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 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 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\n \n \n \n \n \t\n \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\n \n \n \t\n \n \n \n\t\n \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\n \n \n \t\n \n \n \n \n \n \n \n\t\n \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\n \n \n \t\n \n \n\n \n \n \n\t\n \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\n \n \n \t\n \n \n \n \n \n \n \n\t\n \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\n \n \n \t\n \n \n \n \n \n \n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n\t\n\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\n\t\n \n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\n\t\n\t\t\n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n\t\n\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n \n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n\t\n\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\n \n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\n\t\n\t\t\n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n \t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n \n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\n\t\n\t\t\n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n\t\n\t\n\t\t\n\t\t\n \n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\n\t\n\t\t\n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n\t\n\t\n\t\t\n\t\t\n \n \t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\n\t\n\t\t\n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n\t\n\t\n\t\t\n\t\t\n \n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\n\t\n\t\t\n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n\t\n\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\n \n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\n\t\n\t\t\n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n\t\n\t\n\t\t\n\t\t\n \n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\n\t\n\t\t\n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n\t\n\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\n \n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\n\t\n\t\t\n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n\t\n\t\n\t\t\n\t\t\n \n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\n\t\n\t\t\n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n\t\n\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\n\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n\t\n\t\n\t\t\n\t\t\n\t\n\t\n\t\t_]]>\n\t\n \n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\n\t\n\t\t\n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n\t\n\t\n\t\t\n\t\t\n\t\n\t\t\n\t\t\n\t\t\n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \n \n\t\n\t\n \t\n\t\t\n \t\n\t\n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n\t\n \n\t\n\t\t\n\t\t\n \n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\n\t\n\t\t\n\t\n \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 \n \n \n \t\t\t\t\t\n \n \n \n \n \n \n \n\t\n\t\n\t\n \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 \n \n \n \n \n \n \n \n\t\n\t\n \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 \n \n \n \n\n \n \n \n\t\n\t\n \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\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n\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\n \n \n \t\n \n \n \n \n \n \n \n\t\n \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\n \n \n \t\n \n \n \n \n \t\n \n \n \n \n \n \n \t\n\t\n \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\n \n \n \t\n \n \n \n \n \t\n \n \n \n \n\t\n\t\n \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\n \n \n \t\n \n \n \n \n \t\n \n \t\n \n \n \n\t\n\t\t\n\t\n\t\n\t\n \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\n \n \n \t\n \n \n \n \n \n \n \n \n\t\n \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\n \n \n \t\n \n \n \n\t\n \n \n \n \n \n\t\n \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\n \n \n \t\n \n \n \n \n \t\n \n \n \n \n \n \n \t\n\t\n \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\n \n \n \t\n \n \n \n \n \t\n \n \n \n \n\t\n\t\n \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\n \n \n \t\n \n \n \n \n \t\n \n \t\n \n \n \n\t\n\t\t\n\t\n\t\n\t\n \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\n \n \n \t\n \n \n \n \n \n \n\t\n \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\n \n \n \t\n \n \n \n \n \n \n\t\n \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\n \n \n \t\n \n \n \n\t\n \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\n \n \n \t\n \n \n \n \n \n \n\t\n \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\n \n \n \t\n \n \n \n \n \n\t\n \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\n \n \n \t\n \n \n \n \n \n\t\n \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\n \n \n \t\n \t\n \t\n \t\n \t\n \n \n \n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t \t\n \t\n \n \n\t\n\t\n\t\n\t\n \n \n \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\n \n \n \n \n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t\n \t\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\t\n \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\r\n\t\r\n\t \t\r\n\t \t\t\r\n\t\t\t\r\n\t \t\r\n\t \t\r\n\t \t\t\r\n\t \t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\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\r\n\t\r\n\t\t\r\n\t \t\t\r\n\t \t\t\r\n\t \t\r\n\r\n\t \t\r\n\t \t\t\r\n\t \t\r\n\t\r\n\t\r\n\t \r\n\t\t\r\n\t\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\r\n\t\r\n\t \r\n\t\t\r\n\t\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\r\n\t\r\n\t \t\r\n\t \t\t\r\n\t \t\r\n\t\r\n\t\r\n\t \r\n\t\t\r\n\t\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\n \n \n \t\n \n \n \n \n \n \n\t\n \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\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t \t\r\n\t\t\r\n\t\t\t \r\n\t\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\n \n \n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \t\n \n \n \n\t\n\t\n\t\n\t\n\t~\n \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> getXml(@NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { + Map map = new HashMap<>(); + String xmlStr = iActProcessDefinitionService.processDefinitionXml(processDefinitionId); + List xml = new ArrayList<>(Arrays.asList(xmlStr.split("\n"))); + map.put("xml", xml); + map.put("xmlStr", xmlStr); + return R.ok(map); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessDefinitionBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessDefinitionBo.java new file mode 100644 index 000000000..0d7602284 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessDefinitionBo.java @@ -0,0 +1,31 @@ +package org.dromara.workflow.domain.bo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.workflow.common.PageEntity; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 流程定义请求对象 + * + * @author may + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ProcessDefinitionBo extends PageEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程定义名称key + */ + private String key; + /** + * 流程定义名称 + */ + private String name; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java new file mode 100644 index 000000000..52c201d25 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java @@ -0,0 +1,65 @@ +package org.dromara.workflow.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流程定义视图 + * + * @author may + */ +@Data +public class ProcessDefinitionVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程定义id + */ + private String id; + + /** + * 流程定义名称 + */ + private String name; + + /** + * 流程定义标识key + */ + private String key; + + /** + * 流程定义版本 + */ + private int version; + + /** + * 流程定义挂起或激活 1激活 2挂起 + */ + private int suspensionState; + + /** + * 流程xml名称 + */ + private String resourceName; + + /** + * 流程图片名称 + */ + private String diagramResourceName; + + /** + * 流程部署id + */ + private String deploymentId; + + /** + * 流程部署时间 + */ + private Date deploymentTime; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java new file mode 100644 index 000000000..004e9e339 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java @@ -0,0 +1,48 @@ +package org.dromara.workflow.service; + +import jakarta.servlet.http.HttpServletResponse; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.bo.ProcessDefinitionBo; +import org.dromara.workflow.domain.vo.ProcessDefinitionVo; +import org.flowable.engine.repository.ProcessDefinition; + +import java.util.List; + +/** + * 流程定义 服务层 + * + * @author may + */ +public interface IActProcessDefinitionService { + /** + * 分页查询 + * + * @param processDefinitionBo 参数 + * @return 返回分页列表 + */ + TableDataInfo getByPage(ProcessDefinitionBo processDefinitionBo); + + /** + * 查询历史流程定义列表 + * + * @param key 流程定义key + * @return 结果 + */ + List getProcessDefinitionListByKey(String key); + + /** + * 查看流程定义图片 + * + * @param processDefinitionId 流程定义id + * @param response 响应 + */ + void processDefinitionImage(String processDefinitionId, HttpServletResponse response); + + /** + * 查看流程定义xml文件 + * + * @param processDefinitionId 流程定义id + * @return 结果 + */ + String processDefinitionXml(String processDefinitionId); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java new file mode 100644 index 000000000..565754209 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -0,0 +1,166 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.apache.commons.io.IOUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.workflow.domain.bo.ProcessDefinitionBo; +import org.dromara.workflow.domain.vo.ProcessDefinitionVo; +import org.dromara.workflow.service.IActProcessDefinitionService; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.engine.repository.ProcessDefinitionQuery; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 流程定义 服务层实现 + * + * @author may + */ +@RequiredArgsConstructor +@Service +public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionService { + + private final RepositoryService repositoryService; + + /** + * 分页查询 + * + * @param processDefinitionBo 参数 + * @return 返回分页列表 + */ + @Override + public TableDataInfo getByPage(ProcessDefinitionBo processDefinitionBo) { + ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery(); + query.processDefinitionTenantId(LoginHelper.getTenantId()); + if (StringUtils.isNotEmpty(processDefinitionBo.getKey())) { + query.processDefinitionKey(processDefinitionBo.getKey()); + } + if (StringUtils.isNotEmpty(processDefinitionBo.getName())) { + query.processDefinitionNameLike("%" + processDefinitionBo.getName() + "%"); + } + // 分页查询 + List processDefinitionVoList = new ArrayList<>(); + List definitionList = query.latestVersion().listPage(processDefinitionBo.getPageNum(), processDefinitionBo.getPageSize()); + List deploymentList = null; + if (CollUtil.isNotEmpty(definitionList)) { + List deploymentIds = definitionList.stream().map(ProcessDefinition::getDeploymentId).collect(Collectors.toList()); + deploymentList = repositoryService.createDeploymentQuery() + .deploymentIds(deploymentIds).list(); + } + for (ProcessDefinition processDefinition : definitionList) { + ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class); + if (CollUtil.isNotEmpty(deploymentList)) { + // 部署时间 + deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> { + processDefinitionVo.setDeploymentTime(e.getDeploymentTime()); + }); + } + processDefinitionVoList.add(processDefinitionVo); + } + // 总记录数 + long total = query.count(); + + return new TableDataInfo<>(processDefinitionVoList, total); + } + + /** + * 查询历史流程定义列表 + * + * @param key 流程定义key + */ + @Override + public List getProcessDefinitionListByKey(String key) { + List processDefinitionVoList = new ArrayList<>(); + ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery(); + List definitionList = query.processDefinitionTenantId(LoginHelper.getTenantId()).processDefinitionKey(key).list(); + List deploymentList = null; + if (CollUtil.isNotEmpty(definitionList)) { + List deploymentIds = definitionList.stream().map(ProcessDefinition::getDeploymentId).collect(Collectors.toList()); + deploymentList = repositoryService.createDeploymentQuery() + .deploymentIds(deploymentIds).list(); + } + for (ProcessDefinition processDefinition : definitionList) { + ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class); + if (CollUtil.isNotEmpty(deploymentList)) { + // 部署时间 + deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> { + processDefinitionVo.setDeploymentTime(e.getDeploymentTime()); + }); + } + processDefinitionVoList.add(processDefinitionVo); + } + return CollectionUtil.reverse(processDefinitionVoList); + } + + /** + * 查看流程定义图片 + * + * @param processDefinitionId 流程定义id + * @param response 响应 + */ + @Override + public void processDefinitionImage(String processDefinitionId, HttpServletResponse response) { + InputStream inputStream = null; + try { + // 设置页面不缓存 + response.setHeader("Pragma", "no-cache"); + response.addHeader("Cache-Control", "must-revalidate"); + response.addHeader("Cache-Control", "no-cache"); + response.addHeader("Cache-Control", "no-store"); + response.setDateHeader("Expires", 0); + inputStream = repositoryService.getProcessDiagram(processDefinitionId); + // 响应相关图片 + response.setContentType("image/png"); + + byte[] bytes = IOUtils.toByteArray(inputStream); + ServletOutputStream outputStream = response.getOutputStream(); + outputStream.write(bytes); + outputStream.flush(); + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + /** + * 查看流程定义xml文件 + * + * @param processDefinitionId 流程定义id + */ + @Override + public String processDefinitionXml(String processDefinitionId) { + StringBuilder xml = new StringBuilder(); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + InputStream inputStream; + try { + inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName()); + xml.append(IOUtils.toString(inputStream, StandardCharsets.UTF_8)); + } catch (IOException e) { + e.printStackTrace(); + } + return xml.toString(); + } +} From 664a713683217786fa8b7454709282f5ab4a978f Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 4 Jun 2023 20:19:04 +0800 Subject: [PATCH 009/159] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/controller/ActProcessDefinitionController.java | 1 - 1 file changed, 1 deletion(-) 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 index b83203d83..ab61faa3b 100644 --- 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 @@ -10,7 +10,6 @@ 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; From 1f7d8b52af037fcb9bd0fec3e4c1ee3a659c2a13 Mon Sep 17 00:00:00 2001 From: songgaoshuai Date: Mon, 5 Jun 2023 13:01:12 +0800 Subject: [PATCH 010/159] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=EF=BC=8C=E4=BC=98=E5=8C=96=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=8C=E5=AF=BC=E5=87=BA=EF=BC=8C=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E9=9D=9E=E7=A9=BA=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/ruoyi-workflow/pom.xml | 41 ++++--------------- .../service/impl/ActModelServiceImpl.java | 26 +++++++++--- 2 files changed, 28 insertions(+), 39 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index ca167ecc8..fafc0c897 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -17,8 +17,7 @@ - 2.11.0 - 1.10 + 6.8.0 @@ -35,49 +34,25 @@ - - org.flowable - flowable-ui-modeler-rest - 6.8.0 - org.flowable flowable-image-generator + + + org.flowable + flowable-json-converter + ${flowable.version} + + org.dromara ruoyi-system - - - org.apache.xmlgraphics - batik-all - ${batik.version} - - - xalan - xalan - - - - - - - xerces - 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/service/impl/ActModelServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java index 020aaa1a3..70032f85a 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 @@ -108,7 +108,7 @@ public class ActModelServiceImpl implements IActModelService { String description = modelBo.getDescription(); Model checkModel = repositoryService.createModelQuery().modelKey(key).modelTenantId(LoginHelper.getTenantId()).singleResult(); if (ObjectUtil.isNotNull(checkModel)) { - throw new ServiceException("模型key已存在!"); + throw new ServiceException("模型key已存在!"); } // 1. 初始空的模型 Model model = repositoryService.newModel(); @@ -213,13 +213,17 @@ public class ActModelServiceImpl implements IActModelService { String key = values.getFirst("key"); List list = repositoryService.createModelQuery().modelKey(key).modelTenantId(LoginHelper.getTenantId()).list(); list.stream().filter(e -> !e.getId().equals(model.getId())).findFirst().ifPresent(e -> { - throw new ServiceException("模型key已存在!"); + 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("模型不能为空!"); + throw new ServiceException("模型不能为空!"); + } + byte[] toXmlBytes = WorkflowUtils.bpmnJsonToXmlBytes(xmlBytes); + if (ArrayUtil.isEmpty(toXmlBytes)) { + throw new ServiceException("模型不能为空,请至少设计一条主线流程!"); } repositoryService.addModelEditorSource(model.getId(), xmlBytes); return true; @@ -244,6 +248,10 @@ public class ActModelServiceImpl implements IActModelService { if (ArrayUtil.isEmpty(xmlBytes)) { throw new ServiceException("模型数据为空,请先设计流程定义模型,再进行部署!"); } + byte[] toXmlBytes = WorkflowUtils.bpmnJsonToXmlBytes(xmlBytes); + if (ArrayUtil.isEmpty(toXmlBytes)) { + throw new ServiceException("模型不能为空,请至少设计一条主线流程!"); + } // 查询模型的基本信息 Model model = repositoryService.getModel(id); // xml资源的名称 ,对应act_ge_bytearray表中的name_字段 @@ -287,11 +295,17 @@ public class ActModelServiceImpl implements IActModelService { String zipName = "模型不存在"; //查询模型基本信息 Model model = repositoryService.getModel(modelId); + byte[] xmlBytes = repositoryService.getModelEditorSource(modelId); if (ObjectUtil.isNotNull(model)) { - // 查询流程定义模型的json字节码 - byte[] xmlBytes = repositoryService.getModelEditorSource(modelId); - if (ArrayUtil.isEmpty(xmlBytes)) { + byte[] toXmlBytes = WorkflowUtils.bpmnJsonToXmlBytes(xmlBytes); + if (ArrayUtil.isEmpty(toXmlBytes)) { + zipName = "模型不能为空,请至少设计一条主线流程!"; + zos.putNextEntry(new ZipEntry(zipName + ".txt")); + zos.write(zipName.getBytes(StandardCharsets.UTF_8)); + } else if (ArrayUtil.isEmpty(xmlBytes)) { zipName = "模型数据为空,请先设计流程定义模型,再进行部署!"; + zos.putNextEntry(new ZipEntry(zipName + ".txt")); + zos.write(zipName.getBytes(StandardCharsets.UTF_8)); } else { String fileName = model.getName() + "-" + model.getKey(); // 压缩包文件名 From 69ea22527b3e708b2fc0f887589ddc0cdc511509 Mon Sep 17 00:00:00 2001 From: songgaoshuai Date: Mon, 5 Jun 2023 13:10:19 +0800 Subject: [PATCH 011/159] =?UTF-8?q?=E8=B0=83=E6=95=B4ObjectNode.put?= =?UTF-8?q?=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/service/impl/ActModelServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 70032f85a..573f433c6 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 @@ -173,11 +173,11 @@ public class ActModelServiceImpl implements IActModelService { BpmnModel bpmnModel = new BpmnXMLConverter().convertToBpmnModel(xtr); BpmnJsonConverter bpmnJsonConverter = new BpmnJsonConverter(); ObjectNode jsonNodes = bpmnJsonConverter.convertToJson(bpmnModel); - modelNode.put("model", jsonNodes); + modelNode.set("model", jsonNodes); } else { ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree( new String(repositoryService.getModelEditorSource(model.getId()), StandardCharsets.UTF_8)); - modelNode.put("model", editorJsonNode); + modelNode.set("model", editorJsonNode); } } catch (Exception e) { From 671d072d2c1e64274e95c4466ce71b8c68cf4c7b Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Mon, 5 Jun 2023 16:42:18 +0800 Subject: [PATCH 012/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=E5=88=A0=E9=99=A4=EF=BC=8C=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=E6=8C=82=E8=B5=B7=E6=BF=80=E6=B4=BB?= =?UTF-8?q?=EF=BC=8C=E6=B5=81=E7=A8=8B=E5=AE=9A=E4=B9=89=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ActProcessDefinitionController.java | 43 +++++++++- .../service/IActProcessDefinitionService.java | 27 +++++- .../impl/ActProcessDefinitionServiceImpl.java | 83 +++++++++++++++++++ 3 files changed, 148 insertions(+), 5 deletions(-) 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 index ab61faa3b..bb3cf9304 100644 --- 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 @@ -5,16 +5,15 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; +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.ProcessDefinitionBo; import org.dromara.workflow.domain.vo.ProcessDefinitionVo; import org.dromara.workflow.service.IActProcessDefinitionService; 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 org.springframework.web.bind.annotation.*; import java.util.*; @@ -77,4 +76,40 @@ public class ActProcessDefinitionController extends BaseController { map.put("xmlStr", xmlStr); return R.ok(map); } + + /** + * 删除流程定义 + * + * @param deploymentId 部署id + * @param processDefinitionId 流程定义id + */ + @Log(title = "流程定义管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{deploymentId}/{processDefinitionId}") + public R deleteDeployment(@NotBlank(message = "流程部署id不能为空") @PathVariable String deploymentId, + @NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { + return toAjax(iActProcessDefinitionService.deleteDeployment(deploymentId, processDefinitionId)); + } + + /** + * 激活或者挂起流程定义 + * + * @param processDefinitionId 流程定义id + */ + @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) + @PutMapping("/updateProcessDefState/{processDefinitionId}") + public R updateProcDefState(@PathVariable String processDefinitionId) { + return toAjax(iActProcessDefinitionService.updateProcessDefState(processDefinitionId)); + } + + /** + * 迁移流程定义 + * + * @param currentProcessDefinitionId 当前流程定义id + * @param fromProcessDefinitionId 需要迁移到的流程定义id + */ + @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) + @PutMapping("/migrationProcessDefinition/{currentProcessDefinitionId}/{fromProcessDefinitionId}") + public R migrationProcessDefinition(@PathVariable String currentProcessDefinitionId, @PathVariable String fromProcessDefinitionId) { + return toAjax(iActProcessDefinitionService.migrationProcessDefinition(currentProcessDefinitionId, fromProcessDefinitionId)); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java index 004e9e339..9d3866f3c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java @@ -4,7 +4,6 @@ import jakarta.servlet.http.HttpServletResponse; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.bo.ProcessDefinitionBo; import org.dromara.workflow.domain.vo.ProcessDefinitionVo; -import org.flowable.engine.repository.ProcessDefinition; import java.util.List; @@ -45,4 +44,30 @@ public interface IActProcessDefinitionService { * @return 结果 */ String processDefinitionXml(String processDefinitionId); + + /** + * 删除流程定义 + * + * @param deploymentId 部署id + * @param processDefinitionId 流程定义id + * @return 结果 + */ + boolean deleteDeployment(String deploymentId, String processDefinitionId); + + /** + * 激活或者挂起流程定义 + * + * @param processDefinitionId 流程定义id + * @return 结果 + */ + boolean updateProcessDefState(String processDefinitionId); + + /** + * 迁移流程定义 + * + * @param currentProcessDefinitionId 当前流程定义id + * @param fromProcessDefinitionId 需要迁移到的流程定义id + * @return 结果 + */ + boolean migrationProcessDefinition(String currentProcessDefinitionId, String fromProcessDefinitionId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index 565754209..046c2b829 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -7,16 +7,20 @@ import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.apache.commons.io.IOUtils; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.workflow.domain.bo.ProcessDefinitionBo; import org.dromara.workflow.domain.vo.ProcessDefinitionVo; import org.dromara.workflow.service.IActProcessDefinitionService; +import org.flowable.engine.HistoryService; +import org.flowable.engine.ProcessMigrationService; import org.flowable.engine.RepositoryService; import org.flowable.engine.repository.Deployment; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.repository.ProcessDefinitionQuery; +import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.stereotype.Service; import java.io.IOException; @@ -37,6 +41,10 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer private final RepositoryService repositoryService; + private final HistoryService historyService; + + private final ProcessMigrationService processMigrationService; + /** * 分页查询 * @@ -163,4 +171,79 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer } return xml.toString(); } + + /** + * 删除流程定义 + * + * @param deploymentId 部署id + * @param processDefinitionId 流程定义id + */ + @Override + public boolean deleteDeployment(String deploymentId, String processDefinitionId) { + try { + List taskInstanceList = historyService.createHistoricTaskInstanceQuery().processDefinitionId(processDefinitionId).list(); + if (CollectionUtil.isNotEmpty(taskInstanceList)) { + throw new ServiceException("当前流程定义已被使用不可删除!"); + } + //删除流程定义 + repositoryService.deleteDeployment(deploymentId); + return true; + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 激活或者挂起流程定义 + * + * @param processDefinitionId 流程定义id + */ + @Override + public boolean updateProcessDefState(String processDefinitionId) { + try { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(processDefinitionId).singleResult(); + //将当前为挂起状态更新为激活状态 + //参数说明:参数1:流程定义id,参数2:是否激活(true是否级联对应流程实例,激活了则对应流程实例都可以审批), + //参数3:什么时候激活,如果为null则立即激活,如果为具体时间则到达此时间后激活 + if (processDefinition.isSuspended()) { + repositoryService.activateProcessDefinitionById(processDefinitionId, true, null); + } else { + repositoryService.suspendProcessDefinitionById(processDefinitionId, true, null); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException("操作失败"); + } + } + + /** + * 迁移流程定义 + * + * @param currentProcessDefinitionId 当前流程定义id + * @param fromProcessDefinitionId 需要迁移到的流程定义id + */ + + @Override + public boolean migrationProcessDefinition(String currentProcessDefinitionId, String fromProcessDefinitionId) { + try { + // 迁移验证 + boolean migrationValid = processMigrationService.createProcessInstanceMigrationBuilder() + .migrateToProcessDefinition(currentProcessDefinitionId) + .validateMigrationOfProcessInstances(fromProcessDefinitionId) + .isMigrationValid(); + if (!migrationValid) { + throw new ServiceException("流程定义差异过大无法迁移,请修改流程图"); + } + // 已结束的流程实例不会迁移 + processMigrationService.createProcessInstanceMigrationBuilder() + .migrateToProcessDefinition(currentProcessDefinitionId) + .migrateProcessInstances(fromProcessDefinitionId); + return true; + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + } } From 58c7fc55fa962c2a15f4c72fc9d3bd999027cafe Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Tue, 6 Jun 2023 12:27:30 +0800 Subject: [PATCH 013/159] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E6=A0=A1=E9=AA=8C=EF=BC=8C=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E5=88=A0=E9=99=A4=EF=BC=8C=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=BF=80=E6=B4=BB=E6=8C=82=E8=B5=B7=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/service/impl/ActModelServiceImpl.java | 4 ---- .../service/impl/ActProcessDefinitionServiceImpl.java | 5 +++-- 2 files changed, 3 insertions(+), 6 deletions(-) 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 573f433c6..7257f55e7 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 @@ -221,10 +221,6 @@ public class ActModelServiceImpl implements IActModelService { if (ArrayUtil.isEmpty(xmlBytes)) { throw new ServiceException("模型不能为空!"); } - byte[] toXmlBytes = WorkflowUtils.bpmnJsonToXmlBytes(xmlBytes); - if (ArrayUtil.isEmpty(toXmlBytes)) { - throw new ServiceException("模型不能为空,请至少设计一条主线流程!"); - } repositoryService.addModelEditorSource(model.getId(), xmlBytes); return true; } catch (Exception e) { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index 046c2b829..396e2aacb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -181,7 +181,8 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer @Override public boolean deleteDeployment(String deploymentId, String processDefinitionId) { try { - List taskInstanceList = historyService.createHistoricTaskInstanceQuery().processDefinitionId(processDefinitionId).list(); + List taskInstanceList = historyService.createHistoricTaskInstanceQuery() + .processDefinitionId(processDefinitionId).list(); if (CollectionUtil.isNotEmpty(taskInstanceList)) { throw new ServiceException("当前流程定义已被使用不可删除!"); } @@ -203,7 +204,7 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer public boolean updateProcessDefState(String processDefinitionId) { try { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() - .processDefinitionId(processDefinitionId).singleResult(); + .processDefinitionId(processDefinitionId).processDefinitionTenantId(LoginHelper.getTenantId()).singleResult(); //将当前为挂起状态更新为激活状态 //参数说明:参数1:流程定义id,参数2:是否激活(true是否级联对应流程实例,激活了则对应流程实例都可以审批), //参数3:什么时候激活,如果为null则立即激活,如果为具体时间则到达此时间后激活 From a5aa11168ec17242f6c03c1b5cf02a8aeeb73166 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Tue, 6 Jun 2023 12:46:18 +0800 Subject: [PATCH 014/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=E8=BD=AC=E6=8D=A2=E4=B8=BA=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ActProcessDefinitionController.java | 11 +++++ .../service/IActProcessDefinitionService.java | 8 ++++ .../impl/ActProcessDefinitionServiceImpl.java | 40 +++++++++++++++++++ 3 files changed, 59 insertions(+) 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 index bb3cf9304..4933b0937 100644 --- 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 @@ -112,4 +112,15 @@ public class ActProcessDefinitionController extends BaseController { public R migrationProcessDefinition(@PathVariable String currentProcessDefinitionId, @PathVariable String fromProcessDefinitionId) { return toAjax(iActProcessDefinitionService.migrationProcessDefinition(currentProcessDefinitionId, fromProcessDefinitionId)); } + + /** + * 流程定义转换为模型 + * + * @param processDefinitionId 流程定义id + */ + @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) + @PutMapping("/convertToModel/{processDefinitionId}") + public R convertToModel(@NotEmpty(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { + return toAjax(iActProcessDefinitionService.convertToModel(processDefinitionId)); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java index 9d3866f3c..cdbd8078f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java @@ -70,4 +70,12 @@ public interface IActProcessDefinitionService { * @return 结果 */ boolean migrationProcessDefinition(String currentProcessDefinitionId, String fromProcessDefinitionId); + + /** + * 流程定义转换为模型 + * + * @param processDefinitionId 流程定义id + * @return 结果 + */ + boolean convertToModel(String processDefinitionId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index 396e2aacb..056d4a2c4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -3,6 +3,10 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ObjectUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -14,10 +18,12 @@ import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.workflow.domain.bo.ProcessDefinitionBo; import org.dromara.workflow.domain.vo.ProcessDefinitionVo; import org.dromara.workflow.service.IActProcessDefinitionService; +import org.flowable.editor.constants.ModelDataJsonConstants; import org.flowable.engine.HistoryService; import org.flowable.engine.ProcessMigrationService; import org.flowable.engine.RepositoryService; import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.Model; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.repository.ProcessDefinitionQuery; import org.flowable.task.api.history.HistoricTaskInstance; @@ -247,4 +253,38 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer throw new ServiceException(e.getMessage()); } } + + /** + * 流程定义转换为模型 + * + * @param processDefinitionId 流程定义id + */ + @Override + public boolean convertToModel(String processDefinitionId) { + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(processDefinitionId).singleResult(); + InputStream inputStream = repositoryService.getResourceAsStream(pd.getDeploymentId(), pd.getResourceName()); + Model model = repositoryService.createModelQuery().modelKey(pd.getKey()).modelTenantId(LoginHelper.getTenantId()).singleResult(); + try { + if (ObjectUtil.isNotNull(model)) { + repositoryService.addModelEditorSource(model.getId(), IoUtil.readBytes(inputStream)); + } else { + Model modelData = repositoryService.newModel(); + modelData.setKey(pd.getKey()); + modelData.setName(pd.getName()); + modelData.setTenantId(pd.getTenantId()); + ObjectNode modelObjectNode = new ObjectMapper().createObjectNode(); + modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, pd.getName()); + modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, modelData.getVersion()); + modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, pd.getDescription()); + modelData.setMetaInfo(modelObjectNode.toString()); + repositoryService.saveModel(modelData); + repositoryService.addModelEditorSource(modelData.getId(), IoUtil.readBytes(inputStream)); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException(e.getMessage()); + } + } } From 0f21adbba937d6e5ac889b3209e3c27077a27c24 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Tue, 6 Jun 2023 13:56:31 +0800 Subject: [PATCH 015/159] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E7=94=BB=E5=9B=BE=E4=BF=9D=E5=AD=98=E6=97=B6key?= =?UTF-8?q?=E4=B8=8D=E5=9B=9E=E6=98=BE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/service/impl/ActModelServiceImpl.java | 1 + 1 file changed, 1 insertion(+) 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 7257f55e7..cd597987c 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 @@ -164,6 +164,7 @@ public class ActModelServiceImpl implements IActModelService { modelNode.put(MODEL_NAME, model.getName()); } modelNode.put(MODEL_ID, model.getId()); + modelNode.put("key", model.getKey()); Integer version = model.getVersion(); if (version > 0) { byte[] modelEditorSource = repositoryService.getModelEditorSource(model.getId()); From 0623a16e1f98fed99ce81862e384ba6d666b6ca7 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Tue, 6 Jun 2023 16:19:09 +0800 Subject: [PATCH 016/159] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=E5=AF=BC=E5=87=BA=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ActModelServiceImpl.java | 24 ++++++++----------- .../dromara/workflow/utils/WorkflowUtils.java | 20 ++++++++++++++++ 2 files changed, 30 insertions(+), 14 deletions(-) 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 cd597987c..fbebf1c38 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 @@ -1,7 +1,6 @@ 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; @@ -11,7 +10,9 @@ 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.io.IOUtils; import org.apache.commons.lang3.StringUtils; +import org.dromara.common.core.constant.Constants; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -19,7 +20,6 @@ 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; @@ -31,9 +31,6 @@ 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.io.IOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; @@ -168,10 +165,7 @@ public class ActModelServiceImpl implements IActModelService { 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); + BpmnModel bpmnModel = WorkflowUtils.xmlToBpmnModel(modelEditorSource); BpmnJsonConverter bpmnJsonConverter = new BpmnJsonConverter(); ObjectNode jsonNodes = bpmnJsonConverter.convertToJson(bpmnModel); modelNode.set("model", jsonNodes); @@ -245,9 +239,11 @@ public class ActModelServiceImpl implements IActModelService { if (ArrayUtil.isEmpty(xmlBytes)) { throw new ServiceException("模型数据为空,请先设计流程定义模型,再进行部署!"); } - byte[] toXmlBytes = WorkflowUtils.bpmnJsonToXmlBytes(xmlBytes); - if (ArrayUtil.isEmpty(toXmlBytes)) { - throw new ServiceException("模型不能为空,请至少设计一条主线流程!"); + if (JSONUtil.isTypeJSON(IOUtils.toString(xmlBytes, Constants.UTF8))) { + byte[] bytes = WorkflowUtils.bpmnJsonToXmlBytes(xmlBytes); + if (ArrayUtil.isEmpty(bytes)) { + throw new ServiceException("模型不能为空,请至少设计一条主线流程!"); + } } // 查询模型的基本信息 Model model = repositoryService.getModel(id); @@ -294,8 +290,8 @@ public class ActModelServiceImpl implements IActModelService { Model model = repositoryService.getModel(modelId); byte[] xmlBytes = repositoryService.getModelEditorSource(modelId); if (ObjectUtil.isNotNull(model)) { - byte[] toXmlBytes = WorkflowUtils.bpmnJsonToXmlBytes(xmlBytes); - if (ArrayUtil.isEmpty(toXmlBytes)) { + byte[] bytes = WorkflowUtils.bpmnJsonToXmlBytes(xmlBytes); + if (JSONUtil.isTypeJSON(IOUtils.toString(xmlBytes, Constants.UTF8)) && ArrayUtil.isEmpty(bytes)) { zipName = "模型不能为空,请至少设计一条主线流程!"; zos.putNextEntry(new ZipEntry(zipName + ".txt")); zos.write(zipName.getBytes(StandardCharsets.UTF_8)); 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 index a4afe1fbc..8b95b23f0 100644 --- 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 @@ -1,5 +1,7 @@ package org.dromara.workflow.utils; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.dromara.common.json.utils.JsonUtils; @@ -7,7 +9,13 @@ import org.flowable.bpmn.converter.BpmnXMLConverter; import org.flowable.bpmn.model.BpmnModel; import org.flowable.editor.language.json.converter.BpmnJsonConverter; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStream; +import java.rmi.ServerException; /** * 工作流工具 @@ -39,4 +47,16 @@ public class WorkflowUtils { //2.将bpmnModel转为xml return new BpmnXMLConverter().convertToXML(bpmnModel); } + + /** + * xml转为bpmnModel + * + * @param xmlBytes xml + */ + public static BpmnModel xmlToBpmnModel(byte[] xmlBytes) throws XMLStreamException { + ByteArrayInputStream byteArrayInputStream = IoUtil.toStream(xmlBytes); + XMLInputFactory xif = XMLInputFactory.newInstance(); + XMLStreamReader xtr = xif.createXMLStreamReader(byteArrayInputStream); + return new BpmnXMLConverter().convertToBpmnModel(xtr); + } } From 59f005d74a54419bbf24eb7e5c0db4938e9d9db1 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Tue, 6 Jun 2023 21:26:37 +0800 Subject: [PATCH 017/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E9=83=A8=E7=BD=B2=E6=A8=A1=E5=9E=8B=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ActModelServiceImpl.java | 16 ++++- .../dromara/workflow/utils/WorkflowUtils.java | 65 ++++++++++++++++++- 2 files changed, 75 insertions(+), 6 deletions(-) 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 fbebf1c38..d57fd2c3f 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 @@ -1,5 +1,6 @@ package org.dromara.workflow.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; @@ -12,7 +13,6 @@ import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; -import org.dromara.common.core.constant.Constants; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -27,6 +27,7 @@ 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.flowable.validation.ValidationError; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.MultiValueMap; @@ -36,6 +37,7 @@ 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; @@ -239,12 +241,20 @@ public class ActModelServiceImpl implements IActModelService { if (ArrayUtil.isEmpty(xmlBytes)) { throw new ServiceException("模型数据为空,请先设计流程定义模型,再进行部署!"); } - if (JSONUtil.isTypeJSON(IOUtils.toString(xmlBytes, Constants.UTF8))) { + if (JSONUtil.isTypeJSON(IOUtils.toString(xmlBytes, StandardCharsets.UTF_8.toString()))) { byte[] bytes = WorkflowUtils.bpmnJsonToXmlBytes(xmlBytes); if (ArrayUtil.isEmpty(bytes)) { throw new ServiceException("模型不能为空,请至少设计一条主线流程!"); } } + BpmnModel bpmnModel = WorkflowUtils.xmlToBpmnModel(xmlBytes); + // 校验模型 + WorkflowUtils.checkBpmnModel(bpmnModel); + List validationErrors = repositoryService.validateProcess(bpmnModel); + if (CollUtil.isNotEmpty(validationErrors)) { + String errorMsg = validationErrors.stream().map(ValidationError::getProblem).distinct().collect(Collectors.joining(",")); + throw new ServiceException(errorMsg); + } // 查询模型的基本信息 Model model = repositoryService.getModel(id); // xml资源的名称 ,对应act_ge_bytearray表中的name_字段 @@ -291,7 +301,7 @@ public class ActModelServiceImpl implements IActModelService { byte[] xmlBytes = repositoryService.getModelEditorSource(modelId); if (ObjectUtil.isNotNull(model)) { byte[] bytes = WorkflowUtils.bpmnJsonToXmlBytes(xmlBytes); - if (JSONUtil.isTypeJSON(IOUtils.toString(xmlBytes, Constants.UTF8)) && ArrayUtil.isEmpty(bytes)) { + if (JSONUtil.isTypeJSON(IOUtils.toString(xmlBytes, StandardCharsets.UTF_8.toString())) && ArrayUtil.isEmpty(bytes)) { zipName = "模型不能为空,请至少设计一条主线流程!"; zos.putNextEntry(new ZipEntry(zipName + ".txt")); zos.write(zipName.getBytes(StandardCharsets.UTF_8)); 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 index 8b95b23f0..ac52c8b00 100644 --- 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 @@ -1,12 +1,12 @@ package org.dromara.workflow.utils; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.StrUtil; 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.bpmn.model.*; import org.flowable.editor.language.json.converter.BpmnJsonConverter; import javax.xml.stream.XMLInputFactory; @@ -14,8 +14,10 @@ import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import java.io.ByteArrayInputStream; import java.io.IOException; -import java.io.InputStream; import java.rmi.ServerException; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; /** * 工作流工具 @@ -59,4 +61,61 @@ public class WorkflowUtils { XMLStreamReader xtr = xif.createXMLStreamReader(byteArrayInputStream); return new BpmnXMLConverter().convertToBpmnModel(xtr); } + + /** + * 校验模型 + * + * @param bpmnModel bpmn模型 + */ + public static void checkBpmnModel(BpmnModel bpmnModel) throws ServerException { + Collection flowElements = bpmnModel.getMainProcess().getFlowElements(); + + checkBpmnNode(flowElements, false); + + List subProcessList = flowElements.stream().filter(SubProcess.class::isInstance).map(SubProcess.class::cast).collect(Collectors.toList()); + if (!CollUtil.isEmpty(subProcessList)) { + for (SubProcess subProcess : subProcessList) { + Collection subProcessFlowElements = subProcess.getFlowElements(); + checkBpmnNode(subProcessFlowElements, true); + } + } + } + + /** + * 校验bpmn节点是否合法 + * + * @param flowElements 节点集合 + * @param subtask 是否子流程 + */ + private static void checkBpmnNode(Collection flowElements, boolean subtask) throws ServerException { + + if (CollUtil.isEmpty(flowElements)) { + throw new ServerException(subtask ? "子流程必须存在节点" : "" + "必须存在节点!"); + } + + List startEventList = flowElements.stream().filter(StartEvent.class::isInstance).map(StartEvent.class::cast).collect(Collectors.toList()); + if (CollUtil.isEmpty(startEventList)) { + throw new ServerException(subtask ? "子流程必须存在开始节点" : "" + "必须存在开始节点!"); + } + + if (startEventList.size() > 1) { + throw new ServerException(subtask ? "子流程只能存在一个开始节点" : "" + "只能存在一个开始节点!"); + } + + StartEvent startEvent = startEventList.get(0); + List outgoingFlows = startEvent.getOutgoingFlows(); + if (CollUtil.isEmpty(outgoingFlows)) { + throw new ServerException(subtask ? "子流程流程节点为空,请至少设计一条主线流程!" : "" + "流程节点为空,请至少设计一条主线流程!"); + } + + FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement(); + if (!(targetFlowElement instanceof UserTask)) { + throw new ServerException(subtask ? "子流程开始节点后第一个节点必须是用户任务!" : "" + "开始节点后第一个节点必须是用户任务!"); + } + + List endEventList = flowElements.stream().filter(EndEvent.class::isInstance).map(EndEvent.class::cast).collect(Collectors.toList()); + if (CollUtil.isEmpty(endEventList)) { + throw new ServerException(subtask ? "子流程必须存在结束节点!" : "" + "必须存在结束节点!"); + } + } } From 550bfdf8bfc7e9e510e4fcc37849d06cd4803ea0 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Wed, 7 Jun 2023 13:52:17 +0800 Subject: [PATCH 018/159] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E7=94=A8=E6=88=B7=EF=BC=8C=E7=BB=84=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ActModelController.java | 62 ++++++++++++++++ .../domain/vo/GroupRepresentation.java | 27 +++++++ .../vo/ResultListDataRepresentation.java | 70 +++++++++++++++++++ .../domain/vo/UserRepresentation.java | 30 ++++++++ 4 files changed, 189 insertions(+) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/GroupRepresentation.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ResultListDataRepresentation.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/UserRepresentation.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 af2545299..73f19ee02 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,11 +1,14 @@ package org.dromara.workflow.controller; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; 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; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.json.utils.JsonUtils; @@ -14,16 +17,27 @@ 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.system.domain.SysRole; +import org.dromara.system.domain.SysUser; +import org.dromara.system.mapper.SysRoleMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.ISysUserService; import org.dromara.workflow.domain.bo.ModelBo; import org.dromara.workflow.domain.vo.AccountVo; +import org.dromara.workflow.domain.vo.GroupRepresentation; +import org.dromara.workflow.domain.vo.ResultListDataRepresentation; +import org.dromara.workflow.domain.vo.UserRepresentation; import org.dromara.workflow.service.IActModelService; import org.flowable.engine.RepositoryService; import org.flowable.engine.repository.Model; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.MultiValueMap; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; /** @@ -41,6 +55,10 @@ public class ActModelController extends BaseController { private final IActModelService iActModelService; + private final SysUserMapper sysUserMapper; + + private final SysRoleMapper sysRoleMapper; + /** * 分页查询模型 @@ -141,4 +159,48 @@ public class ActModelController extends BaseController { iActModelService.exportZip(modelId, response); } + /** + * 查询用户 + * + * @param filter 参数 + */ + @GetMapping(value = "/rest/editor-users") + public ResultListDataRepresentation getUsers(@RequestParam(value = "filter", required = false) String filter) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StringUtils.isNotBlank(filter), SysUser::getNickName, filter); + List sysUsers = sysUserMapper.selectList(wrapper); + List userRepresentations = new ArrayList<>(); + for (SysUser sysUser : sysUsers) { + UserRepresentation userRepresentation = new UserRepresentation(); + userRepresentation.setFullName(sysUser.getNickName()); + userRepresentation.setLastName(sysUser.getNickName()); + userRepresentation.setTenantId(sysUser.getTenantId()); + userRepresentation.setEmail(sysUser.getEmail()); + userRepresentation.setId(sysUser.getUserId().toString()); + userRepresentations.add(userRepresentation); + } + return new ResultListDataRepresentation(userRepresentations); + } + + /** + * 查询用户组 + * + * @param filter 参数 + */ + @GetMapping(value = "/rest/editor-groups") + public ResultListDataRepresentation getGroups(@RequestParam(required = false, value = "filter") String filter) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StringUtils.isNotBlank(filter), SysRole::getRoleName, filter); + List sysRoles = sysRoleMapper.selectList(wrapper); + List result = new ArrayList<>(); + for (SysRole sysRole : sysRoles) { + GroupRepresentation groupRepresentation = new GroupRepresentation(); + groupRepresentation.setId(sysRole.getRoleId().toString()); + groupRepresentation.setName(sysRole.getRoleName()); + groupRepresentation.setType(sysRole.getRoleKey()); + result.add(groupRepresentation); + } + return new ResultListDataRepresentation(result); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/GroupRepresentation.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/GroupRepresentation.java new file mode 100644 index 000000000..02614033c --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/GroupRepresentation.java @@ -0,0 +1,27 @@ +/* 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.domain.vo; + +import lombok.Data; + +/** + * @author Joram Barrez + */ +@Data +public class GroupRepresentation{ + + protected String id; + protected String name; + protected String type; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ResultListDataRepresentation.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ResultListDataRepresentation.java new file mode 100644 index 000000000..fb6dd769f --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ResultListDataRepresentation.java @@ -0,0 +1,70 @@ +/* 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.domain.vo; + +import java.util.List; + +/** + * @author Tijs Rademakers + */ +public class ResultListDataRepresentation { + + protected Integer size; + protected Long total; + protected Integer start; + protected List data; + + public ResultListDataRepresentation() { + } + + public ResultListDataRepresentation(List data) { + this.data = data; + if (data != null) { + size = data.size(); + total = (long) data.size(); + start = 0; + } + } + + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Integer getStart() { + return start; + } + + public void setStart(Integer start) { + this.start = start; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/UserRepresentation.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/UserRepresentation.java new file mode 100644 index 000000000..d990a920d --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/UserRepresentation.java @@ -0,0 +1,30 @@ +/* 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.domain.vo; + +import lombok.Data; + +/** + * @author Joram Barrez + */ +@Data +public class UserRepresentation { + + protected String id; + protected String firstName; + protected String lastName; + protected String email; + protected String fullName; + protected String tenantId; + +} From 6f934d16ec0ee3b7b09de85ec85dc780bd7a694b Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Wed, 7 Jun 2023 18:01:01 +0800 Subject: [PATCH 019/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ActTaskController.java | 41 +++++++++ .../workflow/domain/bo/StartProcessBo.java | 47 +++++++++++ .../workflow/service/IActTaskService.java | 20 +++++ .../service/impl/ActTaskServiceImpl.java | 83 +++++++++++++++++++ 4 files changed, 191 insertions(+) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java new file mode 100644 index 000000000..c66a68027 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java @@ -0,0 +1,41 @@ +package org.dromara.workflow.controller; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.workflow.domain.bo.StartProcessBo; +import org.dromara.workflow.service.IActTaskService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + * 任务管理 控制层 + * + * @author may + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/task") +public class ActTaskController { + + private final IActTaskService iActTaskService; + + + /** + * 启动任务 + * + * @param startProcessBo 启动流程参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/startWorkFlow") + public R> startWorkFlow(@RequestBody StartProcessBo startProcessBo) { + Map map = iActTaskService.startWorkFlow(startProcessBo); + return R.ok("提交成功", map); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java new file mode 100644 index 000000000..375fc2704 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java @@ -0,0 +1,47 @@ +package org.dromara.workflow.domain.bo; + + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 启动流程对象 + * + * @author may + */ +@Data +public class StartProcessBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 业务唯一值id + */ + private String businessKey; + + /** + * 流程执行key + */ + private String processKey; + + /** + * 如果传实体 需要序列化后的 + * 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}} + */ + private Map variables; + + public Map getVariables() { + if (variables == null) { + return new HashMap<>(16); + } + variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); + return variables; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java new file mode 100644 index 000000000..b90001d77 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java @@ -0,0 +1,20 @@ +package org.dromara.workflow.service; + +import org.dromara.workflow.domain.bo.StartProcessBo; + +import java.util.Map; + +/** + * 任务 服务层 + * + * @author may + */ +public interface IActTaskService { + /** + * 启动任务 + * + * @param startProcessBo 启动流程参数 + * @return 结果 + */ + Map startWorkFlow(StartProcessBo startProcessBo); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java new file mode 100644 index 000000000..41cb6497c --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -0,0 +1,83 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.workflow.domain.bo.StartProcessBo; +import org.dromara.workflow.service.IActTaskService; +import org.flowable.common.engine.impl.identity.Authentication; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.task.api.Task; +import org.flowable.task.api.TaskQuery; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 任务 服务层实现 + * + * @author may + */ +@RequiredArgsConstructor +@Service +public class ActTaskServiceImpl implements IActTaskService { + + private final RuntimeService runtimeService; + private final TaskService taskService; + private final HistoryService historyService; + + /** + * 启动任务 + * + * @param startProcessBo 启动流程参数 + */ + @Override + public Map startWorkFlow(StartProcessBo startProcessBo) { + Map map = new HashMap<>(); + if (StringUtils.isBlank(startProcessBo.getBusinessKey())) { + throw new ServiceException("启动工作流时必须包含业务ID"); + } + // 判断当前业务是否启动过流程 + List instanceList = historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey(startProcessBo.getBusinessKey()).list(); + TaskQuery taskQuery = taskService.createTaskQuery(); + List taskResult = taskQuery.processInstanceBusinessKey(startProcessBo.getBusinessKey()).list(); + if (CollUtil.isNotEmpty(instanceList)) { + map.put("processInstanceId", taskResult.get(0).getProcessInstanceId()); + map.put("taskId", taskResult.get(0).getId()); + return map; + } + // 设置启动人 + Authentication.setAuthenticatedUserId(LoginHelper.getUserId().toString()); + // 启动流程实例(提交申请) + Map variables = startProcessBo.getVariables(); + // 启动跳过表达式 + variables.put("_FLOWABLE_SKIP_EXPRESSION_ENABLED", true); + ProcessInstance pi; + if (CollUtil.isNotEmpty(variables)) { + pi = runtimeService.startProcessInstanceByKeyAndTenantId(startProcessBo.getProcessKey(), startProcessBo.getBusinessKey(), variables, LoginHelper.getTenantId()); + } else { + pi = runtimeService.startProcessInstanceByKeyAndTenantId(startProcessBo.getProcessKey(), startProcessBo.getBusinessKey(), LoginHelper.getTenantId()); + } + // 将流程定义名称 作为 流程实例名称 + runtimeService.setProcessInstanceName(pi.getProcessInstanceId(), pi.getProcessDefinitionName()); + // 申请人执行流程 + List taskList = taskService.createTaskQuery().processInstanceId(pi.getId()).list(); + if (taskList.size() > 1) { + throw new ServiceException("请检查流程第一个环节是否为申请人!"); + } + taskService.setAssignee(taskList.get(0).getId(), LoginHelper.getUserId().toString()); + taskService.setVariable(taskList.get(0).getId(), "processInstanceId", pi.getProcessInstanceId()); + map.put("processInstanceId", pi.getProcessInstanceId()); + map.put("taskId", taskList.get(0).getId()); + return map; + } +} From e98532e03484aa9f8ed1695d592248e53cdbb2dd Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Wed, 7 Jun 2023 22:30:21 +0800 Subject: [PATCH 020/159] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E7=A7=9F=E6=88=B7id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/bo/StartProcessBo.java | 1 - .../service/impl/ActModelServiceImpl.java | 16 ++++++++-------- .../impl/ActProcessDefinitionServiceImpl.java | 10 +++++----- .../service/impl/ActTaskServiceImpl.java | 6 +++--- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java index 375fc2704..c9a068c33 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java @@ -32,7 +32,6 @@ public class StartProcessBo implements Serializable { private String processKey; /** - * 如果传实体 需要序列化后的 * 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}} */ private Map variables; 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 d57fd2c3f..391f433e4 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 @@ -16,7 +16,7 @@ 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.common.tenant.helper.TenantHelper; import org.dromara.workflow.domain.bo.ModelBo; import org.dromara.workflow.service.IActModelService; import org.dromara.workflow.utils.WorkflowUtils; @@ -64,7 +64,7 @@ public class ActModelServiceImpl implements IActModelService { @Override public TableDataInfo getByPage(ModelBo modelBo) { ModelQuery query = repositoryService.createModelQuery(); - query.modelTenantId(LoginHelper.getTenantId()); + query.modelTenantId(TenantHelper.getTenantId()); if (StringUtils.isNotEmpty(modelBo.getName())) { query.modelNameLike("%" + modelBo.getName() + "%"); } @@ -105,7 +105,7 @@ public class ActModelServiceImpl implements IActModelService { String key = modelBo.getKey(); String name = modelBo.getName(); String description = modelBo.getDescription(); - Model checkModel = repositoryService.createModelQuery().modelKey(key).modelTenantId(LoginHelper.getTenantId()).singleResult(); + Model checkModel = repositoryService.createModelQuery().modelKey(key).modelTenantId(TenantHelper.getTenantId()).singleResult(); if (ObjectUtil.isNotNull(checkModel)) { throw new ServiceException("模型key已存在!"); } @@ -114,7 +114,7 @@ public class ActModelServiceImpl implements IActModelService { model.setKey(key); model.setName(name); model.setVersion(version); - model.setTenantId(LoginHelper.getTenantId()); + model.setTenantId(TenantHelper.getTenantId()); ObjectMapper objectMapper = JsonUtils.getObjectMapper(); // 封装模型json对象 ObjectNode objectNode = JsonUtils.getObjectMapper().createObjectNode(); @@ -152,7 +152,7 @@ public class ActModelServiceImpl implements IActModelService { @Override public ObjectNode getModelInfo(String modelId) { ObjectNode modelNode = null; - Model model = repositoryService.createModelQuery().modelId(modelId).modelTenantId(LoginHelper.getTenantId()).singleResult(); + Model model = repositoryService.createModelQuery().modelId(modelId).modelTenantId(TenantHelper.getTenantId()).singleResult(); ObjectMapper objectMapper = JsonUtils.getObjectMapper(); if (model != null) { try { @@ -195,7 +195,7 @@ public class ActModelServiceImpl implements IActModelService { @Transactional(rollbackFor = Exception.class) public boolean editModel(String modelId, MultiValueMap values) { try { - Model model = repositoryService.createModelQuery().modelId(modelId).modelTenantId(LoginHelper.getTenantId()).singleResult(); + Model model = repositoryService.createModelQuery().modelId(modelId).modelTenantId(TenantHelper.getTenantId()).singleResult(); ObjectMapper objectMapper = JsonUtils.getObjectMapper(); ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo()); @@ -208,7 +208,7 @@ public class ActModelServiceImpl implements IActModelService { model.setVersion(model.getVersion() + 1); // 获取唯一标识key String key = values.getFirst("key"); - List list = repositoryService.createModelQuery().modelKey(key).modelTenantId(LoginHelper.getTenantId()).list(); + List list = repositoryService.createModelQuery().modelKey(key).modelTenantId(TenantHelper.getTenantId()).list(); list.stream().filter(e -> !e.getId().equals(model.getId())).findFirst().ifPresent(e -> { throw new ServiceException("模型key已存在!"); }); @@ -270,7 +270,7 @@ public class ActModelServiceImpl implements IActModelService { // bpmn20.xml资源 .addBytes(processName, xmlBytes) // 租户id - .tenantId(LoginHelper.getTenantId()) + .tenantId(TenantHelper.getTenantId()) .deploy(); // 更新 部署id 到流程定义模型数据表中 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index 056d4a2c4..7c7266b78 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -14,7 +14,7 @@ import org.apache.commons.io.IOUtils; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.workflow.domain.bo.ProcessDefinitionBo; import org.dromara.workflow.domain.vo.ProcessDefinitionVo; import org.dromara.workflow.service.IActProcessDefinitionService; @@ -60,7 +60,7 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer @Override public TableDataInfo getByPage(ProcessDefinitionBo processDefinitionBo) { ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery(); - query.processDefinitionTenantId(LoginHelper.getTenantId()); + query.processDefinitionTenantId(TenantHelper.getTenantId()); if (StringUtils.isNotEmpty(processDefinitionBo.getKey())) { query.processDefinitionKey(processDefinitionBo.getKey()); } @@ -101,7 +101,7 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer public List getProcessDefinitionListByKey(String key) { List processDefinitionVoList = new ArrayList<>(); ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery(); - List definitionList = query.processDefinitionTenantId(LoginHelper.getTenantId()).processDefinitionKey(key).list(); + List definitionList = query.processDefinitionTenantId(TenantHelper.getTenantId()).processDefinitionKey(key).list(); List deploymentList = null; if (CollUtil.isNotEmpty(definitionList)) { List deploymentIds = definitionList.stream().map(ProcessDefinition::getDeploymentId).collect(Collectors.toList()); @@ -210,7 +210,7 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer public boolean updateProcessDefState(String processDefinitionId) { try { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() - .processDefinitionId(processDefinitionId).processDefinitionTenantId(LoginHelper.getTenantId()).singleResult(); + .processDefinitionId(processDefinitionId).processDefinitionTenantId(TenantHelper.getTenantId()).singleResult(); //将当前为挂起状态更新为激活状态 //参数说明:参数1:流程定义id,参数2:是否激活(true是否级联对应流程实例,激活了则对应流程实例都可以审批), //参数3:什么时候激活,如果为null则立即激活,如果为具体时间则到达此时间后激活 @@ -264,7 +264,7 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() .processDefinitionId(processDefinitionId).singleResult(); InputStream inputStream = repositoryService.getResourceAsStream(pd.getDeploymentId(), pd.getResourceName()); - Model model = repositoryService.createModelQuery().modelKey(pd.getKey()).modelTenantId(LoginHelper.getTenantId()).singleResult(); + Model model = repositoryService.createModelQuery().modelKey(pd.getKey()).modelTenantId(TenantHelper.getTenantId()).singleResult(); try { if (ObjectUtil.isNotNull(model)) { repositoryService.addModelEditorSource(model.getId(), IoUtil.readBytes(inputStream)); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 41cb6497c..7b085832b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -1,11 +1,11 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.workflow.domain.bo.StartProcessBo; import org.dromara.workflow.service.IActTaskService; import org.flowable.common.engine.impl.identity.Authentication; @@ -63,9 +63,9 @@ public class ActTaskServiceImpl implements IActTaskService { variables.put("_FLOWABLE_SKIP_EXPRESSION_ENABLED", true); ProcessInstance pi; if (CollUtil.isNotEmpty(variables)) { - pi = runtimeService.startProcessInstanceByKeyAndTenantId(startProcessBo.getProcessKey(), startProcessBo.getBusinessKey(), variables, LoginHelper.getTenantId()); + pi = runtimeService.startProcessInstanceByKeyAndTenantId(startProcessBo.getProcessKey(), startProcessBo.getBusinessKey(), variables, TenantHelper.getTenantId()); } else { - pi = runtimeService.startProcessInstanceByKeyAndTenantId(startProcessBo.getProcessKey(), startProcessBo.getBusinessKey(), LoginHelper.getTenantId()); + pi = runtimeService.startProcessInstanceByKeyAndTenantId(startProcessBo.getProcessKey(), startProcessBo.getBusinessKey(), TenantHelper.getTenantId()); } // 将流程定义名称 作为 流程实例名称 runtimeService.setProcessInstanceName(pi.getProcessInstanceId(), pi.getProcessDefinitionName()); From fbbf981b12d32f93ee3c515db6d8075ebab6f588 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Wed, 7 Jun 2023 22:32:42 +0800 Subject: [PATCH 021/159] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dromara/workflow/domain/bo/StartProcessBo.java | 1 - 1 file changed, 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java index c9a068c33..aff3f9745 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java @@ -6,7 +6,6 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Objects; From e69e9d30870272408fa8a349463eb39912f2fd9d Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 8 Jun 2023 12:33:48 +0800 Subject: [PATCH 022/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=8A=9E=E7=90=86=EF=BC=8C=E6=B5=81=E7=A8=8B=E5=BE=85?= =?UTF-8?q?=E5=8A=9E=EF=BC=8C=E5=B7=B2=E5=8A=9E=E5=88=86=E9=A1=B5=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/FlowConstant.java | 2 + .../controller/ActModelController.java | 2 +- .../ActProcessDefinitionController.java | 5 +- .../controller/ActTaskController.java | 40 ++++++- .../workflow/domain/bo/CompleteTaskBo.java | 48 +++++++++ .../dromara/workflow/domain/bo/TaskBo.java | 26 +++++ .../dromara/workflow/domain/vo/TaskVo.java | 99 +++++++++++++++++ .../workflow/service/IActTaskService.java | 29 +++++ .../service/impl/ActTaskServiceImpl.java | 100 +++++++++++++++++- 9 files changed, 344 insertions(+), 7 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java 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 index e69e4e79a..e5462f1ce 100644 --- 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 @@ -13,4 +13,6 @@ public interface FlowConstant { */ String NAMESPACE = "http://b3mn.org/stencilset/bpmn2.0#"; + String MESSAGE_CURRENT_TASK_IS_NULL = "当前任务不存在或你不是任务办理人"; + } 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 73f19ee02..8d5e75d88 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 @@ -101,7 +101,7 @@ public class ActModelController extends BaseController { * @param modelId 模型id */ @GetMapping("/rest/models/{modelId}/editor/json") - public ObjectNode getModelInfo(@PathVariable String modelId) { + public ObjectNode getModelInfo(@NotBlank(message = "模型id不能为空") @PathVariable String modelId) { return iActModelService.getModelInfo(modelId); } 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 index 4933b0937..9c0ca92d3 100644 --- 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 @@ -97,7 +97,7 @@ public class ActProcessDefinitionController extends BaseController { */ @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) @PutMapping("/updateProcessDefState/{processDefinitionId}") - public R updateProcDefState(@PathVariable String processDefinitionId) { + public R updateProcDefState(@NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { return toAjax(iActProcessDefinitionService.updateProcessDefState(processDefinitionId)); } @@ -109,7 +109,8 @@ public class ActProcessDefinitionController extends BaseController { */ @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) @PutMapping("/migrationProcessDefinition/{currentProcessDefinitionId}/{fromProcessDefinitionId}") - public R migrationProcessDefinition(@PathVariable String currentProcessDefinitionId, @PathVariable String fromProcessDefinitionId) { + public R migrationProcessDefinition(@NotBlank(message = "当前流程定义id") @PathVariable String currentProcessDefinitionId, + @NotBlank(message = "需要迁移到的流程定义id") @PathVariable String fromProcessDefinitionId) { return toAjax(iActProcessDefinitionService.migrationProcessDefinition(currentProcessDefinitionId, fromProcessDefinitionId)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java index c66a68027..886cf67c6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java @@ -2,10 +2,16 @@ package org.dromara.workflow.controller; 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.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.CompleteTaskBo; import org.dromara.workflow.domain.bo.StartProcessBo; +import org.dromara.workflow.domain.bo.TaskBo; +import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.service.IActTaskService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -21,7 +27,7 @@ import java.util.Map; @RequiredArgsConstructor @RestController @RequestMapping("/workflow/task") -public class ActTaskController { +public class ActTaskController extends BaseController { private final IActTaskService iActTaskService; @@ -38,4 +44,36 @@ public class ActTaskController { Map map = iActTaskService.startWorkFlow(startProcessBo); return R.ok("提交成功", map); } + + /** + * 办理任务 + * + * @param completeTaskBo 办理任务参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/completeTask") + public R completeTask(@Validated(AddGroup.class) @RequestBody CompleteTaskBo completeTaskBo) { + return toAjax(iActTaskService.completeTask(completeTaskBo)); + } + + /** + * 查询当前用户的待办任务 + * + * @param taskBo 参数 + */ + @GetMapping("/getTaskWaitByPage") + public TableDataInfo getTaskWaitByPage(TaskBo taskBo) { + return iActTaskService.getTaskWaitByPage(taskBo); + } + + /** + * 查询当前用户的已办任务 + * + * @param taskBo 参数 + */ + @GetMapping("/getTaskFinishByPage") + public TableDataInfo getTaskFinishByPage(TaskBo taskBo) { + return iActTaskService.getTaskFinishByPage(taskBo); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java new file mode 100644 index 000000000..65bd42a49 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -0,0 +1,48 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +import java.io.Serial; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * 办理任务请求对象 + * + * @author may + */ +@Data +public class CompleteTaskBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务id + */ + @NotBlank(message = "任务id不能为空", groups = {AddGroup.class}) + private String taskId; + + /** + * 办理意见 + */ + private String message; + + /** + * 流程变量 + */ + private Map variables; + + public Map getVariables() { + if (variables == null) { + return new HashMap<>(16); + } + variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); + return variables; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskBo.java new file mode 100644 index 000000000..0064be79a --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskBo.java @@ -0,0 +1,26 @@ +package org.dromara.workflow.domain.bo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.workflow.common.PageEntity; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 任务请求对象 + * + * @author may + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class TaskBo extends PageEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务名称 + */ + private String name; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java new file mode 100644 index 000000000..4169de0a1 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java @@ -0,0 +1,99 @@ +package org.dromara.workflow.domain.vo; + +import lombok.Data; + +import java.util.Date; + +/** + * 任务视图 + * + * @author may + */ +@Data +public class TaskVo { + + /** + * 任务id + */ + private String id; + + /** + * 任务名称 + */ + private String name; + + /** + * 描述 + */ + private String description; + + /** + * 优先级 + */ + private Integer priority; + + /** + * 负责此任务的人员的用户id + */ + private String owner; + + /** + * 办理人id + */ + private String assignee; + + /** + * 流程实例id + */ + private String processInstanceId; + + /** + * 执行id + */ + private String executionId; + + /** + * 无用 + */ + private String taskDefinitionId; + + /** + * 流程定义id + */ + private String processDefinitionId; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 节点id + */ + private String taskDefinitionKey; + + /** + * 任务截止日期 + */ + private Date dueDate; + + /** + * 流程类别 + */ + private String category; + + /** + * 父级任务id + */ + private String parentTaskId; + + /** + * 租户id + */ + private String tenantId; + + /** + * 认领时间 + */ + private Date claimTime; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java index b90001d77..15b149b0e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java @@ -1,6 +1,10 @@ package org.dromara.workflow.service; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.bo.CompleteTaskBo; import org.dromara.workflow.domain.bo.StartProcessBo; +import org.dromara.workflow.domain.bo.TaskBo; +import org.dromara.workflow.domain.vo.TaskVo; import java.util.Map; @@ -17,4 +21,29 @@ public interface IActTaskService { * @return 结果 */ Map startWorkFlow(StartProcessBo startProcessBo); + + + /** + * 办理任务 + * + * @param completeTaskBo 办理任务参数 + * @return 结果 + */ + boolean completeTask(CompleteTaskBo completeTaskBo); + + /** + * 查询当前用户的待办任务 + * + * @param taskBo 参数 + * @return 结果 + */ + TableDataInfo getTaskWaitByPage(TaskBo taskBo); + + /** + * 查询当前用户的已办任务 + * + * @param taskBo 参数 + * @return 结果 + */ + TableDataInfo getTaskFinishByPage(TaskBo taskBo); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 7b085832b..a02dadabc 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -1,12 +1,19 @@ package org.dromara.workflow.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.domain.bo.CompleteTaskBo; import org.dromara.workflow.domain.bo.StartProcessBo; +import org.dromara.workflow.domain.bo.TaskBo; +import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.service.IActTaskService; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.engine.HistoryService; @@ -16,11 +23,16 @@ import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 任务 服务层实现 @@ -47,9 +59,10 @@ public class ActTaskServiceImpl implements IActTaskService { throw new ServiceException("启动工作流时必须包含业务ID"); } // 判断当前业务是否启动过流程 - List instanceList = historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey(startProcessBo.getBusinessKey()).list(); + List instanceList = historyService.createHistoricProcessInstanceQuery() + .processInstanceBusinessKey(startProcessBo.getBusinessKey()).processInstanceTenantIdLike(TenantHelper.getTenantId()).list(); TaskQuery taskQuery = taskService.createTaskQuery(); - List taskResult = taskQuery.processInstanceBusinessKey(startProcessBo.getBusinessKey()).list(); + List taskResult = taskQuery.processInstanceBusinessKey(startProcessBo.getBusinessKey()).taskTenantId(TenantHelper.getTenantId()).list(); if (CollUtil.isNotEmpty(instanceList)) { map.put("processInstanceId", taskResult.get(0).getProcessInstanceId()); map.put("taskId", taskResult.get(0).getId()); @@ -70,7 +83,7 @@ public class ActTaskServiceImpl implements IActTaskService { // 将流程定义名称 作为 流程实例名称 runtimeService.setProcessInstanceName(pi.getProcessInstanceId(), pi.getProcessDefinitionName()); // 申请人执行流程 - List taskList = taskService.createTaskQuery().processInstanceId(pi.getId()).list(); + List taskList = taskService.createTaskQuery().processInstanceId(pi.getId()).taskTenantId(TenantHelper.getTenantId()).list(); if (taskList.size() > 1) { throw new ServiceException("请检查流程第一个环节是否为申请人!"); } @@ -80,4 +93,85 @@ public class ActTaskServiceImpl implements IActTaskService { map.put("taskId", taskList.get(0).getId()); return map; } + + /** + * 办理任务 + * + * @param completeTaskBo 办理任务参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean completeTask(CompleteTaskBo completeTaskBo) { + try { + List roles = LoginHelper.getLoginUser().getRoles(); + String userId = LoginHelper.getUserId().toString(); + TaskQuery taskQuery = taskService.createTaskQuery(); + taskQuery.taskId(completeTaskBo.getTaskId()) + .taskTenantId(TenantHelper.getTenantId()).taskCandidateOrAssigned(userId); + if (CollUtil.isNotEmpty(roles)) { + List groupIds = roles.stream().map(e -> String.valueOf(e.getRoleId())).collect(Collectors.toList()); + taskQuery.taskCandidateGroupIn(groupIds); + } + Task task = taskQuery.singleResult(); + if (task == null) { + throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); + } + //办理任务 + taskService.complete(completeTaskBo.getTaskId(), completeTaskBo.getVariables()); + //办理意见 + taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage()); + return true; + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + } + + /** + * 查询当前用户的待办任务 + * + * @param taskBo 参数 + */ + @Override + public TableDataInfo getTaskWaitByPage(TaskBo taskBo) { + List roles = LoginHelper.getLoginUser().getRoles(); + String userId = LoginHelper.getUserId().toString(); + TaskQuery query = taskService.createTaskQuery(); + query.taskTenantId(TenantHelper.getTenantId()).taskCandidateOrAssigned(userId); + if (CollUtil.isNotEmpty(roles)) { + List groupIds = roles.stream().map(e -> String.valueOf(e.getRoleId())).collect(Collectors.toList()); + query.taskCandidateGroupIn(groupIds); + } + if (StringUtils.isNotBlank(taskBo.getName())) { + query.taskNameLike(taskBo.getName()); + } + List taskList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); + List list = new ArrayList<>(); + for (Task task : taskList) { + list.add(BeanUtil.toBean(task, TaskVo.class)); + } + long count = query.count(); + return new TableDataInfo<>(list, count); + } + + /** + * 查询当前用户的已办任务 + * + * @param taskBo 参数 + */ + @Override + public TableDataInfo getTaskFinishByPage(TaskBo taskBo) { + String userId = LoginHelper.getUserId().toString(); + HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery() + .taskAssignee(userId).taskTenantId(TenantHelper.getTenantId()).finished().orderByHistoricTaskInstanceStartTime().asc(); + if (StringUtils.isNotBlank(taskBo.getName())) { + query.taskNameLike(taskBo.getName()); + } + List taskInstanceList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); + List list = new ArrayList<>(); + for (HistoricTaskInstance task : taskInstanceList) { + list.add(BeanUtil.toBean(task, TaskVo.class)); + } + long count = query.count(); + return new TableDataInfo<>(list, count); + } } From fa3e9f82bdc6ff86cc5332d9ac6c512aa317c15f Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 8 Jun 2023 18:18:48 +0800 Subject: [PATCH 023/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E6=B5=81=E7=A8=8B=E5=AE=9E=E4=BE=8Bid=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=8E=86=E5=8F=B2=E6=B5=81=E7=A8=8B=E5=9B=BE=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0flowable=E9=85=8D=E7=BD=AE=EF=BC=8C=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=B5=81=E7=A8=8B=E5=8A=9E=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/FlowConstant.java | 5 + .../ActProcessInstanceController.java | 35 + .../CustomDefaultProcessDiagramCanvas.java | 108 ++ .../CustomDefaultProcessDiagramGenerator.java | 1122 +++++++++++++++++ .../flowable/config/FlowableConfig.java | 20 + .../service/IActProcessInstanceService.java | 18 + .../impl/ActProcessInstanceServiceImpl.java | 132 ++ .../service/impl/ActTaskServiceImpl.java | 12 +- 8 files changed, 1444 insertions(+), 8 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramCanvas.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramGenerator.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java 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 index e5462f1ce..61194bd89 100644 --- 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 @@ -15,4 +15,9 @@ public interface FlowConstant { String MESSAGE_CURRENT_TASK_IS_NULL = "当前任务不存在或你不是任务办理人"; + /** + * 连线 + */ + String SEQUENCE_FLOW = "sequenceFlow"; + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java new file mode 100644 index 000000000..4467277dc --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java @@ -0,0 +1,35 @@ +package org.dromara.workflow.controller; + +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import org.dromara.common.web.core.BaseController; +import org.dromara.workflow.service.IActProcessInstanceService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 流程实例管理 控制层 + * + * @author may + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/processInstance") +public class ActProcessInstanceController extends BaseController { + + private final IActProcessInstanceService iActProcessInstanceService; + + /** + * 通过流程实例id获取历史流程图 + * + * @param processInstanceId 流程实例id + * @param response 响应 + */ + @GetMapping("/getHistoryProcessImage/{processInstanceId}") + public void getHistoryProcessImage(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId, + HttpServletResponse response) { + iActProcessInstanceService.getHistoryProcessImage(processInstanceId, response); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramCanvas.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramCanvas.java new file mode 100644 index 000000000..39fd9d363 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramCanvas.java @@ -0,0 +1,108 @@ +package org.dromara.workflow.flowable; + +import org.flowable.bpmn.model.AssociationDirection; +import org.flowable.image.impl.DefaultProcessDiagramCanvas; + +import java.awt.*; +import java.awt.geom.Line2D; +import java.awt.geom.RoundRectangle2D; + +public class CustomDefaultProcessDiagramCanvas extends DefaultProcessDiagramCanvas { + //设置高亮线的颜色 这里我设置成绿色 + protected static Color HIGHLIGHT_SEQUENCEFLOW_COLOR = Color.GREEN; + + public CustomDefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { + super(width, height, minX, minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); + } + + /** + * 画线颜色设置 + */ + public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType, + AssociationDirection associationDirection, boolean highLighted, double scaleFactor) { + + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + + g.setPaint(CONNECTION_COLOR); + if (connectionType.equals("association")) { + g.setStroke(ASSOCIATION_STROKE); + } else if (highLighted) { + //设置线的颜色 + g.setPaint(HIGHLIGHT_SEQUENCEFLOW_COLOR); + g.setStroke(HIGHLIGHT_FLOW_STROKE); + } + + for (int i = 1; i < xPoints.length; i++) { + Integer sourceX = xPoints[i - 1]; + Integer sourceY = yPoints[i - 1]; + Integer targetX = xPoints[i]; + Integer targetY = yPoints[i]; + Line2D.Double line = new Line2D.Double(sourceX, sourceY, targetX, targetY); + g.draw(line); + } + + if (isDefault) { + Line2D.Double line = new Line2D.Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); + drawDefaultSequenceFlowIndicator(line, scaleFactor); + } + + if (conditional) { + Line2D.Double line = new Line2D.Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); + drawConditionalSequenceFlowIndicator(line, scaleFactor); + } + + if (associationDirection == AssociationDirection.ONE || associationDirection == AssociationDirection.BOTH) { + Line2D.Double line = new Line2D.Double(xPoints[xPoints.length - 2], yPoints[xPoints.length - 2], xPoints[xPoints.length - 1], yPoints[xPoints.length - 1]); + drawArrowHead(line, scaleFactor); + } + if (associationDirection == AssociationDirection.BOTH) { + Line2D.Double line = new Line2D.Double(xPoints[1], yPoints[1], xPoints[0], yPoints[0]); + drawArrowHead(line, scaleFactor); + } + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } + + /** + * 高亮节点设置 + */ + public void drawHighLight(int x, int y, int width, int height) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + //设置高亮节点的颜色 + g.setPaint(HIGHLIGHT_COLOR); + g.setStroke(THICK_TASK_BORDER_STROKE); + + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); + g.draw(rect); + + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } + + /** + * @description: 高亮节点红色 + * @param: x + * @param: y + * @param: width + * @param: height + * @return: void + * @author: gssong + * @date: 2022/4/12 + */ + public void drawHighLightRed(int x, int y, int width, int height) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + //设置高亮节点的颜色 + g.setPaint(Color.green); + g.setStroke(THICK_TASK_BORDER_STROKE); + + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); + g.draw(rect); + + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramGenerator.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramGenerator.java new file mode 100644 index 000000000..feda7e5a2 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramGenerator.java @@ -0,0 +1,1122 @@ +/* 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.flowable; + +import org.flowable.bpmn.model.Event; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.image.ProcessDiagramGenerator; + +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.InputStream; +import java.util.List; +import java.util.*; + +/** + * Class to generate an image based the diagram interchange information in a BPMN 2.0 process. + * + * @author Joram Barrez + * @author Tijs Rademakers + * @author Zheng Ji + */ +public class CustomDefaultProcessDiagramGenerator implements ProcessDiagramGenerator { + + protected Map, ActivityDrawInstruction> activityDrawInstructions = new HashMap<>(); + protected Map, ArtifactDrawInstruction> artifactDrawInstructions = new HashMap<>(); + + public CustomDefaultProcessDiagramGenerator() { + this(1.0); + } + + // The instructions on how to draw a certain construct is + // created statically and stored in a map for performance. + public CustomDefaultProcessDiagramGenerator(final double scaleFactor) { + // start event + activityDrawInstructions.put(StartEvent.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + StartEvent startEvent = (StartEvent) flowNode; + if (startEvent.getEventDefinitions() != null && !startEvent.getEventDefinitions().isEmpty()) { + EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0); + if (eventDefinition instanceof TimerEventDefinition) { + processDiagramCanvas.drawTimerStartEvent(graphicInfo, scaleFactor); + } else if (eventDefinition instanceof ErrorEventDefinition) { + processDiagramCanvas.drawErrorStartEvent(graphicInfo, scaleFactor); + } else if (eventDefinition instanceof EscalationEventDefinition) { + processDiagramCanvas.drawEscalationStartEvent(graphicInfo, scaleFactor); + } else if (eventDefinition instanceof ConditionalEventDefinition) { + processDiagramCanvas.drawConditionalStartEvent(graphicInfo, scaleFactor); + } else if (eventDefinition instanceof SignalEventDefinition) { + processDiagramCanvas.drawSignalStartEvent(graphicInfo, scaleFactor); + } else if (eventDefinition instanceof MessageEventDefinition) { + processDiagramCanvas.drawMessageStartEvent(graphicInfo, scaleFactor); + } else { + processDiagramCanvas.drawNoneStartEvent(graphicInfo); + } + } else { + List eventTypeElements = startEvent.getExtensionElements().get("eventType"); + if (eventTypeElements != null && eventTypeElements.size() > 0) { + processDiagramCanvas.drawEventRegistryStartEvent(graphicInfo, scaleFactor); + + } else { + processDiagramCanvas.drawNoneStartEvent(graphicInfo); + } + } + } + }); + + // signal catch + activityDrawInstructions.put(IntermediateCatchEvent.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + IntermediateCatchEvent intermediateCatchEvent = (IntermediateCatchEvent) flowNode; + if (intermediateCatchEvent.getEventDefinitions() != null && !intermediateCatchEvent.getEventDefinitions().isEmpty()) { + + if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) { + processDiagramCanvas.drawCatchingSignalEvent(flowNode.getName(), graphicInfo, true, scaleFactor); + } else if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof TimerEventDefinition) { + processDiagramCanvas.drawCatchingTimerEvent(flowNode.getName(), graphicInfo, true, scaleFactor); + } else if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof MessageEventDefinition) { + processDiagramCanvas.drawCatchingMessageEvent(flowNode.getName(), graphicInfo, true, scaleFactor); + } else if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof ConditionalEventDefinition) { + processDiagramCanvas.drawCatchingConditionalEvent(flowNode.getName(), graphicInfo, true, scaleFactor); + } + } + } + }); + + // signal throw + activityDrawInstructions.put(ThrowEvent.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + ThrowEvent throwEvent = (ThrowEvent) flowNode; + if (throwEvent.getEventDefinitions() != null && !throwEvent.getEventDefinitions().isEmpty()) { + if (throwEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) { + processDiagramCanvas.drawThrowingSignalEvent(graphicInfo, scaleFactor); + } else if (throwEvent.getEventDefinitions().get(0) instanceof EscalationEventDefinition) { + processDiagramCanvas.drawThrowingEscalationEvent(graphicInfo, scaleFactor); + } else if (throwEvent.getEventDefinitions().get(0) instanceof CompensateEventDefinition) { + processDiagramCanvas.drawThrowingCompensateEvent(graphicInfo, scaleFactor); + } else { + processDiagramCanvas.drawThrowingNoneEvent(graphicInfo, scaleFactor); + } + } else { + processDiagramCanvas.drawThrowingNoneEvent(graphicInfo, scaleFactor); + } + } + }); + + // end event + activityDrawInstructions.put(EndEvent.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + EndEvent endEvent = (EndEvent) flowNode; + if (endEvent.getEventDefinitions() != null && !endEvent.getEventDefinitions().isEmpty()) { + if (endEvent.getEventDefinitions().get(0) instanceof ErrorEventDefinition) { + processDiagramCanvas.drawErrorEndEvent(flowNode.getName(), graphicInfo, scaleFactor); + } else if (endEvent.getEventDefinitions().get(0) instanceof EscalationEventDefinition) { + processDiagramCanvas.drawEscalationEndEvent(flowNode.getName(), graphicInfo, scaleFactor); + } else { + processDiagramCanvas.drawNoneEndEvent(graphicInfo, scaleFactor); + } + } else { + processDiagramCanvas.drawNoneEndEvent(graphicInfo, scaleFactor); + } + } + }); + + // task + activityDrawInstructions.put(Task.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawTask(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // user task + activityDrawInstructions.put(UserTask.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawUserTask(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // script task + activityDrawInstructions.put(ScriptTask.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawScriptTask(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // service task + activityDrawInstructions.put(ServiceTask.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + ServiceTask serviceTask = (ServiceTask) flowNode; + if ("camel".equalsIgnoreCase(serviceTask.getType())) { + processDiagramCanvas.drawCamelTask(serviceTask.getName(), graphicInfo, scaleFactor); + } else if ("mule".equalsIgnoreCase(serviceTask.getType())) { + processDiagramCanvas.drawMuleTask(serviceTask.getName(), graphicInfo, scaleFactor); + } else if (ServiceTask.HTTP_TASK.equalsIgnoreCase(serviceTask.getType())) { + processDiagramCanvas.drawHttpTask(serviceTask.getName(), graphicInfo, scaleFactor); + } else if (ServiceTask.DMN_TASK.equalsIgnoreCase(serviceTask.getType())) { + processDiagramCanvas.drawDMNTask(serviceTask.getName(), graphicInfo, scaleFactor); + } else if (ServiceTask.SHELL_TASK.equalsIgnoreCase(serviceTask.getType())) { + processDiagramCanvas.drawShellTask(serviceTask.getName(), graphicInfo, scaleFactor); + } else { + processDiagramCanvas.drawServiceTask(serviceTask.getName(), graphicInfo, scaleFactor); + } + } + }); + + // http service task + activityDrawInstructions.put(HttpServiceTask.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawHttpTask(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // receive task + activityDrawInstructions.put(ReceiveTask.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawReceiveTask(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // send task + activityDrawInstructions.put(SendTask.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawSendTask(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // manual task + activityDrawInstructions.put(ManualTask.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawManualTask(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // send event service task + activityDrawInstructions.put(SendEventServiceTask.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawSendEventServiceTask(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // external worker service task + activityDrawInstructions.put(ExternalWorkerServiceTask.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + ServiceTask serviceTask = (ServiceTask) flowNode; + processDiagramCanvas.drawServiceTask(serviceTask.getName(), graphicInfo, scaleFactor); + } + }); + + // case service task + activityDrawInstructions.put(CaseServiceTask.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawCaseServiceTask(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // businessRuleTask task + activityDrawInstructions.put(BusinessRuleTask.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawBusinessRuleTask(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // exclusive gateway + activityDrawInstructions.put(ExclusiveGateway.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawExclusiveGateway(graphicInfo, scaleFactor); + } + }); + + // inclusive gateway + activityDrawInstructions.put(InclusiveGateway.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawInclusiveGateway(graphicInfo, scaleFactor); + } + }); + + // parallel gateway + activityDrawInstructions.put(ParallelGateway.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawParallelGateway(graphicInfo, scaleFactor); + } + }); + + // event based gateway + activityDrawInstructions.put(EventGateway.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawEventBasedGateway(graphicInfo, scaleFactor); + } + }); + + // Boundary timer + activityDrawInstructions.put(BoundaryEvent.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + BoundaryEvent boundaryEvent = (BoundaryEvent) flowNode; + if (boundaryEvent.getEventDefinitions() != null && !boundaryEvent.getEventDefinitions().isEmpty()) { + EventDefinition eventDefinition = boundaryEvent.getEventDefinitions().get(0); + if (eventDefinition instanceof TimerEventDefinition) { + processDiagramCanvas.drawCatchingTimerEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); + + } else if (eventDefinition instanceof ConditionalEventDefinition) { + processDiagramCanvas.drawCatchingConditionalEvent(graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); + + } else if (eventDefinition instanceof ErrorEventDefinition) { + processDiagramCanvas.drawCatchingErrorEvent(graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); + + } else if (eventDefinition instanceof EscalationEventDefinition) { + processDiagramCanvas.drawCatchingEscalationEvent(graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); + + } else if (eventDefinition instanceof SignalEventDefinition) { + processDiagramCanvas.drawCatchingSignalEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); + + } else if (eventDefinition instanceof MessageEventDefinition) { + processDiagramCanvas.drawCatchingMessageEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); + + } else if (eventDefinition instanceof CompensateEventDefinition) { + processDiagramCanvas.drawCatchingCompensateEvent(graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); + } + + } else { + List eventTypeElements = boundaryEvent.getExtensionElements().get("eventType"); + if (eventTypeElements != null && eventTypeElements.size() > 0) { + processDiagramCanvas.drawCatchingEventRegistryEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); + } + } + } + }); + + // subprocess + activityDrawInstructions.put(SubProcess.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) { + processDiagramCanvas.drawCollapsedSubProcess(flowNode.getName(), graphicInfo, false, scaleFactor); + } else { + processDiagramCanvas.drawExpandedSubProcess(flowNode.getName(), graphicInfo, false, scaleFactor); + } + } + }); + + // transaction + activityDrawInstructions.put(Transaction.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) { + processDiagramCanvas.drawCollapsedSubProcess(flowNode.getName(), graphicInfo, false, scaleFactor); + } else { + processDiagramCanvas.drawExpandedTransaction(flowNode.getName(), graphicInfo, scaleFactor); + } + } + }); + + // Event subprocess + activityDrawInstructions.put(EventSubProcess.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) { + processDiagramCanvas.drawCollapsedSubProcess(flowNode.getName(), graphicInfo, true, scaleFactor); + } else { + processDiagramCanvas.drawExpandedSubProcess(flowNode.getName(), graphicInfo, true, scaleFactor); + } + } + }); + + // Adhoc subprocess + activityDrawInstructions.put(AdhocSubProcess.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) { + processDiagramCanvas.drawCollapsedSubProcess(flowNode.getName(), graphicInfo, false, scaleFactor); + } else { + processDiagramCanvas.drawExpandedSubProcess(flowNode.getName(), graphicInfo, false, scaleFactor); + } + } + }); + + // call activity + activityDrawInstructions.put(CallActivity.class, new ActivityDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawCollapsedCallActivity(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // text annotation + artifactDrawInstructions.put(TextAnnotation.class, new ArtifactDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(artifact.getId()); + TextAnnotation textAnnotation = (TextAnnotation) artifact; + processDiagramCanvas.drawTextAnnotation(textAnnotation.getText(), graphicInfo, scaleFactor); + } + }); + + // association + artifactDrawInstructions.put(Association.class, new ArtifactDrawInstruction() { + + @Override + public void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) { + Association association = (Association) artifact; + String sourceRef = association.getSourceRef(); + String targetRef = association.getTargetRef(); + + // source and target can be instance of FlowElement or Artifact + BaseElement sourceElement = bpmnModel.getFlowElement(sourceRef); + BaseElement targetElement = bpmnModel.getFlowElement(targetRef); + if (sourceElement == null) { + sourceElement = bpmnModel.getArtifact(sourceRef); + } + if (targetElement == null) { + targetElement = bpmnModel.getArtifact(targetRef); + } + List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId()); + graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList); + int[] xPoints = new int[graphicInfoList.size()]; + int[] yPoints = new int[graphicInfoList.size()]; + for (int i = 1; i < graphicInfoList.size(); i++) { + GraphicInfo graphicInfo = graphicInfoList.get(i); + GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1); + + if (i == 1) { + xPoints[0] = (int) previousGraphicInfo.getX(); + yPoints[0] = (int) previousGraphicInfo.getY(); + } + xPoints[i] = (int) graphicInfo.getX(); + yPoints[i] = (int) graphicInfo.getY(); + } + + AssociationDirection associationDirection = association.getAssociationDirection(); + processDiagramCanvas.drawAssociation(xPoints, yPoints, associationDirection, false, scaleFactor); + } + }); + } + + @Override + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, + String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { + + return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, + activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor, drawSequenceFlowNameWithNoLabelDI).generateImage(imageType); + } + + @Override + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, boolean drawSequenceFlowNameWithNoLabelDI) { + return generateDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null, 1.0, drawSequenceFlowNameWithNoLabelDI); + } + + @Override + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, + List highLightedActivities, List highLightedFlows, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { + return generateDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null, scaleFactor, drawSequenceFlowNameWithNoLabelDI); + } + + @Override + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, boolean drawSequenceFlowNameWithNoLabelDI) { + return generateDiagram(bpmnModel, imageType, highLightedActivities, Collections.emptyList(), drawSequenceFlowNameWithNoLabelDI); + } + + @Override + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { + return generateDiagram(bpmnModel, imageType, highLightedActivities, Collections.emptyList(), scaleFactor, drawSequenceFlowNameWithNoLabelDI); + } + + @Override + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName, + String labelFontName, String annotationFontName, ClassLoader customClassLoader, boolean drawSequenceFlowNameWithNoLabelDI) { + + return generateDiagram(bpmnModel, imageType, Collections.emptyList(), Collections.emptyList(), + activityFontName, labelFontName, annotationFontName, customClassLoader, 1.0, drawSequenceFlowNameWithNoLabelDI); + } + + @Override + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName, + String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { + + return generateDiagram(bpmnModel, imageType, Collections.emptyList(), Collections.emptyList(), + activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor, drawSequenceFlowNameWithNoLabelDI); + } + + @Override + public InputStream generatePngDiagram(BpmnModel bpmnModel, boolean drawSequenceFlowNameWithNoLabelDI) { + return generatePngDiagram(bpmnModel, 1.0, drawSequenceFlowNameWithNoLabelDI); + } + + @Override + public InputStream generatePngDiagram(BpmnModel bpmnModel, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { + return generateDiagram(bpmnModel, "png", Collections.emptyList(), Collections.emptyList(), scaleFactor, drawSequenceFlowNameWithNoLabelDI); + } + + @Override + public InputStream generateJpgDiagram(BpmnModel bpmnModel) { + return generateJpgDiagram(bpmnModel, 1.0, false); + } + + @Override + public InputStream generateJpgDiagram(BpmnModel bpmnModel, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { + return generateDiagram(bpmnModel, "jpg", Collections.emptyList(), Collections.emptyList(), drawSequenceFlowNameWithNoLabelDI); + } + + public BufferedImage generateImage(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, + String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { + + return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, + activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor, drawSequenceFlowNameWithNoLabelDI).generateBufferedImage(imageType); + } + + public BufferedImage generateImage(BpmnModel bpmnModel, String imageType, + List highLightedActivities, List highLightedFlows, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { + + return generateImage(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null, scaleFactor, drawSequenceFlowNameWithNoLabelDI); + } + + @Override + public BufferedImage generatePngImage(BpmnModel bpmnModel, double scaleFactor) { + return generateImage(bpmnModel, "png", Collections.emptyList(), Collections.emptyList(), scaleFactor, false); + } + + protected CustomDefaultProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType, + List highLightedActivities, List highLightedFlows, + String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { + + prepareBpmnModel(bpmnModel); + + CustomDefaultProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); + + // Draw pool shape, if process is participant in collaboration + for (Pool pool : bpmnModel.getPools()) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId()); + processDiagramCanvas.drawPoolOrLane(pool.getName(), graphicInfo, scaleFactor); + } + + // Draw lanes + for (Process process : bpmnModel.getProcesses()) { + for (Lane lane : process.getLanes()) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(lane.getId()); + processDiagramCanvas.drawPoolOrLane(lane.getName(), graphicInfo, scaleFactor); + } + } + + // Draw activities and their sequence-flows + for (Process process : bpmnModel.getProcesses()) { + for (FlowNode flowNode : process.findFlowElementsOfType(FlowNode.class)) { + if (!isPartOfCollapsedSubProcess(flowNode, bpmnModel)) { + drawActivity(processDiagramCanvas, bpmnModel, flowNode, highLightedActivities, highLightedFlows, scaleFactor, drawSequenceFlowNameWithNoLabelDI); + } + } + } + + // Draw artifacts + for (Process process : bpmnModel.getProcesses()) { + + for (Artifact artifact : process.getArtifacts()) { + drawArtifact(processDiagramCanvas, bpmnModel, artifact); + } + + List subProcesses = process.findFlowElementsOfType(SubProcess.class, true); + if (subProcesses != null) { + for (SubProcess subProcess : subProcesses) { + + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(subProcess.getId()); + if (graphicInfo != null && graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) { + continue; + } + + if (!isPartOfCollapsedSubProcess(subProcess, bpmnModel)) { + for (Artifact subProcessArtifact : subProcess.getArtifacts()) { + drawArtifact(processDiagramCanvas, bpmnModel, subProcessArtifact); + } + } + } + } + } + + return processDiagramCanvas; + } + + protected void prepareBpmnModel(BpmnModel bpmnModel) { + + // Need to make sure all elements have positive x and y. + // Check all graphicInfo and update the elements accordingly + + List allGraphicInfos = new ArrayList<>(); + if (bpmnModel.getLocationMap() != null) { + allGraphicInfos.addAll(bpmnModel.getLocationMap().values()); + } + if (bpmnModel.getLabelLocationMap() != null) { + allGraphicInfos.addAll(bpmnModel.getLabelLocationMap().values()); + } + if (bpmnModel.getFlowLocationMap() != null) { + for (List flowGraphicInfos : bpmnModel.getFlowLocationMap().values()) { + allGraphicInfos.addAll(flowGraphicInfos); + } + } + + if (allGraphicInfos.size() > 0) { + + boolean needsTranslationX = false; + boolean needsTranslationY = false; + + double lowestX = 0.0; + double lowestY = 0.0; + + // Collect lowest x and y + for (GraphicInfo graphicInfo : allGraphicInfos) { + + double x = graphicInfo.getX(); + double y = graphicInfo.getY(); + + if (x < lowestX) { + needsTranslationX = true; + lowestX = x; + } + if (y < lowestY) { + needsTranslationY = true; + lowestY = y; + } + + } + + // Update all graphicInfo objects + if (needsTranslationX || needsTranslationY) { + + double translationX = Math.abs(lowestX); + double translationY = Math.abs(lowestY); + + for (GraphicInfo graphicInfo : allGraphicInfos) { + if (needsTranslationX) { + graphicInfo.setX(graphicInfo.getX() + translationX); + } + if (needsTranslationY) { + graphicInfo.setY(graphicInfo.getY() + translationY); + } + } + } + + } + + } + + protected void drawActivity(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, + FlowNode flowNode, List highLightedActivities, List highLightedFlows, double scaleFactor, Boolean drawSequenceFlowNameWithNoLabelDI) { + + ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(flowNode.getClass()); + if (drawInstruction != null) { + + drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode); + + // Gather info on the multi instance marker + boolean multiInstanceSequential = false; + boolean multiInstanceParallel = false; + boolean collapsed = false; + if (flowNode instanceof Activity) { + Activity activity = (Activity) flowNode; + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics(); + if (multiInstanceLoopCharacteristics != null) { + multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential(); + multiInstanceParallel = !multiInstanceSequential; + } + } + + // Gather info on the collapsed marker + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + if (flowNode instanceof SubProcess) { + collapsed = graphicInfo.getExpanded() != null && !graphicInfo.getExpanded(); + } else if (flowNode instanceof CallActivity) { + collapsed = true; + } + + if (scaleFactor == 1.0) { + // Actually draw the markers + processDiagramCanvas.drawActivityMarkers((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(), + multiInstanceSequential, multiInstanceParallel, collapsed); + } + + // Draw highlighted activities + if (highLightedActivities.contains(flowNode.getId())) { + drawHighLightRed(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); + } else if (highLightedActivities.contains(Color.RED.toString() + flowNode.getId())) { + drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); + } + + } else if (flowNode instanceof Task) { + activityDrawInstructions.get(Task.class).draw(processDiagramCanvas, bpmnModel, flowNode); + + if (highLightedActivities.contains(flowNode.getId())) { + drawHighLightRed(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); + } else if (highLightedActivities.contains(Color.RED.toString() + flowNode.getId())) { + drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); + } + } + + // Outgoing transitions of activity + for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) { + boolean highLighted = (highLightedFlows.contains(sequenceFlow.getId())); + String defaultFlow = null; + if (flowNode instanceof Activity) { + defaultFlow = ((Activity) flowNode).getDefaultFlow(); + } else if (flowNode instanceof Gateway) { + defaultFlow = ((Gateway) flowNode).getDefaultFlow(); + } + + boolean isDefault = false; + if (defaultFlow != null && defaultFlow.equalsIgnoreCase(sequenceFlow.getId())) { + isDefault = true; + } + boolean drawConditionalIndicator = sequenceFlow.getConditionExpression() != null && sequenceFlow.getConditionExpression().trim().length() > 0 && !(flowNode instanceof Gateway); + + String sourceRef = sequenceFlow.getSourceRef(); + String targetRef = sequenceFlow.getTargetRef(); + FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef); + FlowElement targetElement = bpmnModel.getFlowElement(targetRef); + List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId()); + if (graphicInfoList != null && graphicInfoList.size() > 0) { + graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList); + int[] xPoints = new int[graphicInfoList.size()]; + int[] yPoints = new int[graphicInfoList.size()]; + + for (int i = 1; i < graphicInfoList.size(); i++) { + GraphicInfo graphicInfo = graphicInfoList.get(i); + GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1); + + if (i == 1) { + xPoints[0] = (int) previousGraphicInfo.getX(); + yPoints[0] = (int) previousGraphicInfo.getY(); + } + xPoints[i] = (int) graphicInfo.getX(); + yPoints[i] = (int) graphicInfo.getY(); + + } + + processDiagramCanvas.drawSequenceflow(xPoints, yPoints, drawConditionalIndicator, isDefault, highLighted, scaleFactor); + + // Draw sequenceflow label + GraphicInfo labelGraphicInfo = bpmnModel.getLabelGraphicInfo(sequenceFlow.getId()); + if (labelGraphicInfo != null) { + processDiagramCanvas.drawLabel(sequenceFlow.getName(), labelGraphicInfo, false); + } else { + if (drawSequenceFlowNameWithNoLabelDI) { + GraphicInfo lineCenter = getLineCenter(graphicInfoList); + processDiagramCanvas.drawLabel(sequenceFlow.getName(), lineCenter, false); + } + + } + } + } + + // Nested elements + if (flowNode instanceof FlowElementsContainer) { + for (FlowElement nestedFlowElement : ((FlowElementsContainer) flowNode).getFlowElements()) { + if (nestedFlowElement instanceof FlowNode && !isPartOfCollapsedSubProcess(nestedFlowElement, bpmnModel)) { + drawActivity(processDiagramCanvas, bpmnModel, (FlowNode) nestedFlowElement, + highLightedActivities, highLightedFlows, scaleFactor, drawSequenceFlowNameWithNoLabelDI); + } + } + } + } + + /** + * This method makes coordinates of connection flow better. + * + * @param processDiagramCanvas + * @param bpmnModel + * @param sourceElement + * @param targetElement + * @param graphicInfoList + * @return + */ + protected static List connectionPerfectionizer(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, BaseElement sourceElement, BaseElement targetElement, List graphicInfoList) { + GraphicInfo sourceGraphicInfo = bpmnModel.getGraphicInfo(sourceElement.getId()); + GraphicInfo targetGraphicInfo = bpmnModel.getGraphicInfo(targetElement.getId()); + + CustomDefaultProcessDiagramCanvas.SHAPE_TYPE sourceShapeType = getShapeType(sourceElement); + CustomDefaultProcessDiagramCanvas.SHAPE_TYPE targetShapeType = getShapeType(targetElement); + + return processDiagramCanvas.connectionPerfectionizer(sourceShapeType, targetShapeType, sourceGraphicInfo, targetGraphicInfo, graphicInfoList); + } + + /** + * This method returns shape type of base element.
+ * Each element can be presented as rectangle, rhombus, or ellipse. + * + * @param baseElement + * @return CustomDefaultProcessDiagramCanvas.SHAPE_TYPE + */ + protected static CustomDefaultProcessDiagramCanvas.SHAPE_TYPE getShapeType(BaseElement baseElement) { + if (baseElement instanceof Task || baseElement instanceof Activity || baseElement instanceof TextAnnotation) { + return CustomDefaultProcessDiagramCanvas.SHAPE_TYPE.Rectangle; + } else if (baseElement instanceof Gateway) { + return CustomDefaultProcessDiagramCanvas.SHAPE_TYPE.Rhombus; + } else if (baseElement instanceof Event) { + return CustomDefaultProcessDiagramCanvas.SHAPE_TYPE.Ellipse; + } else { + // unknown source element, just do not correct coordinates + } + return null; + } + + protected static GraphicInfo getLineCenter(List graphicInfoList) { + GraphicInfo gi = new GraphicInfo(); + + int[] xPoints = new int[graphicInfoList.size()]; + int[] yPoints = new int[graphicInfoList.size()]; + + double length = 0; + double[] lengths = new double[graphicInfoList.size()]; + lengths[0] = 0; + double m; + for (int i = 1; i < graphicInfoList.size(); i++) { + GraphicInfo graphicInfo = graphicInfoList.get(i); + GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1); + + if (i == 1) { + xPoints[0] = (int) previousGraphicInfo.getX(); + yPoints[0] = (int) previousGraphicInfo.getY(); + } + xPoints[i] = (int) graphicInfo.getX(); + yPoints[i] = (int) graphicInfo.getY(); + + length += Math.sqrt( + Math.pow((int) graphicInfo.getX() - (int) previousGraphicInfo.getX(), 2) + + Math.pow((int) graphicInfo.getY() - (int) previousGraphicInfo.getY(), 2)); + lengths[i] = length; + } + m = length / 2; + int p1 = 0; + int p2 = 1; + for (int i = 1; i < lengths.length; i++) { + double len = lengths[i]; + p1 = i - 1; + p2 = i; + if (len > m) { + break; + } + } + + GraphicInfo graphicInfo1 = graphicInfoList.get(p1); + GraphicInfo graphicInfo2 = graphicInfoList.get(p2); + + double AB = (int) graphicInfo2.getX() - (int) graphicInfo1.getX(); + double OA = (int) graphicInfo2.getY() - (int) graphicInfo1.getY(); + double OB = lengths[p2] - lengths[p1]; + double ob = m - lengths[p1]; + double ab = AB * ob / OB; + double oa = OA * ob / OB; + + double mx = graphicInfo1.getX() + ab; + double my = graphicInfo1.getY() + oa; + + gi.setX(mx); + gi.setY(my); + return gi; + } + + protected void drawArtifact(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) { + + ArtifactDrawInstruction drawInstruction = artifactDrawInstructions.get(artifact.getClass()); + if (drawInstruction != null) { + drawInstruction.draw(processDiagramCanvas, bpmnModel, artifact); + } + } + + private static void drawHighLight(CustomDefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { + processDiagramCanvas.drawHighLight((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); + + } + + private static void drawHighLightRed(CustomDefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { + processDiagramCanvas.drawHighLightRed((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); + + } + + protected static CustomDefaultProcessDiagramCanvas initProcessDiagramCanvas(BpmnModel bpmnModel, String imageType, + String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { + + // We need to calculate maximum values to know how big the image will be in its entirety + double minX = Double.MAX_VALUE; + double maxX = 0; + double minY = Double.MAX_VALUE; + double maxY = 0; + + for (Pool pool : bpmnModel.getPools()) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId()); + minX = graphicInfo.getX(); + maxX = graphicInfo.getX() + graphicInfo.getWidth(); + minY = graphicInfo.getY(); + maxY = graphicInfo.getY() + graphicInfo.getHeight(); + } + + List flowNodes = gatherAllFlowNodes(bpmnModel); + for (FlowNode flowNode : flowNodes) { + + GraphicInfo flowNodeGraphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + + // width + if (flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth() > maxX) { + maxX = flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth(); + } + if (flowNodeGraphicInfo.getX() < minX) { + minX = flowNodeGraphicInfo.getX(); + } + // height + if (flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight() > maxY) { + maxY = flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight(); + } + if (flowNodeGraphicInfo.getY() < minY) { + minY = flowNodeGraphicInfo.getY(); + } + + for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) { + List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId()); + if (graphicInfoList != null) { + for (GraphicInfo graphicInfo : graphicInfoList) { + // width + if (graphicInfo.getX() > maxX) { + maxX = graphicInfo.getX(); + } + if (graphicInfo.getX() < minX) { + minX = graphicInfo.getX(); + } + // height + if (graphicInfo.getY() > maxY) { + maxY = graphicInfo.getY(); + } + if (graphicInfo.getY() < minY) { + minY = graphicInfo.getY(); + } + } + } + } + } + + List artifacts = gatherAllArtifacts(bpmnModel); + for (Artifact artifact : artifacts) { + + GraphicInfo artifactGraphicInfo = bpmnModel.getGraphicInfo(artifact.getId()); + + if (artifactGraphicInfo != null) { + // width + if (artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth() > maxX) { + maxX = artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth(); + } + if (artifactGraphicInfo.getX() < minX) { + minX = artifactGraphicInfo.getX(); + } + // height + if (artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight() > maxY) { + maxY = artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight(); + } + if (artifactGraphicInfo.getY() < minY) { + minY = artifactGraphicInfo.getY(); + } + } + + List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId()); + if (graphicInfoList != null) { + for (GraphicInfo graphicInfo : graphicInfoList) { + // width + if (graphicInfo.getX() > maxX) { + maxX = graphicInfo.getX(); + } + if (graphicInfo.getX() < minX) { + minX = graphicInfo.getX(); + } + // height + if (graphicInfo.getY() > maxY) { + maxY = graphicInfo.getY(); + } + if (graphicInfo.getY() < minY) { + minY = graphicInfo.getY(); + } + } + } + } + + int nrOfLanes = 0; + for (Process process : bpmnModel.getProcesses()) { + for (Lane l : process.getLanes()) { + + nrOfLanes++; + + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(l.getId()); + // // width + if (graphicInfo.getX() + graphicInfo.getWidth() > maxX) { + maxX = graphicInfo.getX() + graphicInfo.getWidth(); + } + if (graphicInfo.getX() < minX) { + minX = graphicInfo.getX(); + } + // height + if (graphicInfo.getY() + graphicInfo.getHeight() > maxY) { + maxY = graphicInfo.getY() + graphicInfo.getHeight(); + } + if (graphicInfo.getY() < minY) { + minY = graphicInfo.getY(); + } + } + } + + // Special case, see https://activiti.atlassian.net/browse/ACT-1431 + if (flowNodes.isEmpty() && bpmnModel.getPools().isEmpty() && nrOfLanes == 0) { + // Nothing to show + minX = 0; + minY = 0; + } + + return new CustomDefaultProcessDiagramCanvas((int) maxX + 10, (int) maxY + 10, (int) minX, (int) minY, + imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); + } + + protected static List gatherAllArtifacts(BpmnModel bpmnModel) { + List artifacts = new ArrayList<>(); + for (Process process : bpmnModel.getProcesses()) { + artifacts.addAll(process.getArtifacts()); + } + return artifacts; + } + + protected static List gatherAllFlowNodes(BpmnModel bpmnModel) { + List flowNodes = new ArrayList<>(); + for (Process process : bpmnModel.getProcesses()) { + flowNodes.addAll(gatherAllFlowNodes(process)); + } + return flowNodes; + } + + protected static List gatherAllFlowNodes(FlowElementsContainer flowElementsContainer) { + List flowNodes = new ArrayList<>(); + for (FlowElement flowElement : flowElementsContainer.getFlowElements()) { + if (flowElement instanceof FlowNode) { + flowNodes.add((FlowNode) flowElement); + } + if (flowElement instanceof FlowElementsContainer) { + flowNodes.addAll(gatherAllFlowNodes((FlowElementsContainer) flowElement)); + } + } + return flowNodes; + } + + protected boolean isPartOfCollapsedSubProcess(FlowElement flowElement, BpmnModel model) { + SubProcess subProcess = flowElement.getSubProcess(); + if (subProcess != null) { + GraphicInfo graphicInfo = model.getGraphicInfo(subProcess.getId()); + if (graphicInfo != null && graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) { + return true; + } + + return isPartOfCollapsedSubProcess(subProcess, model); + } + + return false; + } + + public Map, ActivityDrawInstruction> getActivityDrawInstructions() { + return activityDrawInstructions; + } + + public void setActivityDrawInstructions( + Map, ActivityDrawInstruction> activityDrawInstructions) { + this.activityDrawInstructions = activityDrawInstructions; + } + + public Map, ArtifactDrawInstruction> getArtifactDrawInstructions() { + return artifactDrawInstructions; + } + + public void setArtifactDrawInstructions( + Map, ArtifactDrawInstruction> artifactDrawInstructions) { + this.artifactDrawInstructions = artifactDrawInstructions; + } + + protected interface ActivityDrawInstruction { + void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode); + } + + protected interface ArtifactDrawInstruction { + void draw(CustomDefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java new file mode 100644 index 000000000..c591bd642 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java @@ -0,0 +1,20 @@ +package org.dromara.workflow.flowable.config; + +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import org.flowable.spring.SpringProcessEngineConfiguration; +import org.flowable.spring.boot.EngineConfigurationConfigurer; +import org.springframework.context.annotation.Configuration; + +/** + * flowable配置 + * + * @author may + */ +@Configuration +public class FlowableConfig implements EngineConfigurationConfigurer { + + @Override + public void configure(SpringProcessEngineConfiguration processEngineConfiguration) { + processEngineConfiguration.setIdGenerator(IdWorker::getIdStr); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java new file mode 100644 index 000000000..737bed639 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java @@ -0,0 +1,18 @@ +package org.dromara.workflow.service; + +import jakarta.servlet.http.HttpServletResponse; + +/** + * 流程实例 服务层 + * + * @author may + */ +public interface IActProcessInstanceService { + /** + * 通过流程实例id获取历史流程图 + * + * @param processInstanceId 流程实例id + * @param response 响应 + */ + void getHistoryProcessImage(String processInstanceId, HttpServletResponse response); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java new file mode 100644 index 000000000..a54437d86 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -0,0 +1,132 @@ +package org.dromara.workflow.service.impl; + +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.apache.commons.io.IOUtils; +import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator; +import org.dromara.workflow.service.IActProcessInstanceService; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.history.HistoricActivityInstance; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.runtime.ProcessInstance; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.awt.*; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 流程实例 服务层实现 + * + * @author may + */ + +@RequiredArgsConstructor +@Service +public class ActProcessInstanceServiceImpl implements IActProcessInstanceService { + + private final RepositoryService repositoryService; + private final RuntimeService runtimeService; + private final HistoryService historyService; + + @Value("${flowable.activity-font-name}") + private String activityFontName; + + @Value("${flowable.label-font-name}") + private String labelFontName; + + @Value("${flowable.annotation-font-name}") + private String annotationFontName; + + /** + * 通过流程实例id获取历史流程图 + * + * @param processInstanceId 流程实例id + * @param response 响应 + */ + @Override + public void getHistoryProcessImage(String processInstanceId, HttpServletResponse response) { + // 设置页面不缓存 + response.setHeader("Pragma", "no-cache"); + response.addHeader("Cache-Control", "must-revalidate"); + response.addHeader("Cache-Control", "no-cache"); + response.addHeader("Cache-Control", "no-store"); + response.setDateHeader("Expires", 0); + InputStream inputStream = null; + try { + String processDefinitionId; + // 获取当前的流程实例 + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + // 如果流程已经结束,则得到结束节点 + if (Objects.isNull(processInstance)) { + HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + processDefinitionId = pi.getProcessDefinitionId(); + } else { + // 根据流程实例ID获得当前处于活动状态的ActivityId合集 + ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + processDefinitionId = pi.getProcessDefinitionId(); + } + + // 获得活动的节点 + List highLightedFlowList = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).orderByHistoricActivityInstanceStartTime().asc().list(); + + List highLightedFlows = new ArrayList<>(); + List highLightedNodes = new ArrayList<>(); + //高亮 + for (HistoricActivityInstance tempActivity : highLightedFlowList) { + if (FlowConstant.SEQUENCE_FLOW.equals(tempActivity.getActivityType())) { + //高亮线 + highLightedFlows.add(tempActivity.getActivityId()); + } else { + //高亮节点 + if (tempActivity.getEndTime() == null) { + highLightedNodes.add(Color.RED.toString() + tempActivity.getActivityId()); + } else { + highLightedNodes.add(tempActivity.getActivityId()); + } + } + } + List highLightedNodeList = new ArrayList<>(); + //运行中的节点 + List redNodeCollect = highLightedNodes.stream().filter(e -> e.contains(Color.RED.toString())).collect(Collectors.toList()); + //排除与运行中相同的节点 + for (String nodeId : highLightedNodes) { + if (!nodeId.contains(Color.RED.toString()) && !redNodeCollect.contains(Color.RED + nodeId)) { + highLightedNodeList.add(nodeId); + } + } + highLightedNodeList.addAll(redNodeCollect); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); + CustomDefaultProcessDiagramGenerator diagramGenerator = new CustomDefaultProcessDiagramGenerator(); + inputStream = diagramGenerator.generateDiagram(bpmnModel, "png", highLightedNodeList, highLightedFlows, activityFontName, labelFontName, annotationFontName, null, 1.0, true); + // 响应相关图片 + response.setContentType("image/png"); + + byte[] bytes = IOUtils.toByteArray(inputStream); + ServletOutputStream outputStream = response.getOutputStream(); + outputStream.write(bytes); + outputStream.flush(); + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index a02dadabc..e21fccae9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -53,6 +53,7 @@ public class ActTaskServiceImpl implements IActTaskService { * @param startProcessBo 启动流程参数 */ @Override + @Transactional(rollbackFor = Exception.class) public Map startWorkFlow(StartProcessBo startProcessBo) { Map map = new HashMap<>(); if (StringUtils.isBlank(startProcessBo.getBusinessKey())) { @@ -74,12 +75,7 @@ public class ActTaskServiceImpl implements IActTaskService { Map variables = startProcessBo.getVariables(); // 启动跳过表达式 variables.put("_FLOWABLE_SKIP_EXPRESSION_ENABLED", true); - ProcessInstance pi; - if (CollUtil.isNotEmpty(variables)) { - pi = runtimeService.startProcessInstanceByKeyAndTenantId(startProcessBo.getProcessKey(), startProcessBo.getBusinessKey(), variables, TenantHelper.getTenantId()); - } else { - pi = runtimeService.startProcessInstanceByKeyAndTenantId(startProcessBo.getProcessKey(), startProcessBo.getBusinessKey(), TenantHelper.getTenantId()); - } + ProcessInstance pi = runtimeService.startProcessInstanceByKeyAndTenantId(startProcessBo.getProcessKey(), startProcessBo.getBusinessKey(), variables, TenantHelper.getTenantId()); // 将流程定义名称 作为 流程实例名称 runtimeService.setProcessInstanceName(pi.getProcessInstanceId(), pi.getProcessDefinitionName()); // 申请人执行流程 @@ -116,10 +112,10 @@ public class ActTaskServiceImpl implements IActTaskService { if (task == null) { throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); } - //办理任务 - taskService.complete(completeTaskBo.getTaskId(), completeTaskBo.getVariables()); //办理意见 taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage()); + //办理任务 + taskService.complete(completeTaskBo.getTaskId(), completeTaskBo.getVariables()); return true; } catch (Exception e) { throw new ServiceException(e.getMessage()); From 11643253a0ab6b78f549e9ccb05e7ca5cb44da44 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Fri, 9 Jun 2023 12:32:06 +0800 Subject: [PATCH 024/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9E=E4=BE=8B=E8=BF=90=E8=A1=8C=E4=B8=AD=EF=BC=8C?= =?UTF-8?q?=E5=B7=B2=E7=BB=93=E6=9D=9F=E5=88=86=E9=A1=B5=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ActProcessInstanceController.java | 26 +++++- .../workflow/domain/bo/ProcessInstanceBo.java | 36 +++++++++ .../workflow/domain/vo/ProcessInstanceVo.java | 79 +++++++++++++++++++ .../service/IActProcessInstanceService.java | 19 +++++ .../impl/ActProcessInstanceServiceImpl.java | 66 +++++++++++++++- 5 files changed, 222 insertions(+), 4 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInstanceBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java index 4467277dc..42f33eb9b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java @@ -3,7 +3,10 @@ package org.dromara.workflow.controller; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; +import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; +import org.dromara.workflow.domain.bo.ProcessInstanceBo; +import org.dromara.workflow.domain.vo.ProcessInstanceVo; import org.dromara.workflow.service.IActProcessInstanceService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -21,6 +24,26 @@ public class ActProcessInstanceController extends BaseController { private final IActProcessInstanceService iActProcessInstanceService; + /** + * 分页查询正在运行的流程实例 + * + * @param processInstanceBo 参数 + */ + @GetMapping("/getProcessInstanceRunningByPage") + public TableDataInfo getProcessInstanceRunningByPage(ProcessInstanceBo processInstanceBo) { + return iActProcessInstanceService.getProcessInstanceRunningByPage(processInstanceBo); + } + + /** + * 分页查询已结束的流程实例 + * + * @param processInstanceBo 参数 + */ + @GetMapping("/getProcessInstanceFinishByPage") + public TableDataInfo getProcessInstanceFinishByPage(ProcessInstanceBo processInstanceBo) { + return iActProcessInstanceService.getProcessInstanceFinishByPage(processInstanceBo); + } + /** * 通过流程实例id获取历史流程图 * @@ -28,8 +51,7 @@ public class ActProcessInstanceController extends BaseController { * @param response 响应 */ @GetMapping("/getHistoryProcessImage/{processInstanceId}") - public void getHistoryProcessImage(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId, - HttpServletResponse response) { + public void getHistoryProcessImage(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId, HttpServletResponse response) { iActProcessInstanceService.getHistoryProcessImage(processInstanceId, response); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInstanceBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInstanceBo.java new file mode 100644 index 000000000..0e404243f --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInstanceBo.java @@ -0,0 +1,36 @@ +package org.dromara.workflow.domain.bo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.workflow.common.PageEntity; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 流程实例请求对象 + * + * @author may + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ProcessInstanceBo extends PageEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程名称 + */ + private String name; + + /** + * 任务发起人 + */ + private String startUserId; + + /** + * 业务id + */ + private String businessKey; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java new file mode 100644 index 000000000..0b36a1622 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java @@ -0,0 +1,79 @@ +package org.dromara.workflow.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流程实例视图 + * + * @author may + */ +@Data +public class ProcessInstanceVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程实例id + */ + private String id; + + /** + * 流程定义id + */ + private String processDefinitionId; + + /** + * 流程定义名称 + */ + private String processDefinitionName; + + /** + * 流程定义key + */ + private String processDefinitionKey; + + /** + * 流程定义版本 + */ + private String processDefinitionVersion; + + /** + * 部署id + */ + private String deploymentId; + + /** + * 业务id + */ + private String businessKey; + + /** + * 是否挂起 + */ + private boolean isSuspended; + + /** + * 租户id + */ + private String tenantId; + + /** + * 启动时间 + */ + private Date startTime; + + /** + * 结束时间 + */ + private Date endTime; + + /** + * 启动人id + */ + private String startUserId; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java index 737bed639..0d9450a93 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java @@ -1,6 +1,9 @@ package org.dromara.workflow.service; import jakarta.servlet.http.HttpServletResponse; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.bo.ProcessInstanceBo; +import org.dromara.workflow.domain.vo.ProcessInstanceVo; /** * 流程实例 服务层 @@ -15,4 +18,20 @@ public interface IActProcessInstanceService { * @param response 响应 */ void getHistoryProcessImage(String processInstanceId, HttpServletResponse response); + + /** + * 分页查询正在运行的流程实例 + * + * @param processInstanceBo 参数 + * @return 结果 + */ + TableDataInfo getProcessInstanceRunningByPage(ProcessInstanceBo processInstanceBo); + + /** + * 分页查询已结束的流程实例 + * + * @param processInstanceBo 参数 + * @return 结果 + */ + TableDataInfo getProcessInstanceFinishByPage(ProcessInstanceBo processInstanceBo); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index a54437d86..080302321 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -1,10 +1,16 @@ package org.dromara.workflow.service.impl; +import cn.hutool.core.bean.BeanUtil; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.apache.commons.io.IOUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.domain.bo.ProcessInstanceBo; +import org.dromara.workflow.domain.vo.ProcessInstanceVo; import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator; import org.dromara.workflow.service.IActProcessInstanceService; import org.flowable.bpmn.model.BpmnModel; @@ -13,7 +19,9 @@ import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.history.HistoricProcessInstanceQuery; import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.engine.runtime.ProcessInstanceQuery; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -23,7 +31,6 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; /** * 流程实例 服务层实现 @@ -48,6 +55,61 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService @Value("${flowable.annotation-font-name}") private String annotationFontName; + /** + * 分页查询正在运行的流程实例 + * + * @param processInstanceBo 参数 + */ + @Override + public TableDataInfo getProcessInstanceRunningByPage(ProcessInstanceBo processInstanceBo) { + List list = new ArrayList<>(); + ProcessInstanceQuery query = runtimeService.createProcessInstanceQuery(); + query.processInstanceTenantId(TenantHelper.getTenantId()); + if (StringUtils.isNotBlank(processInstanceBo.getName())) { + query.processInstanceNameLikeIgnoreCase("%" + processInstanceBo.getName() + "%"); + } + if (StringUtils.isNotBlank(processInstanceBo.getStartUserId())) { + query.startedBy(processInstanceBo.getStartUserId()); + } + if (StringUtils.isNotBlank(processInstanceBo.getBusinessKey())) { + query.processInstanceBusinessKey(processInstanceBo.getBusinessKey()); + } + List processInstances = query.listPage(processInstanceBo.getPageNum(), processInstanceBo.getPageSize()); + for (ProcessInstance processInstance : processInstances) { + list.add(BeanUtil.toBean(processInstance, ProcessInstanceVo.class)); + } + long count = query.count(); + return new TableDataInfo<>(list, count); + } + + /** + * 分页查询已结束的流程实例 + * + * @param processInstanceBo 参数 + */ + @Override + public TableDataInfo getProcessInstanceFinishByPage(ProcessInstanceBo processInstanceBo) { + List list = new ArrayList<>(); + HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery().finished() + .orderByProcessInstanceEndTime().desc(); + query.processInstanceTenantId(TenantHelper.getTenantId()); + if (StringUtils.isNotEmpty(processInstanceBo.getName())) { + query.processInstanceNameLike(processInstanceBo.getName()); + } + if (StringUtils.isNotEmpty(processInstanceBo.getStartUserId())) { + query.startedBy(processInstanceBo.getStartUserId()); + } + if (StringUtils.isNotBlank(processInstanceBo.getBusinessKey())) { + query.processInstanceBusinessKey(processInstanceBo.getBusinessKey()); + } + List historicProcessInstances = query.listPage(processInstanceBo.getPageNum(), processInstanceBo.getPageSize()); + for (HistoricProcessInstance historicProcessInstance : historicProcessInstances) { + list.add(BeanUtil.toBean(historicProcessInstance, ProcessInstanceVo.class)); + } + long count = query.count(); + return new TableDataInfo<>(list, count); + } + /** * 通过流程实例id获取历史流程图 * @@ -98,7 +160,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService } List highLightedNodeList = new ArrayList<>(); //运行中的节点 - List redNodeCollect = highLightedNodes.stream().filter(e -> e.contains(Color.RED.toString())).collect(Collectors.toList()); + List redNodeCollect = highLightedNodes.stream().filter(e -> e.contains(Color.RED.toString())).toList(); //排除与运行中相同的节点 for (String nodeId : highLightedNodes) { if (!nodeId.contains(Color.RED.toString()) && !redNodeCollect.contains(Color.RED + nodeId)) { From 4d63888080005384b9f34092e0613e4e723da3a1 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Fri, 9 Jun 2023 14:07:24 +0800 Subject: [PATCH 025/159] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=EF=BC=8C=E6=B5=81=E7=A8=8B=E5=AE=9E=E4=BE=8B=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E6=A8=A1=E7=B3=8A=E6=9F=A5=E8=AF=A2=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/ActProcessInstanceServiceImpl.java | 5 +++-- .../dromara/workflow/service/impl/ActTaskServiceImpl.java | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 080302321..5517d07bc 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -5,6 +5,7 @@ import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.apache.commons.io.IOUtils; +import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.tenant.helper.TenantHelper; @@ -94,7 +95,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService .orderByProcessInstanceEndTime().desc(); query.processInstanceTenantId(TenantHelper.getTenantId()); if (StringUtils.isNotEmpty(processInstanceBo.getName())) { - query.processInstanceNameLike(processInstanceBo.getName()); + query.processInstanceNameLikeIgnoreCase("%" + processInstanceBo.getName() + "%"); } if (StringUtils.isNotEmpty(processInstanceBo.getStartUserId())) { query.startedBy(processInstanceBo.getStartUserId()); @@ -160,7 +161,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService } List highLightedNodeList = new ArrayList<>(); //运行中的节点 - List redNodeCollect = highLightedNodes.stream().filter(e -> e.contains(Color.RED.toString())).toList(); + List redNodeCollect = StreamUtils.filter(highLightedNodes, e -> e.contains(Color.RED.toString())); //排除与运行中相同的节点 for (String nodeId : highLightedNodes) { if (!nodeId.contains(Color.RED.toString()) && !redNodeCollect.contains(Color.RED + nodeId)) { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index e21fccae9..32d413f0e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -138,7 +138,7 @@ public class ActTaskServiceImpl implements IActTaskService { query.taskCandidateGroupIn(groupIds); } if (StringUtils.isNotBlank(taskBo.getName())) { - query.taskNameLike(taskBo.getName()); + query.taskNameLike("%" + taskBo.getName() + "%"); } List taskList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); List list = new ArrayList<>(); @@ -160,7 +160,7 @@ public class ActTaskServiceImpl implements IActTaskService { HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery() .taskAssignee(userId).taskTenantId(TenantHelper.getTenantId()).finished().orderByHistoricTaskInstanceStartTime().asc(); if (StringUtils.isNotBlank(taskBo.getName())) { - query.taskNameLike(taskBo.getName()); + query.taskNameLike("%" + taskBo.getName() + "%"); } List taskInstanceList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); List list = new ArrayList<>(); From f494d0f3f0db6f7df2610412af6cb890594f74d0 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Fri, 9 Jun 2023 21:44:56 +0800 Subject: [PATCH 026/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=8B=BE=E5=8F=96=EF=BC=8C=E4=BB=BB=E5=8A=A1=E5=BD=92?= =?UTF-8?q?=E8=BF=98=EF=BC=8C=E4=BB=BB=E5=8A=A1=E7=BB=88=E6=AD=A2=EF=BC=8C?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=A7=94=E6=89=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/FlowConstant.java | 2 + .../controller/ActTaskController.java | 66 ++++++++++++- .../workflow/domain/bo/DelegateBo.java | 38 ++++++++ .../workflow/domain/bo/TerminationBo.java | 37 ++++++++ .../flowable/cmd/UpdateHiTaskInstCmd.java | 51 ++++++++++ .../workflow/service/IActTaskService.java | 20 +++- .../service/impl/ActTaskServiceImpl.java | 93 +++++++++++++++++-- .../dromara/workflow/utils/WorkflowUtils.java | 35 +++++++ 8 files changed, 326 insertions(+), 16 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TerminationBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateHiTaskInstCmd.java 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 index 61194bd89..34a63b91b 100644 --- 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 @@ -15,6 +15,8 @@ public interface FlowConstant { String MESSAGE_CURRENT_TASK_IS_NULL = "当前任务不存在或你不是任务办理人"; + String MESSAGE_SUSPENDED = "当前任务已"; + /** * 连线 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java index 886cf67c6..d75c6bb8a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java @@ -1,5 +1,6 @@ package org.dromara.workflow.controller; +import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.validate.AddGroup; @@ -7,12 +8,12 @@ import org.dromara.common.idempotent.annotation.RepeatSubmit; 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.CompleteTaskBo; -import org.dromara.workflow.domain.bo.StartProcessBo; -import org.dromara.workflow.domain.bo.TaskBo; +import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.service.IActTaskService; +import org.flowable.engine.TaskService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -31,6 +32,8 @@ public class ActTaskController extends BaseController { private final IActTaskService iActTaskService; + private final TaskService taskService; + /** * 启动任务 @@ -76,4 +79,61 @@ public class ActTaskController extends BaseController { public TableDataInfo getTaskFinishByPage(TaskBo taskBo) { return iActTaskService.getTaskFinishByPage(taskBo); } + + /** + * 签收(拾取)任务 + * + * @param taskId 任务id + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @PostMapping("/claim/{taskId}") + public R claimTask(@NotBlank(message = "任务id不能为空") @PathVariable String taskId) { + try { + taskService.claim(taskId, String.valueOf(LoginHelper.getUserId())); + return R.ok(); + } catch (Exception e) { + e.printStackTrace(); + return R.fail("签收任务失败:" + e.getMessage()); + } + } + + /** + * 归还(拾取的)任务 + * + * @param taskId 任务id + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @PostMapping("/returnTask/{taskId}") + public R returnTask(@NotBlank(message = "任务id不能为空") @PathVariable String taskId) { + try { + taskService.setAssignee(taskId, null); + return R.ok(); + } catch (Exception e) { + e.printStackTrace(); + return R.fail("归还任务失败:" + e.getMessage()); + } + } + + /** + * 委派任务 + * + * @param delegateBo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @PostMapping("/delegateTask") + public R delegateTask(@Validated({AddGroup.class}) @RequestBody DelegateBo delegateBo) { + return toAjax(iActTaskService.delegateTask(delegateBo)); + } + + /** + * 终止任务 + * + * @param terminationBo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.DELETE) + @PostMapping("/terminationTask") + public R terminationTask(@RequestBody TerminationBo terminationBo) { + return toAjax(iActTaskService.terminationTask(terminationBo)); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java new file mode 100644 index 000000000..a6846a6d6 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java @@ -0,0 +1,38 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 委派任务请求对象 + * + * @author may + */ +@Data +public class DelegateBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 委派人id + */ + @NotBlank(message = "委派人id不能为空", groups = {AddGroup.class}) + private String userId; + + /** + * 委派人名称 + */ + @NotBlank(message = "委派人名称不能为空", groups = {AddGroup.class}) + private String nickName; + + /** + * 任务id + */ + @NotBlank(message = "任务id不能为空", groups = {AddGroup.class}) + private String taskId; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TerminationBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TerminationBo.java new file mode 100644 index 000000000..61b761678 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TerminationBo.java @@ -0,0 +1,37 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 终止任务请求对象 + * + * @author may + */ +@Data +public class TerminationBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务id + */ + @NotBlank(message = "任务id为空", groups = AddGroup.class) + private String taskId; + + /** + * 转办人id + */ + @NotBlank(message = "转办人不能为空", groups = AddGroup.class) + private String userId; + + /** + * 审批意见 + */ + private String comment; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateHiTaskInstCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateHiTaskInstCmd.java new file mode 100644 index 000000000..b87ae816e --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateHiTaskInstCmd.java @@ -0,0 +1,51 @@ +package org.dromara.workflow.flowable.cmd; + +import org.dromara.common.core.exception.ServiceException; +import org.flowable.common.engine.impl.interceptor.Command; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.impl.util.CommandContextUtil; +import org.flowable.task.service.HistoricTaskService; +import org.flowable.task.service.impl.persistence.entity.HistoricTaskInstanceEntity; + +import java.util.Date; +import java.util.List; + + +/** + * 修改流程历史 + * + * @author may + */ +public class UpdateHiTaskInstCmd implements Command { + + private final List taskIds; + + private final String processDefinitionId; + + private final String processInstanceId; + + public UpdateHiTaskInstCmd(List taskIds, String processDefinitionId, String processInstanceId) { + this.taskIds = taskIds; + this.processDefinitionId = processDefinitionId; + this.processInstanceId = processInstanceId; + } + + @Override + public Boolean execute(CommandContext commandContext) { + try { + HistoricTaskService historicTaskService = CommandContextUtil.getHistoricTaskService(); + for (String taskId : taskIds) { + HistoricTaskInstanceEntity historicTask = historicTaskService.getHistoricTask(taskId); + if (historicTask != null) { + historicTask.setProcessDefinitionId(processDefinitionId); + historicTask.setProcessDefinitionId(processInstanceId); + historicTask.setCreateTime(new Date()); + CommandContextUtil.getHistoricTaskService().updateHistoricTask(historicTask, true); + } + } + return true; + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java index 15b149b0e..e4edc887c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java @@ -1,9 +1,7 @@ package org.dromara.workflow.service; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.workflow.domain.bo.CompleteTaskBo; -import org.dromara.workflow.domain.bo.StartProcessBo; -import org.dromara.workflow.domain.bo.TaskBo; +import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.TaskVo; import java.util.Map; @@ -46,4 +44,20 @@ public interface IActTaskService { * @return 结果 */ TableDataInfo getTaskFinishByPage(TaskBo taskBo); + + /** + * 委派任务 + * + * @param delegateBo 参数 + * @return 结果 + */ + boolean delegateTask(DelegateBo delegateBo); + + /** + * 终止任务 + * + * @param terminationBo 参数 + * @return 结果 + */ + boolean terminationTask(TerminationBo terminationBo); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 32d413f0e..95063b7f4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -2,19 +2,22 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.workflow.common.constant.FlowConstant; -import org.dromara.workflow.domain.bo.CompleteTaskBo; -import org.dromara.workflow.domain.bo.StartProcessBo; -import org.dromara.workflow.domain.bo.TaskBo; +import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.service.IActTaskService; +import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.engine.HistoryService; import org.flowable.engine.RuntimeService; @@ -25,6 +28,7 @@ import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.api.history.HistoricTaskInstanceQuery; +import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -32,7 +36,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** * 任务 服务层实现 @@ -70,7 +73,7 @@ public class ActTaskServiceImpl implements IActTaskService { return map; } // 设置启动人 - Authentication.setAuthenticatedUserId(LoginHelper.getUserId().toString()); + Authentication.setAuthenticatedUserId(String.valueOf(LoginHelper.getUserId())); // 启动流程实例(提交申请) Map variables = startProcessBo.getVariables(); // 启动跳过表达式 @@ -100,12 +103,12 @@ public class ActTaskServiceImpl implements IActTaskService { public boolean completeTask(CompleteTaskBo completeTaskBo) { try { List roles = LoginHelper.getLoginUser().getRoles(); - String userId = LoginHelper.getUserId().toString(); + String userId = String.valueOf(LoginHelper.getUserId()); TaskQuery taskQuery = taskService.createTaskQuery(); taskQuery.taskId(completeTaskBo.getTaskId()) .taskTenantId(TenantHelper.getTenantId()).taskCandidateOrAssigned(userId); if (CollUtil.isNotEmpty(roles)) { - List groupIds = roles.stream().map(e -> String.valueOf(e.getRoleId())).collect(Collectors.toList()); + List groupIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId())); taskQuery.taskCandidateGroupIn(groupIds); } Task task = taskQuery.singleResult(); @@ -130,11 +133,11 @@ public class ActTaskServiceImpl implements IActTaskService { @Override public TableDataInfo getTaskWaitByPage(TaskBo taskBo) { List roles = LoginHelper.getLoginUser().getRoles(); - String userId = LoginHelper.getUserId().toString(); + String userId = String.valueOf(LoginHelper.getUserId()); TaskQuery query = taskService.createTaskQuery(); query.taskTenantId(TenantHelper.getTenantId()).taskCandidateOrAssigned(userId); if (CollUtil.isNotEmpty(roles)) { - List groupIds = roles.stream().map(e -> String.valueOf(e.getRoleId())).collect(Collectors.toList()); + List groupIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId())); query.taskCandidateGroupIn(groupIds); } if (StringUtils.isNotBlank(taskBo.getName())) { @@ -156,7 +159,7 @@ public class ActTaskServiceImpl implements IActTaskService { */ @Override public TableDataInfo getTaskFinishByPage(TaskBo taskBo) { - String userId = LoginHelper.getUserId().toString(); + String userId = String.valueOf(LoginHelper.getUserId()); HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery() .taskAssignee(userId).taskTenantId(TenantHelper.getTenantId()).finished().orderByHistoricTaskInstanceStartTime().asc(); if (StringUtils.isNotBlank(taskBo.getName())) { @@ -170,4 +173,74 @@ public class ActTaskServiceImpl implements IActTaskService { long count = query.count(); return new TableDataInfo<>(list, count); } + + /** + * 委派任务 + * + * @param delegateBo 参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean delegateTask(DelegateBo delegateBo) { + TaskEntity task = (TaskEntity) taskService.createTaskQuery() + .taskTenantId(TenantHelper.getTenantId()).taskId(delegateBo.getTaskId()) + .taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); + if (ObjectUtil.isEmpty(task)) { + throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); + } + if (task.isSuspended()) { + throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); + } + try { + TaskEntity newTask = WorkflowUtils.createNewTask(task); + taskService.addComment(newTask.getId(), task.getProcessInstanceId(), "【" + LoginHelper.getUsername() + "】委派给【" + delegateBo.getNickName() + "】"); + //委托任务 + taskService.delegateTask(delegateBo.getTaskId(), delegateBo.getUserId()); + //办理生成的任务记录 + taskService.complete(newTask.getId()); + return true; + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 终止任务 + * + * @param terminationBo 参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean terminationTask(TerminationBo terminationBo) { + Task task = taskService.createTaskQuery() + .taskTenantId(TenantHelper.getTenantId()).taskId(terminationBo.getTaskId()).singleResult(); + + if (ObjectUtil.isEmpty(task)) { + throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); + } + if (task.isSuspended()) { + throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); + } + try { + if (StringUtils.isBlank(terminationBo.getComment())) { + terminationBo.setComment(LoginHelper.getUsername() + "终止了申请"); + } else { + terminationBo.setComment(LoginHelper.getUsername() + "终止了申请:" + terminationBo.getComment()); + } + taskService.addComment(task.getId(), task.getProcessInstanceId(), terminationBo.getComment()); + List list = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()) + .processInstanceId(task.getProcessInstanceId()).list(); + if (CollectionUtil.isNotEmpty(list)) { + List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); + if (CollectionUtil.isNotEmpty(subTasks)) { + subTasks.forEach(e -> taskService.deleteTask(e.getId())); + } + runtimeService.deleteProcessInstance(task.getProcessInstanceId(), StrUtil.EMPTY); + } + return true; + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + } } 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 index ac52c8b00..7ee631121 100644 --- 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 @@ -2,12 +2,19 @@ package org.dromara.workflow.utils; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ObjectUtil; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd; import org.flowable.bpmn.converter.BpmnXMLConverter; import org.flowable.bpmn.model.*; import org.flowable.editor.language.json.converter.BpmnJsonConverter; +import org.flowable.engine.ProcessEngine; +import org.flowable.task.api.Task; +import org.flowable.task.service.impl.persistence.entity.TaskEntity; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; @@ -16,6 +23,8 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.rmi.ServerException; import java.util.Collection; +import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -29,6 +38,8 @@ public class WorkflowUtils { public WorkflowUtils() { } + private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class); + /** * bpmnModel转为xml * @@ -118,4 +129,28 @@ public class WorkflowUtils { throw new ServerException(subtask ? "子流程必须存在结束节点!" : "" + "必须存在结束节点!"); } } + + public static TaskEntity createNewTask(Task currentTask) { + TaskEntity task = null; + if (ObjectUtil.isNotEmpty(currentTask)) { + task = (TaskEntity) PROCESS_ENGINE.getTaskService().newTask(); + task.setCategory(currentTask.getCategory()); + task.setDescription(currentTask.getDescription()); + task.setTenantId(currentTask.getTenantId()); + task.setAssignee(currentTask.getAssignee()); + task.setName(currentTask.getName()); + task.setProcessDefinitionId(currentTask.getProcessDefinitionId()); + task.setProcessInstanceId(currentTask.getProcessInstanceId()); + task.setTaskDefinitionKey(currentTask.getTaskDefinitionKey()); + task.setPriority(currentTask.getPriority()); + task.setCreateTime(new Date()); + task.setTenantId(TenantHelper.getTenantId()); + PROCESS_ENGINE.getTaskService().saveTask(task); + } + if (ObjectUtil.isNotNull(task)) { + UpdateHiTaskInstCmd updateHiTaskInstCmd = new UpdateHiTaskInstCmd(Collections.singletonList(task.getId()), task.getProcessDefinitionId(), task.getProcessInstanceId()); + PROCESS_ENGINE.getManagementService().executeCommand(updateHiTaskInstCmd); + } + return task; + } } From 91c10d31a49f2c3970ca2421f864395102903361 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 11 Jun 2023 17:04:26 +0800 Subject: [PATCH 027/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E8=BD=AC?= =?UTF-8?q?=E5=8A=9E=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ActTaskController.java | 11 ++++++ .../workflow/domain/bo/TransmitBo.java | 37 +++++++++++++++++++ .../workflow/service/IActTaskService.java | 8 ++++ .../service/impl/ActTaskServiceImpl.java | 28 ++++++++++++++ 4 files changed, 84 insertions(+) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransmitBo.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java index d75c6bb8a..e52e29d6e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java @@ -136,4 +136,15 @@ public class ActTaskController extends BaseController { return toAjax(iActTaskService.terminationTask(terminationBo)); } + /** + * 转办任务 + * + * @param transmitBo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @PostMapping("/transferTask") + public R transferTask(@Validated({AddGroup.class}) @RequestBody TransmitBo transmitBo) { + return toAjax(iActTaskService.transferTask(transmitBo)); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransmitBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransmitBo.java new file mode 100644 index 000000000..3eb6609fd --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TransmitBo.java @@ -0,0 +1,37 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 终转办务请求对象 + * + * @author may + */ +@Data +public class TransmitBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务id + */ + @NotBlank(message = "任务id为空", groups = AddGroup.class) + private String taskId; + + /** + * 转办人id + */ + @NotBlank(message = "转办人不能为空", groups = AddGroup.class) + private String userId; + + /** + * 审批意见 + */ + private String comment; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java index e4edc887c..d5c2e5eb7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java @@ -60,4 +60,12 @@ public interface IActTaskService { * @return 结果 */ boolean terminationTask(TerminationBo terminationBo); + + /** + * 转办任务 + * + * @param transmitBo 参数 + * @return 结果 + */ + boolean transferTask(TransmitBo transmitBo); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 95063b7f4..c97d644f4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -243,4 +243,32 @@ public class ActTaskServiceImpl implements IActTaskService { throw new ServiceException(e.getMessage()); } } + + /** + * 转办任务 + * + * @param transmitBo 参数 + */ + @Override + public boolean transferTask(TransmitBo transmitBo) { + Task task = taskService.createTaskQuery().taskId(transmitBo.getTaskId()).taskTenantId(TenantHelper.getTenantId()) + .taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); + if (ObjectUtil.isEmpty(task)) { + throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); + } + if (task.isSuspended()) { + throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); + } + try { + TaskEntity newTask = WorkflowUtils.createNewTask(task); + taskService.addComment(newTask.getId(), task.getProcessInstanceId(), + StringUtils.isNotBlank(transmitBo.getComment()) ? transmitBo.getComment() : LoginHelper.getUsername() + "转办了任务"); + taskService.complete(newTask.getId()); + taskService.setAssignee(task.getId(), transmitBo.getUserId()); + return true; + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException(e.getMessage()); + } + } } From 7428cd42f25b06436fe047b0b3add769e8668a46 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Mon, 12 Jun 2023 17:58:11 +0800 Subject: [PATCH 028/159] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=E5=A7=94?= =?UTF-8?q?=E6=89=98=E5=8A=9E=E7=90=86=EF=BC=8C=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/common/constant/FlowConstant.java | 12 +++++++++++- .../workflow/service/impl/ActTaskServiceImpl.java | 11 ++++++++++- .../org/dromara/workflow/utils/WorkflowUtils.java | 5 +++++ 3 files changed, 26 insertions(+), 2 deletions(-) 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 index 34a63b91b..f1b4033c2 100644 --- 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 @@ -15,11 +15,21 @@ public interface FlowConstant { String MESSAGE_CURRENT_TASK_IS_NULL = "当前任务不存在或你不是任务办理人"; - String MESSAGE_SUSPENDED = "当前任务已"; + String MESSAGE_SUSPENDED = "当前任务已挂起"; /** * 连线 */ String SEQUENCE_FLOW = "sequenceFlow"; + /** + * 流程委派标识 + */ + String PENDING = "PENDING"; + + /** + * 流程启动者 + */ + String INITIATOR = "initiator"; + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index c97d644f4..44b92fdaa 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -72,10 +72,11 @@ public class ActTaskServiceImpl implements IActTaskService { map.put("taskId", taskResult.get(0).getId()); return map; } - // 设置启动人 Authentication.setAuthenticatedUserId(String.valueOf(LoginHelper.getUserId())); // 启动流程实例(提交申请) Map variables = startProcessBo.getVariables(); + // 设置启动人 + variables.put(FlowConstant.INITIATOR, String.valueOf(LoginHelper.getUserId())); // 启动跳过表达式 variables.put("_FLOWABLE_SKIP_EXPRESSION_ENABLED", true); ProcessInstance pi = runtimeService.startProcessInstanceByKeyAndTenantId(startProcessBo.getProcessKey(), startProcessBo.getBusinessKey(), variables, TenantHelper.getTenantId()); @@ -115,6 +116,14 @@ public class ActTaskServiceImpl implements IActTaskService { if (task == null) { throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); } + //办理委托任务 + if (ObjectUtil.isNotEmpty(task.getDelegationState()) && FlowConstant.PENDING.equals(task.getDelegationState().name())) { + taskService.resolveTask(completeTaskBo.getTaskId()); + TaskEntity newTask = WorkflowUtils.createNewTask(task); + taskService.addComment(newTask.getId(), task.getProcessInstanceId(), completeTaskBo.getMessage()); + taskService.complete(newTask.getId()); + return true; + } //办理意见 taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage()); //办理任务 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 index 7ee631121..bd7a16930 100644 --- 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 @@ -130,6 +130,11 @@ public class WorkflowUtils { } } + /** + * 创建一个新任务 + * + * @param currentTask 参数 + */ public static TaskEntity createNewTask(Task currentTask) { TaskEntity task = null; if (ObjectUtil.isNotEmpty(currentTask)) { From 9ff82940acab87537a17299aa65c3d8a6ae9a579 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Mon, 12 Jun 2023 21:21:45 +0800 Subject: [PATCH 029/159] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E5=AF=BC=E5=87=BA=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/service/impl/ActModelServiceImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 391f433e4..d725f55fa 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 @@ -300,8 +300,7 @@ public class ActModelServiceImpl implements IActModelService { Model model = repositoryService.getModel(modelId); byte[] xmlBytes = repositoryService.getModelEditorSource(modelId); if (ObjectUtil.isNotNull(model)) { - byte[] bytes = WorkflowUtils.bpmnJsonToXmlBytes(xmlBytes); - if (JSONUtil.isTypeJSON(IOUtils.toString(xmlBytes, StandardCharsets.UTF_8.toString())) && ArrayUtil.isEmpty(bytes)) { + if (JSONUtil.isTypeJSON(IOUtils.toString(xmlBytes, StandardCharsets.UTF_8.toString())) && ArrayUtil.isEmpty(WorkflowUtils.bpmnJsonToXmlBytes(xmlBytes))) { zipName = "模型不能为空,请至少设计一条主线流程!"; zos.putNextEntry(new ZipEntry(zipName + ".txt")); zos.write(zipName.getBytes(StandardCharsets.UTF_8)); From bf692f2b26df5a9bf148261a1608711541e81681 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Mon, 12 Jun 2023 22:04:54 +0800 Subject: [PATCH 030/159] =?UTF-8?q?=E8=BF=98=E5=8E=9F=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/common/constant/FlowConstant.java | 5 ----- .../dromara/workflow/service/impl/ActTaskServiceImpl.java | 3 +-- 2 files changed, 1 insertion(+), 7 deletions(-) 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 index f1b4033c2..0de3f582e 100644 --- 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 @@ -27,9 +27,4 @@ public interface FlowConstant { */ String PENDING = "PENDING"; - /** - * 流程启动者 - */ - String INITIATOR = "initiator"; - } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 44b92fdaa..910833ac3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -72,11 +72,10 @@ public class ActTaskServiceImpl implements IActTaskService { map.put("taskId", taskResult.get(0).getId()); return map; } + // 设置启动人 Authentication.setAuthenticatedUserId(String.valueOf(LoginHelper.getUserId())); // 启动流程实例(提交申请) Map variables = startProcessBo.getVariables(); - // 设置启动人 - variables.put(FlowConstant.INITIATOR, String.valueOf(LoginHelper.getUserId())); // 启动跳过表达式 variables.put("_FLOWABLE_SKIP_EXPRESSION_ENABLED", true); ProcessInstance pi = runtimeService.startProcessInstanceByKeyAndTenantId(startProcessBo.getProcessKey(), startProcessBo.getBusinessKey(), variables, TenantHelper.getTenantId()); From fd22331be11b1c4a1c2ab19427003b2d2a500cf8 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Wed, 14 Jun 2023 12:32:55 +0800 Subject: [PATCH 031/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ActProcessInstanceController.java | 14 +++ .../workflow/domain/vo/ActHistoryInfoVo.java | 75 ++++++++++++++++ .../service/IActProcessInstanceService.java | 11 +++ .../impl/ActProcessInstanceServiceImpl.java | 89 ++++++++++++++++++- 4 files changed, 187 insertions(+), 2 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java index 42f33eb9b..3831c66a4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java @@ -3,14 +3,18 @@ package org.dromara.workflow.controller; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotBlank; 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.ProcessInstanceBo; +import org.dromara.workflow.domain.vo.ActHistoryInfoVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; import org.dromara.workflow.service.IActProcessInstanceService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * 流程实例管理 控制层 * @@ -54,4 +58,14 @@ public class ActProcessInstanceController extends BaseController { public void getHistoryProcessImage(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId, HttpServletResponse response) { iActProcessInstanceService.getHistoryProcessImage(processInstanceId, response); } + + /** + * 获取审批记录 + * + * @param processInstanceId 流程实例id + */ + @GetMapping("/getHistoryRecord/{processInstanceId}") + public R> getHistoryRecord(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) { + return R.ok(iActProcessInstanceService.getHistoryRecord(processInstanceId)); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java new file mode 100644 index 000000000..093e65945 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java @@ -0,0 +1,75 @@ +package org.dromara.workflow.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流程审批记录视图 + * + * @author may + */ +@Data +public class ActHistoryInfoVo implements Serializable { + + @Serial + private static final long serialVersionUID=1L; + /** + * 任务id + */ + private String id; + /** + * 节点id + */ + private String taskDefinitionKey; + /** + * 任务名称 + */ + private String name; + /** + * 流程实例id + */ + private String processInstanceId; + /** + * 开始时间 + */ + private Date startTime; + /** + * 结束时间 + */ + private Date endTime; + /** + * 运行时长 + */ + private String runDuration; + /** + * 状态 + */ + private String status; + /** + * 办理人id + */ + private String assignee; + + /** + * 办理人名称 + */ + private String nickName; + + /** + * 办理人id + */ + private String owner; + + /** + * 审批信息id + */ + private String commentId; + + /** + * 审批信息 + */ + private String comment; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java index 0d9450a93..faf0704a7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java @@ -3,8 +3,11 @@ package org.dromara.workflow.service; import jakarta.servlet.http.HttpServletResponse; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.bo.ProcessInstanceBo; +import org.dromara.workflow.domain.vo.ActHistoryInfoVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; +import java.util.List; + /** * 流程实例 服务层 * @@ -34,4 +37,12 @@ public interface IActProcessInstanceService { * @return 结果 */ TableDataInfo getProcessInstanceFinishByPage(ProcessInstanceBo processInstanceBo); + + /** + * 获取审批记录 + * + * @param processInstanceId 流程实例id + * @return 结果 + */ + List getHistoryRecord(String processInstanceId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 5517d07bc..7344de83a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -1,6 +1,8 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -9,8 +11,11 @@ import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysUserService; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.domain.bo.ProcessInstanceBo; +import org.dromara.workflow.domain.vo.ActHistoryInfoVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator; import org.dromara.workflow.service.IActProcessInstanceService; @@ -18,20 +23,24 @@ import org.flowable.bpmn.model.BpmnModel; import org.flowable.engine.HistoryService; import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstanceQuery; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstanceQuery; +import org.flowable.engine.task.Comment; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.awt.*; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; +import java.util.*; import java.util.List; -import java.util.Objects; +import java.util.stream.Collectors; /** * 流程实例 服务层实现 @@ -46,6 +55,8 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService private final RepositoryService repositoryService; private final RuntimeService runtimeService; private final HistoryService historyService; + private final ISysUserService iSysUserService; + private final TaskService taskService; @Value("${flowable.activity-font-name}") private String activityFontName; @@ -192,4 +203,78 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService } } } + + /** + * 获取审批记录 + * + * @param processInstanceId 流程实例id + */ + @Override + public List getHistoryRecord(String processInstanceId) { + //查询任务办理记录 + List list = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(processInstanceId).taskTenantId(TenantHelper.getTenantId()).orderByHistoricTaskInstanceEndTime().desc().list(); + list = StreamUtils.sorted(list, Comparator.comparing(HistoricTaskInstance::getEndTime, Comparator.nullsFirst(Date::compareTo))); + List actHistoryInfoVoList = new ArrayList<>(); + for (HistoricTaskInstance historicTaskInstance : list) { + ActHistoryInfoVo actHistoryInfoVo = new ActHistoryInfoVo(); + BeanUtils.copyProperties(historicTaskInstance, actHistoryInfoVo); + actHistoryInfoVo.setStatus(actHistoryInfoVo.getEndTime() == null ? "待处理" : "已处理"); + List taskComments = taskService.getTaskComments(historicTaskInstance.getId()); + if (CollUtil.isNotEmpty(taskComments)) { + actHistoryInfoVo.setCommentId(taskComments.get(0).getId()); + String message = taskComments.stream().map(Comment::getFullMessage).collect(Collectors.joining("。")); + if (StringUtils.isNotBlank(message)) { + actHistoryInfoVo.setComment(message); + } + } + if (ObjectUtil.isNotEmpty(historicTaskInstance.getDurationInMillis())) { + actHistoryInfoVo.setRunDuration(getDuration(historicTaskInstance.getDurationInMillis())); + } + actHistoryInfoVoList.add(actHistoryInfoVo); + } + //翻译人员名称 + if (CollUtil.isNotEmpty(actHistoryInfoVoList)) { + actHistoryInfoVoList.forEach(e -> { + SysUserVo sysUserVo = iSysUserService.selectUserById(Long.valueOf(e.getAssignee())); + e.setNickName(ObjectUtil.isNotEmpty(sysUserVo) ? sysUserVo.getNickName() : ""); + }); + } + List collect = new ArrayList<>(); + //待办理 + List waitingTask = StreamUtils.filter(actHistoryInfoVoList, e -> e.getEndTime() == null); + //已办理 + List finishTask = StreamUtils.filter(actHistoryInfoVoList, e -> e.getEndTime() != null); + collect.addAll(waitingTask); + collect.addAll(finishTask); + return collect; + } + + /** + * 任务完成时间处理 + * + * @param time 时间 + */ + private String getDuration(long time) { + + long day = time / (24 * 60 * 60 * 1000); + long hour = (time / (60 * 60 * 1000) - day * 24); + long minute = ((time / (60 * 1000)) - day * 24 * 60 - hour * 60); + long second = (time / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60); + + if (day > 0) { + return day + "天" + hour + "小时" + minute + "分钟"; + } + if (hour > 0) { + return hour + "小时" + minute + "分钟"; + } + if (minute > 0) { + return minute + "分钟"; + } + if (second > 0) { + return second + "秒"; + } else { + return 0 + "秒"; + } + } } From b07b60fe6063fb934f1c681d87fcaa10494bb1a3 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Wed, 14 Jun 2023 18:47:52 +0800 Subject: [PATCH 032/159] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E9=A2=84=E8=A7=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ActProcessInstanceController.java | 5 +- .../workflow/domain/vo/GraphicInfoVo.java | 47 +++++++++++++++++++ .../service/IActProcessInstanceService.java | 3 +- .../impl/ActProcessInstanceServiceImpl.java | 25 ++++++++-- 4 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/GraphicInfoVo.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java index 3831c66a4..c28b75200 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java @@ -7,13 +7,12 @@ 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.ProcessInstanceBo; -import org.dromara.workflow.domain.vo.ActHistoryInfoVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; import org.dromara.workflow.service.IActProcessInstanceService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.List; +import java.util.Map; /** * 流程实例管理 控制层 @@ -65,7 +64,7 @@ public class ActProcessInstanceController extends BaseController { * @param processInstanceId 流程实例id */ @GetMapping("/getHistoryRecord/{processInstanceId}") - public R> getHistoryRecord(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) { + public R> getHistoryRecord(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) { return R.ok(iActProcessInstanceService.getHistoryRecord(processInstanceId)); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/GraphicInfoVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/GraphicInfoVo.java new file mode 100644 index 000000000..763613165 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/GraphicInfoVo.java @@ -0,0 +1,47 @@ +package org.dromara.workflow.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 节点图形信息 + * + * @author may + */ +@Data +public class GraphicInfoVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + /** + * x坐标 + */ + private double x; + + /** + * y坐标 + */ + private double y; + + /** + * 节点高度 + */ + private double height; + + /** + * 节点宽度 + */ + private double width; + + /** + * 节点id + */ + private String nodeId; + + /** + * 节点名称 + */ + private String nodeName; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java index faf0704a7..8b3afde7f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java @@ -7,6 +7,7 @@ import org.dromara.workflow.domain.vo.ActHistoryInfoVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; import java.util.List; +import java.util.Map; /** * 流程实例 服务层 @@ -44,5 +45,5 @@ public interface IActProcessInstanceService { * @param processInstanceId 流程实例id * @return 结果 */ - List getHistoryRecord(String processInstanceId); + Map getHistoryRecord(String processInstanceId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 7344de83a..ea9229eae 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -16,10 +16,11 @@ import org.dromara.system.service.ISysUserService; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.domain.bo.ProcessInstanceBo; import org.dromara.workflow.domain.vo.ActHistoryInfoVo; +import org.dromara.workflow.domain.vo.GraphicInfoVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator; import org.dromara.workflow.service.IActProcessInstanceService; -import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.*; import org.flowable.engine.HistoryService; import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; @@ -27,6 +28,7 @@ import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstanceQuery; +import org.flowable.engine.impl.util.ProcessDefinitionUtil; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstanceQuery; import org.flowable.engine.task.Comment; @@ -210,7 +212,8 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService * @param processInstanceId 流程实例id */ @Override - public List getHistoryRecord(String processInstanceId) { + public Map getHistoryRecord(String processInstanceId) { + Map map = new HashMap<>(); //查询任务办理记录 List list = historyService.createHistoricTaskInstanceQuery() .processInstanceId(processInstanceId).taskTenantId(TenantHelper.getTenantId()).orderByHistoricTaskInstanceEndTime().desc().list(); @@ -247,7 +250,23 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService List finishTask = StreamUtils.filter(actHistoryInfoVoList, e -> e.getEndTime() != null); collect.addAll(waitingTask); collect.addAll(finishTask); - return collect; + //审批记录 + map.put("historyRecordList", collect); + BpmnModel bpmnModel = repositoryService.getBpmnModel(list.get(0).getProcessDefinitionId()); + List graphicInfoVos = new ArrayList<>(); + Collection flowElements = bpmnModel.getMainProcess().getFlowElements(); + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof UserTask) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowElement.getId()); + GraphicInfoVo graphicInfoVo = BeanUtil.toBean(graphicInfo, GraphicInfoVo.class); + graphicInfoVo.setNodeId(flowElement.getId()); + graphicInfoVo.setNodeName(flowElement.getName()); + graphicInfoVos.add(graphicInfoVo); + } + } + //节点图形信息 + map.put("graphicInfoVos", graphicInfoVos); + return map; } /** From 4c5a350562e55c042b1573bb2e4f7926a3b7be5a Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Wed, 14 Jun 2023 23:03:09 +0800 Subject: [PATCH 033/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ActProcessInstanceServiceImpl.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index ea9229eae..20d1dc522 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -28,7 +28,6 @@ import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstanceQuery; -import org.flowable.engine.impl.util.ProcessDefinitionUtil; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstanceQuery; import org.flowable.engine.task.Comment; @@ -217,7 +216,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService //查询任务办理记录 List list = historyService.createHistoricTaskInstanceQuery() .processInstanceId(processInstanceId).taskTenantId(TenantHelper.getTenantId()).orderByHistoricTaskInstanceEndTime().desc().list(); - list = StreamUtils.sorted(list, Comparator.comparing(HistoricTaskInstance::getEndTime, Comparator.nullsFirst(Date::compareTo))); + list = StreamUtils.sorted(list, Comparator.comparing(HistoricTaskInstance::getEndTime, Comparator.nullsFirst(Date::compareTo)).reversed()); List actHistoryInfoVoList = new ArrayList<>(); for (HistoricTaskInstance historicTaskInstance : list) { ActHistoryInfoVo actHistoryInfoVo = new ActHistoryInfoVo(); @@ -243,6 +242,25 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService e.setNickName(ObjectUtil.isNotEmpty(sysUserVo) ? sysUserVo.getNickName() : ""); }); } + List nodeInfoList = new ArrayList<>(); + Map> groupByKey = StreamUtils.groupByKey(actHistoryInfoVoList, ActHistoryInfoVo::getTaskDefinitionKey); + for (Map.Entry> entry : groupByKey.entrySet()) { + ActHistoryInfoVo actHistoryInfoVo = BeanUtil.toBean(entry.getValue().get(0), ActHistoryInfoVo.class); + String nickName = entry.getValue().stream().filter(e -> StringUtils.isNotBlank(e.getNickName()) && e.getEndTime() == null).map(ActHistoryInfoVo::getNickName).toList().stream().distinct().collect(Collectors.joining(StringUtils.SEPARATOR)); + if (StringUtils.isNotBlank(nickName)) { + actHistoryInfoVo.setNickName(nickName); + } + actHistoryInfoVoList.stream().filter(e -> e.getTaskDefinitionKey().equals(entry.getKey()) && e.getEndTime() == null).findFirst() + .ifPresent(e -> { + actHistoryInfoVo.setStatus("待处理"); + actHistoryInfoVo.setStartTime(e.getStartTime()); + actHistoryInfoVo.setEndTime(null); + actHistoryInfoVo.setRunDuration(null); + }); + nodeInfoList.add(actHistoryInfoVo); + } + //节点信息 + map.put("nodeListInfo", nodeInfoList); List collect = new ArrayList<>(); //待办理 List waitingTask = StreamUtils.filter(actHistoryInfoVoList, e -> e.getEndTime() == null); From 7b034a232bce1c0676139138ac528db0faadf7f9 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 15 Jun 2023 18:17:58 +0800 Subject: [PATCH 034/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9E=E4=BE=8B=E4=BD=9C=E5=BA=9F=EF=BC=8C=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E4=B8=AD=E6=B5=81=E7=A8=8B=E5=AE=9E=E4=BE=8B=E5=88=A0?= =?UTF-8?q?=E9=99=A4=EF=BC=8C=E5=B7=B2=E5=AE=8C=E6=88=90=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=AE=9E=E4=BE=8B=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ActProcessInstanceController.java | 36 +++++++++ .../workflow/domain/bo/ProcessInvalidBo.java | 28 +++++++ .../service/IActProcessInstanceService.java | 25 ++++++ .../impl/ActProcessInstanceServiceImpl.java | 78 +++++++++++++++++++ 4 files changed, 167 insertions(+) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInvalidBo.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java index c28b75200..ae94236f8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java @@ -4,9 +4,12 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; +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.ProcessInstanceBo; +import org.dromara.workflow.domain.bo.ProcessInvalidBo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; import org.dromara.workflow.service.IActProcessInstanceService; import org.springframework.validation.annotation.Validated; @@ -67,4 +70,37 @@ public class ActProcessInstanceController extends BaseController { public R> getHistoryRecord(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) { return R.ok(iActProcessInstanceService.getHistoryRecord(processInstanceId)); } + + /** + * 作废流程实例,不会删除历史记录(删除运行中的实例) + * + * @param processInvalidBo 参数 + */ + @Log(title = "流程实例管理", businessType = BusinessType.DELETE) + @PostMapping("/deleteRuntimeProcessInst") + public R deleteRuntimeProcessInst(@RequestBody ProcessInvalidBo processInvalidBo) { + return toAjax(iActProcessInstanceService.deleteRuntimeProcessInst(processInvalidBo)); + } + + /** + * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param processInstanceId 流程实例id + */ + @Log(title = "流程实例管理", businessType = BusinessType.DELETE) + @DeleteMapping("/deleteRuntimeProcessAndHisInst/{processInstanceId}") + public R deleteRuntimeProcessAndHisInst(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) { + return toAjax(iActProcessInstanceService.deleteRuntimeProcessAndHisInst(processInstanceId)); + } + + /** + * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param processInstanceId 流程实例id + */ + @Log(title = "流程实例管理", businessType = BusinessType.DELETE) + @DeleteMapping("/deleteFinishProcessAndHisInst/{processInstanceId}") + public R deleteFinishProcessAndHisInst(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) { + return toAjax(iActProcessInstanceService.deleteFinishProcessAndHisInst(processInstanceId)); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInvalidBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInvalidBo.java new file mode 100644 index 000000000..0bfebf533 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInvalidBo.java @@ -0,0 +1,28 @@ +package org.dromara.workflow.domain.bo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 流程实例作废请求对象 + * + * @author may + */ +@Data +public class ProcessInvalidBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程实例id + */ + private String processInstId; + + /** + * 作废原因 + */ + private String deleteReason; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java index 8b3afde7f..c1c1ebb2c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java @@ -3,6 +3,7 @@ package org.dromara.workflow.service; import jakarta.servlet.http.HttpServletResponse; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.bo.ProcessInstanceBo; +import org.dromara.workflow.domain.bo.ProcessInvalidBo; import org.dromara.workflow.domain.vo.ActHistoryInfoVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; @@ -46,4 +47,28 @@ public interface IActProcessInstanceService { * @return 结果 */ Map getHistoryRecord(String processInstanceId); + + /** + * 作废流程实例,不会删除历史记录(删除运行中的实例) + * + * @param processInvalidBo 参数 + * @return 结果 + */ + boolean deleteRuntimeProcessInst(ProcessInvalidBo processInvalidBo); + + /** + * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param processInstanceId 流程实例id + * @return 结果 + */ + boolean deleteRuntimeProcessAndHisInst(String processInstanceId); + + /** + * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param processInstanceId 流程实例id + * @return 结果 + */ + boolean deleteFinishProcessAndHisInst(String processInstanceId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 20d1dc522..65a240ee7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -7,14 +7,17 @@ import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.apache.commons.io.IOUtils; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.service.ISysUserService; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.domain.bo.ProcessInstanceBo; +import org.dromara.workflow.domain.bo.ProcessInvalidBo; import org.dromara.workflow.domain.vo.ActHistoryInfoVo; import org.dromara.workflow.domain.vo.GraphicInfoVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; @@ -31,6 +34,7 @@ import org.flowable.engine.history.HistoricProcessInstanceQuery; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstanceQuery; import org.flowable.engine.task.Comment; +import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; @@ -314,4 +318,78 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService return 0 + "秒"; } } + + /** + * 作废流程实例,不会删除历史记录(删除运行中的实例) + * + * @param processInvalidBo 参数 + */ + @Override + public boolean deleteRuntimeProcessInst(ProcessInvalidBo processInvalidBo) { + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() + .processInstanceId(processInvalidBo.getProcessInstId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); + try { + List list = taskService.createTaskQuery().processInstanceId(processInvalidBo.getProcessInstId()) + .taskTenantId(TenantHelper.getTenantId()).list(); + List subTasks = list.stream().filter(e -> StringUtils.isNotBlank(e.getParentTaskId())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(subTasks)) { + subTasks.forEach(e -> taskService.deleteTask(e.getId())); + } + String deleteReason = LoginHelper.getUsername() + "作废了当前申请!"; + if (StringUtils.isNotBlank(processInvalidBo.getDeleteReason())) { + deleteReason = LoginHelper.getUsername() + "作废理由:" + processInvalidBo.getDeleteReason(); + } + runtimeService.deleteProcessInstance(processInvalidBo.getProcessInstId(), deleteReason); + return true; + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param processInstanceId 流程实例id + * @return + */ + @Override + public boolean deleteRuntimeProcessAndHisInst(String processInstanceId) { + try { + //1.删除运行中流程实例 + List list = taskService.createTaskQuery().processInstanceId(processInstanceId) + .taskTenantId(TenantHelper.getTenantId()).list(); + List subTasks = list.stream().filter(e -> StringUtils.isNotBlank(e.getParentTaskId())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(subTasks)) { + subTasks.forEach(e -> taskService.deleteTask(e.getId())); + } + runtimeService.deleteProcessInstance(processInstanceId, LoginHelper.getUserId() + "删除了当前流程申请"); + //2.删除历史记录 + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceTenantId(TenantHelper.getTenantId()).processInstanceId(processInstanceId).singleResult(); + if (ObjectUtil.isNotEmpty(historicProcessInstance)) { + historyService.deleteHistoricProcessInstance(processInstanceId); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param processInstanceId 流程实例id + */ + @Override + public boolean deleteFinishProcessAndHisInst(String processInstanceId) { + try { + historyService.deleteHistoricProcessInstance(processInstanceId); + return true; + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException(e.getMessage()); + } + } } From 2dff183e4fa1c057bcca7f960d9430cc06b29869 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Fri, 16 Jun 2023 23:06:00 +0800 Subject: [PATCH 035/159] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/service/impl/ActTaskServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 910833ac3..de291f82d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -20,6 +20,7 @@ import org.dromara.workflow.service.IActTaskService; import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.engine.HistoryService; +import org.flowable.engine.IdentityService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricProcessInstance; @@ -49,6 +50,7 @@ public class ActTaskServiceImpl implements IActTaskService { private final RuntimeService runtimeService; private final TaskService taskService; private final HistoryService historyService; + private final IdentityService identityService; /** * 启动任务 @@ -73,6 +75,7 @@ public class ActTaskServiceImpl implements IActTaskService { return map; } // 设置启动人 + identityService.setAuthenticatedUserId(String.valueOf(LoginHelper.getUserId())); Authentication.setAuthenticatedUserId(String.valueOf(LoginHelper.getUserId())); // 启动流程实例(提交申请) Map variables = startProcessBo.getVariables(); From db64ae65eafa80b09213c48ed526dda29691e949 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 17 Jun 2023 19:01:26 +0800 Subject: [PATCH 036/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E7=8A=B6=E6=80=81=E6=9E=9A=E4=B8=BE=E3=80=82=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=B5=81=E7=A8=8B=E5=90=AF=E5=8A=A8=EF=BC=8C=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=EF=BC=8C=E7=BB=88=E6=AD=A2=E7=AD=89=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/BusinessStatusEnum.java | 91 +++++++++++++++++++ .../ActProcessInstanceController.java | 3 +- .../workflow/domain/bo/ProcessInvalidBo.java | 5 +- .../flowable/cmd/UpdateBusinessStatusCmd.java | 37 ++++++++ .../impl/ActProcessInstanceServiceImpl.java | 16 ++-- .../service/impl/ActTaskServiceImpl.java | 31 +++++-- 6 files changed, 168 insertions(+), 15 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateBusinessStatusCmd.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java new file mode 100644 index 000000000..4fb4c23f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java @@ -0,0 +1,91 @@ +package org.dromara.workflow.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.apache.commons.lang3.StringUtils; +import org.dromara.common.core.exception.ServiceException; + +/** + * 业务状态枚举 + * + * @author may + */ +@Getter +@AllArgsConstructor +public enum BusinessStatusEnum { + /** + * 已撤销 + */ + CANCEL("cancel", "已撤销"), + /** + * 草稿 + */ + DRAFT("draft", "草稿"), + /** + * 待审核 + */ + WAITING("waiting", "待审核"), + /** + * 已完成 + */ + FINISH("finish", "已完成"), + /** + * 已作废 + */ + INVALID("invalid", "已作废"), + /** + * 已退回 + */ + BACK("back", "已退回"), + /** + * 已终止 + */ + TERMINATION("termination", "已终止"); + + /** + * 状态 + */ + private final String status; + + /** + * 描述 + */ + private final String desc; + + /** + * 启动流程校验 + * + * @param status 状态 + */ + public static void checkStartStatus(String status) { + if (status.equals(WAITING.getStatus())) { + throw new ServiceException("该单据已提交过申请,正在审批中!"); + } else if (status.equals(FINISH.getStatus())) { + throw new ServiceException("该单据已完成申请!"); + } else if (status.equals(INVALID.getStatus())) { + throw new ServiceException("该单据已作废!"); + } else if (status.equals(TERMINATION.getStatus())) { + throw new ServiceException("该单据已终止!"); + } + } + + /** + * 校验流程申请 + * + * @param status 状态 + */ + public static void checkStatus(String status) { + if (status.equals(FINISH.getStatus())) { + throw new ServiceException("该单据已完成申请!"); + } else if (status.equals(INVALID.getStatus())) { + throw new ServiceException("该单据已作废!"); + } else if (status.equals(CANCEL.getStatus())) { + throw new ServiceException("该单据已撤销!"); + } else if (status.equals(BACK.getStatus())) { + throw new ServiceException("该单据已退回!"); + } else if (status.equals(TERMINATION.getStatus())) { + throw new ServiceException("该单据已终止!"); + } + } +} + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java index ae94236f8..488da078a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java @@ -4,6 +4,7 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -78,7 +79,7 @@ public class ActProcessInstanceController extends BaseController { */ @Log(title = "流程实例管理", businessType = BusinessType.DELETE) @PostMapping("/deleteRuntimeProcessInst") - public R deleteRuntimeProcessInst(@RequestBody ProcessInvalidBo processInvalidBo) { + public R deleteRuntimeProcessInst(@Validated(AddGroup.class) @RequestBody ProcessInvalidBo processInvalidBo) { return toAjax(iActProcessInstanceService.deleteRuntimeProcessInst(processInvalidBo)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInvalidBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInvalidBo.java index 0bfebf533..35d565255 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInvalidBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInvalidBo.java @@ -1,6 +1,8 @@ package org.dromara.workflow.domain.bo; +import jakarta.validation.constraints.NotBlank; import lombok.Data; +import org.dromara.common.core.validate.AddGroup; import java.io.Serial; import java.io.Serializable; @@ -19,7 +21,8 @@ public class ProcessInvalidBo implements Serializable { /** * 流程实例id */ - private String processInstId; + @NotBlank(message = "流程实例id不能为空", groups = {AddGroup.class}) + private String processInstanceId; /** * 作废原因 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateBusinessStatusCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateBusinessStatusCmd.java new file mode 100644 index 000000000..3ba120aef --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateBusinessStatusCmd.java @@ -0,0 +1,37 @@ +package org.dromara.workflow.flowable.cmd; + +import org.dromara.common.core.exception.ServiceException; +import org.flowable.common.engine.impl.interceptor.Command; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.impl.persistence.entity.HistoricProcessInstanceEntity; +import org.flowable.engine.impl.persistence.entity.HistoricProcessInstanceEntityManager; +import org.flowable.engine.impl.util.CommandContextUtil; + +/** + * 修改流程状态 + * + * @author may + */ +public class UpdateBusinessStatusCmd implements Command { + + private final String processInstanceId; + private final String status; + + public UpdateBusinessStatusCmd(String processInstanceId, String status) { + this.processInstanceId = processInstanceId; + this.status = status; + } + + @Override + public Boolean execute(CommandContext commandContext) { + try { + HistoricProcessInstanceEntityManager manager = CommandContextUtil.getHistoricProcessInstanceEntityManager(); + HistoricProcessInstanceEntity processInstance = manager.findById(processInstanceId); + processInstance.setBusinessStatus(status); + manager.update(processInstance); + return true; + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 65a240ee7..17626f398 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -16,6 +16,7 @@ import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.service.ISysUserService; import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.common.enums.BusinessStatusEnum; import org.dromara.workflow.domain.bo.ProcessInstanceBo; import org.dromara.workflow.domain.bo.ProcessInvalidBo; import org.dromara.workflow.domain.vo.ActHistoryInfoVo; @@ -326,20 +327,24 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService */ @Override public boolean deleteRuntimeProcessInst(ProcessInvalidBo processInvalidBo) { - ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() - .processInstanceId(processInvalidBo.getProcessInstId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); try { - List list = taskService.createTaskQuery().processInstanceId(processInvalidBo.getProcessInstId()) + List list = taskService.createTaskQuery().processInstanceId(processInvalidBo.getProcessInstanceId()) .taskTenantId(TenantHelper.getTenantId()).list(); - List subTasks = list.stream().filter(e -> StringUtils.isNotBlank(e.getParentTaskId())).collect(Collectors.toList()); + List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); if (CollUtil.isNotEmpty(subTasks)) { subTasks.forEach(e -> taskService.deleteTask(e.getId())); } + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceBusinessKey(processInvalidBo.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); + if (ObjectUtil.isNotEmpty(historicProcessInstance)) { + BusinessStatusEnum.checkStatus(historicProcessInstance.getBusinessStatus()); + } String deleteReason = LoginHelper.getUsername() + "作废了当前申请!"; if (StringUtils.isNotBlank(processInvalidBo.getDeleteReason())) { deleteReason = LoginHelper.getUsername() + "作废理由:" + processInvalidBo.getDeleteReason(); } - runtimeService.deleteProcessInstance(processInvalidBo.getProcessInstId(), deleteReason); + runtimeService.updateBusinessStatus(processInvalidBo.getProcessInstanceId(), BusinessStatusEnum.INVALID.getStatus()); + runtimeService.deleteProcessInstance(processInvalidBo.getProcessInstanceId(), deleteReason); return true; } catch (Exception e) { e.printStackTrace(); @@ -351,7 +356,6 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 * * @param processInstanceId 流程实例id - * @return */ @Override public boolean deleteRuntimeProcessAndHisInst(String processInstanceId) { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index de291f82d..186820ea4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -14,15 +14,14 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.common.enums.BusinessStatusEnum; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.TaskVo; +import org.dromara.workflow.flowable.cmd.UpdateBusinessStatusCmd; import org.dromara.workflow.service.IActTaskService; import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.common.engine.impl.identity.Authentication; -import org.flowable.engine.HistoryService; -import org.flowable.engine.IdentityService; -import org.flowable.engine.RuntimeService; -import org.flowable.engine.TaskService; +import org.flowable.engine.*; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; @@ -51,6 +50,7 @@ public class ActTaskServiceImpl implements IActTaskService { private final TaskService taskService; private final HistoryService historyService; private final IdentityService identityService; + private final ManagementService managementService; /** * 启动任务 @@ -65,11 +65,14 @@ public class ActTaskServiceImpl implements IActTaskService { throw new ServiceException("启动工作流时必须包含业务ID"); } // 判断当前业务是否启动过流程 - List instanceList = historyService.createHistoricProcessInstanceQuery() - .processInstanceBusinessKey(startProcessBo.getBusinessKey()).processInstanceTenantIdLike(TenantHelper.getTenantId()).list(); + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceBusinessKey(startProcessBo.getBusinessKey()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); + if (ObjectUtil.isNotEmpty(historicProcessInstance)) { + BusinessStatusEnum.checkStartStatus(historicProcessInstance.getBusinessStatus()); + } TaskQuery taskQuery = taskService.createTaskQuery(); List taskResult = taskQuery.processInstanceBusinessKey(startProcessBo.getBusinessKey()).taskTenantId(TenantHelper.getTenantId()).list(); - if (CollUtil.isNotEmpty(instanceList)) { + if (CollUtil.isNotEmpty(taskResult)) { map.put("processInstanceId", taskResult.get(0).getProcessInstanceId()); map.put("taskId", taskResult.get(0).getId()); return map; @@ -89,6 +92,8 @@ public class ActTaskServiceImpl implements IActTaskService { if (taskList.size() > 1) { throw new ServiceException("请检查流程第一个环节是否为申请人!"); } + + runtimeService.updateBusinessStatus(pi.getProcessInstanceId(), BusinessStatusEnum.DRAFT.getStatus()); taskService.setAssignee(taskList.get(0).getId(), LoginHelper.getUserId().toString()); taskService.setVariable(taskList.get(0).getId(), "processInstanceId", pi.getProcessInstanceId()); map.put("processInstanceId", pi.getProcessInstanceId()); @@ -126,10 +131,16 @@ public class ActTaskServiceImpl implements IActTaskService { taskService.complete(newTask.getId()); return true; } + runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.WAITING.getStatus()); //办理意见 taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage()); //办理任务 taskService.complete(completeTaskBo.getTaskId(), completeTaskBo.getVariables()); + List list = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(task.getProcessInstanceId()).list(); + if (CollUtil.isEmpty(list)) { + UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); + managementService.executeCommand(updateBusinessStatusCmd); + } return true; } catch (Exception e) { throw new ServiceException(e.getMessage()); @@ -233,6 +244,11 @@ public class ActTaskServiceImpl implements IActTaskService { if (task.isSuspended()) { throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); } + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceBusinessKey(task.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); + if (ObjectUtil.isNotEmpty(historicProcessInstance)) { + BusinessStatusEnum.checkStatus(historicProcessInstance.getBusinessStatus()); + } try { if (StringUtils.isBlank(terminationBo.getComment())) { terminationBo.setComment(LoginHelper.getUsername() + "终止了申请"); @@ -249,6 +265,7 @@ public class ActTaskServiceImpl implements IActTaskService { } runtimeService.deleteProcessInstance(task.getProcessInstanceId(), StrUtil.EMPTY); } + runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.TERMINATION.getStatus()); return true; } catch (Exception e) { throw new ServiceException(e.getMessage()); From e753eec01497cf1b865a3037767f9a7e9af7a7d4 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 17 Jun 2023 19:06:08 +0800 Subject: [PATCH 037/159] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=8A=9E=E7=90=86=20=E6=B5=81=E7=A8=8B=E6=8C=82?= =?UTF-8?q?=E8=B5=B7=E6=8A=9B=E5=87=BA=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/common/constant/FlowConstant.java | 4 ++-- .../org/dromara/workflow/service/impl/ActTaskServiceImpl.java | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) 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 index 0de3f582e..160f5a60e 100644 --- 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 @@ -13,9 +13,9 @@ public interface FlowConstant { */ String NAMESPACE = "http://b3mn.org/stencilset/bpmn2.0#"; - String MESSAGE_CURRENT_TASK_IS_NULL = "当前任务不存在或你不是任务办理人"; + String MESSAGE_CURRENT_TASK_IS_NULL = "当前任务不存在或你不是任务办理人!"; - String MESSAGE_SUSPENDED = "当前任务已挂起"; + String MESSAGE_SUSPENDED = "当前任务已挂起不可审批!"; /** * 连线 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 186820ea4..0d81edce7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -123,6 +123,9 @@ public class ActTaskServiceImpl implements IActTaskService { if (task == null) { throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); } + if (task.isSuspended()) { + throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); + } //办理委托任务 if (ObjectUtil.isNotEmpty(task.getDelegationState()) && FlowConstant.PENDING.equals(task.getDelegationState().name())) { taskService.resolveTask(completeTaskBo.getTaskId()); From 1eb778f914ec0b981bf16df82ddf33ee9a70505e Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 17 Jun 2023 19:15:00 +0800 Subject: [PATCH 038/159] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9E=E4=BE=8B=E6=9F=A5=E8=AF=A2=E6=8C=82=E8=B5=B7?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/domain/vo/ProcessInstanceVo.java | 2 +- .../workflow/service/impl/ActProcessInstanceServiceImpl.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java index 0b36a1622..e7367a878 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java @@ -55,7 +55,7 @@ public class ProcessInstanceVo implements Serializable { /** * 是否挂起 */ - private boolean isSuspended; + private Boolean isSuspended; /** * 租户id diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 17626f398..408bfc777 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -94,7 +94,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService } List processInstances = query.listPage(processInstanceBo.getPageNum(), processInstanceBo.getPageSize()); for (ProcessInstance processInstance : processInstances) { - list.add(BeanUtil.toBean(processInstance, ProcessInstanceVo.class)); + ProcessInstanceVo processInstanceVo = BeanUtil.toBean(processInstance, ProcessInstanceVo.class); + processInstanceVo.setIsSuspended(processInstance.isSuspended()); + list.add(processInstanceVo); } long count = query.count(); return new TableDataInfo<>(list, count); From 4c36f0afc2568c225c46cf50e72933b80a5e15eb Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 18 Jun 2023 20:48:45 +0800 Subject: [PATCH 039/159] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9E=E4=BE=8B=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ActProcessInstanceController.java | 17 ++++++------ .../service/IActProcessInstanceService.java | 10 +++---- .../impl/ActProcessInstanceServiceImpl.java | 27 ++++++++++--------- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java index 488da078a..eb37c90eb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java @@ -2,6 +2,7 @@ package org.dromara.workflow.controller; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.validate.AddGroup; @@ -86,22 +87,22 @@ public class ActProcessInstanceController extends BaseController { /** * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 * - * @param processInstanceId 流程实例id + * @param processInstanceIds 流程实例id */ @Log(title = "流程实例管理", businessType = BusinessType.DELETE) - @DeleteMapping("/deleteRuntimeProcessAndHisInst/{processInstanceId}") - public R deleteRuntimeProcessAndHisInst(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) { - return toAjax(iActProcessInstanceService.deleteRuntimeProcessAndHisInst(processInstanceId)); + @DeleteMapping("/deleteRuntimeProcessAndHisInst/{processInstanceIds}") + public R deleteRuntimeProcessAndHisInst(@NotNull(message = "流程实例id不能为空") @PathVariable String[] processInstanceIds) { + return toAjax(iActProcessInstanceService.deleteRuntimeProcessAndHisInst(processInstanceIds)); } /** * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 * - * @param processInstanceId 流程实例id + * @param processInstanceIds 流程实例id */ @Log(title = "流程实例管理", businessType = BusinessType.DELETE) - @DeleteMapping("/deleteFinishProcessAndHisInst/{processInstanceId}") - public R deleteFinishProcessAndHisInst(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) { - return toAjax(iActProcessInstanceService.deleteFinishProcessAndHisInst(processInstanceId)); + @DeleteMapping("/deleteFinishProcessAndHisInst/{processInstanceIds}") + public R deleteFinishProcessAndHisInst(@NotNull(message = "流程实例id不能为空") @PathVariable String[] processInstanceIds) { + return toAjax(iActProcessInstanceService.deleteFinishProcessAndHisInst(processInstanceIds)); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java index c1c1ebb2c..ac909188b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java @@ -4,10 +4,8 @@ import jakarta.servlet.http.HttpServletResponse; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.bo.ProcessInstanceBo; import org.dromara.workflow.domain.bo.ProcessInvalidBo; -import org.dromara.workflow.domain.vo.ActHistoryInfoVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; -import java.util.List; import java.util.Map; /** @@ -59,16 +57,16 @@ public interface IActProcessInstanceService { /** * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 * - * @param processInstanceId 流程实例id + * @param processInstanceIds 流程实例id * @return 结果 */ - boolean deleteRuntimeProcessAndHisInst(String processInstanceId); + boolean deleteRuntimeProcessAndHisInst(String[] processInstanceIds); /** * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 * - * @param processInstanceId 流程实例id + * @param processInstanceIds 流程实例id * @return 结果 */ - boolean deleteFinishProcessAndHisInst(String processInstanceId); + boolean deleteFinishProcessAndHisInst(String[] processInstanceIds); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 408bfc777..8ae2076ef 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -40,6 +40,7 @@ import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.awt.*; import java.io.IOException; @@ -328,6 +329,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService * @param processInvalidBo 参数 */ @Override + @Transactional(rollbackFor = Exception.class) public boolean deleteRuntimeProcessInst(ProcessInvalidBo processInvalidBo) { try { List list = taskService.createTaskQuery().processInstanceId(processInvalidBo.getProcessInstanceId()) @@ -357,24 +359,25 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService /** * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 * - * @param processInstanceId 流程实例id + * @param processInstanceIds 流程实例id */ @Override - public boolean deleteRuntimeProcessAndHisInst(String processInstanceId) { + @Transactional(rollbackFor = Exception.class) + public boolean deleteRuntimeProcessAndHisInst(String[] processInstanceIds) { try { //1.删除运行中流程实例 - List list = taskService.createTaskQuery().processInstanceId(processInstanceId) + List list = taskService.createTaskQuery().processInstanceIdIn(Arrays.asList(processInstanceIds)) .taskTenantId(TenantHelper.getTenantId()).list(); - List subTasks = list.stream().filter(e -> StringUtils.isNotBlank(e.getParentTaskId())).collect(Collectors.toList()); + List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); if (CollUtil.isNotEmpty(subTasks)) { subTasks.forEach(e -> taskService.deleteTask(e.getId())); } - runtimeService.deleteProcessInstance(processInstanceId, LoginHelper.getUserId() + "删除了当前流程申请"); + runtimeService.bulkDeleteProcessInstances(Arrays.asList(processInstanceIds), LoginHelper.getUserId() + "删除了当前流程申请"); //2.删除历史记录 - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceTenantId(TenantHelper.getTenantId()).processInstanceId(processInstanceId).singleResult(); - if (ObjectUtil.isNotEmpty(historicProcessInstance)) { - historyService.deleteHistoricProcessInstance(processInstanceId); + List historicProcessInstanceList = historyService.createHistoricProcessInstanceQuery() + .processInstanceTenantId(TenantHelper.getTenantId()).processInstanceIds(new HashSet<>(Arrays.asList(processInstanceIds))).list(); + if (ObjectUtil.isNotEmpty(historicProcessInstanceList)) { + historyService.bulkDeleteHistoricProcessInstances(Arrays.asList(processInstanceIds)); } return true; } catch (Exception e) { @@ -386,12 +389,12 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService /** * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 * - * @param processInstanceId 流程实例id + * @param processInstanceIds 流程实例id */ @Override - public boolean deleteFinishProcessAndHisInst(String processInstanceId) { + public boolean deleteFinishProcessAndHisInst(String[] processInstanceIds) { try { - historyService.deleteHistoricProcessInstance(processInstanceId); + historyService.bulkDeleteHistoricProcessInstances(Arrays.asList(processInstanceIds)); return true; } catch (Exception e) { e.printStackTrace(); From 39acda09ecc86dcc805750423c94c7b964b1db0b Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Thu, 22 Jun 2023 21:41:22 +0800 Subject: [PATCH 040/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=92=A4?= =?UTF-8?q?=E9=94=80=E6=B5=81=E7=A8=8B=E7=94=B3=E8=AF=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ActProcessInstanceController.java | 11 ++++++ .../service/IActProcessInstanceService.java | 8 +++++ .../impl/ActProcessInstanceServiceImpl.java | 34 +++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java index eb37c90eb..312f7038e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java @@ -105,4 +105,15 @@ public class ActProcessInstanceController extends BaseController { public R deleteFinishProcessAndHisInst(@NotNull(message = "流程实例id不能为空") @PathVariable String[] processInstanceIds) { return toAjax(iActProcessInstanceService.deleteFinishProcessAndHisInst(processInstanceIds)); } + + /** + * 撤销流程申请 + * + * @param processInstanceId 流程实例id + */ + @Log(title = "流程实例管理", businessType = BusinessType.INSERT) + @PostMapping("/cancelProcessApply/{processInstanceId}") + public R cancelProcessApply(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) { + return toAjax(iActProcessInstanceService.cancelProcessApply(processInstanceId)); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java index ac909188b..3d6a478ac 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java @@ -69,4 +69,12 @@ public interface IActProcessInstanceService { * @return 结果 */ boolean deleteFinishProcessAndHisInst(String[] processInstanceIds); + + /** + * 撤销流程申请 + * + * @param processInstanceId 流程实例id + * @return 结果 + */ + boolean cancelProcessApply(String processInstanceId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 8ae2076ef..05267a629 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -401,4 +401,38 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService throw new ServiceException(e.getMessage()); } } + + /** + * 撤销流程申请 + * + * @param processInstanceId 流程实例id + */ + @Override + public boolean cancelProcessApply(String processInstanceId) { + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() + .processInstanceId(processInstanceId).processInstanceTenantId(TenantHelper.getTenantId()).startedBy(String.valueOf(LoginHelper.getUserId())).singleResult(); + if (ObjectUtil.isNull(processInstance)) { + throw new ServiceException("您不是流程发起人,撤销失败!"); + } + if (processInstance.isSuspended()) { + throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); + } + BusinessStatusEnum.checkStatus(processInstance.getBusinessStatus()); + List taskList = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(processInstanceId).list(); + for (Task task : taskList) { + taskService.addComment(task.getId(), processInstanceId, "申请人撤销申请"); + } + try { + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().finished().orderByHistoricTaskInstanceEndTime().finished().list().get(0); + List nodeIds = StreamUtils.toList(taskList, Task::getTaskDefinitionKey); + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(processInstanceId) + .moveActivityIdsToSingleActivityId(nodeIds, historicTaskInstance.getTaskDefinitionKey()).changeState(); + runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.CANCEL.getStatus()); + return true; + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException("撤销失败:" + e.getMessage()); + } + } } From f0133aaba799551dd596006ba08857fe2e02edaa Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Thu, 22 Jun 2023 21:42:27 +0800 Subject: [PATCH 041/159] =?UTF-8?q?update=20=E8=A1=A5=E5=85=85=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=92=A4=E9=94=80=E4=BA=8B=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/ActProcessInstanceServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 05267a629..24d3468d7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -408,6 +408,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService * @param processInstanceId 流程实例id */ @Override + @Transactional(rollbackFor = Exception.class) public boolean cancelProcessApply(String processInstanceId) { ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() .processInstanceId(processInstanceId).processInstanceTenantId(TenantHelper.getTenantId()).startedBy(String.valueOf(LoginHelper.getUserId())).singleResult(); From a953008087528fd3f767dd1d862a4d811d045423 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Fri, 23 Jun 2023 16:03:07 +0800 Subject: [PATCH 042/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E7=99=BB=E5=BD=95=E4=BA=BA=E5=8D=95=E6=8D=AE=E5=88=97?= =?UTF-8?q?=E8=A1=A8,=E6=B7=BB=E5=8A=A0=E5=8D=95=E6=8D=AE=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/BusinessStatusEnum.java | 18 +++++++++ .../ActProcessInstanceController.java | 10 +++++ .../workflow/domain/vo/ProcessInstanceVo.java | 10 +++++ .../dromara/workflow/domain/vo/TaskVo.java | 10 +++++ .../service/IActProcessInstanceService.java | 8 ++++ .../impl/ActProcessInstanceServiceImpl.java | 38 +++++++++++++++++-- .../service/impl/ActTaskServiceImpl.java | 29 +++++++++++--- 7 files changed, 114 insertions(+), 9 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java index 4fb4c23f5..fbb32ccef 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java @@ -52,6 +52,24 @@ public enum BusinessStatusEnum { */ private final String desc; + /** + * 获取业务状态 + * + * @param status 状态 + */ + public static String getEumByStatus(String status) { + if (StringUtils.isBlank(status)) { + return null; + } + + for (BusinessStatusEnum statusEnum : BusinessStatusEnum.values()) { + if (statusEnum.getStatus().equals(status)) { + return statusEnum.getDesc(); + } + } + return null; + } + /** * 启动流程校验 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java index 312f7038e..495101a37 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java @@ -116,4 +116,14 @@ public class ActProcessInstanceController extends BaseController { public R cancelProcessApply(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) { return toAjax(iActProcessInstanceService.cancelProcessApply(processInstanceId)); } + + /** + * 分页查询当前登录人单据 + * + * @param processInstanceBo 参数 + */ + @GetMapping("/getCurrentSubmitByPage") + public TableDataInfo getCurrentSubmitByPage(ProcessInstanceBo processInstanceBo) { + return iActProcessInstanceService.getCurrentSubmitByPage(processInstanceBo); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java index e7367a878..e3b17c4b1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java @@ -76,4 +76,14 @@ public class ProcessInstanceVo implements Serializable { * 启动人id */ private String startUserId; + + /** + * 流程状态 + */ + private String businessStatus; + + /** + * 流程状态 + */ + private String businessStatusName; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java index 4169de0a1..0d4bae364 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java @@ -96,4 +96,14 @@ public class TaskVo { * 认领时间 */ private Date claimTime; + + /** + * 流程状态 + */ + private String businessStatus; + + /** + * 流程状态 + */ + private String businessStatusName; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java index 3d6a478ac..2f122b6ad 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java @@ -77,4 +77,12 @@ public interface IActProcessInstanceService { * @return 结果 */ boolean cancelProcessApply(String processInstanceId); + + /** + * 分页查询当前登录人单据 + * + * @param processInstanceBo 参数 + * @return 结果 + */ + TableDataInfo getCurrentSubmitByPage(ProcessInstanceBo processInstanceBo); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 24d3468d7..9174370db 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -97,6 +97,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService for (ProcessInstance processInstance : processInstances) { ProcessInstanceVo processInstanceVo = BeanUtil.toBean(processInstance, ProcessInstanceVo.class); processInstanceVo.setIsSuspended(processInstance.isSuspended()); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstance.getBusinessStatus())); list.add(processInstanceVo); } long count = query.count(); @@ -125,7 +126,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService } List historicProcessInstances = query.listPage(processInstanceBo.getPageNum(), processInstanceBo.getPageSize()); for (HistoricProcessInstance historicProcessInstance : historicProcessInstances) { - list.add(BeanUtil.toBean(historicProcessInstance, ProcessInstanceVo.class)); + ProcessInstanceVo processInstanceVo = BeanUtil.toBean(historicProcessInstance, ProcessInstanceVo.class); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(historicProcessInstance.getBusinessStatus())); + list.add(processInstanceVo); } long count = query.count(); return new TableDataInfo<>(list, count); @@ -246,8 +249,10 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService //翻译人员名称 if (CollUtil.isNotEmpty(actHistoryInfoVoList)) { actHistoryInfoVoList.forEach(e -> { - SysUserVo sysUserVo = iSysUserService.selectUserById(Long.valueOf(e.getAssignee())); - e.setNickName(ObjectUtil.isNotEmpty(sysUserVo) ? sysUserVo.getNickName() : ""); + if (StringUtils.isNotBlank(e.getAssignee())) { + SysUserVo sysUserVo = iSysUserService.selectUserById(Long.valueOf(e.getAssignee())); + e.setNickName(ObjectUtil.isNotEmpty(sysUserVo) ? sysUserVo.getNickName() : ""); + } }); } List nodeInfoList = new ArrayList<>(); @@ -436,4 +441,31 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService throw new ServiceException("撤销失败:" + e.getMessage()); } } + + /** + * 分页查询当前登录人单据 + * + * @param processInstanceBo 参数 + */ + @Override + public TableDataInfo getCurrentSubmitByPage(ProcessInstanceBo processInstanceBo) { + List list = new ArrayList<>(); + HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery(); + query.processInstanceTenantId(TenantHelper.getTenantId()); + query.startedBy(processInstanceBo.getStartUserId()); + if (StringUtils.isNotBlank(processInstanceBo.getName())) { + query.processInstanceNameLikeIgnoreCase("%" + processInstanceBo.getName() + "%"); + } + if (StringUtils.isNotBlank(processInstanceBo.getBusinessKey())) { + query.processInstanceBusinessKey(processInstanceBo.getBusinessKey()); + } + List historicProcessInstanceList = query.listPage(processInstanceBo.getPageNum(), processInstanceBo.getPageSize()); + for (HistoricProcessInstance processInstance : historicProcessInstanceList) { + ProcessInstanceVo processInstanceVo = BeanUtil.toBean(processInstance, ProcessInstanceVo.class); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstance.getBusinessStatus())); + list.add(processInstanceVo); + } + long count = query.count(); + return new TableDataInfo<>(list, count); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 0d81edce7..d47938601 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -32,10 +32,7 @@ import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 任务 服务层实现 @@ -169,9 +166,19 @@ public class ActTaskServiceImpl implements IActTaskService { query.taskNameLike("%" + taskBo.getName() + "%"); } List taskList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); + List processInstanceList = null; + if (CollUtil.isNotEmpty(taskList)) { + Set processInstanceIds = StreamUtils.toSet(taskList, Task::getProcessInstanceId); + processInstanceList = runtimeService.createProcessInstanceQuery().processInstanceIds(processInstanceIds).list(); + } List list = new ArrayList<>(); for (Task task : taskList) { - list.add(BeanUtil.toBean(task, TaskVo.class)); + TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); + processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { + taskVo.setBusinessStatus(e.getBusinessStatus()); + taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); + }); + list.add(taskVo); } long count = query.count(); return new TableDataInfo<>(list, count); @@ -191,9 +198,19 @@ public class ActTaskServiceImpl implements IActTaskService { query.taskNameLike("%" + taskBo.getName() + "%"); } List taskInstanceList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); + List historicProcessInstanceList = null; + if (CollUtil.isNotEmpty(taskInstanceList)) { + Set processInstanceIds = StreamUtils.toSet(taskInstanceList, HistoricTaskInstance::getProcessInstanceId); + historicProcessInstanceList = historyService.createHistoricProcessInstanceQuery().processInstanceIds(processInstanceIds).list(); + } List list = new ArrayList<>(); for (HistoricTaskInstance task : taskInstanceList) { - list.add(BeanUtil.toBean(task, TaskVo.class)); + TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); + historicProcessInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { + taskVo.setBusinessStatus(e.getBusinessStatus()); + taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); + }); + list.add(taskVo); } long count = query.count(); return new TableDataInfo<>(list, count); From c3326403c009bbfb3452be59e119aaaad79e34b7 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Sun, 25 Jun 2023 15:37:14 +0800 Subject: [PATCH 043/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=BD=93=E5=89=8D=E4=BB=BB=E5=8A=A1=E5=8F=82=E4=B8=8E?= =?UTF-8?q?=E8=80=85=EF=BC=8C=E4=BC=98=E5=8C=96=E4=BB=BB=E5=8A=A1=E5=BE=85?= =?UTF-8?q?=E5=8A=9E=EF=BC=8C=E5=B7=B2=E5=8A=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/FlowConstant.java | 5 ++ .../workflow/domain/vo/ParticipantVo.java | 43 +++++++++++ .../dromara/workflow/domain/vo/TaskVo.java | 5 ++ .../service/impl/ActTaskServiceImpl.java | 21 ++++-- .../dromara/workflow/utils/WorkflowUtils.java | 74 ++++++++++++++++++- 5 files changed, 136 insertions(+), 12 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ParticipantVo.java 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 index 160f5a60e..6b0d465e3 100644 --- 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 @@ -27,4 +27,9 @@ public interface FlowConstant { */ String PENDING = "PENDING"; + /** + * 候选人标识 + */ + String CANDIDATE = "candidate"; + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ParticipantVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ParticipantVo.java new file mode 100644 index 000000000..c5876f689 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ParticipantVo.java @@ -0,0 +1,43 @@ +package org.dromara.workflow.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 参与者 + * + * @author may + */ +@Data +public class ParticipantVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 组id(角色id) + */ + private List groupIds; + + /** + * 候选人id(用户id) 当组id不为空时,将组内人员查出放入candidate + */ + private List candidate; + + /** + * 候选人名称(用户名称) 当组id不为空时,将组内人员查出放入candidateName + */ + private List candidateName; + + /** + * 是否认领标识 + * 当为空时默认当前任务不需要认领 + * 当为true时当前任务说明为候选模式并且有人已经认领了任务可以归还, + * 当为false时当前任务说明为候选模式该任务未认领, + */ + private Boolean claim; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java index 0d4bae364..dce733440 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java @@ -106,4 +106,9 @@ public class TaskVo { * 流程状态 */ private String businessStatusName; + + /** + * 参与者 + */ + private ParticipantVo participantVo; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index d47938601..93a7e3226 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -174,10 +174,13 @@ public class ActTaskServiceImpl implements IActTaskService { List list = new ArrayList<>(); for (Task task : taskList) { TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); - processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { - taskVo.setBusinessStatus(e.getBusinessStatus()); - taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); - }); + if (CollUtil.isNotEmpty(processInstanceList)) { + processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { + taskVo.setBusinessStatus(e.getBusinessStatus()); + taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); + }); + } + taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); list.add(taskVo); } long count = query.count(); @@ -206,10 +209,12 @@ public class ActTaskServiceImpl implements IActTaskService { List list = new ArrayList<>(); for (HistoricTaskInstance task : taskInstanceList) { TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); - historicProcessInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { - taskVo.setBusinessStatus(e.getBusinessStatus()); - taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); - }); + if (CollUtil.isNotEmpty(historicProcessInstanceList)) { + historicProcessInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { + taskVo.setBusinessStatus(e.getBusinessStatus()); + taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); + }); + } list.add(taskVo); } long count = query.count(); 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 index bd7a16930..6ca8ed2e8 100644 --- 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 @@ -3,16 +3,27 @@ package org.dromara.workflow.utils; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import org.dromara.common.core.enums.UserStatus; import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.SysUserRole; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.mapper.SysUserRoleMapper; +import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.domain.vo.ParticipantVo; import org.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd; import org.flowable.bpmn.converter.BpmnXMLConverter; import org.flowable.bpmn.model.*; import org.flowable.editor.language.json.converter.BpmnJsonConverter; import org.flowable.engine.ProcessEngine; +import org.flowable.identitylink.api.history.HistoricIdentityLink; import org.flowable.task.api.Task; import org.flowable.task.service.impl.persistence.entity.TaskEntity; @@ -22,10 +33,7 @@ import javax.xml.stream.XMLStreamReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.rmi.ServerException; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; /** @@ -39,6 +47,8 @@ public class WorkflowUtils { } private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class); + private static final SysUserMapper SYS_USER_MAPPER = SpringUtils.getBean(SysUserMapper.class); + private static final SysUserRoleMapper SYS_USER_ROLE_MAPPER = SpringUtils.getBean(SysUserRoleMapper.class); /** * bpmnModel转为xml @@ -158,4 +168,60 @@ public class WorkflowUtils { } return task; } + + /** + * 获取当前任务参与者 + * + * @param taskId 任务id + */ + public static ParticipantVo getCurrentTaskParticipant(String taskId) { + ParticipantVo participantVo = new ParticipantVo(); + List linksForTask = PROCESS_ENGINE.getHistoryService().getHistoricIdentityLinksForTask(taskId); + Task task = PROCESS_ENGINE.getTaskService().createTaskQuery().taskTenantId(TenantHelper.getTenantId()).taskId(taskId).singleResult(); + if (task != null && CollUtil.isNotEmpty(linksForTask)) { + List groupList = StreamUtils.filter(linksForTask, e -> StringUtils.isNotBlank(e.getGroupId())); + if (CollUtil.isNotEmpty(groupList)) { + List groupIds = StreamUtils.toList(groupList, e -> Long.valueOf(e.getGroupId())); + List sysUserRoles = SYS_USER_ROLE_MAPPER.selectList(new LambdaQueryWrapper().in(SysUserRole::getRoleId, groupIds)); + if (CollUtil.isNotEmpty(sysUserRoles)) { + participantVo.setGroupIds(groupIds); + List userIdList = StreamUtils.toList(sysUserRoles, SysUserRole::getUserId); + List sysUsers = SYS_USER_MAPPER.selectList( + new LambdaQueryWrapper().in(SysUser::getUserId, userIdList).eq(SysUser::getStatus, UserStatus.OK.getCode())); + if (CollUtil.isNotEmpty(sysUsers)) { + List userIds = StreamUtils.toList(sysUsers, SysUser::getUserId); + List nickNames = StreamUtils.toList(sysUsers, SysUser::getNickName); + participantVo.setCandidate(userIds); + participantVo.setCandidateName(nickNames); + participantVo.setClaim(!StringUtils.isBlank(task.getAssignee())); + } + } + } else { + List candidateList = StreamUtils.filter(linksForTask, e -> FlowConstant.CANDIDATE.equals(e.getType())); + List userIdList = new ArrayList<>(); + for (HistoricIdentityLink historicIdentityLink : linksForTask) { + try { + userIdList.add(Long.valueOf(historicIdentityLink.getUserId())); + } catch (NumberFormatException ignored) { + + } + } + List sysUsers = SYS_USER_MAPPER.selectList( + new LambdaQueryWrapper().in(SysUser::getUserId, userIdList).eq(SysUser::getStatus, UserStatus.OK.getCode())); + if (CollUtil.isNotEmpty(sysUsers)) { + List userIds = StreamUtils.toList(sysUsers, SysUser::getUserId); + List nickNames = StreamUtils.toList(sysUsers, SysUser::getNickName); + participantVo.setCandidate(userIds); + participantVo.setCandidateName(nickNames); + if (StringUtils.isBlank(task.getAssignee()) && CollUtil.isNotEmpty(candidateList)) { + participantVo.setClaim(false); + } + if (!StringUtils.isBlank(task.getAssignee()) && CollUtil.isNotEmpty(candidateList)) { + participantVo.setClaim(true); + } + } + } + } + return participantVo; + } } From 1f2cf8368c78ddf2ff530dae56a6bf1a9602dd4b Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Sun, 25 Jun 2023 15:48:01 +0800 Subject: [PATCH 044/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E7=94=A8?= =?UTF-8?q?=E6=88=B7=EF=BC=8C=E7=94=A8=E6=88=B7=E7=BB=84=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ActModelController.java | 45 +---------------- .../workflow/service/IActModelService.java | 17 +++++++ .../service/impl/ActModelServiceImpl.java | 48 +++++++++++++++++++ 3 files changed, 67 insertions(+), 43 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 8d5e75d88..8df527230 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,14 +1,11 @@ package org.dromara.workflow.controller; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; 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; -import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.json.utils.JsonUtils; @@ -17,27 +14,17 @@ 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.system.domain.SysRole; -import org.dromara.system.domain.SysUser; -import org.dromara.system.mapper.SysRoleMapper; -import org.dromara.system.mapper.SysUserMapper; -import org.dromara.system.service.ISysUserService; import org.dromara.workflow.domain.bo.ModelBo; import org.dromara.workflow.domain.vo.AccountVo; -import org.dromara.workflow.domain.vo.GroupRepresentation; import org.dromara.workflow.domain.vo.ResultListDataRepresentation; -import org.dromara.workflow.domain.vo.UserRepresentation; import org.dromara.workflow.service.IActModelService; import org.flowable.engine.RepositoryService; import org.flowable.engine.repository.Model; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.MultiValueMap; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.ArrayList; -import java.util.List; import java.util.Objects; /** @@ -55,10 +42,6 @@ public class ActModelController extends BaseController { private final IActModelService iActModelService; - private final SysUserMapper sysUserMapper; - - private final SysRoleMapper sysRoleMapper; - /** * 分页查询模型 @@ -166,20 +149,7 @@ public class ActModelController extends BaseController { */ @GetMapping(value = "/rest/editor-users") public ResultListDataRepresentation getUsers(@RequestParam(value = "filter", required = false) String filter) { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.like(StringUtils.isNotBlank(filter), SysUser::getNickName, filter); - List sysUsers = sysUserMapper.selectList(wrapper); - List userRepresentations = new ArrayList<>(); - for (SysUser sysUser : sysUsers) { - UserRepresentation userRepresentation = new UserRepresentation(); - userRepresentation.setFullName(sysUser.getNickName()); - userRepresentation.setLastName(sysUser.getNickName()); - userRepresentation.setTenantId(sysUser.getTenantId()); - userRepresentation.setEmail(sysUser.getEmail()); - userRepresentation.setId(sysUser.getUserId().toString()); - userRepresentations.add(userRepresentation); - } - return new ResultListDataRepresentation(userRepresentations); + return iActModelService.getUsers(filter); } /** @@ -189,18 +159,7 @@ public class ActModelController extends BaseController { */ @GetMapping(value = "/rest/editor-groups") public ResultListDataRepresentation getGroups(@RequestParam(required = false, value = "filter") String filter) { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.like(StringUtils.isNotBlank(filter), SysRole::getRoleName, filter); - List sysRoles = sysRoleMapper.selectList(wrapper); - List result = new ArrayList<>(); - for (SysRole sysRole : sysRoles) { - GroupRepresentation groupRepresentation = new GroupRepresentation(); - groupRepresentation.setId(sysRole.getRoleId().toString()); - groupRepresentation.setName(sysRole.getRoleName()); - groupRepresentation.setType(sysRole.getRoleKey()); - result.add(groupRepresentation); - } - return new ResultListDataRepresentation(result); + return iActModelService.getGroups(filter); } } 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 bf9543c14..f80dac205 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 @@ -4,6 +4,7 @@ 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.dromara.workflow.domain.vo.ResultListDataRepresentation; import org.flowable.engine.repository.Model; import org.springframework.util.MultiValueMap; @@ -61,4 +62,20 @@ public interface IActModelService { * @param response 相应 */ void exportZip(String modelId, HttpServletResponse response); + + /** + * 查询用户 + * + * @param filter 参数 + * @return 结果 + */ + ResultListDataRepresentation getUsers(String filter); + + /** + * 查询用户组 + * + * @param filter 参数 + * @return 结果 + */ + ResultListDataRepresentation getGroups(String filter); } 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 d725f55fa..5cae3f94b 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 @@ -7,6 +7,8 @@ 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.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import jakarta.servlet.http.HttpServletResponse; @@ -17,7 +19,14 @@ 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.tenant.helper.TenantHelper; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysUser; +import org.dromara.system.mapper.SysRoleMapper; +import org.dromara.system.mapper.SysUserMapper; import org.dromara.workflow.domain.bo.ModelBo; +import org.dromara.workflow.domain.vo.GroupRepresentation; +import org.dromara.workflow.domain.vo.ResultListDataRepresentation; +import org.dromara.workflow.domain.vo.UserRepresentation; import org.dromara.workflow.service.IActModelService; import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.bpmn.model.BpmnModel; @@ -35,6 +44,7 @@ import org.springframework.util.MultiValueMap; import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -54,6 +64,8 @@ import static org.flowable.editor.constants.ModelDataJsonConstants.*; public class ActModelServiceImpl implements IActModelService { private final RepositoryService repositoryService; + private final SysUserMapper sysUserMapper; + private final SysRoleMapper sysRoleMapper; /** * 分页查询模型 @@ -334,4 +346,40 @@ public class ActModelServiceImpl implements IActModelService { } } } + + @Override + public ResultListDataRepresentation getUsers(String filter) { + + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(org.dromara.common.core.utils.StringUtils.isNotBlank(filter), SysUser::getNickName, filter); + List sysUsers = sysUserMapper.selectList(wrapper); + List userRepresentations = new ArrayList<>(); + for (SysUser sysUser : sysUsers) { + UserRepresentation userRepresentation = new UserRepresentation(); + userRepresentation.setFullName(sysUser.getNickName()); + userRepresentation.setLastName(sysUser.getNickName()); + userRepresentation.setTenantId(sysUser.getTenantId()); + userRepresentation.setEmail(sysUser.getEmail()); + userRepresentation.setId(sysUser.getUserId().toString()); + userRepresentations.add(userRepresentation); + } + return new ResultListDataRepresentation(userRepresentations); + } + + @Override + public ResultListDataRepresentation getGroups(String filter) { + + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(org.dromara.common.core.utils.StringUtils.isNotBlank(filter), SysRole::getRoleName, filter); + List sysRoles = sysRoleMapper.selectList(wrapper); + List result = new ArrayList<>(); + for (SysRole sysRole : sysRoles) { + GroupRepresentation groupRepresentation = new GroupRepresentation(); + groupRepresentation.setId(sysRole.getRoleId().toString()); + groupRepresentation.setName(sysRole.getRoleName()); + groupRepresentation.setType(sysRole.getRoleKey()); + result.add(groupRepresentation); + } + return new ResultListDataRepresentation(result); + } } From 596c51e5d9ef011a3a86bfdc19d6e31b1c7327f3 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 25 Jun 2023 20:52:30 +0800 Subject: [PATCH 045/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E5=B7=B2?= =?UTF-8?q?=E5=8A=9E=E4=BB=BB=E5=8A=A1=E6=8E=92=E5=BA=8F=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/workflow/domain/vo/TaskVo.java | 5 +++++ .../workflow/service/impl/ActModelServiceImpl.java | 10 ++++++++++ .../workflow/service/impl/ActTaskServiceImpl.java | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java index dce733440..0410d8d46 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java @@ -67,6 +67,11 @@ public class TaskVo { */ private Date createTime; + /** + * 结束时间 + */ + private Date endTime; + /** * 节点id */ 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 5cae3f94b..fadab4713 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 @@ -347,6 +347,11 @@ public class ActModelServiceImpl implements IActModelService { } } + /** + * 查询用户 + * + * @param filter 参数 + */ @Override public ResultListDataRepresentation getUsers(String filter) { @@ -366,6 +371,11 @@ public class ActModelServiceImpl implements IActModelService { return new ResultListDataRepresentation(userRepresentations); } + /** + * 查询用户组 + * + * @param filter 参数 + */ @Override public ResultListDataRepresentation getGroups(String filter) { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 93a7e3226..df9e62582 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -196,7 +196,7 @@ public class ActTaskServiceImpl implements IActTaskService { public TableDataInfo getTaskFinishByPage(TaskBo taskBo) { String userId = String.valueOf(LoginHelper.getUserId()); HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery() - .taskAssignee(userId).taskTenantId(TenantHelper.getTenantId()).finished().orderByHistoricTaskInstanceStartTime().asc(); + .taskAssignee(userId).taskTenantId(TenantHelper.getTenantId()).finished().orderByHistoricTaskInstanceStartTime().desc(); if (StringUtils.isNotBlank(taskBo.getName())) { query.taskNameLike("%" + taskBo.getName() + "%"); } From d80350104b9c00dccf862c6a6b48b6a60ade68c3 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Mon, 26 Jun 2023 20:17:03 +0800 Subject: [PATCH 046/159] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=B5=81=E7=A8=8B=E5=8E=86=E5=8F=B2=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=AE=9E=E4=BE=8B=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/flowable/cmd/UpdateHiTaskInstCmd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateHiTaskInstCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateHiTaskInstCmd.java index b87ae816e..42f6d1c78 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateHiTaskInstCmd.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateHiTaskInstCmd.java @@ -38,7 +38,7 @@ public class UpdateHiTaskInstCmd implements Command { HistoricTaskInstanceEntity historicTask = historicTaskService.getHistoricTask(taskId); if (historicTask != null) { historicTask.setProcessDefinitionId(processDefinitionId); - historicTask.setProcessDefinitionId(processInstanceId); + historicTask.setProcessInstanceId(processInstanceId); historicTask.setCreateTime(new Date()); CommandContextUtil.getHistoricTaskService().updateHistoricTask(historicTask, true); } From 24c362d2ad5593e406cbe2d4be9911d8d03cca9a Mon Sep 17 00:00:00 2001 From: konbai <1527468660@qq.com> Date: Tue, 27 Jun 2023 22:32:05 +0800 Subject: [PATCH 047/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E8=A1=A8=E5=8D=95=E6=93=8D=E4=BD=9C=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/controller/WfFormController.java | 97 +++++++++++++++ .../org/dromara/workflow/domain/WfForm.java | 49 ++++++++ .../dromara/workflow/domain/bo/WfFormBo.java | 56 +++++++++ .../dromara/workflow/domain/vo/WfFormVo.java | 46 +++++++ .../dromara/workflow/mapper/WfFormMapper.java | 13 ++ .../workflow/service/IWfFormService.java | 64 ++++++++++ .../service/impl/WfFormServiceImpl.java | 115 ++++++++++++++++++ .../mapper/workflow/WfFormMapper.xml | 10 ++ script/sql/oracle/oracle_ry_vue_5.X.sql | 31 +++++ script/sql/postgres/postgres_ry_vue_5.X.sql | 33 +++++ script/sql/ry_vue_5.X.sql | 19 +++ script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 91 ++++++++++++++ 12 files changed, 624 insertions(+) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormController.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfForm.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormVo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormMapper.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormMapper.xml diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormController.java new file mode 100644 index 000000000..8262fa1a0 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormController.java @@ -0,0 +1,97 @@ +package org.dromara.workflow.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.QueryGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.workflow.domain.bo.WfFormBo; +import org.dromara.workflow.domain.vo.WfFormVo; +import org.dromara.workflow.service.IWfFormService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.List; + +/** + * 流程表单Controller + * + * @author KonBAI + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/form") +public class WfFormController extends BaseController { + + private final IWfFormService formService; + + /** + * 查询流程表单列表 + */ + @SaCheckPermission("workflow:form:list") + @GetMapping("/list") + public TableDataInfo list(@Validated(QueryGroup.class) WfFormBo bo, PageQuery pageQuery) { + return formService.queryPageList(bo, pageQuery); + } + + /** + * 导出流程表单列表 + */ + @SaCheckPermission("workflow:form:export") + @Log(title = "流程表单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(@Validated WfFormBo bo, HttpServletResponse response) { + List list = formService.queryList(bo); + ExcelUtil.exportExcel(list, "流程表单", WfFormVo.class, response); + } + + /** + * 获取流程表单详细信息 + * @param formId 主键 + */ + @SaCheckPermission("workflow:form:query") + @GetMapping(value = "/{formId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable("formId") Long formId) { + return R.ok(formService.queryById(formId)); + } + + /** + * 新增流程表单 + */ + @SaCheckPermission("workflow:form:add") + @Log(title = "流程表单", businessType = BusinessType.INSERT) + @PostMapping + public R add(@RequestBody WfFormBo bo) { + return toAjax(formService.insertForm(bo)); + } + + /** + * 修改流程表单 + */ + @SaCheckPermission("workflow:form:edit") + @Log(title = "流程表单", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@RequestBody WfFormBo bo) { + return toAjax(formService.updateForm(bo)); + } + + /** + * 删除流程表单 + * @param formIds 主键串 + */ + @SaCheckPermission("workflow:form:remove") + @Log(title = "流程表单", businessType = BusinessType.DELETE) + @DeleteMapping("/{formIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] formIds) { + return toAjax(formService.deleteWithValidByIds(Arrays.asList(formIds))); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfForm.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfForm.java new file mode 100644 index 000000000..59a5c972d --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfForm.java @@ -0,0 +1,49 @@ +package org.dromara.workflow.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; + +/** + * 流程表单对象 wf_form + * + * @author KonBAI + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wf_form") +public class WfForm extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 表单主键 + */ + @TableId(value = "form_id") + private Long formId; + + /** + * 表单名称 + */ + private String formName; + + /** + * 表单配置 + */ + private String formConfig; + + /** + * 表单内容 + */ + private String content; + + /** + * 备注 + */ + private String remark; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormBo.java new file mode 100644 index 000000000..5f17a527e --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormBo.java @@ -0,0 +1,56 @@ +package org.dromara.workflow.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.workflow.domain.WfForm; + +import java.io.Serial; + +/** + * 流程表单业务对象 + * + * @author KonBAI + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = WfForm.class, reverseConvertGenerate = false) +public class WfFormBo extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 表单主键 + */ + @NotNull(message = "表单ID不能为空", groups = { EditGroup.class }) + private Long formId; + + /** + * 表单名称 + */ + @NotBlank(message = "表单名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String formName; + + /** + * 表单配置 + */ + @NotBlank(message = "表单配置不能为空", groups = { AddGroup.class, EditGroup.class }) + private String formConfig; + + /** + * 表单内容 + */ + @NotBlank(message = "表单内容不能为空", groups = { AddGroup.class, EditGroup.class }) + private String content; + + /** + * 备注 + */ + private String remark; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormVo.java new file mode 100644 index 000000000..75e80b107 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormVo.java @@ -0,0 +1,46 @@ +package org.dromara.workflow.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.workflow.domain.WfForm; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 流程分类视图对象 + * + * @author KonBAI + */ +@Data +@AutoMapper(target = WfForm.class) +public class WfFormVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 表单主键 + */ + private Long formId; + + /** + * 表单名称 + */ + private String formName; + + /** + * 表单配置 + */ + private String formConfig; + + /** + * 表单内容 + */ + private String content; + + /** + * 备注 + */ + private String remark; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormMapper.java new file mode 100644 index 000000000..97b8fb664 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormMapper.java @@ -0,0 +1,13 @@ +package org.dromara.workflow.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.workflow.domain.WfForm; +import org.dromara.workflow.domain.vo.WfFormVo; + +/** + * 流程表单Mapper接口 + * + * @author KonBAI + */ +public interface WfFormMapper extends BaseMapperPlus { +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormService.java new file mode 100644 index 000000000..d699ccf6b --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormService.java @@ -0,0 +1,64 @@ +package org.dromara.workflow.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.bo.WfFormBo; +import org.dromara.workflow.domain.vo.WfFormVo; + +import java.util.Collection; +import java.util.List; + +/** + * 流程表单 服务层 + * + * @author KonBAI + */ +public interface IWfFormService { + /** + * 查询流程表单 + * + * @param formId 流程表单ID + * @return 流程表单 + */ + WfFormVo queryById(Long formId); + + /** + * 查询流程表单列表 + * + * @param bo 流程表单 + * @return 流程表单集合 + */ + TableDataInfo queryPageList(WfFormBo bo, PageQuery pageQuery); + + /** + * 查询流程表单列表 + * + * @param bo 流程表单 + * @return 流程表单集合 + */ + List queryList(WfFormBo bo); + + /** + * 新增流程表单 + * + * @param bo 流程表单 + * @return 结果 + */ + int insertForm(WfFormBo bo); + + /** + * 修改流程表单 + * + * @param bo 流程表单 + * @return 结果 + */ + int updateForm(WfFormBo bo); + + /** + * 批量删除流程表单 + * + * @param formIds 需要删除的流程表单ID + * @return 结果 + */ + Boolean deleteWithValidByIds(Collection formIds); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormServiceImpl.java new file mode 100644 index 000000000..eab42ff4d --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormServiceImpl.java @@ -0,0 +1,115 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.WfForm; +import org.dromara.workflow.domain.bo.WfFormBo; +import org.dromara.workflow.domain.vo.WfFormVo; +import org.dromara.workflow.mapper.WfFormMapper; +import org.dromara.workflow.service.IWfFormService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 流程表单Service业务层处理 + * + * @author KonBAI + */ +@RequiredArgsConstructor +@Service +public class WfFormServiceImpl implements IWfFormService { + + private final WfFormMapper baseMapper; + + /** + * 查询流程表单 + * + * @param formId 流程表单ID + * @return 流程表单 + */ + @Override + public WfFormVo queryById(Long formId) { + return baseMapper.selectVoById(formId); + } + + /** + * 查询流程表单列表 + * + * @param bo 流程表单 + * @return 流程表单 + */ + @Override + public TableDataInfo queryPageList(WfFormBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询流程表单列表 + * + * @param bo 流程表单 + * @return 流程表单 + */ + @Override + public List queryList(WfFormBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + /** + * 新增流程表单 + * + * @param bo 流程表单 + * @return 结果 + */ + @Override + public int insertForm(WfFormBo bo) { + WfForm WfForm = MapstructUtils.convert(bo, WfForm.class); + return baseMapper.insert(WfForm); + } + + /** + * 修改流程表单 + * + * @param bo 流程表单 + * @return 结果 + */ + @Override + public int updateForm(WfFormBo bo) { + return baseMapper.update(new WfForm(), new LambdaUpdateWrapper() + .set(StrUtil.isNotBlank(bo.getFormName()), WfForm::getFormName, bo.getFormName()) + .set(StrUtil.isNotBlank(bo.getContent()), WfForm::getContent, bo.getContent()) + .set(StrUtil.isNotBlank(bo.getRemark()), WfForm::getRemark, bo.getRemark()) + .eq(WfForm::getFormId, bo.getFormId())); + } + + /** + * 批量删除流程表单 + * + * @param ids 需要删除的流程表单ID + * @return 结果 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids) { + return baseMapper.deleteBatchIds(ids) > 0; + } + + private LambdaQueryWrapper buildQueryWrapper(WfFormBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getFormName()), WfForm::getFormName, bo.getFormName()); + return lqw; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormMapper.xml new file mode 100644 index 000000000..5d3a0c955 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormMapper.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/script/sql/oracle/oracle_ry_vue_5.X.sql b/script/sql/oracle/oracle_ry_vue_5.X.sql index 0456f11ec..d0a887efe 100644 --- a/script/sql/oracle/oracle_ry_vue_5.X.sql +++ b/script/sql/oracle/oracle_ry_vue_5.X.sql @@ -1106,6 +1106,37 @@ insert into sys_oss_config values (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX', 'X insert into sys_oss_config values (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi-1250000000', '', 'cos.ap-beijing.myqcloud.com', '','N', 'ap-beijing', '1', '1', '', NULL, 103, 1, sysdate, 1, sysdate); insert into sys_oss_config values (5, '000000', 'image', 'ruoyi', 'ruoyi123', 'ruoyi', 'image', '127.0.0.1:9000', '','N', '', '1', '1', '', NULL, 103, 1, sysdate, 1, sysdate); +-- ---------------------------- +-- 流程表单信息表 +-- ---------------------------- +create table wf_form ( + form_id number(20) not null, + form_name varchar(64) default '', + form_config nclob, + content nclob, + create_dept number(20) default null, + create_by number(20) default null, + create_time date, + update_by number(20) default null, + update_time date, + remark varchar(255) default '', + del_flag char(1) default '0' +); + +alter table wf_form add constraint pk_wf_form primary key (form_id); + +comment on table wf_form is '流程表单信息表'; +comment on column wf_form.form_id is '表单主键'; +comment on column wf_form.form_name is '表单名称'; +comment on column wf_form.form_config is '表单配置'; +comment on column wf_form.content is '表单内容'; +comment on column wf_form.create_dept is '创建部门'; +comment on column wf_form.create_by is '创建者'; +comment on column wf_form.create_time is '创建时间'; +comment on column wf_form.update_by is '更新者'; +comment on column wf_form.update_time is '更新时间'; +comment on column wf_form.remark is '备注'; +comment on column wf_form.del_flag is '删除标志(0代表存在 2代表删除)'; -- ---------------------------- -- 钩子 ,用于session连接之后 自动设置默认的date类型格式化 简化时间查询 diff --git a/script/sql/postgres/postgres_ry_vue_5.X.sql b/script/sql/postgres/postgres_ry_vue_5.X.sql index bdf28b493..65b5b1998 100644 --- a/script/sql/postgres/postgres_ry_vue_5.X.sql +++ b/script/sql/postgres/postgres_ry_vue_5.X.sql @@ -1130,6 +1130,39 @@ insert into sys_oss_config values (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX', 'X insert into sys_oss_config values (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi-1250000000', '', 'cos.ap-beijing.myqcloud.com', '','N', 'ap-beijing', '1', '1', '', 103, 1, now(), 1, now(), null); insert into sys_oss_config values (5, '000000', 'image', 'ruoyi', 'ruoyi123', 'ruoyi', 'image', '127.0.0.1:9000', '','N', '', '1', '1', '', 103, 1, now(), 1, now(), NULL); +-- ---------------------------- +-- 流程表单信息表 +-- ---------------------------- +drop table if exists bpmn_form; +create table if not exists bpmn_form +( + form_id int8, + tenant_id varchar(20) default '000000'::varchar, + form_name varchar(255) default ''::varchar not null, + form_config text, + content text, + create_dept int8, + create_by int8, + create_time timestamp, + update_by int8, + update_time timestamp, + remark varchar(500) default ''::varchar, + constraint bpmn_form_pk primary key (bpmn_form) +); + +comment on table wf_form is '流程表单信息表'; +comment on column bpmn_form.form_id is '表单主键'; +comment on column bpmn_form.form_name is '表单名称'; +comment on column bpmn_form.form_config is '表单配置'; +comment on column bpmn_form.content is '表单内容'; +comment on column bpmn_form.create_dept is '创建部门'; +comment on column bpmn_form.create_by is '创建者'; +comment on column bpmn_form.create_time is '创建时间'; +comment on column bpmn_form.update_by is '更新者'; +comment on column bpmn_form.update_time is '更新时间'; +comment on column bpmn_form.remark is '备注'; +comment on column bpmn_form.del_flag is '删除标志(0代表存在 2代表删除)'; + -- 字符串自动转时间 避免框架时间查询报错问题 create or replace function cast_varchar_to_timestamp(varchar) returns timestamptz as $$ select to_timestamp($1, 'yyyy-mm-dd hh24:mi:ss'); diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index 2b3ea0c1c..a05cdfefe 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -794,3 +794,22 @@ insert into sys_oss_config values (2, '000000', 'qiniu', 'XXXXXXXXXXXXXXX', 'X insert into sys_oss_config values (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 'oss-cn-beijing.aliyuncs.com', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), NULL); insert into sys_oss_config values (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi-1250000000', '', 'cos.ap-beijing.myqcloud.com', '','N', 'ap-beijing', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), NULL); insert into sys_oss_config values (5, '000000', 'image', 'ruoyi', 'ruoyi123', 'ruoyi', 'image', '127.0.0.1:9000', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), NULL); + +-- ---------------------------- +-- 流程表单信息表 +-- ---------------------------- +drop table if exists wf_form; +create table wf_form ( + form_id bigint not null comment '表单id', + tenant_id varchar(20) default '000000'comment '租户编号', + form_name varchar(255) default null comment '表单名称', + form_config longtext comment '表单配置', + content longtext comment '表单内容', + create_dept bigint default null comment '创建部门', + create_by bigint default null comment '创建者', + create_time datetime default null comment '创建时间', + update_by bigint default null comment '更新者', + update_time datetime default null comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (form_id) +) engine=innodb comment='流程表单信息表'; diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql index f72dfffcd..ca1025fcc 100644 --- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql +++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql @@ -2812,3 +2812,94 @@ INSERT INTO sys_oss_config VALUES (N'4', N'000000', N'qcloud', N'XXXXXXXXXXXXXXX GO INSERT INTO sys_oss_config VALUES (N'5', N'000000', N'image', N'ruoyi', N'ruoyi123', N'ruoyi', N'image', N'127.0.0.1:9000', N'',N'N', N'', N'1', N'1', N'', 103, 1, getdate(), 1, getdate(), NULL) GO + +CREATE TABLE wf_form +( + form_id bigint NOT NULL, + form_name nvarchar(64) DEFAULT '' NULL, + form_config nvarchar(max) NULL, + content nvarchar(max) NULL, + create_dept bigint NULL, + create_by nvarchar(64) DEFAULT '' NULL, + create_time datetime2(7) NULL, + update_by nvarchar(64) DEFAULT '' NULL, + update_time datetime2(7) NULL, + remark nvarchar(255) NULL, + del_flag nchar(1) DEFAULT ('0') NULL, + CONSTRAINT [PK__wf_form] PRIMARY KEY CLUSTERED ([form_id]) + WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + ON [PRIMARY] +) +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'表单主键', + 'SCHEMA', N'dbo', + 'TABLE', N'wf_form', + 'COLUMN', N'form_id' +GO +EXEC sp_addextendedproperty + 'MS_Description', N'表单名称', + 'SCHEMA', N'dbo', + 'TABLE', N'wf_form', + 'COLUMN', N'form_name' +GO +EXEC sp_addextendedproperty + 'MS_Description', N'表单配置', + 'SCHEMA', N'dbo', + 'TABLE', N'wf_form', + 'COLUMN', N'form_config' +GO +EXEC sp_addextendedproperty + 'MS_Description', N'表单内容', + 'SCHEMA', N'dbo', + 'TABLE', N'wf_form', + 'COLUMN', N'content' +GO +EXEC sp_addextendedproperty + 'MS_Description', N'创建部门' , + 'SCHEMA', N'dbo', + 'TABLE', N'wf_form', + 'COLUMN', N'create_dept' +GO +EXEC sp_addextendedproperty + 'MS_Description', N'创建者', + 'SCHEMA', N'dbo', + 'TABLE', N'wf_form', + 'COLUMN', N'create_by' +GO +EXEC sp_addextendedproperty + 'MS_Description', N'创建时间', + 'SCHEMA', N'dbo', + 'TABLE', N'wf_form', + 'COLUMN', N'create_time' +GO +EXEC sp_addextendedproperty + 'MS_Description', N'更新者', + 'SCHEMA', N'dbo', + 'TABLE', N'wf_form', + 'COLUMN', N'update_by' +GO +EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'wf_form', + 'COLUMN', N'update_time' +GO +EXEC sp_addextendedproperty + 'MS_Description', N'备注', + 'SCHEMA', N'dbo', + 'TABLE', N'wf_form', + 'COLUMN', N'remark' +GO +EXEC sp_addextendedproperty + 'MS_Description', N'删除标志(0代表存在 2代表删除)', + 'SCHEMA', N'dbo', + 'TABLE', N'wf_form', + 'COLUMN', N'del_flag' +GO +EXEC sp_addextendedproperty + 'MS_Description', N'流程表单信息表', + 'SCHEMA', N'dbo', + 'TABLE', N'wf_form' +GO From b8097737731d11975c00c7cb09233ae89dec77e3 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Wed, 28 Jun 2023 22:25:56 +0800 Subject: [PATCH 048/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WfCategoryController.java | 105 ++++++++++++++++++ .../dromara/workflow/domain/WfCategory.java | 51 +++++++++ .../workflow/domain/bo/WfCategoryBo.java | 53 +++++++++ .../workflow/domain/vo/WfCategoryVo.java | 59 ++++++++++ .../workflow/mapper/WfCategoryMapper.java | 15 +++ .../workflow/service/IWfCategoryService.java | 42 +++++++ .../service/impl/WfCategoryServiceImpl.java | 97 ++++++++++++++++ .../src/main/resources/mapper/package-info.md | 3 - .../mapper/workflow/WfCategoryMapper.xml | 7 ++ .../resources/mapper/workflow/package-info.md | 3 - script/sql/ry_vue_5.X.sql | 21 ++++ 11 files changed, 450 insertions(+), 6 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfCategoryController.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfCategory.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCategoryVo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfCategoryMapper.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java delete 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/WfCategoryMapper.xml delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/package-info.md diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfCategoryController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfCategoryController.java new file mode 100644 index 000000000..a0a4716fe --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfCategoryController.java @@ -0,0 +1,105 @@ +package org.dromara.workflow.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.workflow.domain.vo.WfCategoryVo; +import org.dromara.workflow.domain.bo.WfCategoryBo; +import org.dromara.workflow.service.IWfCategoryService; + +/** + * 流程分类 + * + * @author may + * @date 2023-06-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/category") +public class WfCategoryController extends BaseController { + + private final IWfCategoryService wfCategoryService; + + /** + * 查询流程分类列表 + */ + @SaCheckPermission("workflow:category:list") + @GetMapping("/list") + public R> list(WfCategoryBo bo) { + List list = wfCategoryService.queryList(bo); + return R.ok(list); + + } + + /** + * 导出流程分类列表 + */ + @SaCheckPermission("workflow:category:export") + @Log(title = "流程分类", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(WfCategoryBo bo, HttpServletResponse response) { + List list = wfCategoryService.queryList(bo); + ExcelUtil.exportExcel(list, "流程分类", WfCategoryVo.class, response); + } + + /** + * 获取流程分类详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("workflow:category:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(wfCategoryService.queryById(id)); + } + + /** + * 新增流程分类 + */ + @SaCheckPermission("workflow:category:add") + @Log(title = "流程分类", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody WfCategoryBo bo) { + return toAjax(wfCategoryService.insertByBo(bo)); + } + + /** + * 修改流程分类 + */ + @SaCheckPermission("workflow:category:edit") + @Log(title = "流程分类", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody WfCategoryBo bo) { + return toAjax(wfCategoryService.updateByBo(bo)); + } + + /** + * 删除流程分类 + * + * @param ids 主键串 + */ + @SaCheckPermission("workflow:category:remove") + @Log(title = "流程分类", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(wfCategoryService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfCategory.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfCategory.java new file mode 100644 index 000000000..37da761d9 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfCategory.java @@ -0,0 +1,51 @@ +package org.dromara.workflow.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 流程分类对象 wf_category + * + * @author may + * @date 2023-06-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wf_category") +public class WfCategory extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 分类名称 + */ + private String categoryName; + + /** + * 分类编码 + */ + private String categoryCode; + + /** + * 父级id + */ + private Long parentId; + + /** + * 排序 + */ + private Long sortNum; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java new file mode 100644 index 000000000..d0ccbaa64 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java @@ -0,0 +1,53 @@ +package org.dromara.workflow.domain.bo; + +import org.dromara.workflow.domain.WfCategory; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 流程分类业务对象 wf_category + * + * @author may + * @date 2023-06-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = WfCategory.class, reverseConvertGenerate = false) +public class WfCategoryBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 分类名称 + */ + @NotBlank(message = "分类名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String categoryName; + + /** + * 分类编码 + */ + @NotBlank(message = "分类编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String categoryCode; + + /** + * 父级id + */ + @NotNull(message = "父级id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long parentId; + + /** + * 排序 + */ + private Long sortNum; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCategoryVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCategoryVo.java new file mode 100644 index 000000000..59df23a0b --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCategoryVo.java @@ -0,0 +1,59 @@ +package org.dromara.workflow.domain.vo; + +import org.dromara.workflow.domain.WfCategory; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + + +/** + * 流程分类视图对象 wf_category + * + * @author may + * @date 2023-06-27 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = WfCategory.class) +public class WfCategoryVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 分类名称 + */ + @ExcelProperty(value = "分类名称") + private String categoryName; + + /** + * 分类编码 + */ + @ExcelProperty(value = "分类编码") + private String categoryCode; + + /** + * 父级id + */ + @ExcelProperty(value = "父级id") + private Long parentId; + + /** + * 排序 + */ + @ExcelProperty(value = "排序") + private Long sortNum; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfCategoryMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfCategoryMapper.java new file mode 100644 index 000000000..5d1f90b55 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfCategoryMapper.java @@ -0,0 +1,15 @@ +package org.dromara.workflow.mapper; + +import org.dromara.workflow.domain.WfCategory; +import org.dromara.workflow.domain.vo.WfCategoryVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 流程分类Mapper接口 + * + * @author may + * @date 2023-06-27 + */ +public interface WfCategoryMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java new file mode 100644 index 000000000..61bf7df23 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java @@ -0,0 +1,42 @@ +package org.dromara.workflow.service; + +import org.dromara.workflow.domain.vo.WfCategoryVo; +import org.dromara.workflow.domain.bo.WfCategoryBo; + +import java.util.Collection; +import java.util.List; + +/** + * 流程分类Service接口 + * + * @author may + * @date 2023-06-28 + */ +public interface IWfCategoryService { + + /** + * 查询流程分类 + */ + WfCategoryVo queryById(Long id); + + + /** + * 查询流程分类列表 + */ + List queryList(WfCategoryBo bo); + + /** + * 新增流程分类 + */ + Boolean insertByBo(WfCategoryBo bo); + + /** + * 修改流程分类 + */ + Boolean updateByBo(WfCategoryBo bo); + + /** + * 校验并批量删除流程分类信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java new file mode 100644 index 000000000..61364d6be --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java @@ -0,0 +1,97 @@ +package org.dromara.workflow.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.workflow.domain.bo.WfCategoryBo; +import org.dromara.workflow.domain.vo.WfCategoryVo; +import org.dromara.workflow.domain.WfCategory; +import org.dromara.workflow.mapper.WfCategoryMapper; +import org.dromara.workflow.service.IWfCategoryService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 流程分类Service业务层处理 + * + * @author may + * @date 2023-06-28 + */ +@RequiredArgsConstructor +@Service +public class WfCategoryServiceImpl implements IWfCategoryService { + + private final WfCategoryMapper baseMapper; + + /** + * 查询流程分类 + */ + @Override + public WfCategoryVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + + /** + * 查询流程分类列表 + */ + @Override + public List queryList(WfCategoryBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(WfCategoryBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getCategoryName()), WfCategory::getCategoryName, bo.getCategoryName()); + lqw.eq(StringUtils.isNotBlank(bo.getCategoryCode()), WfCategory::getCategoryCode, bo.getCategoryCode()); + return lqw; + } + + /** + * 新增流程分类 + */ + @Override + public Boolean insertByBo(WfCategoryBo bo) { + WfCategory add = MapstructUtils.convert(bo, WfCategory.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改流程分类 + */ + @Override + public Boolean updateByBo(WfCategoryBo bo) { + WfCategory update = MapstructUtils.convert(bo, WfCategory.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(WfCategory entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除流程分类 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} 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 deleted file mode 100644 index c938b1e50..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/package-info.md +++ /dev/null @@ -1,3 +0,0 @@ -java包使用 `.` 分割 resource 目录使用 `/` 分割 -
-此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfCategoryMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfCategoryMapper.xml new file mode 100644 index 000000000..fb05c24ad --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfCategoryMapper.xml @@ -0,0 +1,7 @@ + + + + + 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 deleted file mode 100644 index c938b1e50..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/package-info.md +++ /dev/null @@ -1,3 +0,0 @@ -java包使用 `.` 分割 resource 目录使用 `/` 分割 -
-此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index a05cdfefe..b01e55501 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -813,3 +813,24 @@ create table wf_form ( remark varchar(500) default null comment '备注', primary key (form_id) ) engine=innodb comment='流程表单信息表'; + +-- ---------------------------- +-- 流程分类信息表 +-- ---------------------------- +create table wf_category +( + id bigint not null comment '主键' + primary key, + category_name varchar(255) null comment '分类名称', + category_code varchar(255) null comment '分类编码', + parent_id bigint null comment '父级id', + sort_num int(19) null comment '排序', + tenant_id varchar(20) default '000000' null comment '租户编号', + create_dept bigint null comment '创建部门', + create_by bigint null comment '创建者', + create_time datetime null comment '创建时间', + update_by bigint null comment '更新者', + update_time datetime null comment '更新时间', + constraint uni_category_code + unique (category_code) +) engine=innodb comment= '流程分类'; From 52bf215b6d441faf13011db012bc901c97ebb3cc Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Fri, 30 Jun 2023 12:54:05 +0800 Subject: [PATCH 049/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E5=88=86=E7=B1=BB=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dromara/workflow/domain/bo/ModelBo.java | 6 ++++++ .../dromara/workflow/service/impl/ActModelServiceImpl.java | 4 ++++ 2 files changed, 10 insertions(+) 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 b89d78a2c..f8b037a65 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 @@ -33,6 +33,12 @@ public class ModelBo extends PageEntity implements Serializable { @NotBlank(message = "模型标识key不能为空", groups = {AddGroup.class}) private String key; + /** + * 模型标识key + */ + @NotBlank(message = "模型分类不能为空", groups = {AddGroup.class}) + private String categoryCode; + /** * 备注 */ 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 fadab4713..b9361cc3e 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 @@ -83,6 +83,9 @@ public class ActModelServiceImpl implements IActModelService { if (StringUtils.isNotEmpty(modelBo.getKey())) { query.modelKey(modelBo.getKey()); } + if (StringUtils.isNotEmpty(modelBo.getCategoryCode())) { + query.modelCategory(modelBo.getCategoryCode()); + } query.orderByLastUpdateTime().desc(); //创建时间降序排列 query.orderByCreateTime().desc(); @@ -125,6 +128,7 @@ public class ActModelServiceImpl implements IActModelService { Model model = repositoryService.newModel(); model.setKey(key); model.setName(name); + model.setCategory(modelBo.getCategoryCode()); model.setVersion(version); model.setTenantId(TenantHelper.getTenantId()); ObjectMapper objectMapper = JsonUtils.getObjectMapper(); From 6479864c8501a2c1be1c6f9dd78653bffface89a Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 1 Jul 2023 11:15:29 +0800 Subject: [PATCH 050/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=B5=81=E7=A8=8B=E5=AE=9E=E4=BE=8B=EF=BC=8C=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=E5=88=86=E7=B1=BB=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dromara/workflow/domain/bo/ModelBo.java | 2 +- .../org/dromara/workflow/domain/bo/ProcessDefinitionBo.java | 6 ++++++ .../org/dromara/workflow/domain/bo/ProcessInstanceBo.java | 5 +++++ .../dromara/workflow/service/impl/ActModelServiceImpl.java | 4 ++++ .../service/impl/ActProcessDefinitionServiceImpl.java | 3 +++ .../service/impl/ActProcessInstanceServiceImpl.java | 6 ++++++ 6 files changed, 25 insertions(+), 1 deletion(-) 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 f8b037a65..40204a561 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 @@ -34,7 +34,7 @@ public class ModelBo extends PageEntity implements Serializable { private String key; /** - * 模型标识key + * 模型分类 */ @NotBlank(message = "模型分类不能为空", groups = {AddGroup.class}) private String categoryCode; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessDefinitionBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessDefinitionBo.java index 0d7602284..86e9e0135 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessDefinitionBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessDefinitionBo.java @@ -23,9 +23,15 @@ public class ProcessDefinitionBo extends PageEntity implements Serializable { * 流程定义名称key */ private String key; + /** * 流程定义名称 */ private String name; + /** + * 模型分类 + */ + private String categoryCode; + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInstanceBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInstanceBo.java index 0e404243f..2ab54dcd5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInstanceBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInstanceBo.java @@ -33,4 +33,9 @@ public class ProcessInstanceBo extends PageEntity implements Serializable { * 业务id */ private String businessKey; + + /** + * 模型分类 + */ + private String categoryCode; } 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 b9361cc3e..447472673 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 @@ -36,6 +36,7 @@ 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.flowable.engine.repository.ProcessDefinition; import org.flowable.validation.ValidationError; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -292,6 +293,9 @@ public class ActModelServiceImpl implements IActModelService { // 更新 部署id 到流程定义模型数据表中 model.setDeploymentId(deployment.getId()); repositoryService.saveModel(model); + // 更新分类 + ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult(); + repositoryService.setProcessDefinitionCategory(definition.getId(), model.getCategory()); return true; } catch (Exception e) { e.printStackTrace(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index 7c7266b78..6691c9b16 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -64,6 +64,9 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer if (StringUtils.isNotEmpty(processDefinitionBo.getKey())) { query.processDefinitionKey(processDefinitionBo.getKey()); } + if (StringUtils.isNotEmpty(processDefinitionBo.getCategoryCode())) { + query.processDefinitionCategory(processDefinitionBo.getCategoryCode()); + } if (StringUtils.isNotEmpty(processDefinitionBo.getName())) { query.processDefinitionNameLike("%" + processDefinitionBo.getName() + "%"); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 9174370db..2ec1607e9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -93,6 +93,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService if (StringUtils.isNotBlank(processInstanceBo.getBusinessKey())) { query.processInstanceBusinessKey(processInstanceBo.getBusinessKey()); } + if (StringUtils.isNotBlank(processInstanceBo.getCategoryCode())) { + query.processDefinitionCategory(processInstanceBo.getCategoryCode()); + } List processInstances = query.listPage(processInstanceBo.getPageNum(), processInstanceBo.getPageSize()); for (ProcessInstance processInstance : processInstances) { ProcessInstanceVo processInstanceVo = BeanUtil.toBean(processInstance, ProcessInstanceVo.class); @@ -124,6 +127,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService if (StringUtils.isNotBlank(processInstanceBo.getBusinessKey())) { query.processInstanceBusinessKey(processInstanceBo.getBusinessKey()); } + if (StringUtils.isNotBlank(processInstanceBo.getCategoryCode())) { + query.processDefinitionCategory(processInstanceBo.getCategoryCode()); + } List historicProcessInstances = query.listPage(processInstanceBo.getPageNum(), processInstanceBo.getPageSize()); for (HistoricProcessInstance historicProcessInstance : historicProcessInstances) { ProcessInstanceVo processInstanceVo = BeanUtil.toBean(historicProcessInstance, ProcessInstanceVo.class); From d03d88a4e696e43d0d0d3abd636b89fae775ac91 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 1 Jul 2023 13:37:51 +0800 Subject: [PATCH 051/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E5=8A=9E?= =?UTF-8?q?=E7=90=86=E4=BA=BA=E5=90=8D=E7=A7=B0=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/constant/CacheNames.java | 5 ++++ .../common/core/service/UserService.java | 8 ++++++ .../translation/constant/TransConstant.java | 5 ++++ .../core/impl/NicknameTranslationImpl.java | 27 +++++++++++++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../service/impl/SysUserServiceImpl.java | 8 ++++++ .../dromara/workflow/domain/vo/TaskVo.java | 11 +++++++- .../service/impl/ActTaskServiceImpl.java | 2 ++ 8 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java index c3425d0aa..86ab80ed0 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java @@ -40,6 +40,11 @@ public interface CacheNames { */ String SYS_USER_NAME = "sys_user_name#30d"; + /** + * 用户名称 + */ + String SYS_NICKNAME = "sys_nickname#30d"; + /** * 部门 */ diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java index 554e506d5..d6b312a64 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java @@ -15,4 +15,12 @@ public interface UserService { */ String selectUserNameById(Long userId); + /** + * 通过用户ID查询用户账户 + * + * @param userId 用户ID + * @return 用户账户 + */ + String selectNicknameById(Long userId); + } diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java index 25df1c9fc..c084ea1a0 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java @@ -12,6 +12,11 @@ public interface TransConstant { */ String USER_ID_TO_NAME = "user_id_to_name"; + /** + * 用户id转用户名称 + */ + String USER_ID_TO_NICKNAME = "user_id_to_nickname"; + /** * 部门id转名称 */ diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java new file mode 100644 index 000000000..ac65f5afc --- /dev/null +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java @@ -0,0 +1,27 @@ +package org.dromara.common.translation.core.impl; + +import lombok.AllArgsConstructor; +import org.dromara.common.core.service.UserService; +import org.dromara.common.translation.annotation.TranslationType; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.common.translation.core.TranslationInterface; + +/** + * 用户名称翻译实现 + * + * @author may + */ +@AllArgsConstructor +@TranslationType(type = TransConstant.USER_ID_TO_NICKNAME) +public class NicknameTranslationImpl implements TranslationInterface { + + private final UserService userService; + + @Override + public String translation(Object key, String other) { + if (key instanceof Long id) { + return userService.selectNicknameById(id); + } + return null; + } +} diff --git a/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 45844e014..ad40205ed 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -3,3 +3,4 @@ org.dromara.common.translation.core.impl.DeptNameTranslationImpl org.dromara.common.translation.core.impl.DictTypeTranslationImpl org.dromara.common.translation.core.impl.OssUrlTranslationImpl org.dromara.common.translation.core.impl.UserNameTranslationImpl +org.dromara.common.translation.core.impl.NicknameTranslationImpl diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index c8f63274c..1cda58c73 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -520,4 +520,12 @@ public class SysUserServiceImpl implements ISysUserService, UserService { .select(SysUser::getUserName).eq(SysUser::getUserId, userId)); return ObjectUtil.isNull(sysUser) ? null : sysUser.getUserName(); } + + @Override + @Cacheable(cacheNames = CacheNames.SYS_NICKNAME, key = "#userId") + public String selectNicknameById(Long userId) { + SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysUser::getNickName).eq(SysUser::getUserId, userId)); + return ObjectUtil.isNull(sysUser) ? null : sysUser.getNickName(); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java index 0410d8d46..5cbb62f62 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java @@ -1,6 +1,8 @@ package org.dromara.workflow.domain.vo; import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; import java.util.Date; @@ -40,7 +42,14 @@ public class TaskVo { /** * 办理人id */ - private String assignee; + private Long assignee; + + /** + * 办理人 + */ + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "assignee") + private String assigneeName; + /** * 流程实例id diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index df9e62582..7ed1ef1a0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -180,6 +180,7 @@ public class ActTaskServiceImpl implements IActTaskService { taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); }); } + taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); list.add(taskVo); } @@ -215,6 +216,7 @@ public class ActTaskServiceImpl implements IActTaskService { taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); }); } + taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); list.add(taskVo); } long count = query.count(); From f227c35fb4030719f35af54eb2c530d62c19211e Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 1 Jul 2023 14:46:05 +0800 Subject: [PATCH 052/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=92=A4?= =?UTF-8?q?=E9=94=80=E6=B5=81=E7=A8=8B=E7=94=B3=E8=AF=B7=EF=BC=8C=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E7=99=BB=E5=BD=95=E4=BA=BA=E5=8D=95=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/vo/ActHistoryInfoVo.java | 5 +- .../workflow/domain/vo/ProcessInstanceVo.java | 6 ++ .../impl/ActProcessInstanceServiceImpl.java | 65 +++++++++++-------- 3 files changed, 49 insertions(+), 27 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java index 093e65945..87d2ad2dd 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java @@ -1,6 +1,8 @@ package org.dromara.workflow.domain.vo; import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; import java.io.Serial; import java.io.Serializable; @@ -51,11 +53,12 @@ public class ActHistoryInfoVo implements Serializable { /** * 办理人id */ - private String assignee; + private Long assignee; /** * 办理人名称 */ + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "assignee") private String nickName; /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java index e3b17c4b1..3917f4f51 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java @@ -5,6 +5,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; import java.util.Date; +import java.util.List; /** * 流程实例视图 @@ -86,4 +87,9 @@ public class ProcessInstanceVo implements Serializable { * 流程状态 */ private String businessStatusName; + + /** + * 待办任务集合 + */ + private List taskVoList; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 2ec1607e9..938ad8c21 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -13,8 +13,6 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.service.ISysUserService; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.enums.BusinessStatusEnum; import org.dromara.workflow.domain.bo.ProcessInstanceBo; @@ -22,6 +20,7 @@ import org.dromara.workflow.domain.bo.ProcessInvalidBo; import org.dromara.workflow.domain.vo.ActHistoryInfoVo; import org.dromara.workflow.domain.vo.GraphicInfoVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; +import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator; import org.dromara.workflow.service.IActProcessInstanceService; import org.flowable.bpmn.model.*; @@ -62,7 +61,6 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService private final RepositoryService repositoryService; private final RuntimeService runtimeService; private final HistoryService historyService; - private final ISysUserService iSysUserService; private final TaskService taskService; @Value("${flowable.activity-font-name}") @@ -249,18 +247,14 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService } if (ObjectUtil.isNotEmpty(historicTaskInstance.getDurationInMillis())) { actHistoryInfoVo.setRunDuration(getDuration(historicTaskInstance.getDurationInMillis())); + } + try { + actHistoryInfoVo.setAssignee(StringUtils.isNotBlank(historicTaskInstance.getAssignee()) ? Long.valueOf(historicTaskInstance.getAssignee()) : null); + } catch (NumberFormatException ignored) { + } actHistoryInfoVoList.add(actHistoryInfoVo); } - //翻译人员名称 - if (CollUtil.isNotEmpty(actHistoryInfoVoList)) { - actHistoryInfoVoList.forEach(e -> { - if (StringUtils.isNotBlank(e.getAssignee())) { - SysUserVo sysUserVo = iSysUserService.selectUserById(Long.valueOf(e.getAssignee())); - e.setNickName(ObjectUtil.isNotEmpty(sysUserVo) ? sysUserVo.getNickName() : ""); - } - }); - } List nodeInfoList = new ArrayList<>(); Map> groupByKey = StreamUtils.groupByKey(actHistoryInfoVoList, ActHistoryInfoVo::getTaskDefinitionKey); for (Map.Entry> entry : groupByKey.entrySet()) { @@ -421,25 +415,28 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService @Override @Transactional(rollbackFor = Exception.class) public boolean cancelProcessApply(String processInstanceId) { - ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() - .processInstanceId(processInstanceId).processInstanceTenantId(TenantHelper.getTenantId()).startedBy(String.valueOf(LoginHelper.getUserId())).singleResult(); - if (ObjectUtil.isNull(processInstance)) { - throw new ServiceException("您不是流程发起人,撤销失败!"); - } - if (processInstance.isSuspended()) { - throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); - } - BusinessStatusEnum.checkStatus(processInstance.getBusinessStatus()); - List taskList = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(processInstanceId).list(); - for (Task task : taskList) { - taskService.addComment(task.getId(), processInstanceId, "申请人撤销申请"); - } try { - HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().finished().orderByHistoricTaskInstanceEndTime().finished().list().get(0); + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() + .processInstanceId(processInstanceId).processInstanceTenantId(TenantHelper.getTenantId()).startedBy(String.valueOf(LoginHelper.getUserId())).singleResult(); + if (ObjectUtil.isNull(processInstance)) { + throw new ServiceException("您不是流程发起人,撤销失败!"); + } + if (processInstance.isSuspended()) { + throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); + } + BusinessStatusEnum.checkStatus(processInstance.getBusinessStatus()); + List taskList = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(processInstanceId).list(); + for (Task task : taskList) { + taskService.setAssignee(task.getId(), String.valueOf(LoginHelper.getUserId())); + taskService.addComment(task.getId(), processInstanceId, LoginHelper.getUsername() + ":撤销申请"); + } + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().finished().orderByHistoricTaskInstanceEndTime().asc().list().get(0); List nodeIds = StreamUtils.toList(taskList, Task::getTaskDefinitionKey); runtimeService.createChangeActivityStateBuilder() .processInstanceId(processInstanceId) .moveActivityIdsToSingleActivityId(nodeIds, historicTaskInstance.getTaskDefinitionKey()).changeState(); + Task task = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(processInstanceId).list().get(0); + taskService.setAssignee(task.getId(), historicTaskInstance.getAssignee()); runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.CANCEL.getStatus()); return true; } catch (Exception e) { @@ -465,10 +462,26 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService if (StringUtils.isNotBlank(processInstanceBo.getBusinessKey())) { query.processInstanceBusinessKey(processInstanceBo.getBusinessKey()); } + if (StringUtils.isNotBlank(processInstanceBo.getCategoryCode())) { + query.processInstanceBusinessKey(processInstanceBo.getCategoryCode()); + } + query.orderByProcessInstanceStartTime().desc(); List historicProcessInstanceList = query.listPage(processInstanceBo.getPageNum(), processInstanceBo.getPageSize()); + List taskVoList = new ArrayList<>(); + if (CollUtil.isNotEmpty(historicProcessInstanceList)) { + List processInstanceIds = StreamUtils.toList(historicProcessInstanceList, HistoricProcessInstance::getId); + List taskList = taskService.createTaskQuery().processInstanceIdIn(processInstanceIds).taskTenantId(TenantHelper.getTenantId()).list(); + for (Task task : taskList) { + taskVoList.add(BeanUtil.toBean(task, TaskVo.class)); + } + } for (HistoricProcessInstance processInstance : historicProcessInstanceList) { ProcessInstanceVo processInstanceVo = BeanUtil.toBean(processInstance, ProcessInstanceVo.class); processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstance.getBusinessStatus())); + if (CollUtil.isNotEmpty(taskVoList)) { + List collect = taskVoList.stream().filter(e -> e.getProcessInstanceId().equals(processInstance.getId())).collect(Collectors.toList()); + processInstanceVo.setTaskVoList(CollUtil.isNotEmpty(collect) ? collect : Collections.emptyList()); + } list.add(processInstanceVo); } long count = query.count(); From ecbd2b046ec88ad7f0c077675ab1f2822368a740 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 1 Jul 2023 18:37:51 +0800 Subject: [PATCH 053/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9E=E4=BE=8B=EF=BC=8C=E6=B5=81=E7=A8=8B=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E6=A3=80=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/bo/ProcessInstanceBo.java | 5 +++++ .../org/dromara/workflow/domain/bo/TaskBo.java | 10 ++++++++++ .../org/dromara/workflow/domain/vo/TaskVo.java | 10 ++++++++++ .../impl/ActProcessInstanceServiceImpl.java | 11 ++++++++++- .../service/impl/ActTaskServiceImpl.java | 16 ++++++++++++++++ 5 files changed, 51 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInstanceBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInstanceBo.java index 2ab54dcd5..ff8af2335 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInstanceBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessInstanceBo.java @@ -24,6 +24,11 @@ public class ProcessInstanceBo extends PageEntity implements Serializable { */ private String name; + /** + * 流程key + */ + private String key; + /** * 任务发起人 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskBo.java index 0064be79a..cd2eeadf5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskBo.java @@ -23,4 +23,14 @@ public class TaskBo extends PageEntity implements Serializable { * 任务名称 */ private String name; + + /** + * 流程定义名称 + */ + private String processDefinitionName; + + /** + * 流程定义key + */ + private String processDefinitionKey; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java index 5cbb62f62..52f8ec287 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java @@ -121,6 +121,16 @@ public class TaskVo { */ private String businessStatusName; + /** + * 流程定义名称 + */ + private String processDefinitionName; + + /** + * 流程定义key + */ + private String processDefinitionKey; + /** * 参与者 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 938ad8c21..15611f6c1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -85,6 +85,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService if (StringUtils.isNotBlank(processInstanceBo.getName())) { query.processInstanceNameLikeIgnoreCase("%" + processInstanceBo.getName() + "%"); } + if (StringUtils.isNotBlank(processInstanceBo.getKey())) { + query.processDefinitionKey(processInstanceBo.getKey()); + } if (StringUtils.isNotBlank(processInstanceBo.getStartUserId())) { query.startedBy(processInstanceBo.getStartUserId()); } @@ -119,6 +122,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService if (StringUtils.isNotEmpty(processInstanceBo.getName())) { query.processInstanceNameLikeIgnoreCase("%" + processInstanceBo.getName() + "%"); } + if (StringUtils.isNotBlank(processInstanceBo.getKey())) { + query.processDefinitionKey(processInstanceBo.getKey()); + } if (StringUtils.isNotEmpty(processInstanceBo.getStartUserId())) { query.startedBy(processInstanceBo.getStartUserId()); } @@ -459,11 +465,14 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService if (StringUtils.isNotBlank(processInstanceBo.getName())) { query.processInstanceNameLikeIgnoreCase("%" + processInstanceBo.getName() + "%"); } + if (StringUtils.isNotBlank(processInstanceBo.getKey())) { + query.processDefinitionKey(processInstanceBo.getKey()); + } if (StringUtils.isNotBlank(processInstanceBo.getBusinessKey())) { query.processInstanceBusinessKey(processInstanceBo.getBusinessKey()); } if (StringUtils.isNotBlank(processInstanceBo.getCategoryCode())) { - query.processInstanceBusinessKey(processInstanceBo.getCategoryCode()); + query.processDefinitionCategory(processInstanceBo.getCategoryCode()); } query.orderByProcessInstanceStartTime().desc(); List historicProcessInstanceList = query.listPage(processInstanceBo.getPageNum(), processInstanceBo.getPageSize()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 7ed1ef1a0..dd8f7d325 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -165,6 +165,12 @@ public class ActTaskServiceImpl implements IActTaskService { if (StringUtils.isNotBlank(taskBo.getName())) { query.taskNameLike("%" + taskBo.getName() + "%"); } + if (StringUtils.isNotBlank(taskBo.getProcessDefinitionName())) { + query.processDefinitionNameLike("%" + taskBo.getProcessDefinitionName() + "%"); + } + if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) { + query.processDefinitionKey(taskBo.getProcessDefinitionKey() ); + } List taskList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); List processInstanceList = null; if (CollUtil.isNotEmpty(taskList)) { @@ -178,6 +184,8 @@ public class ActTaskServiceImpl implements IActTaskService { processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { taskVo.setBusinessStatus(e.getBusinessStatus()); taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); + taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey()); + taskVo.setProcessDefinitionName(e.getProcessDefinitionName()); }); } taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); @@ -201,6 +209,12 @@ public class ActTaskServiceImpl implements IActTaskService { if (StringUtils.isNotBlank(taskBo.getName())) { query.taskNameLike("%" + taskBo.getName() + "%"); } + if (StringUtils.isNotBlank(taskBo.getProcessDefinitionName())) { + query.processDefinitionNameLike("%" + taskBo.getProcessDefinitionName() + "%"); + } + if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) { + query.processDefinitionKey( taskBo.getProcessDefinitionKey() ); + } List taskInstanceList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); List historicProcessInstanceList = null; if (CollUtil.isNotEmpty(taskInstanceList)) { @@ -214,6 +228,8 @@ public class ActTaskServiceImpl implements IActTaskService { historicProcessInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { taskVo.setBusinessStatus(e.getBusinessStatus()); taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); + taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey()); + taskVo.setProcessDefinitionName(e.getProcessDefinitionName()); }); } taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); From 54837deda035c750417d078cd023d87920704471 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 2 Jul 2023 09:40:10 +0800 Subject: [PATCH 054/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E4=BC=9A?= =?UTF-8?q?=E7=AD=BE=E4=BB=BB=E5=8A=A1=E5=8A=A0=E7=AD=BE=E5=87=8F=E7=AD=BE?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E4=BB=BB=E5=8A=A1=E4=BD=9C=E5=BA=9F?= =?UTF-8?q?=E7=90=86=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/FlowConstant.java | 20 ++++ .../controller/ActTaskController.java | 22 +++++ .../workflow/domain/bo/AddMultiBo.java | 40 ++++++++ .../workflow/domain/bo/DeleteMultiBo.java | 52 ++++++++++ .../workflow/domain/vo/MultiInstanceVo.java | 33 +++++++ .../cmd/AddSequenceMultiInstanceCmd.java | 58 +++++++++++ .../cmd/DeleteSequenceMultiInstanceCmd.java | 80 +++++++++++++++ .../workflow/service/IActTaskService.java | 16 +++ .../impl/ActProcessInstanceServiceImpl.java | 4 + .../service/impl/ActTaskServiceImpl.java | 99 ++++++++++++++++++- .../dromara/workflow/utils/WorkflowUtils.java | 36 +++++++ 11 files changed, 458 insertions(+), 2 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddMultiBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DeleteMultiBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/MultiInstanceVo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AddSequenceMultiInstanceCmd.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java 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 index 6b0d465e3..cf6259b31 100644 --- 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 @@ -32,4 +32,24 @@ public interface FlowConstant { */ String CANDIDATE = "candidate"; + /** + * 会签任务总数 + */ + String NUMBER_OF_INSTANCES = "nrOfInstances"; + + /** + * 正在执行的会签总数 + */ + String NUMBER_OF_ACTIVE_INSTANCES = "nrOfActiveInstances"; + + /** + * 已完成的会签任务总数 + */ + String NUMBER_OF_COMPLETED_INSTANCES = "nrOfCompletedInstances"; + + /** + * 循环的索引值,可以使用elementIndexVariable属性修改loopCounter的变量名 + */ + String LOOP_COUNTER = "loopCounter"; + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java index e52e29d6e..2d6ff6c24 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java @@ -147,4 +147,26 @@ public class ActTaskController extends BaseController { return toAjax(iActTaskService.transferTask(transmitBo)); } + /** + * 会签任务加签 + * + * @param addMultiBo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @PostMapping("/addMultiInstanceExecution") + public R addMultiInstanceExecution(@Validated({AddGroup.class}) @RequestBody AddMultiBo addMultiBo) { + return toAjax(iActTaskService.addMultiInstanceExecution(addMultiBo)); + } + + /** + * 会签任务减签 + * + * @param deleteMultiBo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @PostMapping("/deleteMultiInstanceExecution") + public R deleteMultiInstanceExecution(@Validated({AddGroup.class}) @RequestBody DeleteMultiBo deleteMultiBo) { + return toAjax(iActTaskService.deleteMultiInstanceExecution(deleteMultiBo)); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddMultiBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddMultiBo.java new file mode 100644 index 000000000..320ec64ca --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/AddMultiBo.java @@ -0,0 +1,40 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 加签参数请求 + * + * @author may + */ +@Data +public class AddMultiBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务ID + */ + @NotBlank(message = "任务ID不能为空", groups = AddGroup.class) + private String taskId; + + /** + * 加签人员id + */ + @NotEmpty(message = "加签人员不能为空", groups = AddGroup.class) + private List assignees; + + /** + * 加签人员名称 + */ + @NotEmpty(message = "加签人员不能为空", groups = AddGroup.class) + private List assigneeNames; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DeleteMultiBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DeleteMultiBo.java new file mode 100644 index 000000000..e533167d9 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DeleteMultiBo.java @@ -0,0 +1,52 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 减签参数请求 + * + * @author may + */ +@Data +public class DeleteMultiBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务ID + */ + @NotBlank(message = "任务ID不能为空", groups = AddGroup.class) + private String taskId; + + /** + * 减签人员 + */ + @NotEmpty(message = "减签人员不能为空", groups = AddGroup.class) + private List taskIds; + + /** + * 执行id + */ + @NotEmpty(message = "执行id不能为空", groups = AddGroup.class) + private List executionIds; + + /** + * 人员id + */ + @NotEmpty(message = "减签人员id不能为空", groups = AddGroup.class) + private List assigneeIds; + + /** + * 人员名称 + */ + @NotEmpty(message = "减签人员不能为空", groups = AddGroup.class) + private List assigneeNames; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/MultiInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/MultiInstanceVo.java new file mode 100644 index 000000000..b99839603 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/MultiInstanceVo.java @@ -0,0 +1,33 @@ +package org.dromara.workflow.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 多实例信息 + * + * @author may + */ +@Data +public class MultiInstanceVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 会签类型(串行,并行) + */ + private Object type; + + /** + * 会签人员KEY + */ + private String assignee; + + /** + * 会签人员集合KEY + */ + private String assigneeList; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AddSequenceMultiInstanceCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AddSequenceMultiInstanceCmd.java new file mode 100644 index 000000000..6cd56797d --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AddSequenceMultiInstanceCmd.java @@ -0,0 +1,58 @@ +package org.dromara.workflow.flowable.cmd; + +import org.flowable.common.engine.impl.interceptor.Command; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.impl.persistence.entity.ExecutionEntity; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager; +import org.flowable.engine.impl.util.CommandContextUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.dromara.workflow.common.constant.FlowConstant.NUMBER_OF_INSTANCES; + +/** + * 串行加签 + * + * @author may + */ +public class AddSequenceMultiInstanceCmd implements Command { + + /** + * 执行id + */ + private final String executionId; + + /** + * 会签人员集合KEY + */ + private final String assigneeList; + + /** + * 加签人员 + */ + private final List assignees; + + public AddSequenceMultiInstanceCmd(String executionId, String assigneeList, List assignees) { + this.executionId = executionId; + this.assigneeList = assigneeList; + this.assignees = assignees; + } + + @Override + public Void execute(CommandContext commandContext) { + ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); + ExecutionEntity entity = executionEntityManager.findById(executionId); + //多实例任务总数加assignees.size() + Integer nrOfInstances = (Integer) entity.getVariable(NUMBER_OF_INSTANCES); + entity.setVariable(NUMBER_OF_INSTANCES, nrOfInstances + assignees.size()); + // 设置流程变量 + List userIds = (List) entity.getVariable(assigneeList); + userIds.addAll(assignees); + Map variables = new HashMap<>(16); + variables.put(assigneeList, userIds); + entity.setVariables(variables); + return null; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java new file mode 100644 index 000000000..89d09d1d8 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java @@ -0,0 +1,80 @@ +package org.dromara.workflow.flowable.cmd; + +import org.flowable.common.engine.impl.interceptor.Command; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.impl.persistence.entity.ExecutionEntity; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager; +import org.flowable.engine.impl.util.CommandContextUtil; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.dromara.workflow.common.constant.FlowConstant.LOOP_COUNTER; +import static org.dromara.workflow.common.constant.FlowConstant.NUMBER_OF_INSTANCES; + + +/** + * 串行减签 + * + * @author may + */ +public class DeleteSequenceMultiInstanceCmd implements Command { + + /** + * 当前节点审批人员id + */ + private final String currentUserId; + + /** + * 执行id + */ + private final String executionId; + + /** + * 会签人员集合KEY + */ + private final String assigneeList; + + /** + * 减签人员 + */ + private final List assignees; + + public DeleteSequenceMultiInstanceCmd(String currentUserId, String executionId, String assigneeList, List assignees) { + this.currentUserId = currentUserId; + this.executionId = executionId; + this.assigneeList = assigneeList; + this.assignees = assignees; + } + + @Override + public Void execute(CommandContext commandContext) { + ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); + ExecutionEntity entity = executionEntityManager.findById(executionId); + // 设置流程变量 + List userIds = (List) entity.getVariable(assigneeList); + List userIdList = new ArrayList<>(); + userIds.forEach(e -> { + Long userId = assignees.stream().filter(id -> id.equals(e)).findFirst().orElse(null); + if (userId == null) { + userIdList.add(e); + } + }); + //当前任务执行位置 + int loopCounterIndex = -1; + for (int i = 0; i < userIdList.size(); i++) { + Long userId = userIdList.get(i); + if (currentUserId.equals(userId.toString())) { + loopCounterIndex = i; + } + } + Map variables = new HashMap<>(16); + variables.put(NUMBER_OF_INSTANCES, userIdList.size()); + variables.put(assigneeList, userIdList); + variables.put(LOOP_COUNTER, loopCounterIndex); + entity.setVariables(variables); + return null; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java index d5c2e5eb7..0aabbc40a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java @@ -68,4 +68,20 @@ public interface IActTaskService { * @return 结果 */ boolean transferTask(TransmitBo transmitBo); + + /** + * 会签任务加签 + * + * @param addMultiBo 参数 + * @return 结果 + */ + boolean addMultiInstanceExecution(AddMultiBo addMultiBo); + + /** + * 会签任务减签 + * + * @param deleteMultiBo 参数 + * @return 结果 + */ + boolean deleteMultiInstanceExecution(DeleteMultiBo deleteMultiBo); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 15611f6c1..4a13be915 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -303,6 +303,10 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService } //节点图形信息 map.put("graphicInfoVos", graphicInfoVos); + //作废理由 + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId) + .processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); + map.put("deleteReason", historicProcessInstance.getDeleteReason()); return map; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index dd8f7d325..394141015 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -16,13 +16,18 @@ import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.enums.BusinessStatusEnum; import org.dromara.workflow.domain.bo.*; +import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.TaskVo; +import org.dromara.workflow.flowable.cmd.AddSequenceMultiInstanceCmd; +import org.dromara.workflow.flowable.cmd.DeleteSequenceMultiInstanceCmd; import org.dromara.workflow.flowable.cmd.UpdateBusinessStatusCmd; import org.dromara.workflow.service.IActTaskService; import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.engine.*; import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; +import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; @@ -169,7 +174,7 @@ public class ActTaskServiceImpl implements IActTaskService { query.processDefinitionNameLike("%" + taskBo.getProcessDefinitionName() + "%"); } if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) { - query.processDefinitionKey(taskBo.getProcessDefinitionKey() ); + query.processDefinitionKey(taskBo.getProcessDefinitionKey()); } List taskList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); List processInstanceList = null; @@ -213,7 +218,7 @@ public class ActTaskServiceImpl implements IActTaskService { query.processDefinitionNameLike("%" + taskBo.getProcessDefinitionName() + "%"); } if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) { - query.processDefinitionKey( taskBo.getProcessDefinitionKey() ); + query.processDefinitionKey(taskBo.getProcessDefinitionKey()); } List taskInstanceList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); List historicProcessInstanceList = null; @@ -342,4 +347,94 @@ public class ActTaskServiceImpl implements IActTaskService { throw new ServiceException(e.getMessage()); } } + + /** + * 会签任务加签 + * + * @param addMultiBo 参数 + */ + @Override + public boolean addMultiInstanceExecution(AddMultiBo addMultiBo) { + Task task = taskService.createTaskQuery().taskId(addMultiBo.getTaskId()).taskTenantId(TenantHelper.getTenantId()) + .taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); + if (ObjectUtil.isEmpty(task)) { + throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); + } + if (task.isSuspended()) { + throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); + } + String taskDefinitionKey = task.getTaskDefinitionKey(); + String processInstanceId = task.getProcessInstanceId(); + String processDefinitionId = task.getProcessDefinitionId(); + + try { + MultiInstanceVo multiInstanceVo = WorkflowUtils.isMultiInstance(processDefinitionId, taskDefinitionKey); + if (multiInstanceVo == null) { + throw new ServiceException("当前环节不是会签节点"); + } + if (multiInstanceVo.getType() instanceof ParallelMultiInstanceBehavior) { + for (Long assignee : addMultiBo.getAssignees()) { + runtimeService.addMultiInstanceExecution(taskDefinitionKey, processInstanceId, Collections.singletonMap(multiInstanceVo.getAssignee(), assignee)); + } + } else if (multiInstanceVo.getType() instanceof SequentialMultiInstanceBehavior) { + AddSequenceMultiInstanceCmd addSequenceMultiInstanceCmd = new AddSequenceMultiInstanceCmd(task.getExecutionId(), multiInstanceVo.getAssigneeList(), addMultiBo.getAssignees()); + managementService.executeCommand(addSequenceMultiInstanceCmd); + } + List assigneeNames = addMultiBo.getAssigneeNames(); + String username = LoginHelper.getUsername(); + TaskEntity newTask = WorkflowUtils.createNewTask(task); + taskService.addComment(newTask.getId(), processInstanceId, username + "加签【" + String.join(StringUtils.SEPARATOR, assigneeNames) + "】"); + taskService.complete(newTask.getId()); + return true; + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 会签任务减签 + * + * @param deleteMultiBo 参数 + */ + @Override + public boolean deleteMultiInstanceExecution(DeleteMultiBo deleteMultiBo) { + Task task = taskService.createTaskQuery().taskId(deleteMultiBo.getTaskId()).taskTenantId(TenantHelper.getTenantId()) + .taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); + if (ObjectUtil.isEmpty(task)) { + throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); + } + if (task.isSuspended()) { + throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); + } + String taskDefinitionKey = task.getTaskDefinitionKey(); + String processInstanceId = task.getProcessInstanceId(); + String processDefinitionId = task.getProcessDefinitionId(); + try { + MultiInstanceVo multiInstanceVo = WorkflowUtils.isMultiInstance(processDefinitionId, taskDefinitionKey); + if (multiInstanceVo == null) { + throw new ServiceException("当前环节不是会签节点"); + } + if (multiInstanceVo.getType() instanceof ParallelMultiInstanceBehavior) { + for (String executionId : deleteMultiBo.getExecutionIds()) { + runtimeService.deleteMultiInstanceExecution(executionId, false); + } + for (String taskId : deleteMultiBo.getTaskIds()) { + historyService.deleteHistoricTaskInstance(taskId); + } + } else if (multiInstanceVo.getType() instanceof SequentialMultiInstanceBehavior) { + DeleteSequenceMultiInstanceCmd deleteSequenceMultiInstanceCmd = new DeleteSequenceMultiInstanceCmd(task.getAssignee(), task.getExecutionId(), multiInstanceVo.getAssigneeList(), deleteMultiBo.getAssigneeIds()); + managementService.executeCommand(deleteSequenceMultiInstanceCmd); + } + List assigneeNames = deleteMultiBo.getAssigneeNames(); + String username = LoginHelper.getUsername(); + TaskEntity newTask = WorkflowUtils.createNewTask(task); + taskService.addComment(newTask.getId(), processInstanceId, username + "减签【" + String.join(StringUtils.SEPARATOR, assigneeNames) + "】"); + taskService.complete(newTask.getId()); + 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/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 6ca8ed2e8..81c8bf68d 100644 --- 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 @@ -17,12 +17,16 @@ import org.dromara.system.domain.SysUserRole; import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.mapper.SysUserRoleMapper; import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.ParticipantVo; import org.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd; import org.flowable.bpmn.converter.BpmnXMLConverter; import org.flowable.bpmn.model.*; +import org.flowable.common.engine.api.delegate.Expression; import org.flowable.editor.language.json.converter.BpmnJsonConverter; import org.flowable.engine.ProcessEngine; +import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; +import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; import org.flowable.identitylink.api.history.HistoricIdentityLink; import org.flowable.task.api.Task; import org.flowable.task.service.impl.persistence.entity.TaskEntity; @@ -224,4 +228,36 @@ public class WorkflowUtils { } return participantVo; } + + /** + * 判断当前节点是否为会签节点 + * + * @param processDefinitionId 流程定义id + * @param taskDefinitionKey 流程定义id + */ + public static MultiInstanceVo isMultiInstance(String processDefinitionId, String taskDefinitionKey) { + BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); + FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(taskDefinitionKey); + MultiInstanceVo multiInstanceVo = new MultiInstanceVo(); + //判断是否为并行会签节点 + if (flowNode.getBehavior() instanceof ParallelMultiInstanceBehavior behavior && behavior.getCollectionExpression() != null) { + Expression collectionExpression = behavior.getCollectionExpression(); + String assigneeList = collectionExpression.getExpressionText(); + String assignee = behavior.getCollectionElementVariable(); + multiInstanceVo.setType(behavior); + multiInstanceVo.setAssignee(assignee); + multiInstanceVo.setAssigneeList(assigneeList); + return multiInstanceVo; + //判断是否为串行会签节点 + } else if (flowNode.getBehavior() instanceof SequentialMultiInstanceBehavior behavior && behavior.getCollectionExpression() != null) { + Expression collectionExpression = behavior.getCollectionExpression(); + String assigneeList = collectionExpression.getExpressionText(); + String assignee = behavior.getCollectionElementVariable(); + multiInstanceVo.setType(behavior); + multiInstanceVo.setAssignee(assignee); + multiInstanceVo.setAssigneeList(assigneeList); + return multiInstanceVo; + } + return null; + } } From f58f12c603c06feea5c33e40648c06c7b9c990bd Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Tue, 4 Jul 2023 21:36:38 +0800 Subject: [PATCH 055/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=BD=93=E5=89=8D=E7=A7=9F=E6=88=B7=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=BE=85=E5=8A=9E=EF=BC=8C=E5=B7=B2=E5=8A=9E=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ActTaskController.java | 20 +++++ .../workflow/service/IActTaskService.java | 17 ++++ .../service/impl/ActTaskServiceImpl.java | 84 +++++++++++++++++++ 3 files changed, 121 insertions(+) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java index 2d6ff6c24..9b42af828 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java @@ -70,6 +70,16 @@ public class ActTaskController extends BaseController { return iActTaskService.getTaskWaitByPage(taskBo); } + /** + * 查询当前租户所有待办任务 + * + * @param taskBo 参数 + */ + @GetMapping("/getAllTaskWaitByPage") + public TableDataInfo getAllTaskWaitByPage(TaskBo taskBo) { + return iActTaskService.getAllTaskWaitByPage(taskBo); + } + /** * 查询当前用户的已办任务 * @@ -80,6 +90,16 @@ public class ActTaskController extends BaseController { return iActTaskService.getTaskFinishByPage(taskBo); } + /** + * 查询当前租户所有已办任务 + * + * @param taskBo 参数 + */ + @GetMapping("/getAllTaskFinishByPage") + public TableDataInfo getAllTaskFinishByPage(TaskBo taskBo) { + return iActTaskService.getAllTaskFinishByPage(taskBo); + } + /** * 签收(拾取)任务 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java index 0aabbc40a..fea6ac4ee 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java @@ -37,6 +37,15 @@ public interface IActTaskService { */ TableDataInfo getTaskWaitByPage(TaskBo taskBo); + /** + * 查询当前租户所有待办任务 + * + * @param taskBo 参数 + * @return 结果 + */ + TableDataInfo getAllTaskWaitByPage(TaskBo taskBo); + + /** * 查询当前用户的已办任务 * @@ -45,6 +54,14 @@ public interface IActTaskService { */ TableDataInfo getTaskFinishByPage(TaskBo taskBo); + /** + * 查询当前租户所有已办任务 + * + * @param taskBo 参数 + * @return 结果 + */ + TableDataInfo getAllTaskFinishByPage(TaskBo taskBo); + /** * 委派任务 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 394141015..a689b3862 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -201,6 +201,48 @@ public class ActTaskServiceImpl implements IActTaskService { return new TableDataInfo<>(list, count); } + /** + * 查询当前租户所有待办任务 + * + * @param taskBo 参数 + */ + @Override + public TableDataInfo getAllTaskWaitByPage(TaskBo taskBo) { + TaskQuery query = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()); + if (StringUtils.isNotBlank(taskBo.getName())) { + query.taskNameLike("%" + taskBo.getName() + "%"); + } + if (StringUtils.isNotBlank(taskBo.getProcessDefinitionName())) { + query.processDefinitionNameLike("%" + taskBo.getProcessDefinitionName() + "%"); + } + if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) { + query.processDefinitionKey(taskBo.getProcessDefinitionKey()); + } + List taskList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); + List processInstanceList = null; + if (CollUtil.isNotEmpty(taskList)) { + Set processInstanceIds = StreamUtils.toSet(taskList, Task::getProcessInstanceId); + processInstanceList = runtimeService.createProcessInstanceQuery().processInstanceIds(processInstanceIds).list(); + } + List list = new ArrayList<>(); + for (Task task : taskList) { + TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); + if (CollUtil.isNotEmpty(processInstanceList)) { + processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { + taskVo.setBusinessStatus(e.getBusinessStatus()); + taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); + taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey()); + taskVo.setProcessDefinitionName(e.getProcessDefinitionName()); + }); + } + taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); + taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); + list.add(taskVo); + } + long count = query.count(); + return new TableDataInfo<>(list, count); + } + /** * 查询当前用户的已办任务 * @@ -244,6 +286,48 @@ public class ActTaskServiceImpl implements IActTaskService { return new TableDataInfo<>(list, count); } + /** + * 查询当前租户所有已办任务 + * + * @param taskBo 参数 + */ + @Override + public TableDataInfo getAllTaskFinishByPage(TaskBo taskBo) { + HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery() + .taskTenantId(TenantHelper.getTenantId()).finished().orderByHistoricTaskInstanceStartTime().desc(); + if (StringUtils.isNotBlank(taskBo.getName())) { + query.taskNameLike("%" + taskBo.getName() + "%"); + } + if (StringUtils.isNotBlank(taskBo.getProcessDefinitionName())) { + query.processDefinitionNameLike("%" + taskBo.getProcessDefinitionName() + "%"); + } + if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) { + query.processDefinitionKey(taskBo.getProcessDefinitionKey()); + } + List taskInstanceList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); + List historicProcessInstanceList = null; + if (CollUtil.isNotEmpty(taskInstanceList)) { + Set processInstanceIds = StreamUtils.toSet(taskInstanceList, HistoricTaskInstance::getProcessInstanceId); + historicProcessInstanceList = historyService.createHistoricProcessInstanceQuery().processInstanceIds(processInstanceIds).list(); + } + List list = new ArrayList<>(); + for (HistoricTaskInstance task : taskInstanceList) { + TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); + if (CollUtil.isNotEmpty(historicProcessInstanceList)) { + historicProcessInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { + taskVo.setBusinessStatus(e.getBusinessStatus()); + taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); + taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey()); + taskVo.setProcessDefinitionName(e.getProcessDefinitionName()); + }); + } + taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); + list.add(taskVo); + } + long count = query.count(); + return new TableDataInfo<>(list, count); + } + /** * 委派任务 * From 7847a80bc233165bcb3c320b5678c912a3859674 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 9 Jul 2023 12:05:08 +0800 Subject: [PATCH 056/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E9=A9=B3?= =?UTF-8?q?=E5=9B=9E=E7=94=B3=E8=AF=B7=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ActTaskController.java | 11 +++++ .../workflow/domain/bo/BackProcessBo.java | 37 +++++++++++++++ .../workflow/service/IActTaskService.java | 8 ++++ .../service/impl/ActTaskServiceImpl.java | 45 +++++++++++++++++++ 4 files changed, 101 insertions(+) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java index 9b42af828..e791b9de7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java @@ -189,4 +189,15 @@ public class ActTaskController extends BaseController { return toAjax(iActTaskService.deleteMultiInstanceExecution(deleteMultiBo)); } + /** + * 驳回审批 + * + * @param backProcessBo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @PostMapping("/backProcess") + public R backProcess(@RequestBody BackProcessBo backProcessBo) { + return R.ok(iActTaskService.backProcess(backProcessBo)); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java new file mode 100644 index 000000000..8b24e9247 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java @@ -0,0 +1,37 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 驳回参数请求 + * + * @author may + */ +@Data +public class BackProcessBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务ID + */ + @NotBlank(message = "任务ID不能为空", groups = AddGroup.class) + private String taskId; + + /** + * 驳回的节点id(目前未使用,直接驳回到申请人) + */ + private String targetActivityId; + + /** + * 办理意见 + */ + private String message; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java index fea6ac4ee..c1ac07aba 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java @@ -101,4 +101,12 @@ public interface IActTaskService { * @return 结果 */ boolean deleteMultiInstanceExecution(DeleteMultiBo deleteMultiBo); + + /** + * 驳回审批 + * + * @param backProcessBo 参数 + * @return 流程实例id + */ + String backProcess(BackProcessBo backProcessBo); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index a689b3862..cd4551274 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -38,6 +38,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.stream.Collectors; /** * 任务 服务层实现 @@ -521,4 +522,48 @@ public class ActTaskServiceImpl implements IActTaskService { throw new ServiceException(e.getMessage()); } } + + /** + * 驳回审批 + * + * @param backProcessBo 参数 + */ + @Override + public String backProcess(BackProcessBo backProcessBo) { + Task task = taskService.createTaskQuery().taskId(backProcessBo.getTaskId()).taskTenantId(TenantHelper.getTenantId()) + .taskAssignee(String.valueOf(LoginHelper.getUserId())).singleResult(); + if (ObjectUtil.isEmpty(task)) { + throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); + } + if (task.isSuspended()) { + throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); + } + try { + String processInstanceId = task.getProcessInstanceId(); + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult(); + //校验单据 + BusinessStatusEnum.checkStatus(processInstance.getBusinessStatus()); + //判断是否有多个任务 + List taskList = taskService.createTaskQuery().processInstanceId(processInstanceId).taskTenantId(TenantHelper.getTenantId()).list(); + //申请人节点 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().finished().orderByHistoricTaskInstanceEndTime().asc().list().get(0); + String backTaskDefinitionKey = historicTaskInstance.getTaskDefinitionKey(); + if (taskList.size() > 1) { + //当前多个任务驳回到单个节点 + runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId) + .moveActivityIdsToSingleActivityId(taskList.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList()), backTaskDefinitionKey) + .changeState(); + } else { + //当前单个节点驳回单个节点 + runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId) + .moveActivityIdTo(task.getTaskDefinitionKey(), backTaskDefinitionKey) + .changeState(); + } + taskService.setAssignee(task.getId(), historicTaskInstance.getAssignee()); + runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.BACK.getStatus()); + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + return task.getProcessInstanceId(); + } } From cfc29bfd45fdea1c280cff7387e3a39762ac03a0 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 9 Jul 2023 12:46:27 +0800 Subject: [PATCH 057/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E9=A9=B3=E5=9B=9E=E5=90=8E=E8=AE=BE=E7=BD=AE=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/controller/ActTaskController.java | 12 ++++++++++++ .../workflow/service/impl/ActTaskServiceImpl.java | 7 ++++++- .../org/dromara/workflow/utils/WorkflowUtils.java | 14 ++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java index e791b9de7..def6dc010 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java @@ -13,6 +13,7 @@ import org.dromara.common.web.core.BaseController; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.service.IActTaskService; +import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.engine.TaskService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -200,4 +201,15 @@ public class ActTaskController extends BaseController { return R.ok(iActTaskService.backProcess(backProcessBo)); } + /** + * 获取流程状态 + * + * @param taskId 任务id + */ + @GetMapping("/getBusinessStatus/{taskId}") + public R getBusinessStatus(@PathVariable String taskId) { + return R.ok("操作成功", WorkflowUtils.getBusinessStatus(taskId)); + } + + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index cd4551274..050b88a97 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -529,6 +529,7 @@ public class ActTaskServiceImpl implements IActTaskService { * @param backProcessBo 参数 */ @Override + @Transactional(rollbackFor = Exception.class) public String backProcess(BackProcessBo backProcessBo) { Task task = taskService.createTaskQuery().taskId(backProcessBo.getTaskId()).taskTenantId(TenantHelper.getTenantId()) .taskAssignee(String.valueOf(LoginHelper.getUserId())).singleResult(); @@ -548,6 +549,7 @@ public class ActTaskServiceImpl implements IActTaskService { //申请人节点 HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().finished().orderByHistoricTaskInstanceEndTime().asc().list().get(0); String backTaskDefinitionKey = historicTaskInstance.getTaskDefinitionKey(); + taskService.addComment(task.getId(), processInstanceId, StringUtils.isNotBlank(backProcessBo.getMessage()) ? backProcessBo.getMessage() : "退回"); if (taskList.size() > 1) { //当前多个任务驳回到单个节点 runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId) @@ -559,7 +561,10 @@ public class ActTaskServiceImpl implements IActTaskService { .moveActivityIdTo(task.getTaskDefinitionKey(), backTaskDefinitionKey) .changeState(); } - taskService.setAssignee(task.getId(), historicTaskInstance.getAssignee()); + List list = taskService.createTaskQuery().processInstanceId(processInstanceId).taskTenantId(TenantHelper.getTenantId()).list(); + for (Task t : list) { + taskService.setAssignee(t.getId(), historicTaskInstance.getAssignee()); + } runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.BACK.getStatus()); } catch (Exception e) { throw new ServiceException(e.getMessage()); 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 index 81c8bf68d..8e07d83c3 100644 --- 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 @@ -25,10 +25,12 @@ import org.flowable.bpmn.model.*; import org.flowable.common.engine.api.delegate.Expression; import org.flowable.editor.language.json.converter.BpmnJsonConverter; import org.flowable.engine.ProcessEngine; +import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; import org.flowable.identitylink.api.history.HistoricIdentityLink; import org.flowable.task.api.Task; +import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import javax.xml.stream.XMLInputFactory; @@ -260,4 +262,16 @@ public class WorkflowUtils { } return null; } + + /** + * 获取当前流程状态 + * + * @param taskId 任务id + */ + public static String getBusinessStatus(String taskId) { + HistoricTaskInstance historicTaskInstance = PROCESS_ENGINE.getHistoryService().createHistoricTaskInstanceQuery().taskId(taskId).taskTenantId(TenantHelper.getTenantId()).singleResult(); + HistoricProcessInstance historicProcessInstance = PROCESS_ENGINE.getHistoryService().createHistoricProcessInstanceQuery() + .processInstanceId(historicTaskInstance.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); + return historicProcessInstance.getBusinessStatus(); + } } From cbbd81f2b921b670e297f3849a65a38e8cfd7863 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 9 Jul 2023 20:03:25 +0800 Subject: [PATCH 058/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E5=8A=A0?= =?UTF-8?q?=E7=AD=BE=EF=BC=8C=E5=87=8F=E7=AD=BE=E4=BA=BA=E5=91=98=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WorkflowUserController.java | 49 +++++ .../workflow/domain/bo/SysUserMultiBo.java | 34 ++++ .../service/IWorkflowUserService.java | 32 ++++ .../service/impl/WorkflowUserServiceImpl.java | 175 ++++++++++++++++++ 4 files changed, 290 insertions(+) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/SysUserMultiBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java new file mode 100644 index 000000000..287c3b7d6 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java @@ -0,0 +1,49 @@ +package org.dromara.workflow.controller; + +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.system.domain.vo.SysUserVo; +import org.dromara.workflow.domain.bo.SysUserMultiBo; +import org.dromara.workflow.domain.vo.TaskVo; +import org.dromara.workflow.service.IWorkflowUserService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 工作流用户选人管理 控制层 + * + * @author may + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/user") +public class WorkflowUserController extends BaseController { + + private final IWorkflowUserService iWorkflowUserService; + + /** + * 分页查询工作流选择加签人员 + * + * @param sysUserMultiBo 参数 + */ + @GetMapping("/getWorkflowAddMultiListByPage") + public TableDataInfo getWorkflowAddMultiInstanceByPage(SysUserMultiBo sysUserMultiBo) { + return iWorkflowUserService.getWorkflowAddMultiInstanceByPage(sysUserMultiBo); + } + + /** + * 查询工作流选择减签人员 + * + * @param taskId 任务id + */ + @GetMapping("/getWorkflowDeleteMultiInstanceList/{taskId}") + public R> getWorkflowDeleteMultiInstanceList(@PathVariable String taskId) { + return R.ok(iWorkflowUserService.getWorkflowDeleteMultiInstanceList(taskId)); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/SysUserMultiBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/SysUserMultiBo.java new file mode 100644 index 000000000..b54f481ce --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/SysUserMultiBo.java @@ -0,0 +1,34 @@ +package org.dromara.workflow.domain.bo; + +import lombok.Data; +import org.dromara.workflow.common.PageEntity; + + +/** + * 用户加签查询 + * + * @author may + */ +@Data + +public class SysUserMultiBo extends PageEntity { + /** + * 人员名称 + */ + private String userName; + + /** + * 人员名称 + */ + private String nickName; + + /** + * 部门id + */ + private String deptId; + + /** + * 任务id + */ + private String taskId; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java new file mode 100644 index 000000000..c70be04d4 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java @@ -0,0 +1,32 @@ +package org.dromara.workflow.service; + +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.workflow.domain.bo.SysUserMultiBo; +import org.dromara.workflow.domain.vo.TaskVo; + +import java.util.List; + +/** + * 工作流用户选人管理 服务层 + * + * @author may + */ +public interface IWorkflowUserService { + + /** + * 分页查询工作流选择加签人员 + * + * @param sysUserMultiBo 参数 + * @return 结果 + */ + TableDataInfo getWorkflowAddMultiInstanceByPage(SysUserMultiBo sysUserMultiBo); + + /** + * 查询工作流选择减签人员 + * + * @param taskId 任务id + * @return 结果 + */ + List getWorkflowDeleteMultiInstanceList(String taskId); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java new file mode 100644 index 000000000..a2e888f2b --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java @@ -0,0 +1,175 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.enums.UserStatus; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysDeptVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.workflow.domain.bo.SysUserMultiBo; +import org.dromara.workflow.domain.vo.MultiInstanceVo; +import org.dromara.workflow.domain.vo.TaskVo; +import org.dromara.workflow.service.IWorkflowUserService; +import org.dromara.workflow.utils.WorkflowUtils; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; +import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; +import org.flowable.task.api.Task; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 工作流用户选人管理 业务处理层 + * + * @author may + */ +@RequiredArgsConstructor +@Service +public class WorkflowUserServiceImpl implements IWorkflowUserService { + + private final SysUserMapper sysUserMapper; + private final SysDeptMapper sysDeptMapper; + private final TaskService taskService; + private final RuntimeService runtimeService; + + /** + * 分页查询工作流选择加签人员 + * + * @param sysUserMultiBo 参数 + */ + @Override + public TableDataInfo getWorkflowAddMultiInstanceByPage(SysUserMultiBo sysUserMultiBo) { + Task task = taskService.createTaskQuery().taskId(sysUserMultiBo.getTaskId()).singleResult(); + if (task == null) { + throw new ServiceException("任务不存在"); + } + MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + //检索条件 + queryWrapper.eq(StringUtils.isNotEmpty(sysUserMultiBo.getDeptId()), SysUser::getDeptId, sysUserMultiBo.getDeptId()); + queryWrapper.eq(SysUser::getStatus, UserStatus.OK.getCode()); + if (multiInstance != null) { + if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { + List assigneeList = (List) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList()); + queryWrapper.notIn(CollectionUtil.isNotEmpty(assigneeList), SysUser::getUserId, assigneeList); + } else { + List list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list(); + List userIds = StreamUtils.toList(list, e -> Long.valueOf(e.getAssignee())); + queryWrapper.notIn(CollectionUtil.isNotEmpty(userIds), SysUser::getUserId, userIds); + } + } + queryWrapper.like(StringUtils.isNotEmpty(sysUserMultiBo.getUserName()), SysUser::getUserName, sysUserMultiBo.getUserName()); + queryWrapper.like(StringUtils.isNotEmpty(sysUserMultiBo.getNickName()), SysUser::getNickName, sysUserMultiBo.getNickName()); + Page page = new Page<>(sysUserMultiBo.getPageNum(), sysUserMultiBo.getPageSize()); + Page userPage = sysUserMapper.selectVoPage(page, queryWrapper); + return TableDataInfo.build(recordPage(userPage)); + } + + /** + * 查询工作流选择减签人员 + * + * @param taskId 任务id 任务id + */ + @Override + public List getWorkflowDeleteMultiInstanceList(String taskId) { + Task task = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).taskId(taskId).singleResult(); + List taskList = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()) + .processInstanceId(task.getProcessInstanceId()).list(); + MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); + List taskListVo = new ArrayList<>(); + if (multiInstance == null) { + return Collections.emptyList(); + } + List assigneeList = null; + if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { + assigneeList = (List) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList()); + } + + if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { + List userIds = StreamUtils.filter(assigneeList, e -> !e.toString().equals(task.getAssignee())); + List sysUsers = null; + if (CollectionUtil.isNotEmpty(userIds)) { + sysUsers = sysUserMapper.selectVoBatchIds(userIds); + } + for (Long userId : userIds) { + TaskVo taskVo = new TaskVo(); + taskVo.setId("串行会签"); + taskVo.setExecutionId("串行会签"); + taskVo.setProcessInstanceId(task.getProcessInstanceId()); + taskVo.setName(task.getName()); + taskVo.setAssignee(userId); + if (CollectionUtil.isNotEmpty(sysUsers)) { + sysUsers.stream().filter(u -> u.getUserId().toString().equals(userId.toString())).findFirst().ifPresent(u -> { + taskVo.setAssigneeName(u.getNickName()); + }); + } + taskListVo.add(taskVo); + } + return taskListVo; + } else if (multiInstance.getType() instanceof ParallelMultiInstanceBehavior) { + List tasks = StreamUtils.filter(taskList, e -> StringUtils.isBlank(e.getParentTaskId()) && !e.getExecutionId().equals(task.getExecutionId()) + && e.getTaskDefinitionKey().equals(task.getTaskDefinitionKey())); + if (CollectionUtil.isNotEmpty(tasks)) { + List userIds = StreamUtils.toList(tasks, e -> Long.valueOf(e.getAssignee())); + List sysUsers = null; + if (CollectionUtil.isNotEmpty(userIds)) { + sysUsers = sysUserMapper.selectVoBatchIds(userIds); + } + for (Task t : tasks) { + TaskVo taskVo = new TaskVo(); + taskVo.setId(t.getId()); + taskVo.setExecutionId(t.getExecutionId()); + taskVo.setProcessInstanceId(t.getProcessInstanceId()); + taskVo.setName(t.getName()); + taskVo.setAssignee(Long.valueOf(t.getAssignee())); + if (CollectionUtil.isNotEmpty(sysUsers)) { + sysUsers.stream().filter(u -> u.getUserId().toString().equals(t.getAssignee())).findFirst().ifPresent(e -> { + taskVo.setAssigneeName(e.getNickName()); + }); + } + taskListVo.add(taskVo); + } + return taskListVo; + } + } + return Collections.emptyList(); + } + + /** + * 翻译部门 + * + * @param page 用户分页数据 + */ + private Page recordPage(Page page) { + List records = page.getRecords(); + if (CollectionUtil.isEmpty(records)) { + return page; + } + List collectDeptId = records.stream().map(SysUserVo::getDeptId).filter(Objects::nonNull).collect(Collectors.toList()); + if (CollectionUtil.isEmpty(collectDeptId)) { + return page; + } + List sysDeptList = sysDeptMapper.selectVoBatchIds(collectDeptId); + records.forEach(e -> { + sysDeptList.stream().filter(d -> d.getDeptId().equals(e.getDeptId())).findFirst().ifPresent(e::setDept); + }); + page.setRecords(records); + return page; + } +} From 4554178f1bf0373edcb0dfee8f0d6e0395d3ccfd Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Wed, 12 Jul 2023 13:35:54 +0800 Subject: [PATCH 059/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=AE=8C=E6=88=90=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/common/enums/TaskStatusEnum.java | 89 +++++++++++++++++++ .../workflow/domain/vo/ActHistoryInfoVo.java | 4 + .../impl/ActProcessInstanceServiceImpl.java | 22 +++-- .../service/impl/ActTaskServiceImpl.java | 15 ++-- 4 files changed, 115 insertions(+), 15 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java new file mode 100644 index 000000000..1fe2b8357 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java @@ -0,0 +1,89 @@ +package org.dromara.workflow.common.enums; + +import cn.hutool.core.util.StrUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.apache.commons.lang3.StringUtils; + +/** + * 任务状态枚举 + * + * @author may + */ +@Getter +@AllArgsConstructor +public enum TaskStatusEnum { + /** + * 撤销 + */ + CANCEL("cancel", "撤销"), + /** + * 通过 + */ + PASS("pass", "通过"), + /** + * 待审核 + */ + WAITING("waiting", "待审核"), + /** + * 作废 + */ + INVALID("invalid", "作废"), + /** + * 退回 + */ + BACK("back", "退回"), + /** + * 终止 + */ + TERMINATION("termination", "终止"), + /** + * 转办 + */ + TRANSFER("transfer", "转办"), + /** + * 委托 + */ + PENDING("pending", "委托"), + /** + * 抄送 + */ + COPY("copy", "抄送"), + /** + * 加签 + */ + SIGN("sign", "加签"), + /** + * 减签 + */ + SIGN_OFF("sign_off", "减签"); + + /** + * 状态 + */ + private final String status; + + /** + * 描述 + */ + private final String desc; + + /** + * 任务业务状态 + * + * @param status 状态 + */ + public static String getEnumsByStatus(String status) { + if (StringUtils.isBlank(status)) { + return StrUtil.EMPTY; + } + + for (TaskStatusEnum statusEnum : TaskStatusEnum.values()) { + if (statusEnum.getStatus().equals(status)) { + return statusEnum.getDesc(); + } + } + return StrUtil.EMPTY; + } +} + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java index 87d2ad2dd..6f26028e2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java @@ -50,6 +50,10 @@ public class ActHistoryInfoVo implements Serializable { * 状态 */ private String status; + /** + * 状态 + */ + private String statusName; /** * 办理人id */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 4a13be915..380a1cac4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -15,6 +15,7 @@ import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.enums.BusinessStatusEnum; +import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.ProcessInstanceBo; import org.dromara.workflow.domain.bo.ProcessInvalidBo; import org.dromara.workflow.domain.vo.ActHistoryInfoVo; @@ -239,17 +240,22 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService .processInstanceId(processInstanceId).taskTenantId(TenantHelper.getTenantId()).orderByHistoricTaskInstanceEndTime().desc().list(); list = StreamUtils.sorted(list, Comparator.comparing(HistoricTaskInstance::getEndTime, Comparator.nullsFirst(Date::compareTo)).reversed()); List actHistoryInfoVoList = new ArrayList<>(); + List processInstanceComments = taskService.getProcessInstanceComments(processInstanceId); for (HistoricTaskInstance historicTaskInstance : list) { ActHistoryInfoVo actHistoryInfoVo = new ActHistoryInfoVo(); BeanUtils.copyProperties(historicTaskInstance, actHistoryInfoVo); - actHistoryInfoVo.setStatus(actHistoryInfoVo.getEndTime() == null ? "待处理" : "已处理"); - List taskComments = taskService.getTaskComments(historicTaskInstance.getId()); - if (CollUtil.isNotEmpty(taskComments)) { - actHistoryInfoVo.setCommentId(taskComments.get(0).getId()); - String message = taskComments.stream().map(Comment::getFullMessage).collect(Collectors.joining("。")); - if (StringUtils.isNotBlank(message)) { - actHistoryInfoVo.setComment(message); - } + if (actHistoryInfoVo.getEndTime() == null) { + actHistoryInfoVo.setStatus(TaskStatusEnum.WAITING.getStatus()); + actHistoryInfoVo.setStatusName(TaskStatusEnum.WAITING.getDesc()); + } + if (CollUtil.isNotEmpty(processInstanceComments)) { + processInstanceComments.stream().filter(e -> e.getTaskId().equals(historicTaskInstance.getId())).findFirst().ifPresent(e -> { + if (StringUtils.isNotBlank(e.getFullMessage())) { + actHistoryInfoVo.setComment(e.getFullMessage()); + actHistoryInfoVo.setStatus(e.getType()); + actHistoryInfoVo.setStatusName(TaskStatusEnum.getEnumsByStatus(e.getType())); + } + }); } if (ObjectUtil.isNotEmpty(historicTaskInstance.getDurationInMillis())) { actHistoryInfoVo.setRunDuration(getDuration(historicTaskInstance.getDurationInMillis())); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 050b88a97..4c44954af 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -15,6 +15,7 @@ import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.enums.BusinessStatusEnum; +import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.TaskVo; @@ -139,7 +140,7 @@ public class ActTaskServiceImpl implements IActTaskService { } runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.WAITING.getStatus()); //办理意见 - taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage()); + taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage()); //办理任务 taskService.complete(completeTaskBo.getTaskId(), completeTaskBo.getVariables()); List list = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(task.getProcessInstanceId()).list(); @@ -348,7 +349,7 @@ public class ActTaskServiceImpl implements IActTaskService { } try { TaskEntity newTask = WorkflowUtils.createNewTask(task); - taskService.addComment(newTask.getId(), task.getProcessInstanceId(), "【" + LoginHelper.getUsername() + "】委派给【" + delegateBo.getNickName() + "】"); + taskService.addComment(newTask.getId(), task.getProcessInstanceId(), TaskStatusEnum.PENDING.getStatus(), "【" + LoginHelper.getUsername() + "】委派给【" + delegateBo.getNickName() + "】"); //委托任务 taskService.delegateTask(delegateBo.getTaskId(), delegateBo.getUserId()); //办理生成的任务记录 @@ -388,7 +389,7 @@ public class ActTaskServiceImpl implements IActTaskService { } else { terminationBo.setComment(LoginHelper.getUsername() + "终止了申请:" + terminationBo.getComment()); } - taskService.addComment(task.getId(), task.getProcessInstanceId(), terminationBo.getComment()); + taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.TERMINATION.getStatus(), terminationBo.getComment()); List list = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()) .processInstanceId(task.getProcessInstanceId()).list(); if (CollectionUtil.isNotEmpty(list)) { @@ -422,7 +423,7 @@ public class ActTaskServiceImpl implements IActTaskService { } try { TaskEntity newTask = WorkflowUtils.createNewTask(task); - taskService.addComment(newTask.getId(), task.getProcessInstanceId(), + taskService.addComment(newTask.getId(), task.getProcessInstanceId(), TaskStatusEnum.TRANSFER.getStatus(), StringUtils.isNotBlank(transmitBo.getComment()) ? transmitBo.getComment() : LoginHelper.getUsername() + "转办了任务"); taskService.complete(newTask.getId()); taskService.setAssignee(task.getId(), transmitBo.getUserId()); @@ -468,7 +469,7 @@ public class ActTaskServiceImpl implements IActTaskService { List assigneeNames = addMultiBo.getAssigneeNames(); String username = LoginHelper.getUsername(); TaskEntity newTask = WorkflowUtils.createNewTask(task); - taskService.addComment(newTask.getId(), processInstanceId, username + "加签【" + String.join(StringUtils.SEPARATOR, assigneeNames) + "】"); + taskService.addComment(newTask.getId(), processInstanceId, TaskStatusEnum.SIGN.getStatus(), username + "加签【" + String.join(StringUtils.SEPARATOR, assigneeNames) + "】"); taskService.complete(newTask.getId()); return true; } catch (Exception e) { @@ -514,7 +515,7 @@ public class ActTaskServiceImpl implements IActTaskService { List assigneeNames = deleteMultiBo.getAssigneeNames(); String username = LoginHelper.getUsername(); TaskEntity newTask = WorkflowUtils.createNewTask(task); - taskService.addComment(newTask.getId(), processInstanceId, username + "减签【" + String.join(StringUtils.SEPARATOR, assigneeNames) + "】"); + taskService.addComment(newTask.getId(), processInstanceId, TaskStatusEnum.SIGN_OFF.getStatus(), username + "减签【" + String.join(StringUtils.SEPARATOR, assigneeNames) + "】"); taskService.complete(newTask.getId()); return true; } catch (Exception e) { @@ -549,7 +550,7 @@ public class ActTaskServiceImpl implements IActTaskService { //申请人节点 HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().finished().orderByHistoricTaskInstanceEndTime().asc().list().get(0); String backTaskDefinitionKey = historicTaskInstance.getTaskDefinitionKey(); - taskService.addComment(task.getId(), processInstanceId, StringUtils.isNotBlank(backProcessBo.getMessage()) ? backProcessBo.getMessage() : "退回"); + taskService.addComment(task.getId(), processInstanceId, TaskStatusEnum.BACK.getStatus(), StringUtils.isNotBlank(backProcessBo.getMessage()) ? backProcessBo.getMessage() : "退回"); if (taskList.size() > 1) { //当前多个任务驳回到单个节点 runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId) From f0368395d1049733e3b77a621cb7aab48f403220 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Fri, 14 Jul 2023 13:27:26 +0800 Subject: [PATCH 060/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E4=BD=9C=E5=BA=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ActProcessInstanceServiceImpl.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 380a1cac4..7ba500e5b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -309,10 +309,6 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService } //节点图形信息 map.put("graphicInfoVos", graphicInfoVos); - //作废理由 - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId) - .processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); - map.put("deleteReason", historicProcessInstance.getDeleteReason()); return map; } @@ -359,15 +355,18 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService if (CollUtil.isNotEmpty(subTasks)) { subTasks.forEach(e -> taskService.deleteTask(e.getId())); } + String deleteReason = LoginHelper.getUsername() + "作废了当前申请!"; + if (StringUtils.isNotBlank(processInvalidBo.getDeleteReason())) { + deleteReason = LoginHelper.getUsername() + "作废理由:" + processInvalidBo.getDeleteReason(); + } + for (Task task : StreamUtils.filter(list, e -> StringUtils.isBlank(e.getParentTaskId()))) { + taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.INVALID.getStatus(), deleteReason); + } HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceBusinessKey(processInvalidBo.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); if (ObjectUtil.isNotEmpty(historicProcessInstance)) { BusinessStatusEnum.checkStatus(historicProcessInstance.getBusinessStatus()); } - String deleteReason = LoginHelper.getUsername() + "作废了当前申请!"; - if (StringUtils.isNotBlank(processInvalidBo.getDeleteReason())) { - deleteReason = LoginHelper.getUsername() + "作废理由:" + processInvalidBo.getDeleteReason(); - } runtimeService.updateBusinessStatus(processInvalidBo.getProcessInstanceId(), BusinessStatusEnum.INVALID.getStatus()); runtimeService.deleteProcessInstance(processInvalidBo.getProcessInstanceId(), deleteReason); return true; From 6b6b9a91d9714b7e6d89eff80596658b4a8b5a9f Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 15 Jul 2023 17:22:49 +0800 Subject: [PATCH 061/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=8A=A0=E7=AD=BE=E4=BA=BA=EF=BC=8C=E5=AE=A1=E5=88=A4?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WorkflowUserController.java | 10 +++++ .../dromara/workflow/domain/vo/TaskVo.java | 5 +++ .../service/IWorkflowUserService.java | 8 ++++ .../impl/ActProcessInstanceServiceImpl.java | 25 ++++++----- .../service/impl/ActTaskServiceImpl.java | 2 + .../service/impl/WorkflowUserServiceImpl.java | 42 +++++++++++++++---- 6 files changed, 73 insertions(+), 19 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java index 287c3b7d6..2194022f1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java @@ -46,4 +46,14 @@ public class WorkflowUserController extends BaseController { public R> getWorkflowDeleteMultiInstanceList(@PathVariable String taskId) { return R.ok(iWorkflowUserService.getWorkflowDeleteMultiInstanceList(taskId)); } + + /** + * 按照用户id查询用户 + * + * @param userIds 用户id + */ + @GetMapping("/getUserListByIds/{userIds}") + public R> getUserListByIds(@PathVariable List userIds) { + return R.ok(iWorkflowUserService.getUserListByIds(userIds)); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java index 52f8ec287..fad9d903d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java @@ -135,4 +135,9 @@ public class TaskVo { * 参与者 */ private ParticipantVo participantVo; + + /** + * 是否会签 + */ + private Boolean multiInstance; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java index c70be04d4..d13247af7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java @@ -29,4 +29,12 @@ public interface IWorkflowUserService { * @return 结果 */ List getWorkflowDeleteMultiInstanceList(String taskId); + + /** + * 按照用户id查询用户 + * + * @param userIds 用户id + * @return 结果 + */ + List getUserListByIds(List userIds); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 7ba500e5b..637c2b502 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -267,6 +267,15 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService } actHistoryInfoVoList.add(actHistoryInfoVo); } + List collect = new ArrayList<>(); + //待办理 + List waitingTask = StreamUtils.filter(actHistoryInfoVoList, e -> e.getEndTime() == null); + //已办理 + List finishTask = StreamUtils.filter(actHistoryInfoVoList, e -> e.getEndTime() != null); + collect.addAll(waitingTask); + collect.addAll(finishTask); + //审批记录 + map.put("historyRecordList", collect); List nodeInfoList = new ArrayList<>(); Map> groupByKey = StreamUtils.groupByKey(actHistoryInfoVoList, ActHistoryInfoVo::getTaskDefinitionKey); for (Map.Entry> entry : groupByKey.entrySet()) { @@ -275,6 +284,11 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService if (StringUtils.isNotBlank(nickName)) { actHistoryInfoVo.setNickName(nickName); } + actHistoryInfoVoList.stream().filter(e -> e.getTaskDefinitionKey().equals(entry.getKey()) && e.getEndTime() != null).findFirst() + .ifPresent(e -> { + actHistoryInfoVo.setStatus("已处理"); + actHistoryInfoVo.setStartTime(e.getStartTime()); + }); actHistoryInfoVoList.stream().filter(e -> e.getTaskDefinitionKey().equals(entry.getKey()) && e.getEndTime() == null).findFirst() .ifPresent(e -> { actHistoryInfoVo.setStatus("待处理"); @@ -286,15 +300,6 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService } //节点信息 map.put("nodeListInfo", nodeInfoList); - List collect = new ArrayList<>(); - //待办理 - List waitingTask = StreamUtils.filter(actHistoryInfoVoList, e -> e.getEndTime() == null); - //已办理 - List finishTask = StreamUtils.filter(actHistoryInfoVoList, e -> e.getEndTime() != null); - collect.addAll(waitingTask); - collect.addAll(finishTask); - //审批记录 - map.put("historyRecordList", collect); BpmnModel bpmnModel = repositoryService.getBpmnModel(list.get(0).getProcessDefinitionId()); List graphicInfoVos = new ArrayList<>(); Collection flowElements = bpmnModel.getMainProcess().getFlowElements(); @@ -443,7 +448,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService List taskList = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(processInstanceId).list(); for (Task task : taskList) { taskService.setAssignee(task.getId(), String.valueOf(LoginHelper.getUserId())); - taskService.addComment(task.getId(), processInstanceId, LoginHelper.getUsername() + ":撤销申请"); + taskService.addComment(task.getId(), processInstanceId, TaskStatusEnum.CANCEL.getStatus(), LoginHelper.getUsername() + ":撤销申请"); } HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().finished().orderByHistoricTaskInstanceEndTime().asc().list().get(0); List nodeIds = StreamUtils.toList(taskList, Task::getTaskDefinitionKey); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 4c44954af..2d081c189 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -197,6 +197,7 @@ public class ActTaskServiceImpl implements IActTaskService { } taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); + taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); list.add(taskVo); } long count = query.count(); @@ -239,6 +240,7 @@ public class ActTaskServiceImpl implements IActTaskService { } taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); + taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); list.add(taskVo); } long count = query.count(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java index a2e888f2b..6781ed185 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java @@ -60,19 +60,20 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { throw new ServiceException("任务不存在"); } MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); + if (multiInstance == null) { + return TableDataInfo.build(); + } LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); //检索条件 queryWrapper.eq(StringUtils.isNotEmpty(sysUserMultiBo.getDeptId()), SysUser::getDeptId, sysUserMultiBo.getDeptId()); queryWrapper.eq(SysUser::getStatus, UserStatus.OK.getCode()); - if (multiInstance != null) { - if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { - List assigneeList = (List) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList()); - queryWrapper.notIn(CollectionUtil.isNotEmpty(assigneeList), SysUser::getUserId, assigneeList); - } else { - List list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list(); - List userIds = StreamUtils.toList(list, e -> Long.valueOf(e.getAssignee())); - queryWrapper.notIn(CollectionUtil.isNotEmpty(userIds), SysUser::getUserId, userIds); - } + if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { + List assigneeList = (List) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList()); + queryWrapper.notIn(CollectionUtil.isNotEmpty(assigneeList), SysUser::getUserId, assigneeList); + } else { + List list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list(); + List userIds = StreamUtils.toList(list, e -> Long.valueOf(e.getAssignee())); + queryWrapper.notIn(CollectionUtil.isNotEmpty(userIds), SysUser::getUserId, userIds); } queryWrapper.like(StringUtils.isNotEmpty(sysUserMultiBo.getUserName()), SysUser::getUserName, sysUserMultiBo.getUserName()); queryWrapper.like(StringUtils.isNotEmpty(sysUserMultiBo.getNickName()), SysUser::getNickName, sysUserMultiBo.getNickName()); @@ -172,4 +173,27 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { page.setRecords(records); return page; } + + /** + * 按照用户id查询用户 + * + * @param userIds 用户id + */ + @Override + public List getUserListByIds(List userIds) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + //检索条件 + queryWrapper.eq(SysUser::getStatus, UserStatus.OK.getCode()); + queryWrapper.in(SysUser::getUserId, userIds); + List sysUserVos = sysUserMapper.selectVoList(queryWrapper); + List collectDeptId = sysUserVos.stream().map(SysUserVo::getDeptId).filter(Objects::nonNull).collect(Collectors.toList()); + if (CollectionUtil.isEmpty(collectDeptId)) { + return sysUserVos; + } + List sysDeptList = sysDeptMapper.selectVoBatchIds(collectDeptId); + sysUserVos.forEach(e -> { + sysDeptList.stream().filter(d -> d.getDeptId().equals(e.getDeptId())).findFirst().ifPresent(e::setDept); + }); + return sysUserVos; + } } From 9e9aff905405e38fb2289aa7db970f5246c34692 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 15 Jul 2023 18:36:06 +0800 Subject: [PATCH 062/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0mysql=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yml | 8 ++--- script/sql/ry_vue_5.X.sql | 33 ++++++++++++++++--- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index fef1fa054..eb47aeccb 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -1,7 +1,7 @@ --- # 监控中心配置 spring.boot.admin.client: # 增加客户端开关 - enabled: true + enabled: false url: http://localhost:9090/admin instance: service-host-type: IP @@ -11,7 +11,7 @@ spring.boot.admin.client: --- # xxl-job 配置 xxl.job: # 执行器开关 - enabled: true + enabled: false # 调度中心地址:如调度中心集群部署存在多个地址则用逗号分隔。 admin-addresses: http://localhost:9100/xxl-job-admin # 执行器通讯TOKEN:非空时启用 @@ -49,9 +49,9 @@ spring: driverClassName: com.mysql.cj.jdbc.Driver # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) - url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true + url: jdbc:mysql://rm-1q2w3esong1998.mysql.rds.aliyuncs.com:3307/ruoyi-plus5x2?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true username: root - password: root + password: Aly_1998 # 从库数据源 slave: lazy: true diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index b01e55501..3cd6e3d16 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -231,6 +231,8 @@ insert into sys_menu values('6', '租户管理', '0', '2', 'tenant', n insert into sys_menu values('2', '系统监控', '0', '3', 'monitor', null, '', 1, 0, 'M', '0', '0', '', 'monitor', 103, 1, sysdate(), null, null, '系统监控目录'); insert into sys_menu values('3', '系统工具', '0', '4', 'tool', null, '', 1, 0, 'M', '0', '0', '', 'tool', 103, 1, sysdate(), null, null, '系统工具目录'); insert into sys_menu values('4', 'PLUS官网', '0', '5', 'https://gitee.com/dromara/RuoYi-Vue-Plus', null, '', 0, 0, 'M', '0', '0', '', 'guide', 103, 1, sysdate(), null, null, 'RuoYi-Vue-Plus官网地址'); +insert into sys_menu values('1616', '工作流', 0, 6, 'workflow', NULL, NULL, 1, 0, 'M', '0', '0', NULL, 'tree-table', 103, 1, '2023-05-27 19:52:40', 1, '2023-05-27 19:52:40', ''); + -- 二级菜单 insert into sys_menu values('100', '用户管理', '1', '1', 'user', 'system/user/index', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 103, 1, sysdate(), null, null, '用户管理菜单'); insert into sys_menu values('101', '角色管理', '1', '2', 'role', 'system/role/index', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 103, 1, sysdate(), null, null, '角色管理菜单'); @@ -245,8 +247,14 @@ insert into sys_menu values('109', '在线用户', '2', '1', 'online', insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 103, 1, sysdate(), null, null, '缓存监控菜单'); insert into sys_menu values('114', '表单构建', '3', '1', 'build', 'tool/build/index', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 103, 1, sysdate(), null, null, '表单构建菜单'); insert into sys_menu values('115', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 103, 1, sysdate(), null, null, '代码生成菜单'); -insert into sys_menu values ('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate(), null, null, '租户管理菜单'); -insert into sys_menu values ('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, '租户套餐管理菜单'); +insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate(), null, null, '租户管理菜单'); +insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, '租户套餐管理菜单'); +insert into sys_menu values('1617', '模型管理', '1616', '1', 'model', 'workflow/model/index', '', 1, 1, 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, sysdate(), null, null, '模型管理菜单'); +insert into sys_menu values('1618', '我的待办', '1616', '4', 'task', '', '', 1, 0, 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '我的待办菜单'); +insert into sys_menu values('1620', '流程定义', '1616', '2', 'processDefinition', 'workflow/processDefinition/index', '', 1, 1, 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '流程定义菜单'); +insert into sys_menu values('1622', '流程分类', '1616', '1', 'category', 'workflow/category/index', '', 1, 0, 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, sysdate(), null, null, '流程分类菜单'); +insert into sys_menu values('1628', '动态表单', '1616', '5', 'form', 'workflow/form/index', '', 1, 1, 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '动态表单菜单'); +insert into sys_menu values('1630', '流程监控', '1616', '3', 'monitor', '', '', 1, 0, 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '流程监控菜单'); -- springboot-admin监控 insert into sys_menu values('117', 'Admin监控', '2', '5', 'Admin', 'monitor/admin/index', '', 1, 0, 'C', '0', '0', 'monitor:admin:list', 'dashboard', 103, 1, sysdate(), null, null, 'Admin监控菜单'); @@ -256,8 +264,12 @@ insert into sys_menu values('118', '文件管理', '1', '10', 'oss', insert into sys_menu values('120', '任务调度中心', '2', '5', 'XxlJob', 'monitor/xxljob/index', '', 1, 0, 'C', '0', '0', 'monitor:xxljob:list', 'job', 103, 1, sysdate(), null, null, 'Xxl-Job控制台菜单'); -- 三级菜单 -insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 103, 1, sysdate(), null, null, '操作日志菜单'); -insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 103, 1, sysdate(), null, null, '登录日志菜单'); +insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 103, 1, sysdate(), null, null, '操作日志菜单'); +insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 103, 1, sysdate(), null, null, '登录日志菜单'); +insert into sys_menu values('1621', '流程实例', '1630','1', 'processInstance', 'workflow/processInstance/index', '', 1, 1, 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '流程实例'); +insert into sys_menu values('1631', '待办任务', '1630','2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', 1, 1, 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '待办任务'); +insert into sys_menu values('1619', '待办任务', '1618','2', 'taskWaiting', 'workflow/task/index', '', 1, 1, 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '待办任务'); +insert into sys_menu values('1629', '我的单据', '1618','1', 'myDocument', 'workflow/task/myDocument', '', 1, 1, 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '我的单据'); -- 用户管理按钮 insert into sys_menu values('1001', '用户查询', '100', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('1002', '用户新增', '100', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 103, 1, sysdate(), null, null, ''); @@ -344,7 +356,18 @@ insert into sys_menu values ('1612', '租户套餐新增', '122', '2', '#', '', insert into sys_menu values ('1613', '租户套餐修改', '122', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:edit', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values ('1614', '租户套餐删除', '122', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:remove', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values ('1615', '租户套餐导出', '122', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:export', '#', 103, 1, sysdate(), null, null, ''); - +-- 动态表单管理相关按钮 +insert into sys_menu values ('1633', '动态表单查询', '1628', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:form:query', '#', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('1634', '动态表单新增', '1628', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:form:add', '#', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('1635', '动态表单修改', '1628', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:form:edit', '#', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('1636', '动态表单删除', '1628', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:form:remove','#', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('1637', '动态表单导出', '1628', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:form:export','#', 103, 1, sysdate(), NULL, NULL, ''); +-- 流程分类管理相关按钮''''''' +insert into sys_menu values ('1623', '流程分类查询', '1622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('1624', '流程分类新增', '1622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('1625', '流程分类修改', '1622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('1626', '流程分类删除', '1622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values ('1627', '流程分类导出', '1622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, sysdate(), NULL, NULL, ''); -- ---------------------------- -- 6、用户和角色关联表 用户N-1角色 From 421952d05d9182f7c300cc9da694f5862ad8254b Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 15 Jul 2023 18:43:57 +0800 Subject: [PATCH 063/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E8=8F=9C?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application-dev.yml | 8 ++++---- script/sql/ry_vue_5.X.sql | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index eb47aeccb..fef1fa054 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -1,7 +1,7 @@ --- # 监控中心配置 spring.boot.admin.client: # 增加客户端开关 - enabled: false + enabled: true url: http://localhost:9090/admin instance: service-host-type: IP @@ -11,7 +11,7 @@ spring.boot.admin.client: --- # xxl-job 配置 xxl.job: # 执行器开关 - enabled: false + enabled: true # 调度中心地址:如调度中心集群部署存在多个地址则用逗号分隔。 admin-addresses: http://localhost:9100/xxl-job-admin # 执行器通讯TOKEN:非空时启用 @@ -49,9 +49,9 @@ spring: driverClassName: com.mysql.cj.jdbc.Driver # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) - url: jdbc:mysql://rm-1q2w3esong1998.mysql.rds.aliyuncs.com:3307/ruoyi-plus5x2?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true + url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true username: root - password: Aly_1998 + password: root # 从库数据源 slave: lazy: true diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index 3cd6e3d16..ee1d5fb68 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -362,7 +362,7 @@ insert into sys_menu values ('1634', '动态表单新增', '1628', '2', '#', '', insert into sys_menu values ('1635', '动态表单修改', '1628', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:form:edit', '#', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values ('1636', '动态表单删除', '1628', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:form:remove','#', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values ('1637', '动态表单导出', '1628', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:form:export','#', 103, 1, sysdate(), NULL, NULL, ''); --- 流程分类管理相关按钮''''''' +-- 流程分类管理相关按钮 insert into sys_menu values ('1623', '流程分类查询', '1622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values ('1624', '流程分类新增', '1622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values ('1625', '流程分类修改', '1622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, sysdate(), NULL, NULL, ''); From 8b1c89da37aece8b2a8a6bd2fc61d7596abe0bea Mon Sep 17 00:00:00 2001 From: konbai <1527468660@qq.com> Date: Wed, 19 Jul 2023 23:50:17 +0800 Subject: [PATCH 064/159] =?UTF-8?q?update=20=E7=A7=BB=E9=99=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E8=A1=A8=E5=8D=95=20formConfig=20=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=EF=BC=8C=E8=A1=A8=E5=8D=95=E9=85=8D=E7=BD=AE=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E9=83=BD=E6=94=BE=E4=B8=80=E8=B5=B7=E4=BE=BF=E4=BA=8E=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/dromara/workflow/domain/WfForm.java | 5 ----- script/sql/oracle/oracle_ry_vue_5.X.sql | 2 -- script/sql/postgres/postgres_ry_vue_5.X.sql | 2 -- script/sql/ry_vue_5.X.sql | 1 - script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 7 ------- 5 files changed, 17 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfForm.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfForm.java index 59a5c972d..77d07d2bf 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfForm.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfForm.java @@ -32,11 +32,6 @@ public class WfForm extends TenantEntity { */ private String formName; - /** - * 表单配置 - */ - private String formConfig; - /** * 表单内容 */ diff --git a/script/sql/oracle/oracle_ry_vue_5.X.sql b/script/sql/oracle/oracle_ry_vue_5.X.sql index d0a887efe..60867382f 100644 --- a/script/sql/oracle/oracle_ry_vue_5.X.sql +++ b/script/sql/oracle/oracle_ry_vue_5.X.sql @@ -1112,7 +1112,6 @@ insert into sys_oss_config values (5, '000000', 'image', 'ruoyi', 'r create table wf_form ( form_id number(20) not null, form_name varchar(64) default '', - form_config nclob, content nclob, create_dept number(20) default null, create_by number(20) default null, @@ -1128,7 +1127,6 @@ alter table wf_form add constraint pk_wf_form primary key (form_id); comment on table wf_form is '流程表单信息表'; comment on column wf_form.form_id is '表单主键'; comment on column wf_form.form_name is '表单名称'; -comment on column wf_form.form_config is '表单配置'; comment on column wf_form.content is '表单内容'; comment on column wf_form.create_dept is '创建部门'; comment on column wf_form.create_by is '创建者'; diff --git a/script/sql/postgres/postgres_ry_vue_5.X.sql b/script/sql/postgres/postgres_ry_vue_5.X.sql index 65b5b1998..cb391666a 100644 --- a/script/sql/postgres/postgres_ry_vue_5.X.sql +++ b/script/sql/postgres/postgres_ry_vue_5.X.sql @@ -1139,7 +1139,6 @@ create table if not exists bpmn_form form_id int8, tenant_id varchar(20) default '000000'::varchar, form_name varchar(255) default ''::varchar not null, - form_config text, content text, create_dept int8, create_by int8, @@ -1153,7 +1152,6 @@ create table if not exists bpmn_form comment on table wf_form is '流程表单信息表'; comment on column bpmn_form.form_id is '表单主键'; comment on column bpmn_form.form_name is '表单名称'; -comment on column bpmn_form.form_config is '表单配置'; comment on column bpmn_form.content is '表单内容'; comment on column bpmn_form.create_dept is '创建部门'; comment on column bpmn_form.create_by is '创建者'; diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index ee1d5fb68..757a1fbbf 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -826,7 +826,6 @@ create table wf_form ( form_id bigint not null comment '表单id', tenant_id varchar(20) default '000000'comment '租户编号', form_name varchar(255) default null comment '表单名称', - form_config longtext comment '表单配置', content longtext comment '表单内容', create_dept bigint default null comment '创建部门', create_by bigint default null comment '创建者', diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql index ca1025fcc..6626c577c 100644 --- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql +++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql @@ -2817,7 +2817,6 @@ CREATE TABLE wf_form ( form_id bigint NOT NULL, form_name nvarchar(64) DEFAULT '' NULL, - form_config nvarchar(max) NULL, content nvarchar(max) NULL, create_dept bigint NULL, create_by nvarchar(64) DEFAULT '' NULL, @@ -2844,12 +2843,6 @@ EXEC sp_addextendedproperty 'TABLE', N'wf_form', 'COLUMN', N'form_name' GO -EXEC sp_addextendedproperty - 'MS_Description', N'表单配置', - 'SCHEMA', N'dbo', - 'TABLE', N'wf_form', - 'COLUMN', N'form_config' -GO EXEC sp_addextendedproperty 'MS_Description', N'表单内容', 'SCHEMA', N'dbo', From b3f40fddb2fa94e1488d519d21cd129f81e1104b Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 22 Jul 2023 23:21:33 +0800 Subject: [PATCH 065/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E8=AF=B7?= =?UTF-8?q?=E5=81=87=E7=94=B3=E8=AF=B7=E7=A4=BA=E4=BE=8B=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=B5=81=E7=A8=8B=E5=AE=9A=E4=B9=89=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=EF=BC=8C=E6=B7=BB=E5=8A=A0sql=E8=8F=9C?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/ruoyi-demo/pom.xml | 23 +-- .../demo/controller/TestLeaveController.java | 106 ++++++++++++ .../org/dromara/demo/domain/TestLeave.java | 46 ++++++ .../dromara/demo/domain/bo/TestLeaveBo.java | 48 ++++++ .../dromara/demo/domain/vo/TestLeaveVo.java | 61 +++++++ .../dromara/demo/mapper/TestLeaveMapper.java | 15 ++ .../demo/service/ITestLeaveService.java | 49 ++++++ .../service/impl/TestLeaveServiceImpl.java | 119 ++++++++++++++ .../resources/mapper/demo/TestLeaveMapper.xml | 7 + .../common/constant/FlowConstant.java | 7 + .../ActProcessDefinitionController.java | 13 ++ .../workflow/domain/ActHiProcinst.java | 151 ++++++++++++++++++ .../workflow/mapper/ActHiProcinstMapper.java | 14 ++ .../service/IActHiProcinstService.java | 31 ++++ .../service/IActProcessDefinitionService.java | 10 ++ .../workflow/service/IWfCategoryService.java | 9 ++ .../impl/ActHiProcinstServiceImpl.java | 54 +++++++ .../impl/ActProcessDefinitionServiceImpl.java | 57 +++++++ .../service/impl/WfCategoryServiceImpl.java | 17 +- .../dromara/workflow/utils/WorkflowUtils.java | 65 ++++++++ .../mapper/workflow/ActHiProcinstMapper.xml | 7 + script/sql/test.sql | 23 +++ 22 files changed, 919 insertions(+), 13 deletions(-) create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestLeaveController.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestLeave.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestLeaveBo.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestLeaveVo.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestLeaveMapper.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestLeaveService.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestLeaveMapper.xml create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiProcinst.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiProcinstService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiProcinstMapper.xml diff --git a/ruoyi-modules/ruoyi-demo/pom.xml b/ruoyi-modules/ruoyi-demo/pom.xml index 09bf0bfae..6e8e71c22 100644 --- a/ruoyi-modules/ruoyi-demo/pom.xml +++ b/ruoyi-modules/ruoyi-demo/pom.xml @@ -97,16 +97,21 @@ org.dromara ruoyi-common-websocket - - - - - - - - - + + org.dromara + ruoyi-workflow + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestLeaveController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestLeaveController.java new file mode 100644 index 000000000..6ef6b4c4f --- /dev/null +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestLeaveController.java @@ -0,0 +1,106 @@ +package org.dromara.demo.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.demo.domain.TestLeave; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.demo.domain.vo.TestLeaveVo; +import org.dromara.demo.domain.bo.TestLeaveBo; +import org.dromara.demo.service.ITestLeaveService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 请假 + * + * @author may + * @date 2023-07-21 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo/leave") +public class TestLeaveController extends BaseController { + + private final ITestLeaveService testLeaveService; + + /** + * 查询请假列表 + */ + @SaCheckPermission("demo:leave:list") + @GetMapping("/list") + public TableDataInfo list(TestLeaveBo bo, PageQuery pageQuery) { + return testLeaveService.queryPageList(bo, pageQuery); + } + + /** + * 导出请假列表 + */ + @SaCheckPermission("demo:leave:export") + @Log(title = "请假", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TestLeaveBo bo, HttpServletResponse response) { + List list = testLeaveService.queryList(bo); + ExcelUtil.exportExcel(list, "请假", TestLeaveVo.class, response); + } + + /** + * 获取请假详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("demo:leave:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(testLeaveService.queryById(id)); + } + + /** + * 新增请假 + */ + @SaCheckPermission("demo:leave:add") + @Log(title = "请假", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TestLeaveBo bo) { + return R.ok(testLeaveService.insertByBo(bo)); + } + + /** + * 修改请假 + */ + @SaCheckPermission("demo:leave:edit") + @Log(title = "请假", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TestLeaveBo bo) { + return R.ok(testLeaveService.updateByBo(bo)); + } + + /** + * 删除请假 + * + * @param ids 主键串 + */ + @SaCheckPermission("demo:leave:remove") + @Log(title = "请假", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(testLeaveService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestLeave.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestLeave.java new file mode 100644 index 000000000..a11352f6f --- /dev/null +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestLeave.java @@ -0,0 +1,46 @@ +package org.dromara.demo.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 请假对象 test_leave + * + * @author may + * @date 2023-07-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("test_leave") +public class TestLeave extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 标题 + */ + private String title; + + /** + * 请假天数 + */ + private Integer leaveDays; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestLeaveBo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestLeaveBo.java new file mode 100644 index 000000000..3142b74a0 --- /dev/null +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestLeaveBo.java @@ -0,0 +1,48 @@ +package org.dromara.demo.domain.bo; + +import org.dromara.demo.domain.TestLeave; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 请假业务对象 test_leave + * + * @author may + * @date 2023-07-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TestLeave.class, reverseConvertGenerate = false) +public class TestLeaveBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 标题 + */ + @NotBlank(message = "标题不能为空", groups = { AddGroup.class, EditGroup.class }) + private String title; + + /** + * 请假天数 + */ + @NotNull(message = "请假天数不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer leaveDays; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestLeaveVo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestLeaveVo.java new file mode 100644 index 000000000..1d510c1ee --- /dev/null +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestLeaveVo.java @@ -0,0 +1,61 @@ +package org.dromara.demo.domain.vo; + +import org.dromara.demo.domain.TestLeave; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.workflow.domain.vo.ProcessInstanceVo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 请假视图对象 test_leave + * + * @author may + * @date 2023-07-21 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TestLeave.class) +public class TestLeaveVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 标题 + */ + @ExcelProperty(value = "标题") + private String title; + + /** + * 请假天数 + */ + @ExcelProperty(value = "请假天数") + private Integer leaveDays; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 流程实例对象 + */ + private ProcessInstanceVo processInstanceVo; + + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestLeaveMapper.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestLeaveMapper.java new file mode 100644 index 000000000..8275f696f --- /dev/null +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestLeaveMapper.java @@ -0,0 +1,15 @@ +package org.dromara.demo.mapper; + +import org.dromara.demo.domain.TestLeave; +import org.dromara.demo.domain.vo.TestLeaveVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 请假Mapper接口 + * + * @author may + * @date 2023-07-21 + */ +public interface TestLeaveMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestLeaveService.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestLeaveService.java new file mode 100644 index 000000000..07227947b --- /dev/null +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestLeaveService.java @@ -0,0 +1,49 @@ +package org.dromara.demo.service; + +import org.dromara.demo.domain.TestLeave; +import org.dromara.demo.domain.vo.TestLeaveVo; +import org.dromara.demo.domain.bo.TestLeaveBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 请假Service接口 + * + * @author may + * @date 2023-07-21 + */ +public interface ITestLeaveService { + + /** + * 查询请假 + */ + TestLeaveVo queryById(Long id); + + /** + * 查询请假列表 + */ + TableDataInfo queryPageList(TestLeaveBo bo, PageQuery pageQuery); + + /** + * 查询请假列表 + */ + List queryList(TestLeaveBo bo); + + /** + * 新增请假 + */ + TestLeave insertByBo(TestLeaveBo bo); + + /** + * 修改请假 + */ + TestLeave updateByBo(TestLeaveBo bo); + + /** + * 校验并批量删除请假信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java new file mode 100644 index 000000000..cb5c303f0 --- /dev/null +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java @@ -0,0 +1,119 @@ +package org.dromara.demo.service.impl; + +import cn.hutool.core.collection.CollUtil; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.workflow.utils.WorkflowUtils; +import org.springframework.stereotype.Service; +import org.dromara.demo.domain.bo.TestLeaveBo; +import org.dromara.demo.domain.vo.TestLeaveVo; +import org.dromara.demo.domain.TestLeave; +import org.dromara.demo.mapper.TestLeaveMapper; +import org.dromara.demo.service.ITestLeaveService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 请假Service业务层处理 + * + * @author may + * @date 2023-07-21 + */ +@RequiredArgsConstructor +@Service +public class TestLeaveServiceImpl implements ITestLeaveService { + + private final TestLeaveMapper baseMapper; + + /** + * 查询请假 + */ + @Override + public TestLeaveVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 查询请假列表 + */ + @Override + public TableDataInfo queryPageList(TestLeaveBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + TableDataInfo build = TableDataInfo.build(result); + List rows = build.getRows(); + if(CollUtil.isNotEmpty(rows)){ + List ids = StreamUtils.toList(rows, e -> String.valueOf(e.getId())); + WorkflowUtils.setProcessInstanceListVo(rows,ids,"id"); + } + return build; + } + + /** + * 查询请假列表 + */ + @Override + public List queryList(TestLeaveBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TestLeaveBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getTitle()), TestLeave::getTitle, bo.getTitle()); + lqw.eq(bo.getLeaveDays() != null, TestLeave::getLeaveDays, bo.getLeaveDays()); + return lqw; + } + + /** + * 新增请假 + */ + @Override + public TestLeave insertByBo(TestLeaveBo bo) { + TestLeave add = MapstructUtils.convert(bo, TestLeave.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return add; + } + + /** + * 修改请假 + */ + @Override + public TestLeave updateByBo(TestLeaveBo bo) { + TestLeave update = MapstructUtils.convert(bo, TestLeave.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0 ? update : null; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TestLeave entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除请假 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestLeaveMapper.xml b/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestLeaveMapper.xml new file mode 100644 index 000000000..b5b83a579 --- /dev/null +++ b/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestLeaveMapper.xml @@ -0,0 +1,7 @@ + + + + + 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 index cf6259b31..8bb684ee6 100644 --- 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 @@ -52,4 +52,11 @@ public interface FlowConstant { */ String LOOP_COUNTER = "loopCounter"; + String ZIP = "ZIP"; + + /** + * 流程实例对象 + */ + String PROCESS_INSTANCE_VO = "processInstanceVo"; + } 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 index 9c0ca92d3..40c159583 100644 --- 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 @@ -14,6 +14,7 @@ import org.dromara.workflow.domain.vo.ProcessDefinitionVo; import org.dromara.workflow.service.IActProcessDefinitionService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.util.*; @@ -124,4 +125,16 @@ public class ActProcessDefinitionController extends BaseController { public R convertToModel(@NotEmpty(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { return toAjax(iActProcessDefinitionService.convertToModel(processDefinitionId)); } + + /** + * 通过zip或xml部署流程定义 + * + * @param file 文件 + * @param categoryCode 分类 + */ + @Log(title = "流程定义管理", businessType = BusinessType.INSERT) + @PostMapping("/deployByFile") + public R deployByFile(@RequestParam("file") MultipartFile file, @RequestParam("categoryCode") String categoryCode) { + return toAjax(iActProcessDefinitionService.deployByFile(file, categoryCode)); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiProcinst.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiProcinst.java new file mode 100644 index 000000000..1b97af1cc --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiProcinst.java @@ -0,0 +1,151 @@ +package org.dromara.workflow.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +import java.io.Serial; + +/** + * 流程实例对象 act_hi_procinst + * + * @author may + * @date 2023-07-22 + */ +@Data +@TableName("act_hi_procinst") +public class ActHiProcinst implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "ID_") + private String id; + + /** + * + */ + @TableField(value = "REV_") + private Long rev; + + /** + * + */ + @TableField(value = "PROC_INST_ID_") + private String procInstId; + + /** + * + */ + @TableField(value = "BUSINESS_KEY_") + private String businessKey; + + /** + * + */ + @TableField(value = "PROC_DEF_ID_") + private String procDefId; + + /** + * + */ + @TableField(value = "START_TIME_") + private Date startTime; + + /** + * + */ + @TableField(value = "END_TIME_") + private Date endTime; + + /** + * + */ + @TableField(value = "DURATION_") + private Long duration; + + /** + * + */ + @TableField(value = "START_USER_ID_") + private String startUserId; + + /** + * + */ + @TableField(value = "START_ACT_ID_") + private String startActId; + + /** + * + */ + @TableField(value = "END_ACT_ID_") + private String endActId; + + /** + * + */ + @TableField(value = "SUPER_PROCESS_INSTANCE_ID_") + private String superProcessInstanceId; + + /** + * + */ + @TableField(value = "DELETE_REASON_") + private String deleteReason; + + /** + * + */ + @TableField(value = "TENANT_ID_") + private String tenantId; + + /** + * + */ + @TableField(value = "NAME_") + private String name; + + /** + * + */ + @TableField(value = "CALLBACK_ID_") + private String callbackId; + + /** + * + */ + @TableField(value = "CALLBACK_TYPE_") + private String callbackType; + + /** + * + */ + @TableField(value = "REFERENCE_ID_") + private String referenceId; + + /** + * + */ + @TableField(value = "REFERENCE_TYPE_") + private String referenceType; + + /** + * + */ + @TableField(value = "PROPAGATED_STAGE_INST_ID_") + private String propagatedStageInstId; + + /** + * + */ + @TableField(value = "BUSINESS_STATUS_") + private String businessStatus; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java new file mode 100644 index 000000000..788fca6ea --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java @@ -0,0 +1,14 @@ +package org.dromara.workflow.mapper; + +import org.dromara.workflow.domain.ActHiProcinst; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 流程实例Mapper接口 + * + * @author may + * @date 2023-07-22 + */ +public interface ActHiProcinstMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiProcinstService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiProcinstService.java new file mode 100644 index 000000000..e802c6972 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiProcinstService.java @@ -0,0 +1,31 @@ +package org.dromara.workflow.service; + + +import org.dromara.workflow.domain.ActHiProcinst; + +import java.util.List; + +/** + * 流程实例Service接口 + * + * @author may + * @date 2023-07-22 + */ +public interface IActHiProcinstService { + + /** + * 按照业务id查询 + * + * @param businessKeys 业务id + * @return 结果 + */ + List selectByBusinessKeyIn(List businessKeys); + + /** + * 按照业务id查询 + * + * @param businessKey 业务id + * @return 结果 + */ + ActHiProcinst selectByBusinessKey(String businessKey); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java index cdbd8078f..c3027a60a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java @@ -4,6 +4,7 @@ import jakarta.servlet.http.HttpServletResponse; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.bo.ProcessDefinitionBo; import org.dromara.workflow.domain.vo.ProcessDefinitionVo; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -78,4 +79,13 @@ public interface IActProcessDefinitionService { * @return 结果 */ boolean convertToModel(String processDefinitionId); + + /** + * 通过zip或xml部署流程定义 + * + * @param file 文件 + * @param categoryCode 分类 + * @return 结果 + */ + boolean deployByFile(MultipartFile file, String categoryCode); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java index 61bf7df23..ebd2c0b54 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java @@ -1,5 +1,6 @@ package org.dromara.workflow.service; +import org.dromara.workflow.domain.WfCategory; import org.dromara.workflow.domain.vo.WfCategoryVo; import org.dromara.workflow.domain.bo.WfCategoryBo; @@ -39,4 +40,12 @@ public interface IWfCategoryService { * 校验并批量删除流程分类信息 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 按照类别编码查询 + * + * @param categoryCode 分类比吗 + * @return 结果 + */ + WfCategory queryByCategoryCode(String categoryCode); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java new file mode 100644 index 000000000..e0ec0a794 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java @@ -0,0 +1,54 @@ +package org.dromara.workflow.service.impl; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.workflow.domain.ActHiProcinst; +import org.springframework.stereotype.Service; +import org.dromara.workflow.mapper.ActHiProcinstMapper; +import org.dromara.workflow.service.IActHiProcinstService; + +import java.util.List; + + +/** + * 流程实例Service业务层处理 + * + * @author may + * @date 2023-07-22 + */ +@RequiredArgsConstructor +@Service +public class ActHiProcinstServiceImpl implements IActHiProcinstService { + + private final ActHiProcinstMapper baseMapper; + + /** + * 按照业务id查询 + * + * @param businessKeys 业务id + */ + @Override + public List selectByBusinessKeyIn(List businessKeys) { + return TenantHelper.ignore(() -> + baseMapper.selectList(new LambdaQueryWrapper() + .in(ActHiProcinst::getBusinessKey, businessKeys) + .eq(ActHiProcinst::getTenantId, TenantHelper.getTenantId())) + ); + } + + /** + * 按照业务id查询 + * + * @param businessKey 业务id + */ + @Override + public ActHiProcinst selectByBusinessKey(String businessKey) { + return TenantHelper.ignore(() -> + baseMapper.selectOne(new LambdaQueryWrapper() + .eq(ActHiProcinst::getBusinessKey, businessKey) + .eq(ActHiProcinst::getTenantId, TenantHelper.getTenantId())) + ); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index 6691c9b16..378425e46 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -15,6 +15,8 @@ import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.domain.WfCategory; import org.dromara.workflow.domain.bo.ProcessDefinitionBo; import org.dromara.workflow.domain.vo.ProcessDefinitionVo; import org.dromara.workflow.service.IActProcessDefinitionService; @@ -28,6 +30,7 @@ import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.repository.ProcessDefinitionQuery; import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; @@ -35,6 +38,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import java.util.zip.ZipInputStream; /** * 流程定义 服务层实现 @@ -51,6 +55,8 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer private final ProcessMigrationService processMigrationService; + private final WfCategoryServiceImpl wfCategoryService; + /** * 分页查询 * @@ -290,4 +296,55 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer throw new ServiceException(e.getMessage()); } } + + /** + * 通过zip或xml部署流程定义 + * + * @param file 文件 + * @param categoryCode 分类 + */ + @Override + public boolean deployByFile(MultipartFile file, String categoryCode) { + try { + + WfCategory wfCategory = wfCategoryService.queryByCategoryCode(categoryCode); + if (wfCategory == null) { + throw new ServiceException("流程分类不存在"); + } + // 文件名 = 流程名称-流程key + String filename = file.getOriginalFilename(); + assert filename != null; + String[] splitFilename = filename.substring(0, filename.lastIndexOf(".")).split("-"); + if (splitFilename.length < 2) { + throw new ServiceException("流程分类不能为空(文件名 = 流程名称-流程key)"); + } + //流程名称 + String processName = splitFilename[0]; + //流程key + String processKey = splitFilename[1]; + // 文件后缀名 + String suffix = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase(); + InputStream inputStream = file.getInputStream(); + Deployment deployment; + if (FlowConstant.ZIP.equals(suffix)) { + // zip + deployment = repositoryService.createDeployment() + .tenantId(TenantHelper.getTenantId()) + .addZipInputStream(new ZipInputStream(inputStream)).name(processName).key(processKey).category(categoryCode).deploy(); + } else { + // xml 或 bpmn + deployment = repositoryService.createDeployment() + .tenantId(TenantHelper.getTenantId()) + .addInputStream(filename, inputStream).name(processName).key(processKey).category(categoryCode).deploy(); + } + // 更新分类 + ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult(); + repositoryService.setProcessDefinitionCategory(definition.getId(), categoryCode); + + return true; + } catch (IOException e) { + e.printStackTrace(); + throw new ServiceException("部署失败" + e.getMessage()); + } + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java index 61364d6be..1ce4e052f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java @@ -13,7 +13,6 @@ import org.dromara.workflow.mapper.WfCategoryMapper; import org.dromara.workflow.service.IWfCategoryService; import java.util.List; -import java.util.Map; import java.util.Collection; /** @@ -32,7 +31,7 @@ public class WfCategoryServiceImpl implements IWfCategoryService { * 查询流程分类 */ @Override - public WfCategoryVo queryById(Long id){ + public WfCategoryVo queryById(Long id) { return baseMapper.selectVoById(id); } @@ -80,7 +79,7 @@ public class WfCategoryServiceImpl implements IWfCategoryService { /** * 保存前的数据校验 */ - private void validEntityBeforeSave(WfCategory entity){ + private void validEntityBeforeSave(WfCategory entity) { //TODO 做一些数据校验,如唯一约束 } @@ -89,9 +88,19 @@ public class WfCategoryServiceImpl implements IWfCategoryService { */ @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ + if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteBatchIds(ids) > 0; } + + /** + * 按照类别编码查询 + * + * @param categoryCode 分类比吗 + */ + @Override + public WfCategory queryByCategoryCode(String categoryCode) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(WfCategory::getCategoryCode, categoryCode)); + } } 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 index 8e07d83c3..a412642be 100644 --- 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 @@ -1,5 +1,6 @@ package org.dromara.workflow.utils; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.ObjectUtil; @@ -7,9 +8,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.dromara.common.core.enums.UserStatus; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.reflect.ReflectUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.system.domain.SysUser; @@ -17,9 +20,13 @@ import org.dromara.system.domain.SysUserRole; import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.mapper.SysUserRoleMapper; import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.common.enums.BusinessStatusEnum; +import org.dromara.workflow.domain.ActHiProcinst; import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.ParticipantVo; +import org.dromara.workflow.domain.vo.ProcessInstanceVo; import org.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd; +import org.dromara.workflow.service.IActHiProcinstService; import org.flowable.bpmn.converter.BpmnXMLConverter; import org.flowable.bpmn.model.*; import org.flowable.common.engine.api.delegate.Expression; @@ -42,6 +49,8 @@ import java.rmi.ServerException; import java.util.*; import java.util.stream.Collectors; +import static org.dromara.workflow.common.constant.FlowConstant.PROCESS_INSTANCE_VO; + /** * 工作流工具 * @@ -55,6 +64,7 @@ public class WorkflowUtils { private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class); private static final SysUserMapper SYS_USER_MAPPER = SpringUtils.getBean(SysUserMapper.class); private static final SysUserRoleMapper SYS_USER_ROLE_MAPPER = SpringUtils.getBean(SysUserRoleMapper.class); + private static final IActHiProcinstService I_ACT_HI_PROCINST_SERVICE = SpringUtils.getBean(IActHiProcinstService.class); /** * bpmnModel转为xml @@ -272,6 +282,61 @@ public class WorkflowUtils { HistoricTaskInstance historicTaskInstance = PROCESS_ENGINE.getHistoryService().createHistoricTaskInstanceQuery().taskId(taskId).taskTenantId(TenantHelper.getTenantId()).singleResult(); HistoricProcessInstance historicProcessInstance = PROCESS_ENGINE.getHistoryService().createHistoricProcessInstanceQuery() .processInstanceId(historicTaskInstance.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); + return historicProcessInstance.getBusinessStatus(); } + + /** + * 设置流程实例对象 + * + * @param obj 业务对象 + * @param businessKey 业务id + */ + public static void setProcessInstanceVo(Object obj, String businessKey) { + ActHiProcinst actHiProcinst = I_ACT_HI_PROCINST_SERVICE.selectByBusinessKey(businessKey); + if (actHiProcinst == null) { + ProcessInstanceVo processInstanceVo = new ProcessInstanceVo(); + processInstanceVo.setBusinessStatus(BusinessStatusEnum.DRAFT.getStatus()); + ReflectUtils.invokeSetter(obj, PROCESS_INSTANCE_VO, processInstanceVo); + return; + } + ProcessInstanceVo processInstanceVo = BeanUtil.toBean(actHiProcinst, ProcessInstanceVo.class); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstanceVo.getBusinessStatus())); + ReflectUtils.invokeSetter(obj, PROCESS_INSTANCE_VO, processInstanceVo); + } + + /** + * 设置流程实例对象 + * + * @param obj 业务对象 + * @param idList 业务id + * @param fieldName 主键属性名称 + */ + public static void setProcessInstanceListVo(Object obj, List idList, String fieldName) { + List actHiProcinstList = I_ACT_HI_PROCINST_SERVICE.selectByBusinessKeyIn(idList); + if (obj instanceof Collection) { + Collection collection = (Collection) obj; + for (Object o : collection) { + if (o != null) { + try { + String fieldValue = ReflectUtils.invokeGetter(o, fieldName).toString(); + ActHiProcinst actHiProcinst = actHiProcinstList.stream().filter(e -> e.getBusinessKey().equals(fieldValue)).findFirst().orElse(null); + if (ObjectUtil.isNotEmpty(actHiProcinst)) { + ProcessInstanceVo processInstanceVo = BeanUtil.toBean(actHiProcinst, ProcessInstanceVo.class); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstanceVo.getBusinessStatus())); + ReflectUtils.invokeSetter(o, PROCESS_INSTANCE_VO, processInstanceVo); + } else { + ProcessInstanceVo processInstanceVo = new ProcessInstanceVo(); + processInstanceVo.setBusinessStatus(BusinessStatusEnum.DRAFT.getStatus()); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstanceVo.getBusinessStatus())); + ReflectUtils.invokeSetter(o, PROCESS_INSTANCE_VO, processInstanceVo); + } + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException(e.getMessage()); + } + } + } + } + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiProcinstMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiProcinstMapper.xml new file mode 100644 index 000000000..44814ec35 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiProcinstMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/script/sql/test.sql b/script/sql/test.sql index d4cea0567..866ef661c 100644 --- a/script/sql/test.sql +++ b/script/sql/test.sql @@ -37,6 +37,22 @@ CREATE TABLE test_tree PRIMARY KEY (id) USING BTREE ) ENGINE = InnoDB COMMENT = '测试树表'; +DROP TABLE if EXISTS test_leave; +create table test_leave +( + id bigint not null comment '主键', + title varchar(255) not null comment '标题', + leave_days int(10) not null comment '请假天数', + remark varchar(255) null comment '备注', + create_dept bigint null comment '创建部门', + create_by bigint null comment '创建者', + create_time datetime null comment '创建时间', + update_by bigint null comment '更新者', + update_time datetime null comment '更新时间', + tenant_id varchar(20) default '000000' null comment '租户编号', + PRIMARY KEY (id) USING BTREE +) ENGINE = InnoDB COMMENT = '请假表'; + INSERT INTO sys_user(user_id, tenant_id, dept_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar, password, status, del_flag, login_ip, login_date, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (3, '000000', 108, 'test', '本部门及以下 密码666666', 'sys_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), 3, sysdate(), NULL); INSERT INTO sys_user(user_id, tenant_id, dept_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar, password, status, del_flag, login_ip, login_date, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (4, '000000', 102, 'test1', '仅本人 密码666666', 'sys_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), 4, sysdate(), NULL); @@ -56,6 +72,13 @@ INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1510, '测试树表删除', 1506, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:remove', '#', 103, 1, sysdate(), NULL, NULL, ''); INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1511, '测试树表导出', 1506, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:export', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1638, '请假申请', 5, 1, 'leave', 'demo/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, sysdate(), NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1639, '请假申请查询', 1638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1640, '请假申请新增', 1638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1641, '请假申请修改', 1638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1642, '请假申请删除', 1638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1643, '请假申请导出', 1638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, sysdate(), NULL, NULL, ''); + INSERT INTO sys_role(role_id, tenant_id, role_name, role_key, role_sort, data_scope, menu_check_strictly, dept_check_strictly, status, del_flag, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (3, '000000', '本部门及以下', 'test1', 3, '4', 1, 1, '0', '0', 103, 1, sysdate(), 1, NULL, NULL); INSERT INTO sys_role(role_id, tenant_id, role_name, role_key, role_sort, data_scope, menu_check_strictly, dept_check_strictly, status, del_flag, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (4, '000000', '仅本人', 'test2', 4, '5', 1, 1, '0', '0', 103, 1, sysdate(), 1, NULL, NULL); From 670b04faf0af5ac0c3ad4072767db26693eeb77f Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 23 Jul 2023 11:36:17 +0800 Subject: [PATCH 066/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=8C=89?= =?UTF-8?q?=E7=85=A7=E4=B8=9A=E5=8A=A1id=E5=88=A0=E9=99=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/controller/TestLeaveController.java | 2 +- .../dromara/demo/domain/bo/TestLeaveBo.java | 1 - .../demo/service/ITestLeaveService.java | 2 +- .../service/impl/TestLeaveServiceImpl.java | 13 +++-- .../ActProcessInstanceController.java | 5 +- .../service/IActProcessInstanceService.java | 13 ++++- .../impl/ActProcessInstanceServiceImpl.java | 58 ++++++++++++++++--- 7 files changed, 72 insertions(+), 22 deletions(-) diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestLeaveController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestLeaveController.java index 6ef6b4c4f..9dbe6ebb7 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestLeaveController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestLeaveController.java @@ -101,6 +101,6 @@ public class TestLeaveController extends BaseController { @DeleteMapping("/{ids}") public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { - return toAjax(testLeaveService.deleteWithValidByIds(List.of(ids), true)); + return toAjax(testLeaveService.deleteWithValidByIds(List.of(ids))); } } diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestLeaveBo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestLeaveBo.java index 3142b74a0..b0e40f8ce 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestLeaveBo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestLeaveBo.java @@ -41,7 +41,6 @@ public class TestLeaveBo extends BaseEntity { /** * 备注 */ - @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) private String remark; diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestLeaveService.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestLeaveService.java index 07227947b..c9993fc25 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestLeaveService.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestLeaveService.java @@ -45,5 +45,5 @@ public interface ITestLeaveService { /** * 校验并批量删除请假信息 */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + Boolean deleteWithValidByIds(Collection ids); } diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java index cb5c303f0..e69a83001 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; +import org.dromara.workflow.service.IActProcessInstanceService; import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.dromara.demo.domain.bo.TestLeaveBo; @@ -33,6 +34,7 @@ import java.util.Collection; public class TestLeaveServiceImpl implements ITestLeaveService { private final TestLeaveMapper baseMapper; + private final IActProcessInstanceService iActProcessInstanceService; /** * 查询请假 @@ -51,9 +53,9 @@ public class TestLeaveServiceImpl implements ITestLeaveService { Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); TableDataInfo build = TableDataInfo.build(result); List rows = build.getRows(); - if(CollUtil.isNotEmpty(rows)){ + if (CollUtil.isNotEmpty(rows)) { List ids = StreamUtils.toList(rows, e -> String.valueOf(e.getId())); - WorkflowUtils.setProcessInstanceListVo(rows,ids,"id"); + WorkflowUtils.setProcessInstanceListVo(rows, ids, "id"); } return build; } @@ -110,10 +112,9 @@ public class TestLeaveServiceImpl implements ITestLeaveService { * 批量删除请假 */ @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 - } + public Boolean deleteWithValidByIds(Collection ids) { + List idList = StreamUtils.toList(ids, String::valueOf); + iActProcessInstanceService.deleteRuntimeProcessAndHisInstByBusinessKeys(idList); return baseMapper.deleteBatchIds(ids) > 0; } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java index 495101a37..415ea3801 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java @@ -17,6 +17,7 @@ import org.dromara.workflow.service.IActProcessInstanceService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.Arrays; import java.util.Map; /** @@ -92,7 +93,7 @@ public class ActProcessInstanceController extends BaseController { @Log(title = "流程实例管理", businessType = BusinessType.DELETE) @DeleteMapping("/deleteRuntimeProcessAndHisInst/{processInstanceIds}") public R deleteRuntimeProcessAndHisInst(@NotNull(message = "流程实例id不能为空") @PathVariable String[] processInstanceIds) { - return toAjax(iActProcessInstanceService.deleteRuntimeProcessAndHisInst(processInstanceIds)); + return toAjax(iActProcessInstanceService.deleteRuntimeProcessAndHisInst(Arrays.asList(processInstanceIds))); } /** @@ -103,7 +104,7 @@ public class ActProcessInstanceController extends BaseController { @Log(title = "流程实例管理", businessType = BusinessType.DELETE) @DeleteMapping("/deleteFinishProcessAndHisInst/{processInstanceIds}") public R deleteFinishProcessAndHisInst(@NotNull(message = "流程实例id不能为空") @PathVariable String[] processInstanceIds) { - return toAjax(iActProcessInstanceService.deleteFinishProcessAndHisInst(processInstanceIds)); + return toAjax(iActProcessInstanceService.deleteFinishProcessAndHisInst(Arrays.asList(processInstanceIds))); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java index 2f122b6ad..6c2cb8967 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java @@ -6,6 +6,7 @@ import org.dromara.workflow.domain.bo.ProcessInstanceBo; import org.dromara.workflow.domain.bo.ProcessInvalidBo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; +import java.util.List; import java.util.Map; /** @@ -60,7 +61,15 @@ public interface IActProcessInstanceService { * @param processInstanceIds 流程实例id * @return 结果 */ - boolean deleteRuntimeProcessAndHisInst(String[] processInstanceIds); + boolean deleteRuntimeProcessAndHisInst(List processInstanceIds); + + /** + * 按照业务id删除 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param businessKeys 业务id + * @return 结果 + */ + boolean deleteRuntimeProcessAndHisInstByBusinessKeys(List businessKeys); /** * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 @@ -68,7 +77,7 @@ public interface IActProcessInstanceService { * @param processInstanceIds 流程实例id * @return 结果 */ - boolean deleteFinishProcessAndHisInst(String[] processInstanceIds); + boolean deleteFinishProcessAndHisInst(List processInstanceIds); /** * 撤销流程申请 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 637c2b502..b603b2710 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.ObjectUtil; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; @@ -16,6 +17,7 @@ import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.enums.BusinessStatusEnum; import org.dromara.workflow.common.enums.TaskStatusEnum; +import org.dromara.workflow.domain.ActHiProcinst; import org.dromara.workflow.domain.bo.ProcessInstanceBo; import org.dromara.workflow.domain.bo.ProcessInvalidBo; import org.dromara.workflow.domain.vo.ActHistoryInfoVo; @@ -23,6 +25,7 @@ import org.dromara.workflow.domain.vo.GraphicInfoVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator; +import org.dromara.workflow.service.IActHiProcinstService; import org.dromara.workflow.service.IActProcessInstanceService; import org.flowable.bpmn.model.*; import org.flowable.engine.HistoryService; @@ -54,7 +57,7 @@ import java.util.stream.Collectors; * * @author may */ - +@Slf4j @RequiredArgsConstructor @Service public class ActProcessInstanceServiceImpl implements IActProcessInstanceService { @@ -63,6 +66,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService private final RuntimeService runtimeService; private final HistoryService historyService; private final TaskService taskService; + private final IActHiProcinstService iActHiProcinstService; @Value("${flowable.activity-font-name}") private String activityFontName; @@ -388,21 +392,57 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService */ @Override @Transactional(rollbackFor = Exception.class) - public boolean deleteRuntimeProcessAndHisInst(String[] processInstanceIds) { + public boolean deleteRuntimeProcessAndHisInst(List processInstanceIds) { try { //1.删除运行中流程实例 - List list = taskService.createTaskQuery().processInstanceIdIn(Arrays.asList(processInstanceIds)) + List list = taskService.createTaskQuery().processInstanceIdIn(processInstanceIds) .taskTenantId(TenantHelper.getTenantId()).list(); List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); if (CollUtil.isNotEmpty(subTasks)) { subTasks.forEach(e -> taskService.deleteTask(e.getId())); } - runtimeService.bulkDeleteProcessInstances(Arrays.asList(processInstanceIds), LoginHelper.getUserId() + "删除了当前流程申请"); + runtimeService.bulkDeleteProcessInstances(processInstanceIds, LoginHelper.getUserId() + "删除了当前流程申请"); //2.删除历史记录 List historicProcessInstanceList = historyService.createHistoricProcessInstanceQuery() - .processInstanceTenantId(TenantHelper.getTenantId()).processInstanceIds(new HashSet<>(Arrays.asList(processInstanceIds))).list(); + .processInstanceTenantId(TenantHelper.getTenantId()).processInstanceIds(new HashSet<>(processInstanceIds)).list(); if (ObjectUtil.isNotEmpty(historicProcessInstanceList)) { - historyService.bulkDeleteHistoricProcessInstances(Arrays.asList(processInstanceIds)); + historyService.bulkDeleteHistoricProcessInstances(processInstanceIds); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 按照业务id删除 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param businessKeys 业务id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteRuntimeProcessAndHisInstByBusinessKeys(List businessKeys) { + try { + //1.删除运行中流程实例 + List actHiProcinsts = iActHiProcinstService.selectByBusinessKeyIn(businessKeys); + if (CollUtil.isEmpty(actHiProcinsts)) { + log.warn("当前业务为查询到流程实例!"); + return false; + } + List processInstanceIds = StreamUtils.toList(actHiProcinsts, ActHiProcinst::getId); + List list = taskService.createTaskQuery().processInstanceIdIn(processInstanceIds) + .taskTenantId(TenantHelper.getTenantId()).list(); + List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); + if (CollUtil.isNotEmpty(subTasks)) { + subTasks.forEach(e -> taskService.deleteTask(e.getId())); + } + runtimeService.bulkDeleteProcessInstances(processInstanceIds, LoginHelper.getUserId() + "删除了当前流程申请"); + //2.删除历史记录 + List historicProcessInstanceList = historyService.createHistoricProcessInstanceQuery() + .processInstanceTenantId(TenantHelper.getTenantId()).processInstanceIds(new HashSet<>(processInstanceIds)).list(); + if (ObjectUtil.isNotEmpty(historicProcessInstanceList)) { + historyService.bulkDeleteHistoricProcessInstances(processInstanceIds); } return true; } catch (Exception e) { @@ -417,9 +457,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService * @param processInstanceIds 流程实例id */ @Override - public boolean deleteFinishProcessAndHisInst(String[] processInstanceIds) { + public boolean deleteFinishProcessAndHisInst(List processInstanceIds) { try { - historyService.bulkDeleteHistoricProcessInstances(Arrays.asList(processInstanceIds)); + historyService.bulkDeleteHistoricProcessInstances(processInstanceIds); return true; } catch (Exception e) { e.printStackTrace(); @@ -502,7 +542,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService ProcessInstanceVo processInstanceVo = BeanUtil.toBean(processInstance, ProcessInstanceVo.class); processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstance.getBusinessStatus())); if (CollUtil.isNotEmpty(taskVoList)) { - List collect = taskVoList.stream().filter(e -> e.getProcessInstanceId().equals(processInstance.getId())).collect(Collectors.toList()); + List collect = StreamUtils.filter(taskVoList, e -> e.getProcessInstanceId().equals(processInstance.getId())); processInstanceVo.setTaskVoList(CollUtil.isNotEmpty(collect) ? collect : Collections.emptyList()); } list.add(processInstanceVo); From a582ea49e4e80a05aad8cce573e916875fb19f21 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 23 Jul 2023 11:43:00 +0800 Subject: [PATCH 067/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/ActProcessInstanceServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index b603b2710..e89631029 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -427,7 +427,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService //1.删除运行中流程实例 List actHiProcinsts = iActHiProcinstService.selectByBusinessKeyIn(businessKeys); if (CollUtil.isEmpty(actHiProcinsts)) { - log.warn("当前业务为查询到流程实例!"); + log.warn("当前业务ID:{}查询到流程实例为空!", businessKeys); return false; } List processInstanceIds = StreamUtils.toList(actHiProcinsts, ActHiProcinst::getId); From f3a1e7fec15f05f0cb450599b8b4ce047bff6b7f Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Fri, 28 Jul 2023 17:50:28 +0800 Subject: [PATCH 068/159] =?UTF-8?q?remove=20=E7=A7=BB=E9=99=A4flow-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 deletions(-) delete mode 100644 ruoyi-extend/ruoyi-flow-ui/.gitignore delete mode 100644 ruoyi-extend/ruoyi-flow-ui/Dockerfile delete mode 100644 ruoyi-extend/ruoyi-flow-ui/HELP.md delete mode 100644 ruoyi-extend/ruoyi-flow-ui/pom.xml delete mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/FlowUiApplication.java delete mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/FlowableIdmConfig.java delete mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomGroupDataManager.java delete mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomPasswordEncoder.java delete mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomUserDataManager.java delete mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupCodeBo.java delete mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupNameBo.java delete mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupQueryBo.java delete mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/UserQueryBo.java delete mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/mapper/CustomMybatisMapper.java delete mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/resources/application-dev.yml delete mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/resources/application-prod.yml delete mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/resources/application.yml delete mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/resources/logback-plus.xml delete mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/resources/mappers/CustomMybatisXmlMapper.xml delete 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 d6966e120..ee176e998 100644 --- a/ruoyi-extend/pom.xml +++ b/ruoyi-extend/pom.xml @@ -14,7 +14,6 @@ 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 deleted file mode 100644 index 549e00a2a..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -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 deleted file mode 100644 index 448cda7e6..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -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 deleted file mode 100644 index 5265b3d40..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/HELP.md +++ /dev/null @@ -1,10 +0,0 @@ -# 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 deleted file mode 100644 index 1592a2bc6..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/pom.xml +++ /dev/null @@ -1,137 +0,0 @@ - - - 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 deleted file mode 100644 index 043ca78fc..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/FlowUiApplication.java +++ /dev/null @@ -1,17 +0,0 @@ -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 deleted file mode 100644 index a05178b7d..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/FlowableIdmConfig.java +++ /dev/null @@ -1,83 +0,0 @@ -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 deleted file mode 100644 index bff43b28d..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomGroupDataManager.java +++ /dev/null @@ -1,165 +0,0 @@ -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 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 deleted file mode 100644 index 477ee8058..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomPasswordEncoder.java +++ /dev/null @@ -1,50 +0,0 @@ -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 deleted file mode 100644 index 3d9d3126e..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomUserDataManager.java +++ /dev/null @@ -1,154 +0,0 @@ -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 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 deleted file mode 100644 index 96fbaa3ca..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupCodeBo.java +++ /dev/null @@ -1,120 +0,0 @@ -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 deleted file mode 100644 index 42b6c6bf0..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupNameBo.java +++ /dev/null @@ -1,121 +0,0 @@ -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 deleted file mode 100644 index fb4d0ded0..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupQueryBo.java +++ /dev/null @@ -1,38 +0,0 @@ -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 deleted file mode 100644 index 946263b83..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/UserQueryBo.java +++ /dev/null @@ -1,55 +0,0 @@ -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 deleted file mode 100644 index ea98b67e9..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/mapper/CustomMybatisMapper.java +++ /dev/null @@ -1,36 +0,0 @@ -/* 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 deleted file mode 100644 index 431e8a8cc..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/src/main/resources/application-dev.yml +++ /dev/null @@ -1,38 +0,0 @@ ---- # 监控配置 -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 deleted file mode 100644 index 431e8a8cc..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/src/main/resources/application-prod.yml +++ /dev/null @@ -1,38 +0,0 @@ ---- # 监控配置 -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 deleted file mode 100644 index f86deaa7f..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/src/main/resources/application.yml +++ /dev/null @@ -1,38 +0,0 @@ -# 开发环境配置 -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 deleted file mode 100644 index 589626fd1..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/src/main/resources/logback-plus.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - 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 deleted file mode 100644 index 088545413..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/src/main/resources/mappers/CustomMybatisXmlMapper.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - 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 deleted file mode 100644 index cd4c0bcb7..000000000 --- a/ruoyi-extend/ruoyi-flow-ui/src/test/java/org/dromara/flow/ui/RuoyiFlowUiApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -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 bfe04233716902dbbe946187fb7f88855eee4353 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 6 Aug 2023 21:01:19 +0800 Subject: [PATCH 069/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E5=BC=95?= =?UTF-8?q?=E6=93=8E=E8=B0=83=E5=BA=A6=E7=9B=91=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flowable/config/FlowableConfig.java | 7 ++ .../config/GlobalFlowableListener.java | 88 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java index c591bd642..9315f8dd7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java @@ -3,8 +3,12 @@ package org.dromara.workflow.flowable.config; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import org.flowable.spring.SpringProcessEngineConfiguration; import org.flowable.spring.boot.EngineConfigurationConfigurer; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; +import java.util.Collections; + + /** * flowable配置 * @@ -13,8 +17,11 @@ import org.springframework.context.annotation.Configuration; @Configuration public class FlowableConfig implements EngineConfigurationConfigurer { + @Autowired + private GlobalFlowableListener globalFlowableListener; @Override public void configure(SpringProcessEngineConfiguration processEngineConfiguration) { processEngineConfiguration.setIdGenerator(IdWorker::getIdStr); + processEngineConfiguration.setEventListeners(Collections.singletonList(globalFlowableListener)); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java new file mode 100644 index 000000000..43f0de282 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java @@ -0,0 +1,88 @@ +package org.dromara.workflow.flowable.config; + +import cn.hutool.core.collection.CollUtil; +import org.dromara.workflow.common.enums.TaskStatusEnum; +import org.flowable.bpmn.model.*; +import org.flowable.common.engine.api.delegate.event.*; +import org.flowable.common.engine.impl.cfg.TransactionState; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.runtime.Execution; +import org.flowable.engine.task.Comment; +import org.flowable.task.api.Task; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import java.util.List; + + +/** + * 引擎调度监听 + * + * @author may + */ +@Component +public class GlobalFlowableListener implements FlowableEventListener { + + @Autowired + @Lazy + private TaskService taskService; + + @Autowired + @Lazy + private RuntimeService runtimeService; + + @Autowired + @Lazy + private RepositoryService repositoryService; + + @Override + public void onEvent(FlowableEvent flowableEvent) { + if (flowableEvent instanceof FlowableEngineEvent flowableEngineEvent) { + FlowableEngineEventType engineEventType = (FlowableEngineEventType) flowableEvent.getType(); + switch (engineEventType) { + case JOB_EXECUTION_SUCCESS: + jobExecutionSuccess((FlowableEngineEntityEvent) flowableEngineEvent); + break; + default: + break; + } + } + } + + @Override + public boolean isFailOnException() { + return true; + } + + @Override + public boolean isFireOnTransactionLifecycleEvent() { + return false; + } + + @Override + public String getOnTransaction() { + return TransactionState.COMMITTED.name(); + } + + protected void jobExecutionSuccess(FlowableEngineEntityEvent event) { + Execution execution = runtimeService.createExecutionQuery().executionId(event.getExecutionId()).singleResult(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(event.getProcessDefinitionId()); + FlowElement flowElement = bpmnModel.getFlowElement(execution.getActivityId()); + if (flowElement instanceof BoundaryEvent) { + String attachedToRefId = ((BoundaryEvent) flowElement).getAttachedToRefId(); + List list = runtimeService.createExecutionQuery().activityId(attachedToRefId).list(); + for (Execution ex : list) { + Task task = taskService.createTaskQuery().executionId(ex.getId()).singleResult(); + if (task != null) { + List taskComments = taskService.getTaskComments(task.getId()); + if (CollUtil.isEmpty(taskComments)) { + taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), "自动审批!"); + } + } + } + } + } +} From d58ccebe3069f0a1b2afb0e9fbfb3ac5223f3c46 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Wed, 9 Aug 2023 13:43:07 +0800 Subject: [PATCH 070/159] =?UTF-8?q?fix=20=E8=A7=A3=E5=86=B3=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E9=80=89=E6=8B=A9=E8=AE=BE=E7=BD=AE=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=8F=91=E8=B5=B7=E4=BA=BA=E8=AE=BE=E7=BD=AE=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E6=9C=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/FlowConstant.java | 10 ++++++++++ .../service/impl/ActModelServiceImpl.java | 20 ++++++++++++++++++- .../service/impl/ActTaskServiceImpl.java | 7 ++++++- 3 files changed, 35 insertions(+), 2 deletions(-) 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 index 8bb684ee6..e1ee141f7 100644 --- 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 @@ -59,4 +59,14 @@ public interface FlowConstant { */ String PROCESS_INSTANCE_VO = "processInstanceVo"; + /** + * 流程发起人 + */ + String INITIATOR = "INITIATOR"; + + /** + * 开启跳过表达式变量 + */ + String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; + } 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 447472673..e57e4d396 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 @@ -9,6 +9,7 @@ import cn.hutool.core.util.ZipUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import jakarta.servlet.http.HttpServletResponse; @@ -231,7 +232,24 @@ public class ActModelServiceImpl implements IActModelService { }); model.setKey(key); repositoryService.saveModel(model); - byte[] xmlBytes = WorkflowUtils.bpmnJsonToXmlBytes(Objects.requireNonNull(values.getFirst("json_xml")).getBytes(StandardCharsets.UTF_8)); + //解决设计器选择设置流程发起人设置变量有问题 + JsonNode jsonNode = objectMapper.readTree(values.getFirst("json_xml")); + JsonNode childShapes = jsonNode.get("childShapes"); + for (JsonNode childShape : childShapes) { + JsonNode properties = childShape.get("properties"); + if(!properties.path("usertaskassignment").isMissingNode()){ + JsonNode usertaskassignment = properties.get("usertaskassignment"); + if(!usertaskassignment.path("assignment").isMissingNode()){ + JsonNode assignment = usertaskassignment.get("assignment"); + if(!assignment.path("assignee").isMissingNode()){ + if ("$INITIATOR".equals(assignment.get("assignee").textValue())) { + ((ObjectNode) assignment).put("assignee", "${INITIATOR}"); + } + } + } + } + } + byte[] xmlBytes = WorkflowUtils.bpmnJsonToXmlBytes(Objects.requireNonNull(JsonUtils.toJsonString(jsonNode)).getBytes(StandardCharsets.UTF_8)); if (ArrayUtil.isEmpty(xmlBytes)) { throw new ServiceException("模型不能为空!"); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 2d081c189..ad6f18265 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -41,6 +41,9 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; +import static org.dromara.workflow.common.constant.FlowConstant.FLOWABLE_SKIP_EXPRESSION_ENABLED; +import static org.dromara.workflow.common.constant.FlowConstant.INITIATOR; + /** * 任务 服务层实现 * @@ -87,7 +90,9 @@ public class ActTaskServiceImpl implements IActTaskService { // 启动流程实例(提交申请) Map variables = startProcessBo.getVariables(); // 启动跳过表达式 - variables.put("_FLOWABLE_SKIP_EXPRESSION_ENABLED", true); + variables.put(FLOWABLE_SKIP_EXPRESSION_ENABLED, true); + // 流程发起人 + variables.put(INITIATOR, (String.valueOf(LoginHelper.getUserId()))); ProcessInstance pi = runtimeService.startProcessInstanceByKeyAndTenantId(startProcessBo.getProcessKey(), startProcessBo.getBusinessKey(), variables, TenantHelper.getTenantId()); // 将流程定义名称 作为 流程实例名称 runtimeService.setProcessInstanceName(pi.getProcessInstanceId(), pi.getProcessDefinitionName()); From 5e3cedb03589dbbd025667020e5db6e34fb21ac9 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Fri, 11 Aug 2023 10:31:00 +0800 Subject: [PATCH 071/159] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BD=9C?= =?UTF-8?q?=E5=BA=9F=EF=BC=8C=E6=92=A4=E9=94=80=E7=AD=89=E5=A4=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ActProcessInstanceServiceImpl.java | 6 +++--- .../dromara/workflow/service/impl/ActTaskServiceImpl.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index f3bcf5a6f..53bae028e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -337,9 +337,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService if (CollUtil.isNotEmpty(subTasks)) { subTasks.forEach(e -> taskService.deleteTask(e.getId())); } - String deleteReason = LoginHelper.getUsername() + "作废了当前申请!"; + String deleteReason = LoginHelper.getLoginUser().getNickname() + "作废了当前申请!"; if (StringUtils.isNotBlank(processInvalidBo.getDeleteReason())) { - deleteReason = LoginHelper.getUsername() + "作废理由:" + processInvalidBo.getDeleteReason(); + deleteReason = LoginHelper.getLoginUser().getNickname() + "作废理由:" + processInvalidBo.getDeleteReason(); } for (Task task : StreamUtils.filter(list, e -> StringUtils.isBlank(e.getParentTaskId()))) { taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.INVALID.getStatus(), deleteReason); @@ -461,7 +461,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService List taskList = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(processInstanceId).list(); for (Task task : taskList) { taskService.setAssignee(task.getId(), String.valueOf(LoginHelper.getUserId())); - taskService.addComment(task.getId(), processInstanceId, TaskStatusEnum.CANCEL.getStatus(), LoginHelper.getUsername() + ":撤销申请"); + taskService.addComment(task.getId(), processInstanceId, TaskStatusEnum.CANCEL.getStatus(), LoginHelper.getLoginUser().getNickname() + ":撤销申请"); } HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().finished().orderByHistoricTaskInstanceEndTime().asc().list().get(0); List nodeIds = StreamUtils.toList(taskList, Task::getTaskDefinitionKey); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index ad6f18265..be00d9554 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -356,7 +356,7 @@ public class ActTaskServiceImpl implements IActTaskService { } try { TaskEntity newTask = WorkflowUtils.createNewTask(task); - taskService.addComment(newTask.getId(), task.getProcessInstanceId(), TaskStatusEnum.PENDING.getStatus(), "【" + LoginHelper.getUsername() + "】委派给【" + delegateBo.getNickName() + "】"); + taskService.addComment(newTask.getId(), task.getProcessInstanceId(), TaskStatusEnum.PENDING.getStatus(), "【" + LoginHelper.getLoginUser().getNickname() + "】委派给【" + delegateBo.getNickName() + "】"); //委托任务 taskService.delegateTask(delegateBo.getTaskId(), delegateBo.getUserId()); //办理生成的任务记录 @@ -392,9 +392,9 @@ public class ActTaskServiceImpl implements IActTaskService { } try { if (StringUtils.isBlank(terminationBo.getComment())) { - terminationBo.setComment(LoginHelper.getUsername() + "终止了申请"); + terminationBo.setComment(LoginHelper.getLoginUser().getNickname() + "终止了申请"); } else { - terminationBo.setComment(LoginHelper.getUsername() + "终止了申请:" + terminationBo.getComment()); + terminationBo.setComment(LoginHelper.getLoginUser().getNickname() + "终止了申请:" + terminationBo.getComment()); } taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.TERMINATION.getStatus(), terminationBo.getComment()); List list = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()) From 73cf4e2a198bbbbf16e377ff736621461da570bc Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Fri, 11 Aug 2023 17:28:55 +0800 Subject: [PATCH 072/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/IWorkflowUserService.java | 9 +++++++ .../service/impl/WorkflowUserServiceImpl.java | 19 ++++++++++--- .../dromara/workflow/utils/WorkflowUtils.java | 27 ++++++++----------- 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java index d13247af7..d167163b8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java @@ -1,6 +1,7 @@ package org.dromara.workflow.service; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysUserRole; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.workflow.domain.bo.SysUserMultiBo; import org.dromara.workflow.domain.vo.TaskVo; @@ -37,4 +38,12 @@ public interface IWorkflowUserService { * @return 结果 */ List getUserListByIds(List userIds); + + /** + * 按照角色id查询关联用户id + * + * @param roleIds 角色id + * @return 结果 + */ + List getUserRoleListByRoleIds(List roleIds); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java index 6781ed185..ebdb2b74e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java @@ -12,10 +12,12 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.SysUserRole; import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.mapper.SysDeptMapper; import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.mapper.SysUserRoleMapper; import org.dromara.workflow.domain.bo.SysUserMultiBo; import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.TaskVo; @@ -44,6 +46,7 @@ import java.util.stream.Collectors; public class WorkflowUserServiceImpl implements IWorkflowUserService { private final SysUserMapper sysUserMapper; + private final SysUserRoleMapper sysUserRoleMapper; private final SysDeptMapper sysDeptMapper; private final TaskService taskService; private final RuntimeService runtimeService; @@ -90,8 +93,7 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { @Override public List getWorkflowDeleteMultiInstanceList(String taskId) { Task task = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).taskId(taskId).singleResult(); - List taskList = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()) - .processInstanceId(task.getProcessInstanceId()).list(); + List taskList = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(task.getProcessInstanceId()).list(); MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); List taskListVo = new ArrayList<>(); if (multiInstance == null) { @@ -124,8 +126,7 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { } return taskListVo; } else if (multiInstance.getType() instanceof ParallelMultiInstanceBehavior) { - List tasks = StreamUtils.filter(taskList, e -> StringUtils.isBlank(e.getParentTaskId()) && !e.getExecutionId().equals(task.getExecutionId()) - && e.getTaskDefinitionKey().equals(task.getTaskDefinitionKey())); + List tasks = StreamUtils.filter(taskList, e -> StringUtils.isBlank(e.getParentTaskId()) && !e.getExecutionId().equals(task.getExecutionId()) && e.getTaskDefinitionKey().equals(task.getTaskDefinitionKey())); if (CollectionUtil.isNotEmpty(tasks)) { List userIds = StreamUtils.toList(tasks, e -> Long.valueOf(e.getAssignee())); List sysUsers = null; @@ -196,4 +197,14 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { }); return sysUserVos; } + + /** + * 按照角色id查询关联用户id + * + * @param roleIds 角色id + */ + @Override + public List getUserRoleListByRoleIds(List roleIds) { + return sysUserRoleMapper.selectList(new LambdaQueryWrapper().in(SysUserRole::getRoleId, roleIds)); + } } 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 index a412642be..f98ca6374 100644 --- 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 @@ -4,10 +4,8 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import org.dromara.common.core.enums.UserStatus; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; @@ -15,10 +13,8 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.reflect.ReflectUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUserRole; -import org.dromara.system.mapper.SysUserMapper; -import org.dromara.system.mapper.SysUserRoleMapper; +import org.dromara.system.domain.vo.SysUserVo; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.enums.BusinessStatusEnum; import org.dromara.workflow.domain.ActHiProcinst; @@ -27,6 +23,8 @@ import org.dromara.workflow.domain.vo.ParticipantVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; import org.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd; import org.dromara.workflow.service.IActHiProcinstService; +import org.dromara.workflow.service.IWorkflowUserService; +import org.dromara.workflow.service.impl.WorkflowUserServiceImpl; import org.flowable.bpmn.converter.BpmnXMLConverter; import org.flowable.bpmn.model.*; import org.flowable.common.engine.api.delegate.Expression; @@ -62,8 +60,7 @@ public class WorkflowUtils { } private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class); - private static final SysUserMapper SYS_USER_MAPPER = SpringUtils.getBean(SysUserMapper.class); - private static final SysUserRoleMapper SYS_USER_ROLE_MAPPER = SpringUtils.getBean(SysUserRoleMapper.class); + private static final IWorkflowUserService I_WORK_FLOW_USER_SERVICE = SpringUtils.getBean(WorkflowUserServiceImpl.class); private static final IActHiProcinstService I_ACT_HI_PROCINST_SERVICE = SpringUtils.getBean(IActHiProcinstService.class); /** @@ -198,15 +195,14 @@ public class WorkflowUtils { List groupList = StreamUtils.filter(linksForTask, e -> StringUtils.isNotBlank(e.getGroupId())); if (CollUtil.isNotEmpty(groupList)) { List groupIds = StreamUtils.toList(groupList, e -> Long.valueOf(e.getGroupId())); - List sysUserRoles = SYS_USER_ROLE_MAPPER.selectList(new LambdaQueryWrapper().in(SysUserRole::getRoleId, groupIds)); + List sysUserRoles = I_WORK_FLOW_USER_SERVICE.getUserRoleListByRoleIds(groupIds); if (CollUtil.isNotEmpty(sysUserRoles)) { participantVo.setGroupIds(groupIds); List userIdList = StreamUtils.toList(sysUserRoles, SysUserRole::getUserId); - List sysUsers = SYS_USER_MAPPER.selectList( - new LambdaQueryWrapper().in(SysUser::getUserId, userIdList).eq(SysUser::getStatus, UserStatus.OK.getCode())); + List sysUsers = I_WORK_FLOW_USER_SERVICE.getUserListByIds(userIdList); if (CollUtil.isNotEmpty(sysUsers)) { - List userIds = StreamUtils.toList(sysUsers, SysUser::getUserId); - List nickNames = StreamUtils.toList(sysUsers, SysUser::getNickName); + List userIds = StreamUtils.toList(sysUsers, SysUserVo::getUserId); + List nickNames = StreamUtils.toList(sysUsers, SysUserVo::getNickName); participantVo.setCandidate(userIds); participantVo.setCandidateName(nickNames); participantVo.setClaim(!StringUtils.isBlank(task.getAssignee())); @@ -222,11 +218,10 @@ public class WorkflowUtils { } } - List sysUsers = SYS_USER_MAPPER.selectList( - new LambdaQueryWrapper().in(SysUser::getUserId, userIdList).eq(SysUser::getStatus, UserStatus.OK.getCode())); + List sysUsers = I_WORK_FLOW_USER_SERVICE.getUserListByIds(userIdList); if (CollUtil.isNotEmpty(sysUsers)) { - List userIds = StreamUtils.toList(sysUsers, SysUser::getUserId); - List nickNames = StreamUtils.toList(sysUsers, SysUser::getNickName); + List userIds = StreamUtils.toList(sysUsers, SysUserVo::getUserId); + List nickNames = StreamUtils.toList(sysUsers, SysUserVo::getNickName); participantVo.setCandidate(userIds); participantVo.setCandidateName(nickNames); if (StringUtils.isBlank(task.getAssignee()) && CollUtil.isNotEmpty(candidateList)) { From 313841839b34121eae4c0baf9a34585756a5e30f Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Fri, 25 Aug 2023 10:26:49 +0800 Subject: [PATCH 073/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=E5=9B=BE=E7=89=87=E9=A2=84=E8=A7=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ActProcessDefinitionController.java | 6 +-- .../service/IActProcessDefinitionService.java | 5 +-- .../impl/ActProcessDefinitionServiceImpl.java | 38 +++---------------- 3 files changed, 10 insertions(+), 39 deletions(-) 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 index 40c159583..6347cd958 100644 --- 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 @@ -1,6 +1,5 @@ package org.dromara.workflow.controller; -import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import lombok.RequiredArgsConstructor; @@ -56,11 +55,10 @@ public class ActProcessDefinitionController extends BaseController { * 查看流程定义图片 * * @param processDefinitionId 流程定义id - * @param response 响应 */ @GetMapping("/processDefinitionImage/{processDefinitionId}") - public void processDefinitionImage(@PathVariable String processDefinitionId, HttpServletResponse response) { - iActProcessDefinitionService.processDefinitionImage(processDefinitionId, response); + public R processDefinitionImage(@PathVariable String processDefinitionId) { + return R.ok("操作成功", iActProcessDefinitionService.processDefinitionImage(processDefinitionId)); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java index c3027a60a..5f5f41a44 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java @@ -1,6 +1,5 @@ package org.dromara.workflow.service; -import jakarta.servlet.http.HttpServletResponse; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.bo.ProcessDefinitionBo; import org.dromara.workflow.domain.vo.ProcessDefinitionVo; @@ -34,9 +33,9 @@ public interface IActProcessDefinitionService { * 查看流程定义图片 * * @param processDefinitionId 流程定义id - * @param response 响应 + * @return 结果 */ - void processDefinitionImage(String processDefinitionId, HttpServletResponse response); + String processDefinitionImage(String processDefinitionId); /** * 查看流程定义xml文件 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index 378425e46..132cce17d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -1,15 +1,15 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.codec.Base64; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.ObjectUtil; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; -import jakarta.servlet.ServletOutputStream; -import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; @@ -134,38 +134,12 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer * 查看流程定义图片 * * @param processDefinitionId 流程定义id - * @param response 响应 */ + @SneakyThrows @Override - public void processDefinitionImage(String processDefinitionId, HttpServletResponse response) { - InputStream inputStream = null; - try { - // 设置页面不缓存 - response.setHeader("Pragma", "no-cache"); - response.addHeader("Cache-Control", "must-revalidate"); - response.addHeader("Cache-Control", "no-cache"); - response.addHeader("Cache-Control", "no-store"); - response.setDateHeader("Expires", 0); - inputStream = repositoryService.getProcessDiagram(processDefinitionId); - // 响应相关图片 - response.setContentType("image/png"); - - byte[] bytes = IOUtils.toByteArray(inputStream); - ServletOutputStream outputStream = response.getOutputStream(); - outputStream.write(bytes); - outputStream.flush(); - outputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (inputStream != null) { - try { - inputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } + public String processDefinitionImage(String processDefinitionId) { + InputStream inputStream = repositoryService.getProcessDiagram(processDefinitionId); + return Base64.encode(IOUtils.toByteArray(inputStream)); } /** From 5318c8e68eb34cfa48ff6ae92861242eac70760e Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Fri, 25 Aug 2023 16:04:41 +0800 Subject: [PATCH 074/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=B5=81=E7=A8=8B=E5=88=86=E7=B1=BB=E5=90=8E=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=B5=81=E7=A8=8B=E5=88=86=E7=B1=BB=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/TestLeaveServiceImpl.java | 2 ++ .../impl/ActProcessInstanceServiceImpl.java | 1 + .../service/impl/WfCategoryServiceImpl.java | 22 +++++++++++++++++++ .../dromara/workflow/utils/WorkflowUtils.java | 1 - 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java index e69a83001..057bff8e9 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java @@ -18,6 +18,7 @@ import org.dromara.demo.domain.vo.TestLeaveVo; import org.dromara.demo.domain.TestLeave; import org.dromara.demo.mapper.TestLeaveMapper; import org.dromara.demo.service.ITestLeaveService; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; @@ -112,6 +113,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService { * 批量删除请假 */ @Override + @Transactional(rollbackFor = Exception.class) public Boolean deleteWithValidByIds(Collection ids) { List idList = StreamUtils.toList(ids, String::valueOf); iActProcessInstanceService.deleteRuntimeProcessAndHisInstByBusinessKeys(idList); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 53bae028e..bc8b791e4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -430,6 +430,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService * @param processInstanceIds 流程实例id */ @Override + @Transactional(rollbackFor = Exception.class) public boolean deleteFinishProcessAndHisInst(List processInstanceIds) { try { historyService.bulkDeleteHistoricProcessInstances(processInstanceIds); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java index 1ce4e052f..a72086d21 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java @@ -5,12 +5,17 @@ import org.dromara.common.core.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.Model; +import org.flowable.engine.repository.ProcessDefinition; import org.springframework.stereotype.Service; import org.dromara.workflow.domain.bo.WfCategoryBo; import org.dromara.workflow.domain.vo.WfCategoryVo; import org.dromara.workflow.domain.WfCategory; import org.dromara.workflow.mapper.WfCategoryMapper; import org.dromara.workflow.service.IWfCategoryService; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Collection; @@ -27,6 +32,8 @@ public class WfCategoryServiceImpl implements IWfCategoryService { private final WfCategoryMapper baseMapper; + private final RepositoryService repositoryService; + /** * 查询流程分类 */ @@ -70,9 +77,24 @@ public class WfCategoryServiceImpl implements IWfCategoryService { * 修改流程分类 */ @Override + @Transactional(rollbackFor = Exception.class) public Boolean updateByBo(WfCategoryBo bo) { WfCategory update = MapstructUtils.convert(bo, WfCategory.class); validEntityBeforeSave(update); + WfCategoryVo wfCategoryVo = baseMapper.selectVoById(bo.getId()); + List processDefinitionList = repositoryService.createProcessDefinitionQuery().processDefinitionCategory(wfCategoryVo.getCategoryCode()).list(); + for (ProcessDefinition processDefinition : processDefinitionList) { + repositoryService.setProcessDefinitionCategory(processDefinition.getId(),bo.getCategoryCode()); + } + List deploymentList = repositoryService.createDeploymentQuery().deploymentCategory(wfCategoryVo.getCategoryCode()).list(); + for (Deployment deployment : deploymentList) { + repositoryService.setDeploymentCategory(deployment.getId(),bo.getCategoryCode()); + } + List modelList = repositoryService.createModelQuery().modelCategory(wfCategoryVo.getCategoryCode()).list(); + for (Model model : modelList) { + model.setCategory(bo.getCategoryCode()); + repositoryService.saveModel(model); + } return baseMapper.updateById(update) > 0; } 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 index f98ca6374..14287ca2d 100644 --- 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 @@ -277,7 +277,6 @@ public class WorkflowUtils { HistoricTaskInstance historicTaskInstance = PROCESS_ENGINE.getHistoryService().createHistoricTaskInstanceQuery().taskId(taskId).taskTenantId(TenantHelper.getTenantId()).singleResult(); HistoricProcessInstance historicProcessInstance = PROCESS_ENGINE.getHistoryService().createHistoricProcessInstanceQuery() .processInstanceId(historicTaskInstance.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); - return historicProcessInstance.getBusinessStatus(); } From 1c8f604672469b99b832518afb2f64f73a7135c3 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 10 Sep 2023 13:29:09 +0800 Subject: [PATCH 075/159] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=E4=B8=8E=E8=A1=A8=E5=8D=95=E5=85=B3?= =?UTF-8?q?=E8=81=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ActProcessDefinitionController.java | 2 +- .../WfFormDefinitionController.java | 39 ++++++ .../org/dromara/workflow/domain/WfForm.java | 5 + .../workflow/domain/WfFormDefinition.java | 56 +++++++++ .../dromara/workflow/domain/bo/WfFormBo.java | 11 ++ .../domain/bo/WfFormDefinitionBo.java | 60 +++++++++ .../domain/vo/WfFormDefinitionVo.java | 65 ++++++++++ .../dromara/workflow/domain/vo/WfFormVo.java | 10 ++ .../mapper/WfFormDefinitionMapper.java | 15 +++ .../service/IWfFormDefinitionService.java | 48 +++++++ .../impl/WfFormDefinitionServiceImpl.java | 117 ++++++++++++++++++ .../service/impl/WfFormServiceImpl.java | 20 +++ .../workflow/WfFormDefinitionMapper.xml | 7 ++ script/sql/ry_vue_5.X.sql | 22 ++++ 14 files changed, 476 insertions(+), 1 deletion(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml 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 index 6347cd958..fd952957a 100644 --- 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 @@ -47,7 +47,7 @@ public class ActProcessDefinitionController extends BaseController { * @param key 流程定义key */ @GetMapping("/getProcessDefinitionListByKey/{key}") - public R> getProcessDefinitionList(@NotEmpty(message = "流程定义key不能为空") @PathVariable String key) { + public R> getProcessDefinitionListByKey(@NotEmpty(message = "流程定义key不能为空") @PathVariable String key) { return R.ok("操作成功", iActProcessDefinitionService.getProcessDefinitionListByKey(key)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java new file mode 100644 index 000000000..e013200cb --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java @@ -0,0 +1,39 @@ +package org.dromara.workflow.controller; + + +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.workflow.domain.bo.WfFormDefinitionBo; +import org.dromara.workflow.service.IWfFormDefinitionService; + +/** + * 动态单与流程定义关联信息 + * + * @author may + * @date 2023-08-31 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/formDefinition") +public class WfFormDefinitionController extends BaseController { + + private final IWfFormDefinitionService wfFormDefinitionService; + + /** + * 新增动态单与流程定义关联信息 + */ + @Log(title = "动态单与流程定义关联信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody WfFormDefinitionBo bo) { + return toAjax(wfFormDefinitionService.insertByBo(bo)); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfForm.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfForm.java index 77d07d2bf..ae1340e9f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfForm.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfForm.java @@ -37,6 +37,11 @@ public class WfForm extends TenantEntity { */ private String content; + /** + * 状态(0正常 1停用) + */ + private String status; + /** * 备注 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java new file mode 100644 index 000000000..c5f31673e --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java @@ -0,0 +1,56 @@ +package org.dromara.workflow.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 动态单与流程定义关联信息对象 wf_form_definition + * + * @author may + * @date 2023-08-31 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wf_form_definition") +public class WfFormDefinition extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 动态表单id + */ + private Long formId; + + /** + * 流程定义key + */ + private String processDefinitionKey; + + /** + * 流程定义名称 + */ + private String processDefinitionName; + + /** + * 流程定义id + */ + private String processDefinitionId; + + /** + * 流程定义版本 + */ + private Long processDefinitionVersion; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormBo.java index 5f17a527e..db4e7d33b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormBo.java @@ -49,8 +49,19 @@ public class WfFormBo extends BaseEntity { @NotBlank(message = "表单内容不能为空", groups = { AddGroup.class, EditGroup.class }) private String content; + /** + * 状态(0正常 1停用) + */ + @NotBlank(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class }) + private String status; + /** * 备注 */ private String remark; + + /** + * 动态单与流程定义关联信息业务对象 + */ + private WfFormDefinitionBo wfFormDefinitionBo; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java new file mode 100644 index 000000000..81a53c3ea --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java @@ -0,0 +1,60 @@ +package org.dromara.workflow.domain.bo; + +import org.dromara.workflow.domain.WfFormDefinition; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 动态单与流程定义关联信息业务对象 wf_form_definition + * + * @author may + * @date 2023-08-31 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = WfFormDefinition.class, reverseConvertGenerate = false) +public class WfFormDefinitionBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 动态表单id + */ + @NotNull(message = "动态表单id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long formId; + + /** + * 流程定义id + */ + @NotBlank(message = "流程定义key不能为空", groups = { AddGroup.class, EditGroup.class }) + private String processDefinitionKey; + + /** + * 流程定义名称 + */ + @NotBlank(message = "流程定义名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String processDefinitionName; + + /** + * 流程定义id + */ + @NotBlank(message = "流程定义id不能为空", groups = { AddGroup.class, EditGroup.class }) + private String processDefinitionId; + + /** + * 流程定义版本 + */ + @NotNull(message = "流程定义版本不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long processDefinitionVersion; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java new file mode 100644 index 000000000..b6edde9b0 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java @@ -0,0 +1,65 @@ +package org.dromara.workflow.domain.vo; + +import org.dromara.workflow.domain.WfFormDefinition; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + + +/** + * 动态单与流程定义关联信息视图对象 wf_form_definition + * + * @author may + * @date 2023-08-31 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = WfFormDefinition.class) +public class WfFormDefinitionVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 动态表单id + */ + @ExcelProperty(value = "动态表单id") + private Long formId; + + /** + * 流程定义id + */ + @ExcelProperty(value = "流程定义key") + private String processDefinitionKey; + + /** + * 流程定义名称 + */ + @ExcelProperty(value = "流程定义名称") + private String processDefinitionName; + + /** + * 流程定义id + */ + @ExcelProperty(value = "流程定义id") + private String processDefinitionId; + + /** + * 流程定义版本 + */ + @ExcelProperty(value = "流程定义版本") + private Long processDefinitionVersion; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormVo.java index 75e80b107..2a2aa400a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormVo.java @@ -39,8 +39,18 @@ public class WfFormVo implements Serializable { */ private String content; + /** + * 状态(0正常 1停用) + */ + private String status; + /** * 备注 */ private String remark; + + /** + * 动态单与流程定义关联信息业务对象 + */ + private WfFormDefinitionVo wfFormDefinitionVo; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java new file mode 100644 index 000000000..0d3cb37a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java @@ -0,0 +1,15 @@ +package org.dromara.workflow.mapper; + +import org.dromara.workflow.domain.WfFormDefinition; +import org.dromara.workflow.domain.vo.WfFormDefinitionVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 动态单与流程定义关联信息Mapper接口 + * + * @author may + * @date 2023-08-31 + */ +public interface WfFormDefinitionMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java new file mode 100644 index 000000000..80dce253c --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java @@ -0,0 +1,48 @@ +package org.dromara.workflow.service; + +import org.dromara.workflow.domain.vo.WfFormDefinitionVo; +import org.dromara.workflow.domain.bo.WfFormDefinitionBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 动态单与流程定义关联信息Service接口 + * + * @author may + * @date 2023-08-31 + */ +public interface IWfFormDefinitionService { + + /** + * 查询动态单与流程定义关联信息 + */ + WfFormDefinitionVo queryById(Long id); + + /** + * 查询动态单与流程定义关联信息列表 + */ + TableDataInfo queryPageList(WfFormDefinitionBo bo, PageQuery pageQuery); + + /** + * 查询动态单与流程定义关联信息列表 + */ + List queryList(WfFormDefinitionBo bo); + + /** + * 新增动态单与流程定义关联信息 + */ + Boolean insertByBo(WfFormDefinitionBo bo); + + /** + * 修改动态单与流程定义关联信息 + */ + Boolean updateByBo(WfFormDefinitionBo bo); + + /** + * 校验并批量删除动态单与流程定义关联信息信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java new file mode 100644 index 000000000..84d1ffa73 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java @@ -0,0 +1,117 @@ +package org.dromara.workflow.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.workflow.domain.bo.WfFormDefinitionBo; +import org.dromara.workflow.domain.vo.WfFormDefinitionVo; +import org.dromara.workflow.domain.WfFormDefinition; +import org.dromara.workflow.mapper.WfFormDefinitionMapper; +import org.dromara.workflow.service.IWfFormDefinitionService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 动态单与流程定义关联信息Service业务层处理 + * + * @author may + * @date 2023-08-31 + */ +@RequiredArgsConstructor +@Service +public class WfFormDefinitionServiceImpl implements IWfFormDefinitionService { + + private final WfFormDefinitionMapper baseMapper; + + /** + * 查询动态单与流程定义关联信息 + */ + @Override + public WfFormDefinitionVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询动态单与流程定义关联信息列表 + */ + @Override + public TableDataInfo queryPageList(WfFormDefinitionBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询动态单与流程定义关联信息列表 + */ + @Override + public List queryList(WfFormDefinitionBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(WfFormDefinitionBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getFormId() != null, WfFormDefinition::getFormId, bo.getFormId()); + lqw.eq(StringUtils.isNotBlank(bo.getProcessDefinitionKey()), WfFormDefinition::getProcessDefinitionKey, bo.getProcessDefinitionKey()); + lqw.like(StringUtils.isNotBlank(bo.getProcessDefinitionName()), WfFormDefinition::getProcessDefinitionName, bo.getProcessDefinitionName()); + lqw.eq(StringUtils.isNotBlank(bo.getProcessDefinitionId()), WfFormDefinition::getProcessDefinitionId, bo.getProcessDefinitionId()); + lqw.eq(bo.getProcessDefinitionVersion() != null, WfFormDefinition::getProcessDefinitionVersion, bo.getProcessDefinitionVersion()); + return lqw; + } + + /** + * 新增动态单与流程定义关联信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(WfFormDefinitionBo bo) { + WfFormDefinition add = MapstructUtils.convert(bo, WfFormDefinition.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改动态单与流程定义关联信息 + */ + @Override + public Boolean updateByBo(WfFormDefinitionBo bo) { + WfFormDefinition update = MapstructUtils.convert(bo, WfFormDefinition.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(WfFormDefinition entity){ + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(WfFormDefinition::getFormId,entity.getFormId()); + baseMapper.delete(wrapper); + } + + /** + * 批量删除动态单与流程定义关联信息 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormServiceImpl.java index eab42ff4d..e86427976 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.workflow.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -7,12 +8,16 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.WfForm; +import org.dromara.workflow.domain.WfFormDefinition; import org.dromara.workflow.domain.bo.WfFormBo; +import org.dromara.workflow.domain.vo.WfFormDefinitionVo; import org.dromara.workflow.domain.vo.WfFormVo; +import org.dromara.workflow.mapper.WfFormDefinitionMapper; import org.dromara.workflow.mapper.WfFormMapper; import org.dromara.workflow.service.IWfFormService; import org.springframework.stereotype.Service; @@ -32,6 +37,8 @@ public class WfFormServiceImpl implements IWfFormService { private final WfFormMapper baseMapper; + private final WfFormDefinitionMapper wfFormDefinitionMapper; + /** * 查询流程表单 * @@ -53,6 +60,18 @@ public class WfFormServiceImpl implements IWfFormService { public TableDataInfo queryPageList(WfFormBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + List records = result.getRecords(); + if(CollUtil.isNotEmpty(records)){ + List formIds = StreamUtils.toList(records, WfFormVo::getFormId); + List wfFormDefinitionVos = wfFormDefinitionMapper.selectVoList( + new LambdaQueryWrapper().in(WfFormDefinition::getFormId, formIds) + ); + for (WfFormVo record : records) { + if(CollUtil.isNotEmpty(wfFormDefinitionVos)){ + wfFormDefinitionVos.stream().filter(e->String.valueOf(e.getFormId()).equals(String.valueOf(record.getFormId()))).findFirst().ifPresent(record::setWfFormDefinitionVo); + } + } + } return TableDataInfo.build(result); } @@ -92,6 +111,7 @@ public class WfFormServiceImpl implements IWfFormService { .set(StrUtil.isNotBlank(bo.getFormName()), WfForm::getFormName, bo.getFormName()) .set(StrUtil.isNotBlank(bo.getContent()), WfForm::getContent, bo.getContent()) .set(StrUtil.isNotBlank(bo.getRemark()), WfForm::getRemark, bo.getRemark()) + .set(StrUtil.isNotBlank(bo.getStatus()), WfForm::getStatus, bo.getStatus()) .eq(WfForm::getFormId, bo.getFormId())); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml new file mode 100644 index 000000000..17a9e1dfc --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index c41a1c596..7d9210254 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -887,6 +887,7 @@ create table wf_form ( form_id bigint not null comment '表单id', tenant_id varchar(20) default '000000'comment '租户编号', form_name varchar(255) default null comment '表单名称', + status char(1) default '1' comment '状态(0正常 1停用)', content longtext comment '表单内容', create_dept bigint default null comment '创建部门', create_by bigint default null comment '创建者', @@ -918,6 +919,27 @@ create table wf_category unique (category_code) ) engine=innodb comment= '流程分类'; +-- ---------------------------- +-- 流程分类信息表 +-- ---------------------------- +drop table if exists wf_form_definition; +create table wf_form_definition +( + id bigint not null comment '主键' + primary key, + form_id bigint not null comment '动态表单id', + process_definition_key varchar(255) not null comment '流程定义key', + process_definition_name varchar(255) not null comment '流程定义名称', + process_definition_id varchar(255) not null comment '流程定义id', + process_definition_version int not null comment '流程定义版本', + tenant_id varchar(20) default '000000' null comment '租户编号', + create_dept bigint null comment '创建部门', + create_by bigint null comment '创建者', + create_time datetime null comment '创建时间', + update_by bigint null comment '更新者', + update_time datetime null comment '更新时间' +) engine=innodb comment= '动态表单与流程定义关联信息'; + -- ---------------------------- -- 系统授权表 -- ---------------------------- From 9cb54ea8879b173b750aa3568a58e0f40c79002e Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 14 Sep 2023 16:16:06 +0800 Subject: [PATCH 076/159] =?UTF-8?q?update=20=E5=8D=87=E7=BA=A7flowable?= =?UTF-8?q?=E5=88=B07.0.0.M2=EF=BC=8C=E8=B0=83=E6=95=B4=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E6=B5=81=E6=8F=90=E4=BA=A4=E6=A0=A1=E9=AA=8C=EF=BC=8C=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E5=B7=A5=E4=BD=9C=E6=B5=81=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../common/enums/BusinessStatusEnum.java | 29 ++++++++------ .../impl/ActProcessDefinitionServiceImpl.java | 2 +- .../impl/ActProcessInstanceServiceImpl.java | 2 +- .../dromara/workflow/utils/WorkflowUtils.java | 38 +++++++++---------- 5 files changed, 38 insertions(+), 35 deletions(-) diff --git a/pom.xml b/pom.xml index 21077fdbe..9c50c62cb 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 1.3.0 - 7.0.0.M1 + 7.0.0.M2 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java index fbb32ccef..86be522a4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java @@ -1,9 +1,10 @@ package org.dromara.workflow.common.enums; +import cn.hutool.core.util.StrUtil; import lombok.AllArgsConstructor; import lombok.Getter; -import org.apache.commons.lang3.StringUtils; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; /** * 业务状态枚举 @@ -59,7 +60,7 @@ public enum BusinessStatusEnum { */ public static String getEumByStatus(String status) { if (StringUtils.isBlank(status)) { - return null; + return StrUtil.EMPTY; } for (BusinessStatusEnum statusEnum : BusinessStatusEnum.values()) { @@ -67,7 +68,7 @@ public enum BusinessStatusEnum { return statusEnum.getDesc(); } } - return null; + return StrUtil.EMPTY; } /** @@ -76,14 +77,16 @@ public enum BusinessStatusEnum { * @param status 状态 */ public static void checkStartStatus(String status) { - if (status.equals(WAITING.getStatus())) { + if (WAITING.getStatus().equals(status)) { throw new ServiceException("该单据已提交过申请,正在审批中!"); - } else if (status.equals(FINISH.getStatus())) { + } else if (FINISH.getStatus().equals(status)) { throw new ServiceException("该单据已完成申请!"); - } else if (status.equals(INVALID.getStatus())) { + } else if (INVALID.getStatus().equals(status)) { throw new ServiceException("该单据已作废!"); - } else if (status.equals(TERMINATION.getStatus())) { + } else if (TERMINATION.getStatus().equals(status)) { throw new ServiceException("该单据已终止!"); + } else if (StringUtils.isBlank(status)) { + throw new ServiceException("流程状态为空!"); } } @@ -93,16 +96,18 @@ public enum BusinessStatusEnum { * @param status 状态 */ public static void checkStatus(String status) { - if (status.equals(FINISH.getStatus())) { + if (FINISH.getStatus().equals(status)) { throw new ServiceException("该单据已完成申请!"); - } else if (status.equals(INVALID.getStatus())) { + } else if (INVALID.getStatus().equals(status)) { throw new ServiceException("该单据已作废!"); - } else if (status.equals(CANCEL.getStatus())) { + } else if (CANCEL.getStatus().equals(status)) { throw new ServiceException("该单据已撤销!"); - } else if (status.equals(BACK.getStatus())) { + } else if (BACK.getStatus().equals(status)) { throw new ServiceException("该单据已退回!"); - } else if (status.equals(TERMINATION.getStatus())) { + } else if (TERMINATION.getStatus().equals(status)) { throw new ServiceException("该单据已终止!"); + } else if (StringUtils.isBlank(status)) { + throw new ServiceException("流程状态为空!"); } } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index 132cce17d..34f65f5d3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -205,7 +205,7 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer return true; } catch (Exception e) { e.printStackTrace(); - throw new ServiceException("操作失败"); + throw new ServiceException("操作失败:"+e.getMessage()); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index bc8b791e4..5e4776b92 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -240,7 +240,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService try { actHistoryInfoVo.setAssignee(StringUtils.isNotBlank(historicTaskInstance.getAssignee()) ? Long.valueOf(historicTaskInstance.getAssignee()) : null); } catch (NumberFormatException ignored) { - + log.warn("当前任务【{}】,办理人转换人员ID【{}】异常!", historicTaskInstance.getName(), historicTaskInstance.getAssignee()); } actHistoryInfoVoList.add(actHistoryInfoVo); } 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 index 14287ca2d..3e0e49f05 100644 --- 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 @@ -6,7 +6,6 @@ import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.ObjectUtil; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -308,26 +307,25 @@ public class WorkflowUtils { */ public static void setProcessInstanceListVo(Object obj, List idList, String fieldName) { List actHiProcinstList = I_ACT_HI_PROCINST_SERVICE.selectByBusinessKeyIn(idList); - if (obj instanceof Collection) { - Collection collection = (Collection) obj; + if (obj instanceof Collection collection) { for (Object o : collection) { - if (o != null) { - try { - String fieldValue = ReflectUtils.invokeGetter(o, fieldName).toString(); - ActHiProcinst actHiProcinst = actHiProcinstList.stream().filter(e -> e.getBusinessKey().equals(fieldValue)).findFirst().orElse(null); - if (ObjectUtil.isNotEmpty(actHiProcinst)) { - ProcessInstanceVo processInstanceVo = BeanUtil.toBean(actHiProcinst, ProcessInstanceVo.class); - processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstanceVo.getBusinessStatus())); - ReflectUtils.invokeSetter(o, PROCESS_INSTANCE_VO, processInstanceVo); - } else { - ProcessInstanceVo processInstanceVo = new ProcessInstanceVo(); - processInstanceVo.setBusinessStatus(BusinessStatusEnum.DRAFT.getStatus()); - processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstanceVo.getBusinessStatus())); - ReflectUtils.invokeSetter(o, PROCESS_INSTANCE_VO, processInstanceVo); - } - } catch (Exception e) { - e.printStackTrace(); - throw new ServiceException(e.getMessage()); + String fieldValue = ReflectUtils.invokeGetter(o, fieldName).toString(); + if (CollUtil.isEmpty(actHiProcinstList)) { + ProcessInstanceVo processInstanceVo = new ProcessInstanceVo(); + processInstanceVo.setBusinessStatus(BusinessStatusEnum.DRAFT.getStatus()); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstanceVo.getBusinessStatus())); + ReflectUtils.invokeSetter(o, PROCESS_INSTANCE_VO, processInstanceVo); + } else { + ActHiProcinst actHiProcinst = actHiProcinstList.stream().filter(e -> e.getBusinessKey().equals(fieldValue)).findFirst().orElse(null); + if (ObjectUtil.isNotEmpty(actHiProcinst)) { + ProcessInstanceVo processInstanceVo = BeanUtil.toBean(actHiProcinst, ProcessInstanceVo.class); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstanceVo.getBusinessStatus())); + ReflectUtils.invokeSetter(o, PROCESS_INSTANCE_VO, processInstanceVo); + } else { + ProcessInstanceVo processInstanceVo = new ProcessInstanceVo(); + processInstanceVo.setBusinessStatus(BusinessStatusEnum.DRAFT.getStatus()); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstanceVo.getBusinessStatus())); + ReflectUtils.invokeSetter(o, PROCESS_INSTANCE_VO, processInstanceVo); } } } From 98ab342e7f21664b34a5e187ddfafd99f3492a70 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 17 Sep 2023 17:41:43 +0800 Subject: [PATCH 077/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E8=A1=A8=E5=8D=95=E5=8D=95=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WfBusinessFormController.java | 106 +++++++++++++++ .../workflow/controller/WfFormController.java | 11 ++ .../workflow/domain/WfBusinessForm.java | 64 +++++++++ .../workflow/domain/bo/WfBusinessFormBo.java | 58 ++++++++ .../workflow/domain/vo/WfBusinessFormVo.java | 63 +++++++++ .../dromara/workflow/domain/vo/WfFormVo.java | 11 ++ .../workflow/mapper/WfBusinessFormMapper.java | 15 +++ .../dromara/workflow/mapper/package-info.java | 1 - .../service/IWfBusinessFormService.java | 49 +++++++ .../impl/WfBusinessFormServiceImpl.java | 124 ++++++++++++++++++ .../service/impl/WfFormServiceImpl.java | 17 ++- .../mapper/workflow/WfBusinessFormMapper.xml | 7 + .../mapper/workflow/WfFormMapper.xml | 3 - script/sql/ry_vue_5.X.sql | 40 +++++- 14 files changed, 554 insertions(+), 15 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfBusinessFormController.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfBusinessForm.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfBusinessFormBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfBusinessFormVo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfBusinessFormMapper.java delete 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/IWfBusinessFormService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfBusinessFormMapper.xml diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfBusinessFormController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfBusinessFormController.java new file mode 100644 index 000000000..153fa462b --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfBusinessFormController.java @@ -0,0 +1,106 @@ +package org.dromara.workflow.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.workflow.domain.WfBusinessForm; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.workflow.domain.vo.WfBusinessFormVo; +import org.dromara.workflow.domain.bo.WfBusinessFormBo; +import org.dromara.workflow.service.IWfBusinessFormService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 发起流程 + * + * @author may + * @date 2023-09-16 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/businessForm") +public class WfBusinessFormController extends BaseController { + + private final IWfBusinessFormService wfBusinessFormService; + + /** + * 查询发起流程列表 + */ + @SaCheckPermission("workflow:businessForm:list") + @GetMapping("/list") + public TableDataInfo list(WfBusinessFormBo bo, PageQuery pageQuery) { + return wfBusinessFormService.queryPageList(bo, pageQuery); + } + + /** + * 导出发起流程列表 + */ + @SaCheckPermission("workflow:businessForm:export") + @Log(title = "发起流程", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(WfBusinessFormBo bo, HttpServletResponse response) { + List list = wfBusinessFormService.queryList(bo); + ExcelUtil.exportExcel(list, "发起流程", WfBusinessFormVo.class, response); + } + + /** + * 获取发起流程详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("workflow:businessForm:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(wfBusinessFormService.queryById(id)); + } + + /** + * 新增发起流程 + */ + @SaCheckPermission("workflow:businessForm:add") + @Log(title = "发起流程", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody WfBusinessFormBo bo) { + return R.ok(wfBusinessFormService.insertByBo(bo)); + } + + /** + * 修改发起流程 + */ + @SaCheckPermission("workflow:businessForm:edit") + @Log(title = "发起流程", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody WfBusinessFormBo bo) { + return R.ok(wfBusinessFormService.updateByBo(bo)); + } + + /** + * 删除发起流程 + * + * @param ids 主键串 + */ + @SaCheckPermission("workflow:businessForm:remove") + @Log(title = "发起流程", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(wfBusinessFormService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormController.java index 8262fa1a0..35e981e40 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormController.java @@ -6,6 +6,7 @@ import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; +import org.dromara.common.core.enums.UserStatus; import org.dromara.common.core.validate.QueryGroup; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; @@ -43,6 +44,16 @@ public class WfFormController extends BaseController { return formService.queryPageList(bo, pageQuery); } + /** + * 查询流程表单列表 + */ + @SaCheckPermission("workflow:form:list") + @GetMapping("/queryList") + public R> queryList(WfFormBo bo) { + bo.setStatus(UserStatus.OK.getCode()); + return R.ok(formService.queryList(bo)); + } + /** * 导出流程表单列表 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfBusinessForm.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfBusinessForm.java new file mode 100644 index 000000000..9de2ad210 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfBusinessForm.java @@ -0,0 +1,64 @@ +package org.dromara.workflow.domain; + +import com.fasterxml.jackson.annotation.JsonInclude; +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.util.Map; + +/** + * 发起流程对象 wf_business_form + * + * @author may + * @date 2023-09-16 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wf_business_form") +public class WfBusinessForm extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 申请编码 + */ + private String applyCode; + + /** + * 表单id + */ + private Long formId; + + /** + * 表单名称 + */ + private String formName; + + /** + * 表单内容 + */ + private String content; + + /** + * 表单值 + */ + private String contentValue; + + /** + * 流程变量 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + @TableField(exist = false) + private Map variable; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfBusinessFormBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfBusinessFormBo.java new file mode 100644 index 000000000..2ac5c27bc --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfBusinessFormBo.java @@ -0,0 +1,58 @@ +package org.dromara.workflow.domain.bo; + +import org.dromara.workflow.domain.WfBusinessForm; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 发起流程业务对象 wf_business_form + * + * @author may + * @date 2023-09-16 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = WfBusinessForm.class, reverseConvertGenerate = false) +public class WfBusinessFormBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 申请编码 + */ + private String applyCode; + + /** + * 表单id + */ + @NotNull(message = "表单id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long formId; + + /** + * 表单名称 + */ + @NotBlank(message = "表单名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String formName; + + /** + * 表单内容 + */ + @NotBlank(message = "表单内容不能为空", groups = { AddGroup.class, EditGroup.class }) + private String content; + + /** + * 表单值 + */ + private String contentValue; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfBusinessFormVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfBusinessFormVo.java new file mode 100644 index 000000000..7d47469d8 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfBusinessFormVo.java @@ -0,0 +1,63 @@ +package org.dromara.workflow.domain.vo; + +import org.dromara.workflow.domain.WfBusinessForm; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 发起流程视图对象 wf_business_form + * + * @author may + * @date 2023-09-16 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = WfBusinessForm.class) +public class WfBusinessFormVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 申请编码 + */ + @ExcelProperty(value = "申请编码") + private String applyCode; + + /** + * 表单id + */ + @ExcelProperty(value = "表单id") + private Long formId; + + /** + * 表单名称 + */ + @ExcelProperty(value = "表单名称") + private String formName; + + /** + * 表单内容 + */ + @ExcelProperty(value = "表单内容") + private String content; + + /** + * 表单值 + */ + @ExcelProperty(value = "表单值") + private String contentValue; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormVo.java index 2a2aa400a..7f8fa8e67 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormVo.java @@ -6,6 +6,7 @@ import org.dromara.workflow.domain.WfForm; import java.io.Serial; import java.io.Serializable; +import java.util.Date; /** * 流程分类视图对象 @@ -49,6 +50,16 @@ public class WfFormVo implements Serializable { */ private String remark; + /** + * 创建时间 + */ + private Date createTime; + + /** + * 修改时间 + */ + private Date updateTime; + /** * 动态单与流程定义关联信息业务对象 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfBusinessFormMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfBusinessFormMapper.java new file mode 100644 index 000000000..8e850aa93 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfBusinessFormMapper.java @@ -0,0 +1,15 @@ +package org.dromara.workflow.mapper; + +import org.dromara.workflow.domain.WfBusinessForm; +import org.dromara.workflow.domain.vo.WfBusinessFormVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 发起流程Mapper接口 + * + * @author may + * @date 2023-09-16 + */ +public interface WfBusinessFormMapper extends BaseMapperPlus { + +} 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 deleted file mode 100644 index 580707211..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package org.dromara.workflow.mapper; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfBusinessFormService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfBusinessFormService.java new file mode 100644 index 000000000..010e04111 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfBusinessFormService.java @@ -0,0 +1,49 @@ +package org.dromara.workflow.service; + +import org.dromara.workflow.domain.WfBusinessForm; +import org.dromara.workflow.domain.vo.WfBusinessFormVo; +import org.dromara.workflow.domain.bo.WfBusinessFormBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 发起流程Service接口 + * + * @author may + * @date 2023-09-16 + */ +public interface IWfBusinessFormService { + + /** + * 查询发起流程 + */ + WfBusinessFormVo queryById(Long id); + + /** + * 查询发起流程列表 + */ + TableDataInfo queryPageList(WfBusinessFormBo bo, PageQuery pageQuery); + + /** + * 查询发起流程列表 + */ + List queryList(WfBusinessFormBo bo); + + /** + * 新增发起流程 + */ + WfBusinessForm insertByBo(WfBusinessFormBo bo); + + /** + * 修改发起流程 + */ + WfBusinessForm updateByBo(WfBusinessFormBo bo); + + /** + * 校验并批量删除发起流程信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java new file mode 100644 index 000000000..c6c0a7610 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java @@ -0,0 +1,124 @@ +package org.dromara.workflow.service.impl; + +import com.fasterxml.jackson.core.type.TypeReference; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.workflow.domain.bo.WfBusinessFormBo; +import org.dromara.workflow.domain.vo.WfBusinessFormVo; +import org.dromara.workflow.domain.WfBusinessForm; +import org.dromara.workflow.mapper.WfBusinessFormMapper; +import org.dromara.workflow.service.IWfBusinessFormService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 发起流程Service业务层处理 + * + * @author may + * @date 2023-09-16 + */ +@RequiredArgsConstructor +@Service +public class WfBusinessFormServiceImpl implements IWfBusinessFormService { + + private final WfBusinessFormMapper baseMapper; + + /** + * 查询发起流程 + */ + @Override + public WfBusinessFormVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 查询发起流程列表 + */ + @Override + public TableDataInfo queryPageList(WfBusinessFormBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询发起流程列表 + */ + @Override + public List queryList(WfBusinessFormBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(WfBusinessFormBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getApplyCode()), WfBusinessForm::getApplyCode, bo.getApplyCode()); + lqw.like(StringUtils.isNotBlank(bo.getFormName()), WfBusinessForm::getFormName, bo.getFormName()); + return lqw; + } + + /** + * 新增发起流程 + */ + @Override + public WfBusinessForm insertByBo(WfBusinessFormBo bo) { + WfBusinessForm add = MapstructUtils.convert(bo, WfBusinessForm.class); + validEntityBeforeSave(add); + add.setApplyCode(DateUtils.dateTimeNow()); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + if (StringUtils.isNotBlank(add.getContentValue())) { + Map variable = JsonUtils.parseObject(add.getContentValue(), new TypeReference<>() { + }); + add.setVariable(variable); + } + return add; + } + + /** + * 修改发起流程 + */ + @Override + public WfBusinessForm updateByBo(WfBusinessFormBo bo) { + WfBusinessForm update = MapstructUtils.convert(bo, WfBusinessForm.class); + validEntityBeforeSave(update); + baseMapper.updateById(update); + if (StringUtils.isNotBlank(update.getContentValue())) { + Map variable = JsonUtils.parseObject(update.getContentValue(), new TypeReference<>() { + }); + update.setVariable(variable); + } + return update; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(WfBusinessForm entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除发起流程 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormServiceImpl.java index e86427976..1a7aacb1d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormServiceImpl.java @@ -24,7 +24,6 @@ import org.springframework.stereotype.Service; import java.util.Collection; import java.util.List; -import java.util.Map; /** * 流程表单Service业务层处理 @@ -47,7 +46,14 @@ public class WfFormServiceImpl implements IWfFormService { */ @Override public WfFormVo queryById(Long formId) { - return baseMapper.selectVoById(formId); + WfFormVo wfFormVo = baseMapper.selectVoById(formId); + if (wfFormVo != null) { + WfFormDefinitionVo wfFormDefinitionVo = wfFormDefinitionMapper.selectVoOne( + new LambdaQueryWrapper().eq(WfFormDefinition::getFormId, wfFormVo.getFormId()) + ); + wfFormVo.setWfFormDefinitionVo(wfFormDefinitionVo); + } + return wfFormVo; } /** @@ -61,14 +67,14 @@ public class WfFormServiceImpl implements IWfFormService { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); List records = result.getRecords(); - if(CollUtil.isNotEmpty(records)){ + if (CollUtil.isNotEmpty(records)) { List formIds = StreamUtils.toList(records, WfFormVo::getFormId); List wfFormDefinitionVos = wfFormDefinitionMapper.selectVoList( new LambdaQueryWrapper().in(WfFormDefinition::getFormId, formIds) ); for (WfFormVo record : records) { - if(CollUtil.isNotEmpty(wfFormDefinitionVos)){ - wfFormDefinitionVos.stream().filter(e->String.valueOf(e.getFormId()).equals(String.valueOf(record.getFormId()))).findFirst().ifPresent(record::setWfFormDefinitionVo); + if (CollUtil.isNotEmpty(wfFormDefinitionVos)) { + wfFormDefinitionVos.stream().filter(e -> String.valueOf(e.getFormId()).equals(String.valueOf(record.getFormId()))).findFirst().ifPresent(record::setWfFormDefinitionVo); } } } @@ -127,7 +133,6 @@ public class WfFormServiceImpl implements IWfFormService { } private LambdaQueryWrapper buildQueryWrapper(WfFormBo bo) { - Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.like(StringUtils.isNotBlank(bo.getFormName()), WfForm::getFormName, bo.getFormName()); return lqw; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfBusinessFormMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfBusinessFormMapper.xml new file mode 100644 index 000000000..f8ec725f6 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfBusinessFormMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormMapper.xml index 5d3a0c955..e9ee055c1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormMapper.xml @@ -4,7 +4,4 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index 7d9210254..043a8e6eb 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -289,12 +289,14 @@ insert into sys_menu values('115', '代码生成', '3', '2', 'gen', insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate(), null, null, '租户管理菜单'); insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, '租户套餐管理菜单'); insert into sys_menu values('123', '客户端管理', '1', '11', 'client', 'system/client/index', '', 1, 0, 'C', '0', '0', 'system:client:list', 'international', 103, 1, sysdate(), null, null, '客户端管理菜单'); -insert into sys_menu values('1617', '模型管理', '1616', '1', 'model', 'workflow/model/index', '', 1, 1, 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, sysdate(), null, null, '模型管理菜单'); -insert into sys_menu values('1618', '我的待办', '1616', '4', 'task', '', '', 1, 0, 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '我的待办菜单'); -insert into sys_menu values('1620', '流程定义', '1616', '2', 'processDefinition', 'workflow/processDefinition/index', '', 1, 1, 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '流程定义菜单'); insert into sys_menu values('1622', '流程分类', '1616', '1', 'category', 'workflow/category/index', '', 1, 0, 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, sysdate(), null, null, '流程分类菜单'); -insert into sys_menu values('1628', '动态表单', '1616', '5', 'form', 'workflow/form/index', '', 1, 1, 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '动态表单菜单'); -insert into sys_menu values('1630', '流程监控', '1616', '3', 'monitor', '', '', 1, 0, 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '流程监控菜单'); +insert into sys_menu values('1617', '模型管理', '1616', '2', 'model', 'workflow/model/index', '', 1, 1, 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, sysdate(), null, null, '模型管理菜单'); +insert into sys_menu values('1620', '流程定义', '1616', '3', 'processDefinition', 'workflow/processDefinition/index', '', 1, 1, 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '流程定义菜单'); +insert into sys_menu values('1630', '流程监控', '1616', '4', 'monitor', '', '', 1, 0, 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '流程监控菜单'); +insert into sys_menu values('1618', '我的待办', '1616', '5', 'task', '', '', 1, 0, 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '我的待办菜单'); +insert into sys_menu values('1628', '动态表单', '1616', '6', 'form', 'workflow/form/index', '', 1, 1, 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '动态表单菜单'); +insert into sys_menu values('1638', '发起流程', '1616', '7', 'businessForm', 'workflow/businessForm/index', '', 1, 1, 'C', '0', '0', 'workflow:businessForm:list', 'tree-table', 103, 1, sysdate(), null, null, '发起流程菜单'); +insert into sys_menu values('1639', '我的单据', '1616', '8', 'businessFormList', 'workflow/businessForm/list', '', 1, 1, 'C', '0', '0', 'workflow:businessForm:list', 'tree-table', 103, 1, sysdate(), null, null, '我的单据菜单'); -- springboot-admin监控 insert into sys_menu values('117', 'Admin监控', '2', '5', 'Admin', 'monitor/admin/index', '', 1, 0, 'C', '0', '0', 'monitor:admin:list', 'dashboard', 103, 1, sysdate(), null, null, 'Admin监控菜单'); @@ -414,6 +416,12 @@ insert into sys_menu values('1062', '客户端管理新增', '123', '2', '#', ' insert into sys_menu values('1063', '客户端管理修改', '123', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:edit', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('1064', '客户端管理删除', '123', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:remove', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('1065', '客户端管理导出', '123', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:export', '#', 103, 1, sysdate(), null, null, ''); +-- 发起流程按钮 +insert into sys_menu values('1640', '发起流程查询', '1638', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:businessForm:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('1641', '发起流程新增', '1638', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:businessForm:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('1642', '发起流程修改', '1638', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:businessForm:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('1643', '发起流程删除', '1638', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:businessForm:remove','#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('1644', '发起流程导出', '1638', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:businessForm:export','#', 103, 1, sysdate(), null, null, ''); -- ---------------------------- -- 6、用户和角色关联表 用户N-1角色 @@ -940,6 +948,28 @@ create table wf_form_definition update_time datetime null comment '更新时间' ) engine=innodb comment= '动态表单与流程定义关联信息'; +-- ---------------------------- +-- 业务单据表 +-- ---------------------------- +drop table if exists wf_business_form; +create table wf_business_form +( + id bigint not null comment '主键' + primary key, + apply_code varchar(255) not null comment '申请编码', + form_id bigint not null comment '表单id', + form_name varchar(255) not null comment '表单名称', + content longtext not null comment '表单内容', + tenant_id varchar(20) default '000000' null comment '租户编号', + create_dept bigint null comment '创建部门', + create_by bigint null comment '创建者', + create_time datetime null comment '创建时间', + update_by bigint null comment '更新者', + update_time datetime null comment '更新时间', + content_value longtext null comment '表单值' +) engine=innodb comment= '业务单据表'; + + -- ---------------------------- -- 系统授权表 -- ---------------------------- From 50484c54423b7880eda262f033e9792e706ad4c6 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Thu, 21 Sep 2023 21:06:56 +0800 Subject: [PATCH 078/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E8=A1=A8=E5=8D=95=E6=8F=90=E4=BA=A4=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/vo/WfBusinessFormVo.java | 10 ++++++++++ .../impl/WfBusinessFormServiceImpl.java | 18 +++++++++++++++++- .../dromara/workflow/utils/WorkflowUtils.java | 3 +++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfBusinessFormVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfBusinessFormVo.java index 7d47469d8..e4811e9bf 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfBusinessFormVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfBusinessFormVo.java @@ -60,4 +60,14 @@ public class WfBusinessFormVo implements Serializable { @ExcelProperty(value = "表单值") private String contentValue; + /** + * 动态单与流程定义关联信息业务对象 + */ + private WfFormDefinitionVo wfFormDefinitionVo; + + /** + * 流程实例对象 + */ + private ProcessInstanceVo processInstanceVo; + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java index c6c0a7610..bc92787c6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java @@ -3,6 +3,7 @@ package org.dromara.workflow.service.impl; import com.fasterxml.jackson.core.type.TypeReference; import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -11,6 +12,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; +import org.dromara.workflow.domain.WfFormDefinition; +import org.dromara.workflow.domain.vo.WfFormDefinitionVo; +import org.dromara.workflow.mapper.WfFormDefinitionMapper; +import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.dromara.workflow.domain.bo.WfBusinessFormBo; import org.dromara.workflow.domain.vo.WfBusinessFormVo; @@ -34,12 +39,21 @@ public class WfBusinessFormServiceImpl implements IWfBusinessFormService { private final WfBusinessFormMapper baseMapper; + private final WfFormDefinitionMapper wfFormDefinitionMapper; + /** * 查询发起流程 */ @Override public WfBusinessFormVo queryById(Long id) { - return baseMapper.selectVoById(id); + WfBusinessFormVo wfBusinessFormVo = baseMapper.selectVoById(id); + if (wfBusinessFormVo != null) { + WfFormDefinitionVo wfFormDefinitionVo = wfFormDefinitionMapper.selectVoOne( + new LambdaQueryWrapper().eq(WfFormDefinition::getFormId, wfBusinessFormVo.getFormId()) + ); + wfBusinessFormVo.setWfFormDefinitionVo(wfFormDefinitionVo); + } + return wfBusinessFormVo; } /** @@ -49,6 +63,8 @@ public class WfBusinessFormServiceImpl implements IWfBusinessFormService { public TableDataInfo queryPageList(WfBusinessFormBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + List records = result.getRecords(); + WorkflowUtils.setProcessInstanceListVo(records,StreamUtils.toList(records, e -> String.valueOf(e.getId())),"id"); return TableDataInfo.build(result); } 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 index 3e0e49f05..ed009c1be 100644 --- 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 @@ -306,6 +306,9 @@ public class WorkflowUtils { * @param fieldName 主键属性名称 */ public static void setProcessInstanceListVo(Object obj, List idList, String fieldName) { + if (CollUtil.isEmpty(idList)) { + return; + } List actHiProcinstList = I_ACT_HI_PROCINST_SERVICE.selectByBusinessKeyIn(idList); if (obj instanceof Collection collection) { for (Object o : collection) { From 6347f11b52968b631db8476ca44bcdc9ea2b9af8 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 30 Sep 2023 18:08:32 +0800 Subject: [PATCH 079/159] =?UTF-8?q?update=20=E5=8D=87=E7=BA=A7flowable7.0,?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=9A=E5=8A=A1=E5=8D=95=E6=8D=AE=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=B5=81=E7=A8=8B=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../controller/WfBusinessFormController.java | 2 +- .../service/IWfBusinessFormService.java | 2 +- .../impl/WfBusinessFormServiceImpl.java | 29 ++++++++++--------- .../service/impl/WorkflowUserServiceImpl.java | 4 +++ 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/pom.xml b/pom.xml index 5a16a1fcc..817f41c1a 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 1.3.0 - 7.0.0.M2 + 7.0.0 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfBusinessFormController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfBusinessFormController.java index 153fa462b..8eef136a3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfBusinessFormController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfBusinessFormController.java @@ -101,6 +101,6 @@ public class WfBusinessFormController extends BaseController { @DeleteMapping("/{ids}") public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { - return toAjax(wfBusinessFormService.deleteWithValidByIds(List.of(ids), true)); + return toAjax(wfBusinessFormService.deleteWithValidByIds(List.of(ids))); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfBusinessFormService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfBusinessFormService.java index 010e04111..b042c8136 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfBusinessFormService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfBusinessFormService.java @@ -45,5 +45,5 @@ public interface IWfBusinessFormService { /** * 校验并批量删除发起流程信息 */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + Boolean deleteWithValidByIds(Collection ids); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java index bc92787c6..53af1ba0a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.workflow.service.impl; +import cn.hutool.core.collection.CollUtil; import com.fasterxml.jackson.core.type.TypeReference; import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.MapstructUtils; @@ -12,9 +13,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; +import org.dromara.workflow.domain.ActHiProcinst; import org.dromara.workflow.domain.WfFormDefinition; import org.dromara.workflow.domain.vo.WfFormDefinitionVo; import org.dromara.workflow.mapper.WfFormDefinitionMapper; +import org.dromara.workflow.service.IActHiProcinstService; +import org.dromara.workflow.service.IActProcessInstanceService; import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.dromara.workflow.domain.bo.WfBusinessFormBo; @@ -22,10 +26,12 @@ import org.dromara.workflow.domain.vo.WfBusinessFormVo; import org.dromara.workflow.domain.WfBusinessForm; import org.dromara.workflow.mapper.WfBusinessFormMapper; import org.dromara.workflow.service.IWfBusinessFormService; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; import java.util.Collection; +import java.util.stream.Collectors; /** * 发起流程Service业务层处理 @@ -38,8 +44,9 @@ import java.util.Collection; public class WfBusinessFormServiceImpl implements IWfBusinessFormService { private final WfBusinessFormMapper baseMapper; - private final WfFormDefinitionMapper wfFormDefinitionMapper; + private final IActProcessInstanceService iActProcessInstanceService; + private final IActHiProcinstService iActHiProcinstService; /** * 查询发起流程 @@ -64,7 +71,7 @@ public class WfBusinessFormServiceImpl implements IWfBusinessFormService { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); List records = result.getRecords(); - WorkflowUtils.setProcessInstanceListVo(records,StreamUtils.toList(records, e -> String.valueOf(e.getId())),"id"); + WorkflowUtils.setProcessInstanceListVo(records, StreamUtils.toList(records, e -> String.valueOf(e.getId())), "id"); return TableDataInfo.build(result); } @@ -90,7 +97,7 @@ public class WfBusinessFormServiceImpl implements IWfBusinessFormService { @Override public WfBusinessForm insertByBo(WfBusinessFormBo bo) { WfBusinessForm add = MapstructUtils.convert(bo, WfBusinessForm.class); - validEntityBeforeSave(add); + //规则自行修改 add.setApplyCode(DateUtils.dateTimeNow()); boolean flag = baseMapper.insert(add) > 0; if (flag) { @@ -110,7 +117,6 @@ public class WfBusinessFormServiceImpl implements IWfBusinessFormService { @Override public WfBusinessForm updateByBo(WfBusinessFormBo bo) { WfBusinessForm update = MapstructUtils.convert(bo, WfBusinessForm.class); - validEntityBeforeSave(update); baseMapper.updateById(update); if (StringUtils.isNotBlank(update.getContentValue())) { Map variable = JsonUtils.parseObject(update.getContentValue(), new TypeReference<>() { @@ -120,20 +126,15 @@ public class WfBusinessFormServiceImpl implements IWfBusinessFormService { return update; } - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(WfBusinessForm entity) { - //TODO 做一些数据校验,如唯一约束 - } - /** * 批量删除发起流程 */ @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids) { + List actHiProcinsts = iActHiProcinstService.selectByBusinessKeyIn(StreamUtils.toList(ids, String::valueOf)); + if (CollUtil.isNotEmpty(actHiProcinsts)) { + iActProcessInstanceService.deleteRuntimeProcessAndHisInst(actHiProcinsts.stream().map(ActHiProcinst::getId).collect(Collectors.toList())); } return baseMapper.deleteBatchIds(ids) > 0; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java index ebdb2b74e..4cb658ccd 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.workflow.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -182,6 +183,9 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { */ @Override public List getUserListByIds(List userIds) { + if (CollUtil.isEmpty(userIds)) { + return Collections.emptyList(); + } LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); //检索条件 queryWrapper.eq(SysUser::getStatus, UserStatus.OK.getCode()); From 31c4a9fd063f18921e44f38c5ae10b3f989b127a Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 7 Oct 2023 17:44:31 +0800 Subject: [PATCH 080/159] =?UTF-8?q?update=20=E4=BF=AE=E6=94=B9=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=90=AF=E5=8A=A8=E5=90=8E=E9=87=8D=E6=96=B0=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E6=B5=81=E7=A8=8B=E5=8F=98=E9=87=8F=EF=BC=8C=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=B9=B6=E8=A1=8C=E6=B5=81=E7=A8=8B=E9=A9=B3=E5=9B=9E?= =?UTF-8?q?=EF=BC=8C=E6=92=A4=E9=94=80=E5=90=8E=EF=BC=8C=E5=9E=83=E5=9C=BE?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flowable/cmd/DeleteExecutionCmd.java | 32 +++++++++++++++ .../cmd/ExecutionChildByExecutionIdCmd.java | 39 +++++++++++++++++++ .../impl/ActProcessInstanceServiceImpl.java | 17 ++++++-- .../service/impl/ActTaskServiceImpl.java | 16 ++++++-- 4 files changed, 97 insertions(+), 7 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java new file mode 100644 index 000000000..698cebd6e --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java @@ -0,0 +1,32 @@ +package org.dromara.workflow.flowable.cmd; + +import org.flowable.common.engine.impl.interceptor.Command; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager; +import org.flowable.engine.impl.util.CommandContextUtil; + +import java.io.Serializable; + +/** + * 删除执行数据 + * + * @author may + */ +public class DeleteExecutionCmd implements Command, Serializable { + + /** + * 执行id + */ + private final String executionId; + + public DeleteExecutionCmd(String executionId) { + this.executionId = executionId; + } + + @Override + public String execute(CommandContext commandContext) { + ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); + executionEntityManager.delete(executionId); + return null; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java new file mode 100644 index 000000000..7ace3fcbd --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java @@ -0,0 +1,39 @@ +package org.dromara.workflow.flowable.cmd; + +import org.flowable.common.engine.impl.interceptor.Command; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.impl.persistence.entity.ExecutionEntity; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager; +import org.flowable.engine.impl.util.CommandContextUtil; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 获取并行网关执行后保留的执行实例数据 + * + * @author may + */ +public class ExecutionChildByExecutionIdCmd implements Command>, Serializable { + + /** + * 当前任务执行实例id + */ + private final String executionId; + + public ExecutionChildByExecutionIdCmd(String executionId) { + this.executionId = executionId; + } + + @Override + public List execute(CommandContext commandContext) { + ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); + // 获取当前执行数据 + ExecutionEntity executionEntity = executionEntityManager.findById(executionId); + // 通过当前执行数据的父执行,查询所有子执行数据 + List allChildrenExecution = + executionEntityManager.collectChildren(executionEntity.getParent()); + return allChildrenExecution.stream().filter(e -> !e.isActive()).collect(Collectors.toList()); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 5e4776b92..86bb697d3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -25,16 +25,16 @@ import org.dromara.workflow.domain.vo.GraphicInfoVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator; +import org.dromara.workflow.flowable.cmd.DeleteExecutionCmd; +import org.dromara.workflow.flowable.cmd.ExecutionChildByExecutionIdCmd; import org.dromara.workflow.service.IActHiProcinstService; import org.dromara.workflow.service.IActProcessInstanceService; import org.flowable.bpmn.model.*; -import org.flowable.engine.HistoryService; -import org.flowable.engine.RepositoryService; -import org.flowable.engine.RuntimeService; -import org.flowable.engine.TaskService; +import org.flowable.engine.*; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstanceQuery; +import org.flowable.engine.impl.persistence.entity.ExecutionEntity; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstanceQuery; import org.flowable.engine.task.Comment; @@ -66,6 +66,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService private final HistoryService historyService; private final TaskService taskService; private final IActHiProcinstService iActHiProcinstService; + private final ManagementService managementService; @Value("${flowable.activity-font-name}") private String activityFontName; @@ -471,6 +472,14 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService .moveActivityIdsToSingleActivityId(nodeIds, historicTaskInstance.getTaskDefinitionKey()).changeState(); Task task = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(processInstanceId).list().get(0); taskService.setAssignee(task.getId(), historicTaskInstance.getAssignee()); + //获取并行网关执行后保留的执行实例数据 + ExecutionChildByExecutionIdCmd childByExecutionIdCmd = new ExecutionChildByExecutionIdCmd(task.getExecutionId()); + List executionEntities = managementService.executeCommand(childByExecutionIdCmd); + //删除流程实例垃圾数据 + for (ExecutionEntity executionEntity : executionEntities) { + DeleteExecutionCmd deleteExecutionCmd = new DeleteExecutionCmd(executionEntity.getId()); + managementService.executeCommand(deleteExecutionCmd); + } runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.CANCEL.getStatus()); return true; } catch (Exception e) { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index be00d9554..85d6d4292 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -19,9 +19,7 @@ import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.TaskVo; -import org.dromara.workflow.flowable.cmd.AddSequenceMultiInstanceCmd; -import org.dromara.workflow.flowable.cmd.DeleteSequenceMultiInstanceCmd; -import org.dromara.workflow.flowable.cmd.UpdateBusinessStatusCmd; +import org.dromara.workflow.flowable.cmd.*; import org.dromara.workflow.service.IActTaskService; import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.common.engine.impl.identity.Authentication; @@ -29,6 +27,7 @@ import org.flowable.engine.*; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; +import org.flowable.engine.impl.persistence.entity.ExecutionEntity; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; @@ -80,6 +79,9 @@ public class ActTaskServiceImpl implements IActTaskService { TaskQuery taskQuery = taskService.createTaskQuery(); List taskResult = taskQuery.processInstanceBusinessKey(startProcessBo.getBusinessKey()).taskTenantId(TenantHelper.getTenantId()).list(); if (CollUtil.isNotEmpty(taskResult)) { + if (CollUtil.isNotEmpty(startProcessBo.getVariables())) { + taskService.setVariables(taskResult.get(0).getId(), startProcessBo.getVariables()); + } map.put("processInstanceId", taskResult.get(0).getProcessInstanceId()); map.put("taskId", taskResult.get(0).getId()); return map; @@ -550,6 +552,9 @@ public class ActTaskServiceImpl implements IActTaskService { try { String processInstanceId = task.getProcessInstanceId(); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult(); + //获取并行网关执行后保留的执行实例数据 + ExecutionChildByExecutionIdCmd childByExecutionIdCmd = new ExecutionChildByExecutionIdCmd(task.getExecutionId()); + List executionEntities = managementService.executeCommand(childByExecutionIdCmd); //校验单据 BusinessStatusEnum.checkStatus(processInstance.getBusinessStatus()); //判断是否有多个任务 @@ -573,6 +578,11 @@ public class ActTaskServiceImpl implements IActTaskService { for (Task t : list) { taskService.setAssignee(t.getId(), historicTaskInstance.getAssignee()); } + //删除流程实例垃圾数据 + for (ExecutionEntity executionEntity : executionEntities) { + DeleteExecutionCmd deleteExecutionCmd = new DeleteExecutionCmd(executionEntity.getId()); + managementService.executeCommand(deleteExecutionCmd); + } runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.BACK.getStatus()); } catch (Exception e) { throw new ServiceException(e.getMessage()); From 7d6d1ade4f8c88a6118ff7a6b599529f60bd24fb Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 19 Oct 2023 18:12:11 +0800 Subject: [PATCH 081/159] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=BE=85=E5=8A=9E=EF=BC=8C=E6=8E=92=E9=99=A4=E9=9D=9E?= =?UTF-8?q?=E5=BE=85=E5=8A=9E=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/mapper/ActTaskMapper.java | 30 ++++++++ .../service/impl/ActTaskServiceImpl.java | 55 +++++++-------- .../mapper/workflow/ActTaskMapper.xml | 69 +++++++++++++++++++ 3 files changed, 122 insertions(+), 32 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java new file mode 100644 index 000000000..2f51461ec --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java @@ -0,0 +1,30 @@ +package org.dromara.workflow.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.workflow.domain.vo.TaskVo; + +import java.util.List; + +/** + * 运行时任务Mapper接口 + * + * @author may + * @date 2023-10-19 + */ +public interface ActTaskMapper extends BaseMapperPlus { + + /** + * 获取待办信息 + * + * @param page 分页 + * @param queryWrapper 条件 + * @param userId 用户id + * @param groupIds 用户角色id + * @return 结果 + */ + Page getTaskWaitByPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper, @Param("userId") String userId, @Param("groupIds") List groupIds); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 85d6d4292..722b498ee 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -5,11 +5,14 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; @@ -20,6 +23,7 @@ import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.flowable.cmd.*; +import org.dromara.workflow.mapper.ActTaskMapper; import org.dromara.workflow.service.IActTaskService; import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.common.engine.impl.identity.Authentication; @@ -57,6 +61,7 @@ public class ActTaskServiceImpl implements IActTaskService { private final HistoryService historyService; private final IdentityService identityService; private final ManagementService managementService; + private final ActTaskMapper actTaskMapper; /** * 启动任务 @@ -168,47 +173,33 @@ public class ActTaskServiceImpl implements IActTaskService { */ @Override public TableDataInfo getTaskWaitByPage(TaskBo taskBo) { + PageQuery pageQuery = new PageQuery(); + pageQuery.setPageNum(taskBo.getPageNum()); + pageQuery.setPageSize(taskBo.getPageSize()); + QueryWrapper queryWrapper = new QueryWrapper<>(); List roles = LoginHelper.getLoginUser().getRoles(); String userId = String.valueOf(LoginHelper.getUserId()); - TaskQuery query = taskService.createTaskQuery(); - query.taskTenantId(TenantHelper.getTenantId()).taskCandidateOrAssigned(userId); - if (CollUtil.isNotEmpty(roles)) { - List groupIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId())); - query.taskCandidateGroupIn(groupIds); - } + queryWrapper.eq("t.business_status_", BusinessStatusEnum.WAITING.getStatus()); + queryWrapper.eq("t.tenant_id_", TenantHelper.getTenantId()); if (StringUtils.isNotBlank(taskBo.getName())) { - query.taskNameLike("%" + taskBo.getName() + "%"); + queryWrapper.like("t.name_", taskBo.getName()); } if (StringUtils.isNotBlank(taskBo.getProcessDefinitionName())) { - query.processDefinitionNameLike("%" + taskBo.getProcessDefinitionName() + "%"); + queryWrapper.like("t.processDefinitionName", taskBo.getProcessDefinitionName()); } if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) { - query.processDefinitionKey(taskBo.getProcessDefinitionKey()); + queryWrapper.eq("t.processDefinitionKey", taskBo.getProcessDefinitionKey()); } - List taskList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); - List processInstanceList = null; - if (CollUtil.isNotEmpty(taskList)) { - Set processInstanceIds = StreamUtils.toSet(taskList, Task::getProcessInstanceId); - processInstanceList = runtimeService.createProcessInstanceQuery().processInstanceIds(processInstanceIds).list(); + Page page = TenantHelper.ignore(() -> + actTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper, userId, StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId()))) + ); + List taskList = page.getRecords(); + for (TaskVo task : taskList) { + task.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(task.getBusinessStatus())); + task.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); + task.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); } - List list = new ArrayList<>(); - for (Task task : taskList) { - TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); - if (CollUtil.isNotEmpty(processInstanceList)) { - processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { - taskVo.setBusinessStatus(e.getBusinessStatus()); - taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); - taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey()); - taskVo.setProcessDefinitionName(e.getProcessDefinitionName()); - }); - } - taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); - taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); - taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); - list.add(taskVo); - } - long count = query.count(); - return new TableDataInfo<>(list, count); + return new TableDataInfo<>(taskList, page.getTotal()); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml new file mode 100644 index 000000000..fdc74ff34 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 06bf090b525b5a1b633ba008e2000d27ac0c25cc Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Tue, 24 Oct 2023 13:40:28 +0800 Subject: [PATCH 082/159] =?UTF-8?q?update=20=E8=BF=98=E5=8E=9F=E5=BE=85?= =?UTF-8?q?=E5=8A=9E=E4=BB=BB=E5=8A=A1=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=BE=85?= =?UTF-8?q?=E5=8A=9E=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/ruoyi-workflow/pom.xml | 15 ++++ .../common/enums/MessageTypeEnum.java | 31 ++++++++ .../workflow/domain/bo/BackProcessBo.java | 6 ++ .../workflow/domain/bo/CompleteTaskBo.java | 6 ++ .../workflow/mapper/ActHiProcinstMapper.java | 2 + .../workflow/mapper/ActTaskMapper.java | 30 -------- .../impl/ActHiProcinstServiceImpl.java | 13 ++-- .../service/impl/ActTaskServiceImpl.java | 75 +++++++++++++------ .../dromara/workflow/utils/WorkflowUtils.java | 46 +++++++++++- .../mapper/workflow/ActTaskMapper.xml | 69 ----------------- 10 files changed, 162 insertions(+), 131 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index fafc0c897..3dedb40be 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -53,6 +53,21 @@ ruoyi-system + + org.dromara + ruoyi-common-websocket + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-common-sms + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java new file mode 100644 index 000000000..d7ba1bf01 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java @@ -0,0 +1,31 @@ +package org.dromara.workflow.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 消息类型枚举 + * + * @author may + */ +@Getter +@AllArgsConstructor +public enum MessageTypeEnum { + /** + * 站内信 + */ + SYSTEM_MESSAGE("1", "站内信"), + /** + * 邮箱 + */ + EMAIL_MESSAGE("2", "邮箱"), + /** + * 短信 + */ + SMS_MESSAGE("3", "短信"); + + private final String code; + + private final String desc; +} + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java index 8b24e9247..7ac6b38e5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java @@ -6,6 +6,7 @@ import org.dromara.common.core.validate.AddGroup; import java.io.Serial; import java.io.Serializable; +import java.util.List; /** @@ -25,6 +26,11 @@ public class BackProcessBo implements Serializable { @NotBlank(message = "任务ID不能为空", groups = AddGroup.class) private String taskId; + /** + * 消息类型 + */ + private List messageType; + /** * 驳回的节点id(目前未使用,直接驳回到申请人) */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index 65bd42a49..87c742e0b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -7,6 +7,7 @@ import org.dromara.common.core.validate.AddGroup; import java.io.Serial; import java.io.Serializable; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -27,6 +28,11 @@ public class CompleteTaskBo implements Serializable { @NotBlank(message = "任务id不能为空", groups = {AddGroup.class}) private String taskId; + /** + * 消息类型 + */ + private List messageType; + /** * 办理意见 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java index 788fca6ea..cd8fabfa3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java @@ -1,5 +1,6 @@ package org.dromara.workflow.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import org.dromara.workflow.domain.ActHiProcinst; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; @@ -9,6 +10,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; * @author may * @date 2023-07-22 */ +@InterceptorIgnore(tenantLine = "true") public interface ActHiProcinstMapper extends BaseMapperPlus { } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java deleted file mode 100644 index 2f51461ec..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.dromara.workflow.mapper; - -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.ibatis.annotations.Param; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.vo.TaskVo; - -import java.util.List; - -/** - * 运行时任务Mapper接口 - * - * @author may - * @date 2023-10-19 - */ -public interface ActTaskMapper extends BaseMapperPlus { - - /** - * 获取待办信息 - * - * @param page 分页 - * @param queryWrapper 条件 - * @param userId 用户id - * @param groupIds 用户角色id - * @return 结果 - */ - Page getTaskWaitByPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper, @Param("userId") String userId, @Param("groupIds") List groupIds); -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java index e0ec0a794..1d3bf06fe 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java @@ -31,11 +31,9 @@ public class ActHiProcinstServiceImpl implements IActHiProcinstService { */ @Override public List selectByBusinessKeyIn(List businessKeys) { - return TenantHelper.ignore(() -> - baseMapper.selectList(new LambdaQueryWrapper() + return baseMapper.selectList(new LambdaQueryWrapper() .in(ActHiProcinst::getBusinessKey, businessKeys) - .eq(ActHiProcinst::getTenantId, TenantHelper.getTenantId())) - ); + .eq(ActHiProcinst::getTenantId, TenantHelper.getTenantId())); } /** @@ -45,10 +43,9 @@ public class ActHiProcinstServiceImpl implements IActHiProcinstService { */ @Override public ActHiProcinst selectByBusinessKey(String businessKey) { - return TenantHelper.ignore(() -> - baseMapper.selectOne(new LambdaQueryWrapper() + return baseMapper.selectOne(new LambdaQueryWrapper() .eq(ActHiProcinst::getBusinessKey, businessKey) - .eq(ActHiProcinst::getTenantId, TenantHelper.getTenantId())) - ); + .eq(ActHiProcinst::getTenantId, TenantHelper.getTenantId())); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 722b498ee..aefe8f1c9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -5,14 +5,11 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; @@ -23,7 +20,6 @@ import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.flowable.cmd.*; -import org.dromara.workflow.mapper.ActTaskMapper; import org.dromara.workflow.service.IActTaskService; import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.common.engine.impl.identity.Authentication; @@ -38,6 +34,7 @@ import org.flowable.task.api.TaskQuery; import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.flowable.task.service.impl.persistence.entity.TaskEntity; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -61,7 +58,6 @@ public class ActTaskServiceImpl implements IActTaskService { private final HistoryService historyService; private final IdentityService identityService; private final ManagementService managementService; - private final ActTaskMapper actTaskMapper; /** * 启动任务 @@ -142,6 +138,7 @@ public class ActTaskServiceImpl implements IActTaskService { if (task.isSuspended()) { throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); } + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult(); //办理委托任务 if (ObjectUtil.isNotEmpty(task.getDelegationState()) && FlowConstant.PENDING.equals(task.getDelegationState().name())) { taskService.resolveTask(completeTaskBo.getTaskId()); @@ -159,6 +156,8 @@ public class ActTaskServiceImpl implements IActTaskService { if (CollUtil.isEmpty(list)) { UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); managementService.executeCommand(updateBusinessStatusCmd); + } else { + sendMessage(list, processInstance.getName(), completeTaskBo.getMessageType(),null); } return true; } catch (Exception e) { @@ -166,6 +165,19 @@ public class ActTaskServiceImpl implements IActTaskService { } } + /** + * 发送消息 + * + * @param list 任务 + * @param name 流程名称 + * @param messageType 消息类型 + * @param message 消息内容,为空则发送默认配置的消息内容 + */ + @Async + public void sendMessage(List list, String name, List messageType,String message) { + WorkflowUtils.sendMessage(list, name, messageType,message); + } + /** * 查询当前用户的待办任务 * @@ -173,33 +185,47 @@ public class ActTaskServiceImpl implements IActTaskService { */ @Override public TableDataInfo getTaskWaitByPage(TaskBo taskBo) { - PageQuery pageQuery = new PageQuery(); - pageQuery.setPageNum(taskBo.getPageNum()); - pageQuery.setPageSize(taskBo.getPageSize()); - QueryWrapper queryWrapper = new QueryWrapper<>(); List roles = LoginHelper.getLoginUser().getRoles(); String userId = String.valueOf(LoginHelper.getUserId()); - queryWrapper.eq("t.business_status_", BusinessStatusEnum.WAITING.getStatus()); - queryWrapper.eq("t.tenant_id_", TenantHelper.getTenantId()); + TaskQuery query = taskService.createTaskQuery(); + query.taskTenantId(TenantHelper.getTenantId()).taskCandidateOrAssigned(userId); + if (CollUtil.isNotEmpty(roles)) { + List groupIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId())); + query.taskCandidateGroupIn(groupIds); + } if (StringUtils.isNotBlank(taskBo.getName())) { - queryWrapper.like("t.name_", taskBo.getName()); + query.taskNameLike("%" + taskBo.getName() + "%"); } if (StringUtils.isNotBlank(taskBo.getProcessDefinitionName())) { - queryWrapper.like("t.processDefinitionName", taskBo.getProcessDefinitionName()); + query.processDefinitionNameLike("%" + taskBo.getProcessDefinitionName() + "%"); } if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) { - queryWrapper.eq("t.processDefinitionKey", taskBo.getProcessDefinitionKey()); + query.processDefinitionKey(taskBo.getProcessDefinitionKey()); } - Page page = TenantHelper.ignore(() -> - actTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper, userId, StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId()))) - ); - List taskList = page.getRecords(); - for (TaskVo task : taskList) { - task.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(task.getBusinessStatus())); - task.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); - task.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); + List taskList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); + List processInstanceList = null; + if (CollUtil.isNotEmpty(taskList)) { + Set processInstanceIds = StreamUtils.toSet(taskList, Task::getProcessInstanceId); + processInstanceList = runtimeService.createProcessInstanceQuery().processInstanceIds(processInstanceIds).list(); } - return new TableDataInfo<>(taskList, page.getTotal()); + List list = new ArrayList<>(); + for (Task task : taskList) { + TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); + if (CollUtil.isNotEmpty(processInstanceList)) { + processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { + taskVo.setBusinessStatus(e.getBusinessStatus()); + taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); + taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey()); + taskVo.setProcessDefinitionName(e.getProcessDefinitionName()); + }); + } + taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); + taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); + taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); + list.add(taskVo); + } + long count = query.count(); + return new TableDataInfo<>(list, count); } /** @@ -569,6 +595,9 @@ public class ActTaskServiceImpl implements IActTaskService { for (Task t : list) { taskService.setAssignee(t.getId(), historicTaskInstance.getAssignee()); } + //发送消息 + String message = "您的【" + processInstance.getName() + "】单据已经被驳回,请您注意查收。"; + sendMessage(list, processInstance.getName(), backProcessBo.getMessageType(),message); //删除流程实例垃圾数据 for (ExecutionEntity executionEntity : executionEntities) { DeleteExecutionCmd deleteExecutionCmd = new DeleteExecutionCmd(executionEntity.getId()); 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 index ed009c1be..7af9b3f3f 100644 --- 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 @@ -11,11 +11,15 @@ import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.reflect.ReflectUtils; import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mail.utils.MailUtils; import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.common.websocket.dto.WebSocketMessageDto; +import org.dromara.common.websocket.utils.WebSocketUtils; import org.dromara.system.domain.SysUserRole; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.enums.BusinessStatusEnum; +import org.dromara.workflow.common.enums.MessageTypeEnum; import org.dromara.workflow.domain.ActHiProcinst; import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.ParticipantVo; @@ -36,7 +40,6 @@ import org.flowable.identitylink.api.history.HistoricIdentityLink; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.service.impl.persistence.entity.TaskEntity; - import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; @@ -334,4 +337,45 @@ public class WorkflowUtils { } } } + + /** + * 发送消息 + * + * @param list 任务 + * @param name 流程名称 + * @param messageType 消息类型 + * @param message 消息内容,为空则发送默认配置的消息内容 + */ + public static void sendMessage(List list, String name, List messageType,String message) { + Set userIds = new HashSet<>(); + if(StringUtils.isBlank(message)){ + message = "有新的【" + name + "】单据已经提交至您的待办,请及时处理。"; + } + for (Task t : list) { + ParticipantVo taskParticipant = WorkflowUtils.getCurrentTaskParticipant(t.getId()); + if (CollUtil.isNotEmpty(taskParticipant.getGroupIds())) { + List sysUserRoles = I_WORK_FLOW_USER_SERVICE.getUserRoleListByRoleIds(taskParticipant.getGroupIds()); + if (CollUtil.isNotEmpty(sysUserRoles)) { + userIds.addAll(StreamUtils.toList(sysUserRoles, SysUserRole::getUserId)); + } + } + List candidate = taskParticipant.getCandidate(); + if (CollUtil.isNotEmpty(candidate)) { + userIds.addAll(candidate); + } + } + if (CollUtil.isNotEmpty(userIds)) { + List sysUserVoList = I_WORK_FLOW_USER_SERVICE.getUserListByIds(new ArrayList<>(userIds)); + if (messageType.contains(MessageTypeEnum.SYSTEM_MESSAGE.getCode())) { + WebSocketMessageDto dto = new WebSocketMessageDto(); + dto.setSessionKeys(new ArrayList<>(userIds)); + dto.setMessage(message); + WebSocketUtils.publishMessage(dto); + } else if (messageType.contains(MessageTypeEnum.EMAIL_MESSAGE.getCode())) { + MailUtils.sendText(StreamUtils.join(sysUserVoList, SysUserVo::getEmail), "单据审批提醒", message); + } else if (messageType.contains(MessageTypeEnum.SMS_MESSAGE.getCode())) { + //todo 短信发送 + } + } + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml deleted file mode 100644 index fdc74ff34..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From e2b169e07ae5379e5490363e4d15320b7eb0c59e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Wed, 25 Oct 2023 22:18:21 +0800 Subject: [PATCH 083/159] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=B3=A8=E5=86=8C=E6=8E=A5=E5=8F=A3=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=90=8D=E4=B8=8D=E5=8C=BA=E5=88=86=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/web/service/SysRegisterService.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java index 013773e50..4d4b07283 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java @@ -1,6 +1,8 @@ package org.dromara.web.service; import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.dromara.common.core.constant.Constants; import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.domain.model.RegisterBody; @@ -14,8 +16,11 @@ import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.log.event.LogininforEvent; import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.web.config.properties.CaptchaProperties; +import org.dromara.system.domain.SysUser; import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.service.ISysUserService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -30,6 +35,7 @@ import org.springframework.stereotype.Service; public class SysRegisterService { private final ISysUserService userService; + private final SysUserMapper userMapper; private final CaptchaProperties captchaProperties; /** @@ -53,7 +59,11 @@ public class SysRegisterService { sysUser.setPassword(BCrypt.hashpw(password)); sysUser.setUserType(userType); - if (!userService.checkUserNameUnique(sysUser)) { + boolean exist = userMapper.exists(new LambdaQueryWrapper() + .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId) + .eq(SysUser::getUserName, sysUser.getUserName()) + .ne(ObjectUtil.isNotNull(sysUser.getUserId()), SysUser::getUserId, sysUser.getUserId())); + if (exist) { throw new UserException("user.register.save.error", username); } boolean regFlag = userService.registerUser(sysUser, tenantId); From 59129837042fba3179a9543fca4c426f36f3aa39 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Fri, 27 Oct 2023 16:43:56 +0800 Subject: [PATCH 084/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=82=AC=E5=8A=9E=EF=BC=8C=E4=BB=BB=E5=8A=A1=E6=94=B9?= =?UTF-8?q?=E6=B4=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ActProcessInstanceController.java | 13 +++++++ .../controller/ActTaskController.java | 11 ++++++ .../workflow/domain/bo/TaskUrgingBo.java | 34 +++++++++++++++++++ .../service/IActProcessInstanceService.java | 9 +++++ .../workflow/service/IActTaskService.java | 9 +++++ .../impl/ActProcessInstanceServiceImpl.java | 32 ++++++++++++++--- .../service/impl/ActTaskServiceImpl.java | 30 +++++++++++++--- .../dromara/workflow/utils/WorkflowUtils.java | 7 ++-- 8 files changed, 133 insertions(+), 12 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskUrgingBo.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java index 3ac3474e9..166e2e7b2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java @@ -11,6 +11,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; import org.dromara.workflow.domain.bo.ProcessInstanceBo; import org.dromara.workflow.domain.bo.ProcessInvalidBo; +import org.dromara.workflow.domain.bo.TaskUrgingBo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; import org.dromara.workflow.service.IActProcessInstanceService; import org.springframework.validation.annotation.Validated; @@ -125,4 +126,16 @@ public class ActProcessInstanceController extends BaseController { public TableDataInfo getCurrentSubmitByPage(ProcessInstanceBo processInstanceBo) { return iActProcessInstanceService.getCurrentSubmitByPage(processInstanceBo); } + + /** + * 任务催办(给当前任务办理人发送站内信,邮件,短信等) + * + * @param taskUrgingBo 任务催办 + */ + @Log(title = "流程实例管理", businessType = BusinessType.INSERT) + @PostMapping("/taskUrging") + public R taskUrging(@RequestBody TaskUrgingBo taskUrgingBo) { + return toAjax(iActProcessInstanceService.taskUrging(taskUrgingBo)); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java index def6dc010..51f7ea1c6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java @@ -212,4 +212,15 @@ public class ActTaskController extends BaseController { } + /** + * 修改任务办理人 + * + * @param taskIds 任务id + * @param userId 办理人id + */ + @Log(title = "任务管理", businessType = BusinessType.UPDATE) + @PutMapping("/updateAssignee/{taskIds}/{userId}") + public R updateAssignee(@PathVariable String[] taskIds, @PathVariable String userId) { + return toAjax(iActTaskService.updateAssignee(taskIds, userId)); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskUrgingBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskUrgingBo.java new file mode 100644 index 000000000..20856efa9 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskUrgingBo.java @@ -0,0 +1,34 @@ +package org.dromara.workflow.domain.bo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 任务催办 + * + * @author may + */ +@Data +public class TaskUrgingBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程实例id + */ + private String processInstanceId; + + /** + * 消息类型 + */ + private List messageType; + + /** + * 催办内容(为空默认系统内置信息) + */ + private String message; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java index c31000c38..b871807bd 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java @@ -3,6 +3,7 @@ package org.dromara.workflow.service; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.bo.ProcessInstanceBo; import org.dromara.workflow.domain.bo.ProcessInvalidBo; +import org.dromara.workflow.domain.bo.TaskUrgingBo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; import java.util.List; @@ -93,4 +94,12 @@ public interface IActProcessInstanceService { * @return 结果 */ TableDataInfo getCurrentSubmitByPage(ProcessInstanceBo processInstanceBo); + + /** + * 任务催办(给当前任务办理人发送站内信,邮件,短信等) + * + * @param taskUrgingBo 任务催办 + * @return 结果 + */ + boolean taskUrging(TaskUrgingBo taskUrgingBo); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java index c1ac07aba..a3a77b637 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java @@ -109,4 +109,13 @@ public interface IActTaskService { * @return 流程实例id */ String backProcess(BackProcessBo backProcessBo); + + /** + * 修改任务办理人 + * + * @param taskIds 任务id + * @param userId 办理人id + * @return 结果 + */ + boolean updateAssignee(String[] taskIds, String userId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 86bb697d3..a9147fc0b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -20,15 +20,14 @@ import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.ActHiProcinst; import org.dromara.workflow.domain.bo.ProcessInstanceBo; import org.dromara.workflow.domain.bo.ProcessInvalidBo; -import org.dromara.workflow.domain.vo.ActHistoryInfoVo; -import org.dromara.workflow.domain.vo.GraphicInfoVo; -import org.dromara.workflow.domain.vo.ProcessInstanceVo; -import org.dromara.workflow.domain.vo.TaskVo; +import org.dromara.workflow.domain.bo.TaskUrgingBo; +import org.dromara.workflow.domain.vo.*; import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator; import org.dromara.workflow.flowable.cmd.DeleteExecutionCmd; import org.dromara.workflow.flowable.cmd.ExecutionChildByExecutionIdCmd; import org.dromara.workflow.service.IActHiProcinstService; import org.dromara.workflow.service.IActProcessInstanceService; +import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.bpmn.model.*; import org.flowable.engine.*; import org.flowable.engine.history.HistoricActivityInstance; @@ -533,4 +532,29 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService long count = query.count(); return new TableDataInfo<>(list, count); } + + /** + * 任务催办(给当前任务办理人发送站内信,邮件,短信等) + * + * @param taskUrgingBo 任务催办 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean taskUrging(TaskUrgingBo taskUrgingBo) { + try { + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(taskUrgingBo.getProcessInstanceId()).singleResult(); + if (processInstance == null) { + throw new ServiceException("任务已结束!"); + } + String message = taskUrgingBo.getMessage(); + if (StringUtils.isBlank(message)) { + message = "您的【" + processInstance.getName() + "】单据还未审批,请您及时处理。"; + } + List list = taskService.createTaskQuery().processInstanceId(taskUrgingBo.getProcessInstanceId()).list(); + WorkflowUtils.sendMessage(list, processInstance.getName(), taskUrgingBo.getMessageType(), message); + } catch (ServiceException e) { + throw new ServiceException(e.getMessage()); + } + return true; + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index aefe8f1c9..8728e8c27 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -157,7 +157,7 @@ public class ActTaskServiceImpl implements IActTaskService { UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); managementService.executeCommand(updateBusinessStatusCmd); } else { - sendMessage(list, processInstance.getName(), completeTaskBo.getMessageType(),null); + sendMessage(list, processInstance.getName(), completeTaskBo.getMessageType(), null); } return true; } catch (Exception e) { @@ -171,11 +171,11 @@ public class ActTaskServiceImpl implements IActTaskService { * @param list 任务 * @param name 流程名称 * @param messageType 消息类型 - * @param message 消息内容,为空则发送默认配置的消息内容 + * @param message 消息内容,为空则发送默认配置的消息内容 */ @Async - public void sendMessage(List list, String name, List messageType,String message) { - WorkflowUtils.sendMessage(list, name, messageType,message); + public void sendMessage(List list, String name, List messageType, String message) { + WorkflowUtils.sendMessage(list, name, messageType, message); } /** @@ -597,7 +597,7 @@ public class ActTaskServiceImpl implements IActTaskService { } //发送消息 String message = "您的【" + processInstance.getName() + "】单据已经被驳回,请您注意查收。"; - sendMessage(list, processInstance.getName(), backProcessBo.getMessageType(),message); + sendMessage(list, processInstance.getName(), backProcessBo.getMessageType(), message); //删除流程实例垃圾数据 for (ExecutionEntity executionEntity : executionEntities) { DeleteExecutionCmd deleteExecutionCmd = new DeleteExecutionCmd(executionEntity.getId()); @@ -609,4 +609,24 @@ public class ActTaskServiceImpl implements IActTaskService { } return task.getProcessInstanceId(); } + + /** + * 修改任务办理人 + * + * @param taskIds 任务id + * @param userId 办理人id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateAssignee(String[] taskIds, String userId) { + try { + List list = taskService.createTaskQuery().taskIds(Arrays.asList(taskIds)).taskTenantId(TenantHelper.getTenantId()).list(); + for (Task task : list) { + taskService.setAssignee(task.getId(), userId); + } + } catch (Exception e) { + throw new ServiceException("修改失败:" + e.getMessage()); + } + return true; + } } 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 index 7af9b3f3f..f0c53f7b9 100644 --- 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 @@ -40,6 +40,7 @@ import org.flowable.identitylink.api.history.HistoricIdentityLink; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.service.impl.persistence.entity.TaskEntity; + import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; @@ -346,10 +347,10 @@ public class WorkflowUtils { * @param messageType 消息类型 * @param message 消息内容,为空则发送默认配置的消息内容 */ - public static void sendMessage(List list, String name, List messageType,String message) { + public static void sendMessage(List list, String name, List messageType, String message) { Set userIds = new HashSet<>(); - if(StringUtils.isBlank(message)){ - message = "有新的【" + name + "】单据已经提交至您的待办,请及时处理。"; + if (StringUtils.isBlank(message)) { + message = "有新的【" + name + "】单据已经提交至您的待办,请您及时处理。"; } for (Task t : list) { ParticipantVo taskParticipant = WorkflowUtils.getCurrentTaskParticipant(t.getId()); From e26982f001b9a4f59cff206f3a9ce66dc5c2ddd5 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Fri, 27 Oct 2023 16:46:12 +0800 Subject: [PATCH 085/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9E=E4=BE=8B=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/ActProcessInstanceServiceImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index a9147fc0b..eb2f562b6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -542,7 +542,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService @Transactional(rollbackFor = Exception.class) public boolean taskUrging(TaskUrgingBo taskUrgingBo) { try { - ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(taskUrgingBo.getProcessInstanceId()).singleResult(); + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() + .processInstanceId(taskUrgingBo.getProcessInstanceId()) + .processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); if (processInstance == null) { throw new ServiceException("任务已结束!"); } From 66f749a09bb0ae9bb32e900ed3b7d353a379f184 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Fri, 27 Oct 2023 18:15:54 +0800 Subject: [PATCH 086/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E5=90=8D?= =?UTF-8?q?=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/utils/WorkflowUtils.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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 index f0c53f7b9..e6509f141 100644 --- 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 @@ -63,7 +63,7 @@ public class WorkflowUtils { } private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class); - private static final IWorkflowUserService I_WORK_FLOW_USER_SERVICE = SpringUtils.getBean(WorkflowUserServiceImpl.class); + private static final IWorkflowUserService I_WORKFLOW_USER_SERVICE = SpringUtils.getBean(WorkflowUserServiceImpl.class); private static final IActHiProcinstService I_ACT_HI_PROCINST_SERVICE = SpringUtils.getBean(IActHiProcinstService.class); /** @@ -198,11 +198,11 @@ public class WorkflowUtils { List groupList = StreamUtils.filter(linksForTask, e -> StringUtils.isNotBlank(e.getGroupId())); if (CollUtil.isNotEmpty(groupList)) { List groupIds = StreamUtils.toList(groupList, e -> Long.valueOf(e.getGroupId())); - List sysUserRoles = I_WORK_FLOW_USER_SERVICE.getUserRoleListByRoleIds(groupIds); + List sysUserRoles = I_WORKFLOW_USER_SERVICE.getUserRoleListByRoleIds(groupIds); if (CollUtil.isNotEmpty(sysUserRoles)) { participantVo.setGroupIds(groupIds); List userIdList = StreamUtils.toList(sysUserRoles, SysUserRole::getUserId); - List sysUsers = I_WORK_FLOW_USER_SERVICE.getUserListByIds(userIdList); + List sysUsers = I_WORKFLOW_USER_SERVICE.getUserListByIds(userIdList); if (CollUtil.isNotEmpty(sysUsers)) { List userIds = StreamUtils.toList(sysUsers, SysUserVo::getUserId); List nickNames = StreamUtils.toList(sysUsers, SysUserVo::getNickName); @@ -221,7 +221,7 @@ public class WorkflowUtils { } } - List sysUsers = I_WORK_FLOW_USER_SERVICE.getUserListByIds(userIdList); + List sysUsers = I_WORKFLOW_USER_SERVICE.getUserListByIds(userIdList); if (CollUtil.isNotEmpty(sysUsers)) { List userIds = StreamUtils.toList(sysUsers, SysUserVo::getUserId); List nickNames = StreamUtils.toList(sysUsers, SysUserVo::getNickName); @@ -355,7 +355,7 @@ public class WorkflowUtils { for (Task t : list) { ParticipantVo taskParticipant = WorkflowUtils.getCurrentTaskParticipant(t.getId()); if (CollUtil.isNotEmpty(taskParticipant.getGroupIds())) { - List sysUserRoles = I_WORK_FLOW_USER_SERVICE.getUserRoleListByRoleIds(taskParticipant.getGroupIds()); + List sysUserRoles = I_WORKFLOW_USER_SERVICE.getUserRoleListByRoleIds(taskParticipant.getGroupIds()); if (CollUtil.isNotEmpty(sysUserRoles)) { userIds.addAll(StreamUtils.toList(sysUserRoles, SysUserRole::getUserId)); } @@ -366,7 +366,7 @@ public class WorkflowUtils { } } if (CollUtil.isNotEmpty(userIds)) { - List sysUserVoList = I_WORK_FLOW_USER_SERVICE.getUserListByIds(new ArrayList<>(userIds)); + List sysUserVoList = I_WORKFLOW_USER_SERVICE.getUserListByIds(new ArrayList<>(userIds)); if (messageType.contains(MessageTypeEnum.SYSTEM_MESSAGE.getCode())) { WebSocketMessageDto dto = new WebSocketMessageDto(); dto.setSessionKeys(new ArrayList<>(userIds)); From 015a204efe72e649a2c135d9e1548d5dcb3ba95b Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Thu, 2 Nov 2023 21:45:13 +0800 Subject: [PATCH 087/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/utils/WorkflowUtils.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) 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 index e6509f141..4d8119914 100644 --- 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 @@ -367,15 +367,19 @@ public class WorkflowUtils { } if (CollUtil.isNotEmpty(userIds)) { List sysUserVoList = I_WORKFLOW_USER_SERVICE.getUserListByIds(new ArrayList<>(userIds)); - if (messageType.contains(MessageTypeEnum.SYSTEM_MESSAGE.getCode())) { - WebSocketMessageDto dto = new WebSocketMessageDto(); - dto.setSessionKeys(new ArrayList<>(userIds)); - dto.setMessage(message); - WebSocketUtils.publishMessage(dto); - } else if (messageType.contains(MessageTypeEnum.EMAIL_MESSAGE.getCode())) { - MailUtils.sendText(StreamUtils.join(sysUserVoList, SysUserVo::getEmail), "单据审批提醒", message); - } else if (messageType.contains(MessageTypeEnum.SMS_MESSAGE.getCode())) { - //todo 短信发送 + for (String code : messageType) { + if (code.equals(MessageTypeEnum.SYSTEM_MESSAGE.getCode())) { + WebSocketMessageDto dto = new WebSocketMessageDto(); + dto.setSessionKeys(new ArrayList<>(userIds)); + dto.setMessage(message); + WebSocketUtils.publishMessage(dto); + } + if (code.equals(MessageTypeEnum.EMAIL_MESSAGE.getCode())) { + MailUtils.sendText(StreamUtils.join(sysUserVoList, SysUserVo::getEmail), "单据审批提醒", message); + } + if (code.equals(MessageTypeEnum.SMS_MESSAGE.getCode())) { + //todo 短信发送 + } } } } From 08990a34a0627fcaed4c3d81b7c2dd4ae929de62 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Mon, 20 Nov 2023 21:48:43 +0800 Subject: [PATCH 088/159] =?UTF-8?q?add=20bpmn=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=B5=81=E7=A8=8B=E5=8A=9E=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ActTaskServiceImpl.java | 6 +++++- script/bpmn/请假流程(会签)-leave5.zip | Bin 0 -> 1770 bytes script/bpmn/请假流程(包容网关)-leave4.zip | Bin 0 -> 2232 bytes script/bpmn/请假流程(并行网关)-leave3.zip | Bin 0 -> 2156 bytes script/bpmn/请假流程(排他网关)-leave2.zip | Bin 0 -> 2087 bytes script/bpmn/请假流程(普通流程)-leave1.zip | Bin 0 -> 1657 bytes 6 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 script/bpmn/请假流程(会签)-leave5.zip create mode 100644 script/bpmn/请假流程(包容网关)-leave4.zip create mode 100644 script/bpmn/请假流程(并行网关)-leave3.zip create mode 100644 script/bpmn/请假流程(排他网关)-leave2.zip create mode 100644 script/bpmn/请假流程(普通流程)-leave1.zip diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 8728e8c27..25c005f6d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -151,7 +151,11 @@ public class ActTaskServiceImpl implements IActTaskService { //办理意见 taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage()); //办理任务 - taskService.complete(completeTaskBo.getTaskId(), completeTaskBo.getVariables()); + if (CollUtil.isNotEmpty(completeTaskBo.getVariables())) { + taskService.complete(completeTaskBo.getTaskId(), completeTaskBo.getVariables()); + } else { + taskService.complete(completeTaskBo.getTaskId()); + } List list = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(task.getProcessInstanceId()).list(); if (CollUtil.isEmpty(list)) { UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); diff --git a/script/bpmn/请假流程(会签)-leave5.zip b/script/bpmn/请假流程(会签)-leave5.zip new file mode 100644 index 0000000000000000000000000000000000000000..a5e03efce37dc78f36fb79effe9dd404461b99ce GIT binary patch literal 1770 zcma)-Sv(tv8pYGGg`pV1Z3#t9?7P^P#^@zc(n_d(Oa?#k(kI$uRzufUT8cUj;}e0=*YFL+2kU5Q+`;3%xVUAGT?WOnoXf9z z-Oz2nfg4tNHSWwGAc@SE7lHK|wx*={RkgQDqRDXdj=TyvxmK9A)1V2eL5IX22E}hN zy;ht3Aa60PR;%!~z~ZIBLS2^0Lgd>)!!O_ddHkI4I#-WW)==4&@I*-FfB+#;-G+o4 zJ8VLV7tAL&w~j9e=se1UzLtl-c-*Nbg==?BPEM90biWdX%sCl7}^rvozZ(9BV9<|a~k&_BK6J!P)Qtox7eG6JP~-{hYy|o_D5cUw^OWl ztbA?}M>1;*4)*LXr1o?nr|IPxaV-V-$@F^ayHpA`-MixRo!61HY7-9Co!i9X{6*6t zBX^9VHq&)dgXkjcw3VYVtPvekeAYBB;?V9-Ufa)!K_ZsTc7^_?(}C3GJZ8n2%=1LH z7CXw%U~?-AG8W~m>QN(QtQ7R!z3iRFvHnjN^gqp?sT#V>?Ss?zGCw>%nA7w+ijL%b z>~wbMj^5?aR~NmSieu+++%>m)kA0xOLJ>){EuMKxW!n|$EhSay%1eAN+nK2Th-?Na z5vU+ophFOy@R+@ZLG+*kf?v2fj*U)gE%%FScIvW!Lz4~L%P&azZIx@EE2vD#PSj5l zFQsNEJJU0}zVj@_?d}scsoN-?ev9+4t8CK%F;->ZRLe)#z8sX4C=A_O%@84bOhi0~ zfdwd!Bno1le(mOM&zVih7D+diqi8w6`RTmBQrF~N!aaTirDtFI@NPs~8(+DR8jMno z`oRj(jN8ZB`L$k62^`}picmN!Hh*lmcVgSGsP;#uj?8i@0XEO)I~vH%JoF>rCGdR% zOWX&Z_m4U(fKki=9aV_B=8rIulCE1lEe}aR}xuJ$u$IZ%K!>TLr#Ypnwnw{90tp5DBd!w3wr?}x36 zp<8f4#vr*cafW4Y!iW$Pby0QvHMPu$cT82$;`>L|3HfeLPFlp#QxP4xoOFH+@IKwr zGb!nI{TtD~Y}^F)_p);{_p%tqOSCNOUWk%E*|**$C&7O#9)6AVP;mWmU+G}^2TwYF-RF?A!9SH8O0dgSd(m#mX7a3j;xjaIS{=)q_0;tU(uD%K%S*PBUoGxl@NHd zBM(gUGc>Zbn>6QSEaajvTyQM3oKayfq{JCj8$OEGe%KYKN8OuVrL)S27G`mG;vm;W z9VnyS6~iQSdA-XN8YS2g;a@E#sWO@c43oanGe`jUv`DI6t8N`emm|g1n`~slu?{6k za5-Li1vD143l-ai&e3gJ+;d@u0)_iwUgX7ELBq;RmlFtvmU`<4f^BuGFt%0~8o!bcG1;P~Olp>l7l)9me*6+X^dW53nwEWn48%lR zRo?|UV$B8*r#7MzjbxYjSb^j>{p#$2-nNz0fyK&m!e#a|tL&25L;$GJt4=u4{(YTH zM#=2D-bsYu0!Y0ZOmPd}2;dniBMMFVR@GZi`8p>#dT)eJg}ziL45&1QBDT*hO3da- z64Jn0lRa0o%!vPjHH7d7Kl|1f-Jxto>|&gsmk(}k?3M{87nv=<%!vHK&7N@r!7fdU zG8O<_k=?2j$Kb)2+f)QHt<$&$$ubX4d2;0~%%0AhJ}bGv(X+0=B{~^Japq zcI%65+0+}xV5i9@#mCOe7ASZ)?h)~F;>6tzdKAf$pCB}R-`=_NKX zu4=T1QKO=ysz%Lw5v|dB+fVO(KfdRD_@DFqpXYr3!K_%>1OXrr2=JjH*b(qAL4V}+ z7i}x?DXT53ZuAN!X@%6WM#)-9BJXymDkHr;L%lUs?gjXx)S)V2{>W`-E36px zV$Y@{)Rgq=*6hLk#x9zE0syCMnkGE}O;np3F3uNMFPam10tn=X@OXjMJ>K20(FOe( zgpP(j0ps=_Hv2^Fxm%1qHQ~_(x8?Bz+4(q?hCY)vYL7Rj2NzZpj|<+47}uvYExFZ&gogTXAG;!;8?BRN z@V58!ZHq`xv{bX2|3bttFG?Gt8M)@yedDn?m-+>1_(E66zRk&9<`q7OpRlaIR`rI9 zwFAmvgPT_VB@%9KXCVJzQSvZ5$oG4P!1Ilzvx`MSjy3=cX67gvNc$ z@0YhHB>3noOokzdxL3vfuZaz!ZRaGW?FmOcZC1Vao{i%}!Uz-ZO7;*hMW^s-HbVZ| z{K~J4_IusW_V)%1qfW5ARIFsw+1B!~twHDM24ndwD&lD38pH79KKWvGe+Rt8OCXFq zk*cTz$J5=-odRlc^&Zb(N!&^lCwh_w;T} zucLBepvx~!(P}&(sh2H4Ss0+7Rr2dpf4rCUU#*U{(C=Gf4TJj-+n^cQ>f08~bO8xx z#cK-~-A^MtsRAsiM1Y_SFUV3t%DCiM>44={AUR9;@LP>uXEMq@(bv=*{^?u|y5m+* z3LST>!v@V!DaHG;zIFkjP4PY>E*oK5uSby`;10f4hy;}bEdY||`c*0#3tUa))0p?n zXG4Io*`d4O4BKfe;kRNl5slB*;VK$;*T6$%nXCx_K4M5Y9uy~N0K`*?n@PZGL0ZwL zVOwhKx2-OQ!S|hX>Zti;WMoz*166)-PLqj`V0P979Us|(E zMcmgfBv*Ve#Hz$3UTUN#d@r|P5=eqXkxD1j>9&_>?04qZ{)ew(j~2f6JLbj4hG{HH z*@jPYWu>u*dM8|baFcT!&K;>Zf4hP}%u|tRDLfg;az^OaJgb6}GF(gAb*6MVBiLYY z6R8?yKx=A>zAc};uR_%6!Q9FK*1hWxF&iV~8tE-THo?w4F)6OCA>CK;?gV!n+oFjA zUsayriPLI?y+#)*2L4iO^U_;?0+pp|m?T`p|1!=547?fT-mxHbXe|xi|@IiMT-JaEthz^k%-E<$J5_ zz~FG}AoA(q9{7dqT?pSVA*JWRp8T*9fe*&@V*PQ(hB^4L3VDI8w%!=MnB%p71{l3G z(hKtDnNcW{C7ER@GA^K2pc1vWU&l2Q{_ED-`fbz`>JHdubi`-ygRV2HGg=#?E=Y621~2tXhR7lnf17 z<-j_DL5fJpbSivIo6eXK4)-if7;4=yR~-FF>%2&2JcO_3XHlAxFn2^#QsZ@-*lN4m zYW${W1+~8k?y_AYyUQTj3$iGMAs3v*?UTVm`IgC5Nf_w)`^Eh_O}d^>QLa=z0b#W* z#0;SA@AmvIn<@&Eb9X7@+np5#nD>kWX2k(2K4fuP$M zFGPFVOvqirX4g@}A2418I*cLDC))N1T!~1wnHV1>#>47MN=l~gKXV}&AtsVzX~ezl zwGPk9r`{T>^|LYB*i{!5Jzj86gzaiE-4}EV9v`u`n)I%UeOi?*Y-8K(!+;MnU#1PH zu)joa_|QI_PUCGIO8$AZ`DtM+s-iCL(It%qZ#cQZT|)@`DAB4^GgyT+zhb4S%`aY7#G@5r%+p13i$=TuPR!HX%t1P-vP*U{ZC zoLRjd0ikzL*)Fo*KO8&m**X>ci6S$^_(|wjcOS>O_eGt}@2R3f1YS@=HvVc1dMW6C z%DMAkf7Vs*aH}Rh?n2x;i{@H#{U_t*%|p)i{9)XE4pW;N%V`TbBV!Gw+&x#+Whz}f zeO+nk(E}-LStZ5v{e5b0JXX}pam^B8hL2X&kxOMR z*guxjMCc_5QBT*B*s(Zt6rKH=K`WnJ&-srV1`r-1*2ZI zmk8ycX_R;zmK7alqW{I2p0-~BO7#Qbx;B9smY5bkrG=ARP5O!o!mVp!?2qsTdQA%*7f8&@aU@G<3TDtjuQL$X@i4##(Y4h)y{K=J5;t@LzIq#2Supb5AH;#eGziZ!kD3 zd;|lPEFi94Zg8$P1qPZ;*b%;qD?527`D%X?&C<0l>gCCHvnAcq+8@DZZ=gyt4>zVg z;nXwqsKl1Q@&pQPt;kBa$t0>tDC!!K+ zyS|Y83sNo0N#PAJRA`qhP@Ho);i5E$-~{mqr{h!i`xf*V@@-`Paf0EM^R4QFohA0# zCo8Z`MCfDZ-mg|>7FI9nS79h`CX1#_?3TAC(b~?z& za5s~tKqg4Y+qiAm)B#^U{5mmGiZ~=`fwUO^Q&|- zr;Nq}j=NSR(8>QLcNWQZo<=n@Q-b#w)8jV(47s`(x;7Zn>_uQvXn||~q3NdPxm9AtVUIWMr}CfUk^f!r4pn zinM_8+>1fVc02Dz`^HD}y(@V`39H+1gn~ka$J3&JDt7v9@4dBf8D^lIUjsg%m(Sd5 zQ7k=V8UeLF4 zYKG3JG(Zt_PN< z=D!LPqluAwUHtQ}3Jr4kyFX+^It+8$rxLJgCcAA)NcY*{Qu-oR9hyMZZyI#iPAH}A z6`gpD^u_C3@Af&`qp8|)jCz+V66=#-^7@ZF$T>mE-{R+>{`jd70%vt^u|0BD>jB<^ z6;bc3)qB+!anLUBL`j_@6t5;fXY{inx^kD=S`D2n8V2E{dkxiFCVX1 y)srG#0H9h80D#$X9RUIU+x-95emDRB;{W{vV0K53{Z8QeHD15=&abNgz<&U3CNSgx literal 0 HcmV?d00001 diff --git a/script/bpmn/请假流程(排他网关)-leave2.zip b/script/bpmn/请假流程(排他网关)-leave2.zip new file mode 100644 index 0000000000000000000000000000000000000000..7555193a564bf0073f552c10bf0662617d59dcc2 GIT binary patch literal 2087 zcmb7_X*d)L7stmIr9p-4g-By<)YzJkR2qAhGFjg&VJ1t+GU5(no2(II%RWP{?3rQ6 zWQi#ae}9P z?iGvPu5*hgr@ouLuiHpxJb&SC(`AXBQkUV4eS53X339R`dDKOOH<9)Z;eOU41;Uqn zRWv@9XaqOpH5IH&`JLxn6FuO{PFDyi%P}BraGSY7lW=+oEQ1+6?~i$m6`j;w=$uh% zrjN+lB{!PC1Q;o-Z!^t!xW`5U?#?}9NPm`XJKbYb4N<~mCT11(M&pE9ooXo*3iIU* zLg)s=0sMR=Cz3OsuRa)8X{I(!+{)2JLMp-Vn`TYt!V-fn4qkF!`cj)8HpOW;^M{J% zh!%3N&5q?k2->^M}~7U2Qg*F zaDoF@dZ(Ax?FFBz6QXczD+UZ%J>FZ^atR64Z#aK*6J@9|mkh~Ee#MZ+)H}1a6-<4t zF#IFF67}H!RIPVb9q31X-#mQ~r4_!xu3>dPS)Y7lX+_T6V@-G$NAHYnxq%qUUYUlIv}!*xB(rZGmsxl z1)b-vr>?~kyw(r7f|v2KF6dj?5IBLHqOev%dd| zOfU6{9Cn2ecB=(}i}7YSy#rr}1^J17_>c8@;bL>S{ki3};u);(@`ahE-ts*vkoH!f zi6WtLmr`V2=QH9$hvnos)uF_1)dnjNY$rh_&*YE3Qfo#S+hqpF#->0|iS*Z}$fOV} zbF-;gho7x>)}ePpte>u+rNXI>d{PFf)%!)K0js-qP;fCHmcyF`#=Ay62J7vN&2J|7 z%}G6_%|$e7=|gvZ^qe`U#GRX4{ziFUEH}KjiAb$zb`~^=!wvUTJGz7Li2<>5IGHC` zwwgRV+iTL+Ic{H zOIN-M_`u0YTyO0pSw!A9!zF-8FF<^nMaEXWs@yP)A|}js>geTJ`W(uemtuY-o$%bF z*tY9pQ|wT@FEc}*jhh60x;SK20g)M*YANlqqI)xcZ_>Z_8cq=L_z3E%Ad974-x zZ@Pzx{tQ+T9NJE?X*cRP8$deUJJKJmk~|&duNg8A&$+C&^rrEQkmFokeKNZz)XyfuW!LeO zGk43E`FruTI&WP8`Rd&m=5d`?!D$FdnI5t3dN>Yt1xRal_bT~fVJ$l$CF2IKYw()( z7c|Wv^5rpwefuF@;|5FBueTN%m9OO$CNS_SgL?^ZR&J*hQabz1PROU)G1uB>L51XH zZn`);28z-hc#Tu~oQ^yOe@tAm_S>pcS~TxNq3S26brFht#vGI$v8q%zp*eJGrJ?DA zLlxtlx%gkfjx!n#js>y^Sxg_rxLg^qa0e5RRfG24HEzFE8IQ-U)!8>0S$6z53C-i* zn*8K90$OG#751gt4<4qF-qYp>E#riN7UfnIFriwxKTcF^c1Yuc@Wpkta7bp$`-KXY zC($JWO&`vm0o9kB50%X$J@mJ3$ZacVB%ldn=U$Y1N8^mfpzdB1D)cz{T0^Y8EF}J;(3yT1tB423pz`hb`LNZ8TEtAGaFDOJ*OY6zvy13D^7)ng@?{pp zUy7s%FXPecuwuVii!}{=cYYCl>69&OiX63h$?)t_yiVfrj!wLzf{E3#KA5PC9Kcs^ zT^P8{yb_*)^7Lhe9dlHD12bgl_|Z7+i?Ux5Cd#;+;`riX>7rQ*2GCtvx$C+y315`Q!P1&U4Q5@8=wD4+si?!C+vj zi53L>Eq3qva&x;hCr{RvBfnFq?71qt{*B@i_fO2Xp^&1|Nk?o6Nr_Z@JKKyz$}B## zbjBUZR5sf&V^}RG`7JkBVW01nP(#OIMgalRfqVI6g4WFRYMdve>uN#{jPhSY5b43OR&nCz8ImnO8vtmo=JUN6B9#uWyrJoyG>wmfS)T6*9 zt*A^~52Ig$o59=;o4B3nYI2Km{-B*Zhmv1)bPfAr>v>XeA!98B+P>mdegB25ZdNDF z)LUO@FH}afR>6~t$omivb*Xoj>`dJR%tX38rQvkuey|v^C5Bbi?o9YeWxdp+o76M~ z$ZxkSn!1%4)#2{sy^aoh``yF57RHpTwfGdmR|B z=9R|P-|p-xhCEBZ8{DqdM?6tW)RQDLCNfT?7LHgpR5+#mLgvU~*blTEKeGJHMo+&y z7$DoL)i*jl2uM8CE!q=+Gic{+S+(B9d>WV4kE5PN?VWY!zHkHb8vz7QpL0b447MTT z2(`=ZHdaM_Z*p5+uc$UgXk-D6#dM04)Z&*d2hxi4hAcE6TzL-s7o`)&{YE_ib7c7I znkg787g4J0rYVg&j7<5LI^u|Gf{spWL;+DCDk1^b`YBfTHFf(jIai<{Bq6f=F}rLh z`PZct7mpg0@XT3w_oGHarR`eFR|x3`p)19O4cCr63i)3I zC|If$ZejGn;mL}XzF^|cTnBY}z-W>!OPnD2F4}Ued|l*i_Qf70Y{lsCH+o`Zopf3x@T#mb(Peyo;_r(NmI~9E$D@ zkGm^o1s|KnxpK0a2>;=P5f-5JBz?lCLUqb{Oz`n>ZM!hM21`g5*>u+@cGcOPb^apd z)f$_9KnXvY+2X^$FgSjrTCw4)`X2i1$)&~ki*S#9zx|?ERxOTC95@3}!Y{7R`n)hM znNK=BH&VQgq3ygLUfgzR-g1>06F)o|>LK&o`4&NTZ8Xd~1n{^zWkT~)c_L7lp}oM= zY_is5F_Dr<=~p5i4LtA@M#n_s7hP6IQRslbY*oexo+IOO;xcgaaV_P+Og7uWpYzjNOzB1l6`+OW{ z++x$P=Je(Cykj>WtilsaUXyQUIYs&gj(*2!^T}K6?k@>xCui9tgqk+hH7L=I zCCwb|z}&+@rm%+#5Y6&Pt>PN`RH=G;cZ?0YoKwOnHIvZ7ktW4^imcNx9*r2}aJ+9d z6CsW!TjKF2RH^;gA=FX<N+tx>!_Yz zervpOlc>&-X{BgKcGjUL*rfxp3e0EySOfH}0!TVcz#8lFmo_BqDXNK>_`Z1Kd}qGn zcS9pjRe Date: Sun, 26 Nov 2023 20:48:56 +0800 Subject: [PATCH 089/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E8=B0=83=E6=95=B4=E5=88=86=E7=B1=BB=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ActProcessDefinitionServiceImpl.java | 8 ++++---- script/bpmn/请假流程(子流程)-leave6.zip | Bin 0 -> 2182 bytes script/bpmn/请假流程(边界定时任务)-leave7.zip | Bin 0 -> 2172 bytes 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 script/bpmn/请假流程(子流程)-leave6.zip create mode 100644 script/bpmn/请假流程(边界定时任务)-leave7.zip diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index 34f65f5d3..bb8af2405 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -20,6 +20,7 @@ import org.dromara.workflow.domain.WfCategory; import org.dromara.workflow.domain.bo.ProcessDefinitionBo; import org.dromara.workflow.domain.vo.ProcessDefinitionVo; import org.dromara.workflow.service.IActProcessDefinitionService; +import org.dromara.workflow.service.IWfCategoryService; import org.flowable.editor.constants.ModelDataJsonConstants; import org.flowable.engine.HistoryService; import org.flowable.engine.ProcessMigrationService; @@ -55,7 +56,7 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer private final ProcessMigrationService processMigrationService; - private final WfCategoryServiceImpl wfCategoryService; + private final IWfCategoryService iWfCategoryService; /** * 分页查询 @@ -205,7 +206,7 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer return true; } catch (Exception e) { e.printStackTrace(); - throw new ServiceException("操作失败:"+e.getMessage()); + throw new ServiceException("操作失败:" + e.getMessage()); } } @@ -280,8 +281,7 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer @Override public boolean deployByFile(MultipartFile file, String categoryCode) { try { - - WfCategory wfCategory = wfCategoryService.queryByCategoryCode(categoryCode); + WfCategory wfCategory = iWfCategoryService.queryByCategoryCode(categoryCode); if (wfCategory == null) { throw new ServiceException("流程分类不存在"); } diff --git a/script/bpmn/请假流程(子流程)-leave6.zip b/script/bpmn/请假流程(子流程)-leave6.zip new file mode 100644 index 0000000000000000000000000000000000000000..ded3cea9216eb9bc229ed475d7cd841b77cdd384 GIT binary patch literal 2182 zcmb7Gc{mh~79E69wxp7M%Mzv`CQ{5~%{s`QHG}MF>|!k086;we##&>`(%6?zW2lhb z7;Ba?nz0rUp5FJp@BQAN@7zD`x!*nK-+K>SpWzHQ00;yEHcLY-0sny9DgR!BUx|ue zZH)R>k-X8Cuu_%&AD$@Zg>VW)KtRrZ-aZOoP_VZb)kYu9M?BxLZV7I?N!lPf2Nlpl z0CeKE30cr6C!m;rwyL~}OP@8BCYQ!08OOdQ!XexV&C!e(20AkK6(+U~OGk>_(O_3u zW_@Gds|Y~_TYau=eT$>uEGM`3V{pT@KX1Pp%zPX=qAf7xLwMvnV?5G*?@$u0Axsv^ zpHrm~-R|YN1ddiBq(?~i4sU;w(3z#JtRUQO^CEjkVL_0@FuR@2?sz-a^RcX>v>5cC zg@`btCrBmziSM9$us9LTSxF9>I;DVE3>06JO&+mt!%{jiZ)d_G{0`bfaa)<#KiHxW z$d%HS!9UG~O_arxijsQFK|9r@!$D;Gt)}XrjaZ!|V)FTZL>4;;3;Tf$3s=hRt>^Et zyRR!f{&XAsagfR~jO26^(k>2$B!;e&Ck-IEX<^xo0jRGpw-l4hC8>VzN`DTE8`+|J zFOS;Kgo0_rp5T`0z0r}HU>%#GTkVq`0@wE&xz16*X|ITFvwBrLlGMn~gG0cYcxBTCtmeyS`TXLS*z*|>K8)tT^Wb0N0?#4JUX|| zh(wDNeF=v8V^IoRpHT8k`eSN$Xw|xx+d!^cyN?wQk^T3e^EX9z0W9Kl+|mpUoAO;i zg=i_I-dfXR%>2>#+szu^j(+Q$d_9pRhX+$lNl#kka>K--yfz)0A#1FOjrxs80xe6Flyhv{))=!<1UdPHToj zm>}xnJx4A)5|a>&@KwT4@w$+x(XI9^ce{!M6LwLyV(V;7r1~45<4wvcp~mNUmoSjr zImQ22og`usVpf+g2&aqnWet;QvKl*wil_3p~HL|kqdp|r*JsmF~lMV03GW_0sb z6!c>m9U_MGz3Vzxvr%!vlX6VrCXQxBZG3KRnauy!MZGNdu zuOSW`7KI2Yo^ZfMr<|{Sgab9s&|jQV5D{nKB}Jr4RWWMbKhT}DF(`NSswW^RExfj$ zz3UDIS>6fL^9W8A<)|@p$&hIZ42h056x4)EkmoVPCFoiiKJyMZ4~lJ6YCvc+HaI7w z17aHEg(W6vl@hJChBb}9*jcC+br%d%&nhvRN|Wa_4s{+r5{L>`Ue-K}&B*)V6B3{i zIN31gC%0A&y3|^2mH8C~6r@iH0Z8p#0mJ&BJkFP#zn^=vZYhh`pN|6>ToEn_8uclf89G$I*&s`PoLC+Uzq5@|(w~K&3$t7UW%}=cB<< zR+1Wm22^LTfsE^K_p@+{&KDcNl7g*jbd4^=rzRkiu&W7`N=4j<3E;)3bVr|gFZ(aB zz8y>LH#+G~WpgNqZI^^FhNMWRH`*p~!FEzy9zaUUF!n`qj_u%V^`>f3xG~HnWl(tp z;Zry~G;2uXNSxQ8*yOd|%F&v0I{r(`-AzB9(#J9<&Wkd**AD%~Q+0z*r&npmy{^0G zDW}CNQ*a1HjsF4Rf&9iDg{9;MbD~iR>L-#F@)B}?__h^?iZNk7(`$W-+eRJpk@G#8E<9Y5YtVaAdUSD^xXJW z>CP!QH&oD4&qSDQX=(p6lSflU?iQ)LQ^@(+Vx`k6=yICNCz;K*r@x5p#!G9@pF?EE zJRTh74y>-@c0i$g-T{pzv$cW#$SZcny@~D6Wmv4c&M*QGAk1{seYKQ{p3S#dY{G=H z70$%cHk%AtJvW;&ykp$#&EI#|zdI1`Z8~Uo{h&k0gR6 z-a26qP8u)JeqmrUnC=EFSq|8;C%6q z_wE_|d*ksr))xYsQcZP%cVCj$$uLJG-|(0tQmi%EB#yH|s;>PZZd#dNwrM8fy151+ z^#>?h!n#bYkI^h^qwo+eSb}rR;#ui%mC(~3Fe*;-n;faA5y*e zBruGwH&A^r6O-tw01kg^t*ra8qEc5bB`lERF2s%poBCfg(ggy&5u$n(cH#Jire6W_ zyoDUg>l*u`VZ_;wLv_X{=ivIxz`o_?-!04lz^Bu{57(!o=LY;Y7W{MfHx~Ra{;!Y# T*JotmjX>%<{ literal 0 HcmV?d00001 diff --git a/script/bpmn/请假流程(边界定时任务)-leave7.zip b/script/bpmn/请假流程(边界定时任务)-leave7.zip new file mode 100644 index 0000000000000000000000000000000000000000..bd553753af1a443ee96e3faa6949f8f007f878b2 GIT binary patch literal 2172 zcmbW3cRUo18^_PcibTa3Me43(W{*-L~`nGQ3W*uW97pk@$~tmOLw_;3WEJ}eSa z!j-eBF?(XE9-(MH6vfiU{i8If} z4+n9pw=yDWRq**(TaUqiGU=GieQT+mG6^zLgxHSc&~ua8&3x|Z9t!LnQYdz16Ru-{ zo;bB-oEE9MdfS)O#^^9&yOZS?9MGteG^NC^DeDy}cR^Mfyc48aM^)H0y`gF3m-vbl zkpYpHO6gIg)&@mV!toh8^PDp2%*O_bbLl6uv8dyX(3IZxLMI188kP4|Q{GUtUq4Ix zyQCj24VQhbneFse_RHfBEBW(*iPj>_H+pM5UdE6WW7{#** z-Lfe|wa1pNuJNAoqiNkM_taE^PH4YV6X2(N_nhIu3P-!R5vkLI)%mCU^J`Q%+Nw;G zAt0ZhxtnGFx*9ayW{ABAY%s4erZ2M)UW^Iu#W%Il5~V7`)1*YXJ8mb&A$y)oC%#o4 zTkk(KL6xrA=6ol4Y_ywPz|s}H6?vDI(+%RD!rO_s9%S?B*n7o#YY(7L{WccH{N@Ti zcYrV5*`@0^#Gc7yl7^hL1;gYe{5wuDfKxD|q?QVmXq`{b&x zdnD%DwPxr$hx&W&(iENHA;G(}Y06wSDc)=n+v*yoYe`_i+QjnP@rGF+<00iPUu`C@ z^oi73{GJycOU=A~S4BoRi=&8l|LH-S_@FwT7pfVuC`+uX+RGqC^ZV^-qVu!Wn?sI&Z6OWcEZDdN0AcwtvMznLi1a3282bt6}o`nz= z8Vee5#9xF4+!vAl1_Xqnekz$L_nNig>nF}{xz-ynX66X@0Ih+p5l+Ja1GRfWyUP)8 z6l0ILq?0Vca*c&?H^DrxM|=!kQ|GpT5n^EZoK_knc2vyBJ9gB5*j`JrM)1N7mZ+<5 z9F+yFBIG1IVy+o_JZCZ>%TV5mPatwbm3mF)3QL%t^jj{xmNx}+beT_6NNyyhV-1aHO}bcd@8s7Uodn^ z&y>)I0V8m!4n~~n`;?#ceZEJ+gT)mm$CQoD_uF&F2egE_O!VQz1Uz*25bGXcn9cdm zk*Hqv_Sgd)CUe_x%|d*`T~;XD5w5k}8HXxe*0vKnr<(rxHFb};{jrH7n{CE5@`=2@V5^||<(jXqc4sm?9=J%n)4o(tL_p3q_STpAJb{z(M0bfl0q$kNQ!4GuljbTFS|m;l7x4w4$>qWo28s zD4JWe!Vg^`iRwXDFwGdKXJ<52U4MYSPZ;Sb0v1B+&ah$r`N0nZ778_7iFb{=-6J@{ z{d*JO49wRm`?R#$#+NoO{+WzTAn=fB;7=ejtz%Y`49tRsNa#El%L@#vSMS$bdMtKV z9*gQx9vMb)pmx9}Ak}U=kr5{M^sd8TNT(GXnr*Q2+p{M@N4V@Lvb`_wBC({4f8X5kU3MF#Y{Q_h+8| K+4L-b+kXJqoHOeH literal 0 HcmV?d00001 From 2133a72c2958bdc70b79cafac326cab7660c62cf Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Tue, 28 Nov 2023 13:15:47 +0800 Subject: [PATCH 090/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E8=AF=B7?= =?UTF-8?q?=E5=81=87=E7=94=B3=E8=AF=B7=E5=8C=85=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/ruoyi-demo/pom.xml | 11 +---------- .../workflow}/controller/TestLeaveController.java | 10 +++++----- .../java/org/dromara/workflow}/domain/TestLeave.java | 2 +- .../org/dromara/workflow}/domain/bo/TestLeaveBo.java | 4 ++-- .../org/dromara/workflow}/domain/vo/TestLeaveVo.java | 7 ++----- .../dromara/workflow}/mapper/TestLeaveMapper.java | 6 +++--- .../dromara/workflow}/service/ITestLeaveService.java | 8 ++++---- .../workflow}/service/impl/TestLeaveServiceImpl.java | 12 ++++++------ .../resources/mapper/workflow}/TestLeaveMapper.xml | 2 +- 9 files changed, 25 insertions(+), 37 deletions(-) rename ruoyi-modules/{ruoyi-demo/src/main/java/org/dromara/demo => ruoyi-workflow/src/main/java/org/dromara/workflow}/controller/TestLeaveController.java (92%) rename ruoyi-modules/{ruoyi-demo/src/main/java/org/dromara/demo => ruoyi-workflow/src/main/java/org/dromara/workflow}/domain/TestLeave.java (94%) rename ruoyi-modules/{ruoyi-demo/src/main/java/org/dromara/demo => ruoyi-workflow/src/main/java/org/dromara/workflow}/domain/bo/TestLeaveBo.java (92%) rename ruoyi-modules/{ruoyi-demo/src/main/java/org/dromara/demo => ruoyi-workflow/src/main/java/org/dromara/workflow}/domain/vo/TestLeaveVo.java (82%) rename ruoyi-modules/{ruoyi-demo/src/main/java/org/dromara/demo => ruoyi-workflow/src/main/java/org/dromara/workflow}/mapper/TestLeaveMapper.java (61%) rename ruoyi-modules/{ruoyi-demo/src/main/java/org/dromara/demo => ruoyi-workflow/src/main/java/org/dromara/workflow}/service/ITestLeaveService.java (81%) rename ruoyi-modules/{ruoyi-demo/src/main/java/org/dromara/demo => ruoyi-workflow/src/main/java/org/dromara/workflow}/service/impl/TestLeaveServiceImpl.java (92%) rename ruoyi-modules/{ruoyi-demo/src/main/resources/mapper/demo => ruoyi-workflow/src/main/resources/mapper/workflow}/TestLeaveMapper.xml (70%) diff --git a/ruoyi-modules/ruoyi-demo/pom.xml b/ruoyi-modules/ruoyi-demo/pom.xml index cc694f4a9..6e07a45f1 100644 --- a/ruoyi-modules/ruoyi-demo/pom.xml +++ b/ruoyi-modules/ruoyi-demo/pom.xml @@ -63,11 +63,6 @@ ruoyi-common-excel - - org.dromara - ruoyi-common-security - - org.dromara ruoyi-common-web @@ -102,11 +97,6 @@ org.dromara ruoyi-common-websocket - - - org.dromara - ruoyi-workflow - @@ -117,6 +107,7 @@ + diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestLeaveController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java similarity index 92% rename from ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestLeaveController.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java index 9dbe6ebb7..a65aa6acd 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestLeaveController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java @@ -1,4 +1,4 @@ -package org.dromara.demo.controller; +package org.dromara.workflow.controller; import java.util.List; @@ -6,7 +6,10 @@ import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; -import org.dromara.demo.domain.TestLeave; +import org.dromara.workflow.domain.TestLeave; +import org.dromara.workflow.domain.bo.TestLeaveBo; +import org.dromara.workflow.domain.vo.TestLeaveVo; +import org.dromara.workflow.service.ITestLeaveService; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.dromara.common.idempotent.annotation.RepeatSubmit; @@ -18,9 +21,6 @@ import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.excel.utils.ExcelUtil; -import org.dromara.demo.domain.vo.TestLeaveVo; -import org.dromara.demo.domain.bo.TestLeaveBo; -import org.dromara.demo.service.ITestLeaveService; import org.dromara.common.mybatis.core.page.TableDataInfo; /** diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestLeave.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java similarity index 94% rename from ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestLeave.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java index a11352f6f..a1e56830e 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestLeave.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java @@ -1,4 +1,4 @@ -package org.dromara.demo.domain; +package org.dromara.workflow.domain; import org.dromara.common.mybatis.core.domain.BaseEntity; import com.baomidou.mybatisplus.annotation.*; diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestLeaveBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java similarity index 92% rename from ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestLeaveBo.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java index b0e40f8ce..7352523d1 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestLeaveBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java @@ -1,6 +1,6 @@ -package org.dromara.demo.domain.bo; +package org.dromara.workflow.domain.bo; -import org.dromara.demo.domain.TestLeave; +import org.dromara.workflow.domain.TestLeave; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestLeaveVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java similarity index 82% rename from ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestLeaveVo.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java index 1d510c1ee..83d4a6441 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestLeaveVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java @@ -1,17 +1,14 @@ -package org.dromara.demo.domain.vo; +package org.dromara.workflow.domain.vo; -import org.dromara.demo.domain.TestLeave; +import org.dromara.workflow.domain.TestLeave; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; -import org.dromara.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import org.dromara.workflow.domain.vo.ProcessInstanceVo; import java.io.Serial; import java.io.Serializable; -import java.util.Date; /** diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestLeaveMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/TestLeaveMapper.java similarity index 61% rename from ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestLeaveMapper.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/TestLeaveMapper.java index 8275f696f..55b6a8e48 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestLeaveMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/TestLeaveMapper.java @@ -1,7 +1,7 @@ -package org.dromara.demo.mapper; +package org.dromara.workflow.mapper; -import org.dromara.demo.domain.TestLeave; -import org.dromara.demo.domain.vo.TestLeaveVo; +import org.dromara.workflow.domain.TestLeave; +import org.dromara.workflow.domain.vo.TestLeaveVo; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; /** diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestLeaveService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ITestLeaveService.java similarity index 81% rename from ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestLeaveService.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ITestLeaveService.java index c9993fc25..380979ffb 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestLeaveService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ITestLeaveService.java @@ -1,8 +1,8 @@ -package org.dromara.demo.service; +package org.dromara.workflow.service; -import org.dromara.demo.domain.TestLeave; -import org.dromara.demo.domain.vo.TestLeaveVo; -import org.dromara.demo.domain.bo.TestLeaveBo; +import org.dromara.workflow.domain.TestLeave; +import org.dromara.workflow.domain.vo.TestLeaveVo; +import org.dromara.workflow.domain.bo.TestLeaveBo; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java similarity index 92% rename from ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index 057bff8e9..dc2055ada 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -1,4 +1,4 @@ -package org.dromara.demo.service.impl; +package org.dromara.workflow.service.impl; import cn.hutool.core.collection.CollUtil; import org.dromara.common.core.utils.MapstructUtils; @@ -13,11 +13,11 @@ import lombok.RequiredArgsConstructor; import org.dromara.workflow.service.IActProcessInstanceService; import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; -import org.dromara.demo.domain.bo.TestLeaveBo; -import org.dromara.demo.domain.vo.TestLeaveVo; -import org.dromara.demo.domain.TestLeave; -import org.dromara.demo.mapper.TestLeaveMapper; -import org.dromara.demo.service.ITestLeaveService; +import org.dromara.workflow.domain.bo.TestLeaveBo; +import org.dromara.workflow.domain.vo.TestLeaveVo; +import org.dromara.workflow.domain.TestLeave; +import org.dromara.workflow.mapper.TestLeaveMapper; +import org.dromara.workflow.service.ITestLeaveService; import org.springframework.transaction.annotation.Transactional; import java.util.List; diff --git a/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestLeaveMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/TestLeaveMapper.xml similarity index 70% rename from ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestLeaveMapper.xml rename to ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/TestLeaveMapper.xml index b5b83a579..e824e3f39 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestLeaveMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/TestLeaveMapper.xml @@ -2,6 +2,6 @@ - + From f943409382639895e48c5d42509daae493bbf938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Wed, 29 Nov 2023 00:34:43 +0800 Subject: [PATCH 091/159] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/ruoyi-demo/pom.xml | 10 ----- .../dromara/workflow/common/PageEntity.java | 14 ++----- .../common/enums/BusinessStatusEnum.java | 16 +++---- .../workflow/common/enums/TaskStatusEnum.java | 15 +++---- .../controller/ActModelController.java | 39 ++++++++--------- .../ActProcessDefinitionController.java | 30 ++++++------- .../ActProcessInstanceController.java | 22 +++++----- .../controller/ActTaskController.java | 31 +++++++------- .../controller/StencilsetRestResource.java | 21 +++++----- .../controller/TestLeaveController.java | 35 ++++++++-------- .../controller/WfBusinessFormController.java | 33 ++++++++------- .../controller/WfCategoryController.java | 27 ++++++------ .../workflow/controller/WfFormController.java | 2 + .../WfFormDefinitionController.java | 13 +++--- .../controller/WorkflowUserController.java | 13 +++--- .../workflow/domain/ActHiProcinst.java | 7 ++-- .../dromara/workflow/domain/TestLeave.java | 5 ++- .../workflow/domain/WfBusinessForm.java | 8 ++-- .../dromara/workflow/domain/WfCategory.java | 5 ++- .../workflow/domain/WfFormDefinition.java | 5 ++- .../workflow/domain/bo/TestLeaveBo.java | 17 ++++---- .../workflow/domain/bo/WfBusinessFormBo.java | 19 +++++---- .../workflow/domain/bo/WfCategoryBo.java | 19 +++++---- .../dromara/workflow/domain/bo/WfFormBo.java | 10 ++--- .../domain/bo/WfFormDefinitionBo.java | 23 +++++----- .../workflow/domain/vo/ActHistoryInfoVo.java | 2 +- .../domain/vo/GroupRepresentation.java | 2 +- .../vo/ResultListDataRepresentation.java | 41 +++--------------- .../workflow/domain/vo/TestLeaveVo.java | 3 +- .../workflow/domain/vo/WfBusinessFormVo.java | 2 +- .../workflow/domain/vo/WfCategoryVo.java | 3 +- .../domain/vo/WfFormDefinitionVo.java | 3 +- .../cmd/AddSequenceMultiInstanceCmd.java | 19 +++++---- .../cmd/DeleteSequenceMultiInstanceCmd.java | 13 +++--- .../cmd/ExecutionChildByExecutionIdCmd.java | 4 +- .../flowable/config/FlowableConfig.java | 1 + .../config/GlobalFlowableListener.java | 10 ++--- .../workflow/mapper/ActHiProcinstMapper.java | 2 +- .../workflow/mapper/TestLeaveMapper.java | 2 +- .../workflow/mapper/WfBusinessFormMapper.java | 2 +- .../workflow/mapper/WfCategoryMapper.java | 2 +- .../mapper/WfFormDefinitionMapper.java | 2 +- .../workflow/service/IActModelService.java | 2 +- .../service/IActProcessDefinitionService.java | 2 +- .../workflow/service/ITestLeaveService.java | 8 ++-- .../service/IWfBusinessFormService.java | 8 ++-- .../workflow/service/IWfCategoryService.java | 2 +- .../service/IWfFormDefinitionService.java | 6 +-- .../impl/ActHiProcinstServiceImpl.java | 10 ++--- .../service/impl/ActModelServiceImpl.java | 22 +++++----- .../impl/ActProcessDefinitionServiceImpl.java | 12 +++--- .../impl/ActProcessInstanceServiceImpl.java | 42 +++++++++++-------- .../service/impl/ActTaskServiceImpl.java | 13 +++--- .../service/impl/TestLeaveServiceImpl.java | 20 ++++----- .../impl/WfBusinessFormServiceImpl.java | 37 ++++++++-------- .../service/impl/WfCategoryServiceImpl.java | 20 ++++----- .../impl/WfFormDefinitionServiceImpl.java | 24 +++++------ .../service/impl/WorkflowUserServiceImpl.java | 12 +++--- .../dromara/workflow/utils/WorkflowUtils.java | 24 +++++------ .../src/main/resources/mapper/package-info.md | 3 ++ 60 files changed, 401 insertions(+), 418 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/package-info.md diff --git a/ruoyi-modules/ruoyi-demo/pom.xml b/ruoyi-modules/ruoyi-demo/pom.xml index 6e07a45f1..4fd43bc5f 100644 --- a/ruoyi-modules/ruoyi-demo/pom.xml +++ b/ruoyi-modules/ruoyi-demo/pom.xml @@ -97,16 +97,6 @@ org.dromara ruoyi-common-websocket - - - - - - - - - - diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/PageEntity.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/PageEntity.java index f62a66ebc..cc8aaddd8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/PageEntity.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/PageEntity.java @@ -1,11 +1,14 @@ package org.dromara.workflow.common; +import lombok.Data; + /** * 分页参数 * * @author may */ +@Data public class PageEntity { /** @@ -22,15 +25,4 @@ public class PageEntity { 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/common/enums/BusinessStatusEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java index 86be522a4..d23bb5dab 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java @@ -6,6 +6,8 @@ import lombok.Getter; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; +import java.util.Arrays; + /** * 业务状态枚举 * @@ -58,17 +60,15 @@ public enum BusinessStatusEnum { * * @param status 状态 */ - public static String getEumByStatus(String status) { + public static String findByStatus(String status) { if (StringUtils.isBlank(status)) { return StrUtil.EMPTY; } - - for (BusinessStatusEnum statusEnum : BusinessStatusEnum.values()) { - if (statusEnum.getStatus().equals(status)) { - return statusEnum.getDesc(); - } - } - return StrUtil.EMPTY; + return Arrays.stream(BusinessStatusEnum.values()) + .filter(statusEnum -> statusEnum.getStatus().equals(status)) + .findFirst() + .map(BusinessStatusEnum::getDesc) + .orElse(StrUtil.EMPTY); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java index 1fe2b8357..03be8dc53 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java @@ -5,6 +5,8 @@ import lombok.AllArgsConstructor; import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import java.util.Arrays; + /** * 任务状态枚举 * @@ -73,17 +75,16 @@ public enum TaskStatusEnum { * * @param status 状态 */ - public static String getEnumsByStatus(String status) { + public static String findByStatus(String status) { if (StringUtils.isBlank(status)) { return StrUtil.EMPTY; } - for (TaskStatusEnum statusEnum : TaskStatusEnum.values()) { - if (statusEnum.getStatus().equals(status)) { - return statusEnum.getDesc(); - } - } - return StrUtil.EMPTY; + return Arrays.stream(TaskStatusEnum.values()) + .filter(statusEnum -> statusEnum.getStatus().equals(status)) + .findFirst() + .map(TaskStatusEnum::getDesc) + .orElse(StrUtil.EMPTY); } } 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 8df527230..500d06367 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,11 +1,13 @@ package org.dromara.workflow.controller; +import cn.hutool.core.convert.Convert; 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; +import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.json.utils.JsonUtils; @@ -25,7 +27,7 @@ import org.springframework.util.MultiValueMap; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.Objects; +import java.util.Arrays; /** * 模型管理 控制层 @@ -40,7 +42,7 @@ public class ActModelController extends BaseController { private final RepositoryService repositoryService; - private final IActModelService iActModelService; + private final IActModelService actModelService; /** @@ -49,8 +51,8 @@ public class ActModelController extends BaseController { * @param modelBo 模型参数 */ @GetMapping("/list") - public TableDataInfo getByPage(ModelBo modelBo) { - return iActModelService.getByPage(modelBo); + public TableDataInfo page(ModelBo modelBo) { + return actModelService.page(modelBo); } /** @@ -59,10 +61,11 @@ public class ActModelController extends BaseController { @GetMapping("/rest/account") public String getAccount() { AccountVo accountVo = new AccountVo(); - accountVo.setId(Objects.requireNonNull(LoginHelper.getUserId()).toString()); + LoginUser loginUser = LoginHelper.getLoginUser(); + accountVo.setId(Convert.toStr(loginUser.getUserId())); accountVo.setFirstName(""); - accountVo.setLastName(LoginHelper.getUsername()); - accountVo.setFullName(LoginHelper.getUsername()); + accountVo.setLastName(loginUser.getUsername()); + accountVo.setFullName(loginUser.getUsername()); return JsonUtils.toJsonString(accountVo); } @@ -75,7 +78,7 @@ public class ActModelController extends BaseController { @RepeatSubmit() @PostMapping("/rest/models") public R saveNewModel(@Validated(AddGroup.class) @RequestBody ModelBo modelBo) { - return toAjax(iActModelService.saveNewModel(modelBo)); + return toAjax(actModelService.saveNewModel(modelBo)); } /** @@ -85,7 +88,7 @@ public class ActModelController extends BaseController { */ @GetMapping("/rest/models/{modelId}/editor/json") public ObjectNode getModelInfo(@NotBlank(message = "模型id不能为空") @PathVariable String modelId) { - return iActModelService.getModelInfo(modelId); + return actModelService.getModelInfo(modelId); } @@ -99,7 +102,7 @@ public class ActModelController extends BaseController { @RepeatSubmit() @PostMapping(value = "/rest/models/{modelId}/editor/json") public R editModel(@PathVariable String modelId, @RequestParam MultiValueMap values) { - return toAjax(iActModelService.editModel(modelId, values)); + return toAjax(actModelService.editModel(modelId, values)); } /** @@ -112,9 +115,7 @@ public class ActModelController extends BaseController { @DeleteMapping("/{ids}") @Transactional(rollbackFor = Exception.class) public R delete(@NotEmpty(message = "主键不能为空") @PathVariable String[] ids) { - for (String id : ids) { - repositoryService.deleteModel(id); - } + Arrays.stream(ids).parallel().forEachOrdered(repositoryService::deleteModel); return R.ok(); } @@ -127,7 +128,7 @@ public class ActModelController extends BaseController { @RepeatSubmit() @PostMapping("/modelDeploy/{id}") public R deploy(@NotBlank(message = "模型id不能为空") @PathVariable("id") String id) { - return toAjax(iActModelService.modelDeploy(id)); + return toAjax(actModelService.modelDeploy(id)); } /** @@ -139,7 +140,7 @@ public class ActModelController extends BaseController { @GetMapping("/export/zip/{modelId}") public void exportZip(@NotEmpty(message = "模型id不能为空") @PathVariable String modelId, HttpServletResponse response) { - iActModelService.exportZip(modelId, response); + actModelService.exportZip(modelId, response); } /** @@ -148,8 +149,8 @@ public class ActModelController extends BaseController { * @param filter 参数 */ @GetMapping(value = "/rest/editor-users") - public ResultListDataRepresentation getUsers(@RequestParam(value = "filter", required = false) String filter) { - return iActModelService.getUsers(filter); + public ResultListDataRepresentation editorUsers(@RequestParam(value = "filter", required = false) String filter) { + return actModelService.getUsers(filter); } /** @@ -158,8 +159,8 @@ public class ActModelController extends BaseController { * @param filter 参数 */ @GetMapping(value = "/rest/editor-groups") - public ResultListDataRepresentation getGroups(@RequestParam(required = false, value = "filter") String filter) { - return iActModelService.getGroups(filter); + public ResultListDataRepresentation editorGroups(@RequestParam(required = false, value = "filter") String filter) { + return actModelService.getGroups(filter); } } 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 index fd952957a..62c40188d 100644 --- 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 @@ -4,6 +4,7 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -15,7 +16,9 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** @@ -29,7 +32,7 @@ import java.util.*; @RequestMapping("/workflow/processDefinition") public class ActProcessDefinitionController extends BaseController { - private final IActProcessDefinitionService iActProcessDefinitionService; + private final IActProcessDefinitionService actProcessDefinitionService; /** * 分页查询 @@ -37,8 +40,8 @@ public class ActProcessDefinitionController extends BaseController { * @param processDefinitionBo 参数 */ @GetMapping("/list") - public TableDataInfo getByPage(ProcessDefinitionBo processDefinitionBo) { - return iActProcessDefinitionService.getByPage(processDefinitionBo); + public TableDataInfo page(ProcessDefinitionBo processDefinitionBo) { + return actProcessDefinitionService.page(processDefinitionBo); } /** @@ -48,7 +51,7 @@ public class ActProcessDefinitionController extends BaseController { */ @GetMapping("/getProcessDefinitionListByKey/{key}") public R> getProcessDefinitionListByKey(@NotEmpty(message = "流程定义key不能为空") @PathVariable String key) { - return R.ok("操作成功", iActProcessDefinitionService.getProcessDefinitionListByKey(key)); + return R.ok("操作成功", actProcessDefinitionService.getProcessDefinitionListByKey(key)); } /** @@ -58,7 +61,7 @@ public class ActProcessDefinitionController extends BaseController { */ @GetMapping("/processDefinitionImage/{processDefinitionId}") public R processDefinitionImage(@PathVariable String processDefinitionId) { - return R.ok("操作成功", iActProcessDefinitionService.processDefinitionImage(processDefinitionId)); + return R.ok("操作成功", actProcessDefinitionService.processDefinitionImage(processDefinitionId)); } /** @@ -69,9 +72,8 @@ public class ActProcessDefinitionController extends BaseController { @GetMapping("/processDefinitionXml/{processDefinitionId}") public R> getXml(@NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { Map map = new HashMap<>(); - String xmlStr = iActProcessDefinitionService.processDefinitionXml(processDefinitionId); - List xml = new ArrayList<>(Arrays.asList(xmlStr.split("\n"))); - map.put("xml", xml); + String xmlStr = actProcessDefinitionService.processDefinitionXml(processDefinitionId); + map.put("xml", StringUtils.splitList("\n")); map.put("xmlStr", xmlStr); return R.ok(map); } @@ -86,7 +88,7 @@ public class ActProcessDefinitionController extends BaseController { @DeleteMapping("/{deploymentId}/{processDefinitionId}") public R deleteDeployment(@NotBlank(message = "流程部署id不能为空") @PathVariable String deploymentId, @NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { - return toAjax(iActProcessDefinitionService.deleteDeployment(deploymentId, processDefinitionId)); + return toAjax(actProcessDefinitionService.deleteDeployment(deploymentId, processDefinitionId)); } /** @@ -97,7 +99,7 @@ public class ActProcessDefinitionController extends BaseController { @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) @PutMapping("/updateProcessDefState/{processDefinitionId}") public R updateProcDefState(@NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { - return toAjax(iActProcessDefinitionService.updateProcessDefState(processDefinitionId)); + return toAjax(actProcessDefinitionService.updateProcessDefState(processDefinitionId)); } /** @@ -110,7 +112,7 @@ public class ActProcessDefinitionController extends BaseController { @PutMapping("/migrationProcessDefinition/{currentProcessDefinitionId}/{fromProcessDefinitionId}") public R migrationProcessDefinition(@NotBlank(message = "当前流程定义id") @PathVariable String currentProcessDefinitionId, @NotBlank(message = "需要迁移到的流程定义id") @PathVariable String fromProcessDefinitionId) { - return toAjax(iActProcessDefinitionService.migrationProcessDefinition(currentProcessDefinitionId, fromProcessDefinitionId)); + return toAjax(actProcessDefinitionService.migrationProcessDefinition(currentProcessDefinitionId, fromProcessDefinitionId)); } /** @@ -121,7 +123,7 @@ public class ActProcessDefinitionController extends BaseController { @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) @PutMapping("/convertToModel/{processDefinitionId}") public R convertToModel(@NotEmpty(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { - return toAjax(iActProcessDefinitionService.convertToModel(processDefinitionId)); + return toAjax(actProcessDefinitionService.convertToModel(processDefinitionId)); } /** @@ -133,6 +135,6 @@ public class ActProcessDefinitionController extends BaseController { @Log(title = "流程定义管理", businessType = BusinessType.INSERT) @PostMapping("/deployByFile") public R deployByFile(@RequestParam("file") MultipartFile file, @RequestParam("categoryCode") String categoryCode) { - return toAjax(iActProcessDefinitionService.deployByFile(file, categoryCode)); + return toAjax(actProcessDefinitionService.deployByFile(file, categoryCode)); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java index 166e2e7b2..20d6d68d8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java @@ -31,7 +31,7 @@ import java.util.Map; @RequestMapping("/workflow/processInstance") public class ActProcessInstanceController extends BaseController { - private final IActProcessInstanceService iActProcessInstanceService; + private final IActProcessInstanceService actProcessInstanceService; /** * 分页查询正在运行的流程实例 @@ -40,7 +40,7 @@ public class ActProcessInstanceController extends BaseController { */ @GetMapping("/getProcessInstanceRunningByPage") public TableDataInfo getProcessInstanceRunningByPage(ProcessInstanceBo processInstanceBo) { - return iActProcessInstanceService.getProcessInstanceRunningByPage(processInstanceBo); + return actProcessInstanceService.getProcessInstanceRunningByPage(processInstanceBo); } /** @@ -50,7 +50,7 @@ public class ActProcessInstanceController extends BaseController { */ @GetMapping("/getProcessInstanceFinishByPage") public TableDataInfo getProcessInstanceFinishByPage(ProcessInstanceBo processInstanceBo) { - return iActProcessInstanceService.getProcessInstanceFinishByPage(processInstanceBo); + return actProcessInstanceService.getProcessInstanceFinishByPage(processInstanceBo); } /** @@ -60,7 +60,7 @@ public class ActProcessInstanceController extends BaseController { */ @GetMapping("/getHistoryProcessImage/{processInstanceId}") public R getHistoryProcessImage(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) { - return R.ok("操作成功", iActProcessInstanceService.getHistoryProcessImage(processInstanceId)); + return R.ok("操作成功", actProcessInstanceService.getHistoryProcessImage(processInstanceId)); } /** @@ -70,7 +70,7 @@ public class ActProcessInstanceController extends BaseController { */ @GetMapping("/getHistoryRecord/{processInstanceId}") public R> getHistoryRecord(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) { - return R.ok(iActProcessInstanceService.getHistoryRecord(processInstanceId)); + return R.ok(actProcessInstanceService.getHistoryRecord(processInstanceId)); } /** @@ -81,7 +81,7 @@ public class ActProcessInstanceController extends BaseController { @Log(title = "流程实例管理", businessType = BusinessType.DELETE) @PostMapping("/deleteRuntimeProcessInst") public R deleteRuntimeProcessInst(@Validated(AddGroup.class) @RequestBody ProcessInvalidBo processInvalidBo) { - return toAjax(iActProcessInstanceService.deleteRuntimeProcessInst(processInvalidBo)); + return toAjax(actProcessInstanceService.deleteRuntimeProcessInst(processInvalidBo)); } /** @@ -92,7 +92,7 @@ public class ActProcessInstanceController extends BaseController { @Log(title = "流程实例管理", businessType = BusinessType.DELETE) @DeleteMapping("/deleteRuntimeProcessAndHisInst/{processInstanceIds}") public R deleteRuntimeProcessAndHisInst(@NotNull(message = "流程实例id不能为空") @PathVariable String[] processInstanceIds) { - return toAjax(iActProcessInstanceService.deleteRuntimeProcessAndHisInst(Arrays.asList(processInstanceIds))); + return toAjax(actProcessInstanceService.deleteRuntimeProcessAndHisInst(Arrays.asList(processInstanceIds))); } /** @@ -103,7 +103,7 @@ public class ActProcessInstanceController extends BaseController { @Log(title = "流程实例管理", businessType = BusinessType.DELETE) @DeleteMapping("/deleteFinishProcessAndHisInst/{processInstanceIds}") public R deleteFinishProcessAndHisInst(@NotNull(message = "流程实例id不能为空") @PathVariable String[] processInstanceIds) { - return toAjax(iActProcessInstanceService.deleteFinishProcessAndHisInst(Arrays.asList(processInstanceIds))); + return toAjax(actProcessInstanceService.deleteFinishProcessAndHisInst(Arrays.asList(processInstanceIds))); } /** @@ -114,7 +114,7 @@ public class ActProcessInstanceController extends BaseController { @Log(title = "流程实例管理", businessType = BusinessType.INSERT) @PostMapping("/cancelProcessApply/{processInstanceId}") public R cancelProcessApply(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) { - return toAjax(iActProcessInstanceService.cancelProcessApply(processInstanceId)); + return toAjax(actProcessInstanceService.cancelProcessApply(processInstanceId)); } /** @@ -124,7 +124,7 @@ public class ActProcessInstanceController extends BaseController { */ @GetMapping("/getCurrentSubmitByPage") public TableDataInfo getCurrentSubmitByPage(ProcessInstanceBo processInstanceBo) { - return iActProcessInstanceService.getCurrentSubmitByPage(processInstanceBo); + return actProcessInstanceService.getCurrentSubmitByPage(processInstanceBo); } /** @@ -135,7 +135,7 @@ public class ActProcessInstanceController extends BaseController { @Log(title = "流程实例管理", businessType = BusinessType.INSERT) @PostMapping("/taskUrging") public R taskUrging(@RequestBody TaskUrgingBo taskUrgingBo) { - return toAjax(iActProcessInstanceService.taskUrging(taskUrgingBo)); + return toAjax(actProcessInstanceService.taskUrging(taskUrgingBo)); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java index 51f7ea1c6..0ceadddc6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java @@ -1,5 +1,6 @@ package org.dromara.workflow.controller; +import cn.hutool.core.convert.Convert; import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; @@ -31,7 +32,7 @@ import java.util.Map; @RequestMapping("/workflow/task") public class ActTaskController extends BaseController { - private final IActTaskService iActTaskService; + private final IActTaskService actTaskService; private final TaskService taskService; @@ -45,7 +46,7 @@ public class ActTaskController extends BaseController { @RepeatSubmit() @PostMapping("/startWorkFlow") public R> startWorkFlow(@RequestBody StartProcessBo startProcessBo) { - Map map = iActTaskService.startWorkFlow(startProcessBo); + Map map = actTaskService.startWorkFlow(startProcessBo); return R.ok("提交成功", map); } @@ -58,7 +59,7 @@ public class ActTaskController extends BaseController { @RepeatSubmit() @PostMapping("/completeTask") public R completeTask(@Validated(AddGroup.class) @RequestBody CompleteTaskBo completeTaskBo) { - return toAjax(iActTaskService.completeTask(completeTaskBo)); + return toAjax(actTaskService.completeTask(completeTaskBo)); } /** @@ -68,7 +69,7 @@ public class ActTaskController extends BaseController { */ @GetMapping("/getTaskWaitByPage") public TableDataInfo getTaskWaitByPage(TaskBo taskBo) { - return iActTaskService.getTaskWaitByPage(taskBo); + return actTaskService.getTaskWaitByPage(taskBo); } /** @@ -78,7 +79,7 @@ public class ActTaskController extends BaseController { */ @GetMapping("/getAllTaskWaitByPage") public TableDataInfo getAllTaskWaitByPage(TaskBo taskBo) { - return iActTaskService.getAllTaskWaitByPage(taskBo); + return actTaskService.getAllTaskWaitByPage(taskBo); } /** @@ -88,7 +89,7 @@ public class ActTaskController extends BaseController { */ @GetMapping("/getTaskFinishByPage") public TableDataInfo getTaskFinishByPage(TaskBo taskBo) { - return iActTaskService.getTaskFinishByPage(taskBo); + return actTaskService.getTaskFinishByPage(taskBo); } /** @@ -98,7 +99,7 @@ public class ActTaskController extends BaseController { */ @GetMapping("/getAllTaskFinishByPage") public TableDataInfo getAllTaskFinishByPage(TaskBo taskBo) { - return iActTaskService.getAllTaskFinishByPage(taskBo); + return actTaskService.getAllTaskFinishByPage(taskBo); } /** @@ -110,7 +111,7 @@ public class ActTaskController extends BaseController { @PostMapping("/claim/{taskId}") public R claimTask(@NotBlank(message = "任务id不能为空") @PathVariable String taskId) { try { - taskService.claim(taskId, String.valueOf(LoginHelper.getUserId())); + taskService.claim(taskId, Convert.toStr(LoginHelper.getUserId())); return R.ok(); } catch (Exception e) { e.printStackTrace(); @@ -143,7 +144,7 @@ public class ActTaskController extends BaseController { @Log(title = "任务管理", businessType = BusinessType.INSERT) @PostMapping("/delegateTask") public R delegateTask(@Validated({AddGroup.class}) @RequestBody DelegateBo delegateBo) { - return toAjax(iActTaskService.delegateTask(delegateBo)); + return toAjax(actTaskService.delegateTask(delegateBo)); } /** @@ -154,7 +155,7 @@ public class ActTaskController extends BaseController { @Log(title = "任务管理", businessType = BusinessType.DELETE) @PostMapping("/terminationTask") public R terminationTask(@RequestBody TerminationBo terminationBo) { - return toAjax(iActTaskService.terminationTask(terminationBo)); + return toAjax(actTaskService.terminationTask(terminationBo)); } /** @@ -165,7 +166,7 @@ public class ActTaskController extends BaseController { @Log(title = "任务管理", businessType = BusinessType.INSERT) @PostMapping("/transferTask") public R transferTask(@Validated({AddGroup.class}) @RequestBody TransmitBo transmitBo) { - return toAjax(iActTaskService.transferTask(transmitBo)); + return toAjax(actTaskService.transferTask(transmitBo)); } /** @@ -176,7 +177,7 @@ public class ActTaskController extends BaseController { @Log(title = "任务管理", businessType = BusinessType.INSERT) @PostMapping("/addMultiInstanceExecution") public R addMultiInstanceExecution(@Validated({AddGroup.class}) @RequestBody AddMultiBo addMultiBo) { - return toAjax(iActTaskService.addMultiInstanceExecution(addMultiBo)); + return toAjax(actTaskService.addMultiInstanceExecution(addMultiBo)); } /** @@ -187,7 +188,7 @@ public class ActTaskController extends BaseController { @Log(title = "任务管理", businessType = BusinessType.INSERT) @PostMapping("/deleteMultiInstanceExecution") public R deleteMultiInstanceExecution(@Validated({AddGroup.class}) @RequestBody DeleteMultiBo deleteMultiBo) { - return toAjax(iActTaskService.deleteMultiInstanceExecution(deleteMultiBo)); + return toAjax(actTaskService.deleteMultiInstanceExecution(deleteMultiBo)); } /** @@ -198,7 +199,7 @@ public class ActTaskController extends BaseController { @Log(title = "任务管理", businessType = BusinessType.INSERT) @PostMapping("/backProcess") public R backProcess(@RequestBody BackProcessBo backProcessBo) { - return R.ok(iActTaskService.backProcess(backProcessBo)); + return R.ok(actTaskService.backProcess(backProcessBo)); } /** @@ -221,6 +222,6 @@ public class ActTaskController extends BaseController { @Log(title = "任务管理", businessType = BusinessType.UPDATE) @PutMapping("/updateAssignee/{taskIds}/{userId}") public R updateAssignee(@PathVariable String[] taskIds, @PathVariable String userId) { - return toAjax(iActTaskService.updateAssignee(taskIds, userId)); + return toAjax(actTaskService.updateAssignee(taskIds, userId)); } } 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 d8da28aa9..73cef482b 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,8 +12,11 @@ */ package org.dromara.workflow.controller; +import cn.hutool.core.io.resource.ResourceUtil; import org.apache.commons.io.IOUtils; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.io.InputStream; import java.nio.charset.StandardCharsets; @@ -25,14 +28,12 @@ import java.nio.charset.StandardCharsets; @RequestMapping("/workflow/model") public class StencilsetRestResource { - @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); + @GetMapping(value = "/rest/stencil-sets/editor") + public String getStencilset() { + try (InputStream inputStream = ResourceUtil.getStream("static/stencilset.json")) { + 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/TestLeaveController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java index a65aa6acd..cc83c28ff 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java @@ -1,27 +1,28 @@ package org.dromara.workflow.controller; -import java.util.List; - -import lombok.RequiredArgsConstructor; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; import org.dromara.workflow.domain.TestLeave; import org.dromara.workflow.domain.bo.TestLeaveBo; import org.dromara.workflow.domain.vo.TestLeaveVo; import org.dromara.workflow.service.ITestLeaveService; -import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.web.core.BaseController; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.log.enums.BusinessType; -import org.dromara.common.excel.utils.ExcelUtil; -import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /** * 请假 @@ -65,7 +66,7 @@ public class TestLeaveController extends BaseController { @SaCheckPermission("demo:leave:query") @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { + @PathVariable Long id) { return R.ok(testLeaveService.queryById(id)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfBusinessFormController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfBusinessFormController.java index 8eef136a3..1388aadfb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfBusinessFormController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfBusinessFormController.java @@ -1,27 +1,28 @@ package org.dromara.workflow.controller; -import java.util.List; - -import lombok.RequiredArgsConstructor; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; -import org.dromara.workflow.domain.WfBusinessForm; -import org.springframework.web.bind.annotation.*; -import org.springframework.validation.annotation.Validated; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.web.core.BaseController; -import org.dromara.common.mybatis.core.page.PageQuery; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.log.enums.BusinessType; import org.dromara.common.excel.utils.ExcelUtil; -import org.dromara.workflow.domain.vo.WfBusinessFormVo; -import org.dromara.workflow.domain.bo.WfBusinessFormBo; -import org.dromara.workflow.service.IWfBusinessFormService; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.workflow.domain.WfBusinessForm; +import org.dromara.workflow.domain.bo.WfBusinessFormBo; +import org.dromara.workflow.domain.vo.WfBusinessFormVo; +import org.dromara.workflow.service.IWfBusinessFormService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /** * 发起流程 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfCategoryController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfCategoryController.java index a0a4716fe..8dced8929 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfCategoryController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfCategoryController.java @@ -1,24 +1,25 @@ package org.dromara.workflow.controller; -import java.util.List; - -import lombok.RequiredArgsConstructor; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; -import org.springframework.web.bind.annotation.*; -import org.springframework.validation.annotation.Validated; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.web.core.BaseController; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.log.enums.BusinessType; import org.dromara.common.excel.utils.ExcelUtil; -import org.dromara.workflow.domain.vo.WfCategoryVo; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; import org.dromara.workflow.domain.bo.WfCategoryBo; +import org.dromara.workflow.domain.vo.WfCategoryVo; import org.dromara.workflow.service.IWfCategoryService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /** * 流程分类 @@ -64,7 +65,7 @@ public class WfCategoryController extends BaseController { @SaCheckPermission("workflow:category:query") @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { + @PathVariable Long id) { return R.ok(wfCategoryService.queryById(id)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormController.java index 35e981e40..21ab55091 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormController.java @@ -67,6 +67,7 @@ public class WfFormController extends BaseController { /** * 获取流程表单详细信息 + * * @param formId 主键 */ @SaCheckPermission("workflow:form:query") @@ -97,6 +98,7 @@ public class WfFormController extends BaseController { /** * 删除流程表单 + * * @param formIds 主键串 */ @SaCheckPermission("workflow:form:remove") diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java index e013200cb..c6e7005c0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java @@ -2,16 +2,19 @@ package org.dromara.workflow.controller; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; -import org.springframework.validation.annotation.Validated; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.web.core.BaseController; 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.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; import org.dromara.workflow.domain.bo.WfFormDefinitionBo; import org.dromara.workflow.service.IWfFormDefinitionService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; /** * 动态单与流程定义关联信息 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java index 2194022f1..36430ecab 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java @@ -9,7 +9,10 @@ import org.dromara.workflow.domain.bo.SysUserMultiBo; import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.service.IWorkflowUserService; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +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.List; @@ -25,7 +28,7 @@ import java.util.List; @RequestMapping("/workflow/user") public class WorkflowUserController extends BaseController { - private final IWorkflowUserService iWorkflowUserService; + private final IWorkflowUserService workflowUserService; /** * 分页查询工作流选择加签人员 @@ -34,7 +37,7 @@ public class WorkflowUserController extends BaseController { */ @GetMapping("/getWorkflowAddMultiListByPage") public TableDataInfo getWorkflowAddMultiInstanceByPage(SysUserMultiBo sysUserMultiBo) { - return iWorkflowUserService.getWorkflowAddMultiInstanceByPage(sysUserMultiBo); + return workflowUserService.getWorkflowAddMultiInstanceByPage(sysUserMultiBo); } /** @@ -44,7 +47,7 @@ public class WorkflowUserController extends BaseController { */ @GetMapping("/getWorkflowDeleteMultiInstanceList/{taskId}") public R> getWorkflowDeleteMultiInstanceList(@PathVariable String taskId) { - return R.ok(iWorkflowUserService.getWorkflowDeleteMultiInstanceList(taskId)); + return R.ok(workflowUserService.getWorkflowDeleteMultiInstanceList(taskId)); } /** @@ -54,6 +57,6 @@ public class WorkflowUserController extends BaseController { */ @GetMapping("/getUserListByIds/{userIds}") public R> getUserListByIds(@PathVariable List userIds) { - return R.ok(iWorkflowUserService.getUserListByIds(userIds)); + return R.ok(workflowUserService.getUserListByIds(userIds)); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiProcinst.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiProcinst.java index 1b97af1cc..e87fb9253 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiProcinst.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiProcinst.java @@ -1,13 +1,14 @@ package org.dromara.workflow.domain; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import java.io.Serial; import java.io.Serializable; import java.util.Date; -import java.io.Serial; - /** * 流程实例对象 act_hi_procinst * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java index a1e56830e..e02fc28ab 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java @@ -1,9 +1,10 @@ package org.dromara.workflow.domain; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; import java.io.Serial; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfBusinessForm.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfBusinessForm.java index 9de2ad210..5de725095 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfBusinessForm.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfBusinessForm.java @@ -1,10 +1,12 @@ package org.dromara.workflow.domain; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonInclude; -import org.dromara.common.tenant.core.TenantEntity; -import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; import java.io.Serial; import java.util.Map; @@ -59,6 +61,6 @@ public class WfBusinessForm extends TenantEntity { */ @JsonInclude(JsonInclude.Include.NON_EMPTY) @TableField(exist = false) - private Map variable; + private Map variable; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfCategory.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfCategory.java index 37da761d9..94a7cf500 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfCategory.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfCategory.java @@ -1,9 +1,10 @@ package org.dromara.workflow.domain; -import org.dromara.common.tenant.core.TenantEntity; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; import java.io.Serial; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java index c5f31673e..1fb77531a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java @@ -1,9 +1,10 @@ package org.dromara.workflow.domain; -import org.dromara.common.tenant.core.TenantEntity; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; import java.io.Serial; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java index 7352523d1..35acebc85 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java @@ -1,13 +1,14 @@ package org.dromara.workflow.domain.bo; -import org.dromara.workflow.domain.TestLeave; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; -import jakarta.validation.constraints.*; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.workflow.domain.TestLeave; /** * 请假业务对象 test_leave @@ -23,19 +24,19 @@ public class TestLeaveBo extends BaseEntity { /** * 主键 */ - @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) private Long id; /** * 标题 */ - @NotBlank(message = "标题不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "标题不能为空", groups = {AddGroup.class, EditGroup.class}) private String title; /** * 请假天数 */ - @NotNull(message = "请假天数不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotNull(message = "请假天数不能为空", groups = {AddGroup.class, EditGroup.class}) private Integer leaveDays; /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfBusinessFormBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfBusinessFormBo.java index 2ac5c27bc..797cf62e9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfBusinessFormBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfBusinessFormBo.java @@ -1,13 +1,14 @@ package org.dromara.workflow.domain.bo; -import org.dromara.workflow.domain.WfBusinessForm; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; -import jakarta.validation.constraints.*; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.workflow.domain.WfBusinessForm; /** * 发起流程业务对象 wf_business_form @@ -23,7 +24,7 @@ public class WfBusinessFormBo extends BaseEntity { /** * 主键 */ - @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) private Long id; /** @@ -34,19 +35,19 @@ public class WfBusinessFormBo extends BaseEntity { /** * 表单id */ - @NotNull(message = "表单id不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotNull(message = "表单id不能为空", groups = {AddGroup.class, EditGroup.class}) private Long formId; /** * 表单名称 */ - @NotBlank(message = "表单名称不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "表单名称不能为空", groups = {AddGroup.class, EditGroup.class}) private String formName; /** * 表单内容 */ - @NotBlank(message = "表单内容不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "表单内容不能为空", groups = {AddGroup.class, EditGroup.class}) private String content; /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java index d0ccbaa64..69608fda3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java @@ -1,13 +1,14 @@ package org.dromara.workflow.domain.bo; -import org.dromara.workflow.domain.WfCategory; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; -import jakarta.validation.constraints.*; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.workflow.domain.WfCategory; /** * 流程分类业务对象 wf_category @@ -23,25 +24,25 @@ public class WfCategoryBo extends BaseEntity { /** * 主键 */ - @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) private Long id; /** * 分类名称 */ - @NotBlank(message = "分类名称不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "分类名称不能为空", groups = {AddGroup.class, EditGroup.class}) private String categoryName; /** * 分类编码 */ - @NotBlank(message = "分类编码不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "分类编码不能为空", groups = {AddGroup.class, EditGroup.class}) private String categoryCode; /** * 父级id */ - @NotNull(message = "父级id不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotNull(message = "父级id不能为空", groups = {AddGroup.class, EditGroup.class}) private Long parentId; /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormBo.java index db4e7d33b..891a5a52f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormBo.java @@ -28,31 +28,31 @@ public class WfFormBo extends BaseEntity { /** * 表单主键 */ - @NotNull(message = "表单ID不能为空", groups = { EditGroup.class }) + @NotNull(message = "表单ID不能为空", groups = {EditGroup.class}) private Long formId; /** * 表单名称 */ - @NotBlank(message = "表单名称不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "表单名称不能为空", groups = {AddGroup.class, EditGroup.class}) private String formName; /** * 表单配置 */ - @NotBlank(message = "表单配置不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "表单配置不能为空", groups = {AddGroup.class, EditGroup.class}) private String formConfig; /** * 表单内容 */ - @NotBlank(message = "表单内容不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "表单内容不能为空", groups = {AddGroup.class, EditGroup.class}) private String content; /** * 状态(0正常 1停用) */ - @NotBlank(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "状态不能为空", groups = {AddGroup.class, EditGroup.class}) private String status; /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java index 81a53c3ea..be486ebb9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java @@ -1,13 +1,14 @@ package org.dromara.workflow.domain.bo; -import org.dromara.workflow.domain.WfFormDefinition; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; -import jakarta.validation.constraints.*; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.workflow.domain.WfFormDefinition; /** * 动态单与流程定义关联信息业务对象 wf_form_definition @@ -23,37 +24,37 @@ public class WfFormDefinitionBo extends BaseEntity { /** * 主键 */ - @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) private Long id; /** * 动态表单id */ - @NotNull(message = "动态表单id不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotNull(message = "动态表单id不能为空", groups = {AddGroup.class, EditGroup.class}) private Long formId; /** * 流程定义id */ - @NotBlank(message = "流程定义key不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "流程定义key不能为空", groups = {AddGroup.class, EditGroup.class}) private String processDefinitionKey; /** * 流程定义名称 */ - @NotBlank(message = "流程定义名称不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "流程定义名称不能为空", groups = {AddGroup.class, EditGroup.class}) private String processDefinitionName; /** * 流程定义id */ - @NotBlank(message = "流程定义id不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "流程定义id不能为空", groups = {AddGroup.class, EditGroup.class}) private String processDefinitionId; /** * 流程定义版本 */ - @NotNull(message = "流程定义版本不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotNull(message = "流程定义版本不能为空", groups = {AddGroup.class, EditGroup.class}) private Long processDefinitionVersion; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java index 6f26028e2..067b6f5d8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java @@ -17,7 +17,7 @@ import java.util.Date; public class ActHistoryInfoVo implements Serializable { @Serial - private static final long serialVersionUID=1L; + private static final long serialVersionUID = 1L; /** * 任务id */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/GroupRepresentation.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/GroupRepresentation.java index 02614033c..53e4bfce7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/GroupRepresentation.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/GroupRepresentation.java @@ -18,7 +18,7 @@ import lombok.Data; * @author Joram Barrez */ @Data -public class GroupRepresentation{ +public class GroupRepresentation { protected String id; protected String name; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ResultListDataRepresentation.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ResultListDataRepresentation.java index fb6dd769f..907d4dadd 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ResultListDataRepresentation.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ResultListDataRepresentation.java @@ -12,22 +12,22 @@ */ package org.dromara.workflow.domain.vo; +import lombok.Data; + import java.util.List; /** * @author Tijs Rademakers */ +@Data public class ResultListDataRepresentation { protected Integer size; protected Long total; protected Integer start; - protected List data; + protected List data; - public ResultListDataRepresentation() { - } - - public ResultListDataRepresentation(List data) { + public ResultListDataRepresentation(List data) { this.data = data; if (data != null) { size = data.size(); @@ -36,35 +36,4 @@ public class ResultListDataRepresentation { } } - public Integer getSize() { - return size; - } - - public void setSize(Integer size) { - this.size = size; - } - - public Long getTotal() { - return total; - } - - public void setTotal(Long total) { - this.total = total; - } - - public Integer getStart() { - return start; - } - - public void setStart(Integer start) { - this.start = start; - } - - public List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java index 83d4a6441..749ff76d6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java @@ -1,11 +1,10 @@ package org.dromara.workflow.domain.vo; -import org.dromara.workflow.domain.TestLeave; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; -import org.dromara.workflow.domain.vo.ProcessInstanceVo; +import org.dromara.workflow.domain.TestLeave; import java.io.Serial; import java.io.Serializable; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfBusinessFormVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfBusinessFormVo.java index e4811e9bf..05cb0fdeb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfBusinessFormVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfBusinessFormVo.java @@ -1,10 +1,10 @@ package org.dromara.workflow.domain.vo; -import org.dromara.workflow.domain.WfBusinessForm; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; +import org.dromara.workflow.domain.WfBusinessForm; import java.io.Serial; import java.io.Serializable; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCategoryVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCategoryVo.java index 59df23a0b..362f64625 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCategoryVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCategoryVo.java @@ -1,16 +1,15 @@ package org.dromara.workflow.domain.vo; -import org.dromara.workflow.domain.WfCategory; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; +import org.dromara.workflow.domain.WfCategory; import java.io.Serial; import java.io.Serializable; - /** * 流程分类视图对象 wf_category * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java index b6edde9b0..47bd0932e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java @@ -1,16 +1,15 @@ package org.dromara.workflow.domain.vo; -import org.dromara.workflow.domain.WfFormDefinition; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; +import org.dromara.workflow.domain.WfFormDefinition; import java.io.Serial; import java.io.Serializable; - /** * 动态单与流程定义关联信息视图对象 wf_form_definition * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AddSequenceMultiInstanceCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AddSequenceMultiInstanceCmd.java index 6cd56797d..3cdfcf415 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AddSequenceMultiInstanceCmd.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AddSequenceMultiInstanceCmd.java @@ -1,5 +1,6 @@ package org.dromara.workflow.flowable.cmd; +import cn.hutool.core.collection.CollUtil; import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.impl.persistence.entity.ExecutionEntity; @@ -44,15 +45,17 @@ public class AddSequenceMultiInstanceCmd implements Command { public Void execute(CommandContext commandContext) { ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); ExecutionEntity entity = executionEntityManager.findById(executionId); - //多实例任务总数加assignees.size() - Integer nrOfInstances = (Integer) entity.getVariable(NUMBER_OF_INSTANCES); - entity.setVariable(NUMBER_OF_INSTANCES, nrOfInstances + assignees.size()); + // 多实例任务总数加 assignees.size() + if (entity.getVariable(NUMBER_OF_INSTANCES) instanceof Integer nrOfInstances) { + entity.setVariable(NUMBER_OF_INSTANCES, nrOfInstances + assignees.size()); + } // 设置流程变量 - List userIds = (List) entity.getVariable(assigneeList); - userIds.addAll(assignees); - Map variables = new HashMap<>(16); - variables.put(assigneeList, userIds); - entity.setVariables(variables); + if (entity.getVariable(assigneeList) instanceof List userIds) { + CollUtil.addAll(userIds, assignees); + Map variables = new HashMap<>(16); + variables.put(assigneeList, userIds); + entity.setVariables(variables); + } return null; } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java index 89d09d1d8..e7edbd090 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java @@ -1,5 +1,6 @@ package org.dromara.workflow.flowable.cmd; +import lombok.AllArgsConstructor; import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.impl.persistence.entity.ExecutionEntity; @@ -20,6 +21,7 @@ import static org.dromara.workflow.common.constant.FlowConstant.NUMBER_OF_INSTAN * * @author may */ +@AllArgsConstructor public class DeleteSequenceMultiInstanceCmd implements Command { /** @@ -42,19 +44,14 @@ public class DeleteSequenceMultiInstanceCmd implements Command { */ private final List assignees; - public DeleteSequenceMultiInstanceCmd(String currentUserId, String executionId, String assigneeList, List assignees) { - this.currentUserId = currentUserId; - this.executionId = executionId; - this.assigneeList = assigneeList; - this.assignees = assignees; - } @Override + @SuppressWarnings("unchecked") public Void execute(CommandContext commandContext) { ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); ExecutionEntity entity = executionEntityManager.findById(executionId); // 设置流程变量 - List userIds = (List) entity.getVariable(assigneeList); + List userIds = (List) entity.getVariable(assigneeList); List userIdList = new ArrayList<>(); userIds.forEach(e -> { Long userId = assignees.stream().filter(id -> id.equals(e)).findFirst().orElse(null); @@ -62,7 +59,7 @@ public class DeleteSequenceMultiInstanceCmd implements Command { userIdList.add(e); } }); - //当前任务执行位置 + // 当前任务执行位置 int loopCounterIndex = -1; for (int i = 0; i < userIdList.size(); i++) { Long userId = userIdList.get(i); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java index 7ace3fcbd..1f3088bfc 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java @@ -1,5 +1,6 @@ package org.dromara.workflow.flowable.cmd; +import org.dromara.common.core.utils.StreamUtils; import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.impl.persistence.entity.ExecutionEntity; @@ -8,7 +9,6 @@ import org.flowable.engine.impl.util.CommandContextUtil; import java.io.Serializable; import java.util.List; -import java.util.stream.Collectors; /** * 获取并行网关执行后保留的执行实例数据 @@ -34,6 +34,6 @@ public class ExecutionChildByExecutionIdCmd implements Command allChildrenExecution = executionEntityManager.collectChildren(executionEntity.getParent()); - return allChildrenExecution.stream().filter(e -> !e.isActive()).collect(Collectors.toList()); + return StreamUtils.filter(allChildrenExecution, e -> !e.isActive()); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java index 9315f8dd7..3fee71a5c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java @@ -19,6 +19,7 @@ public class FlowableConfig implements EngineConfigurationConfigurer jobExecutionSuccess((FlowableEngineEntityEvent) flowableEngineEvent); } } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java index cd8fabfa3..a3a41c924 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java @@ -1,8 +1,8 @@ package org.dromara.workflow.mapper; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import org.dromara.workflow.domain.ActHiProcinst; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.workflow.domain.ActHiProcinst; /** * 流程实例Mapper接口 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/TestLeaveMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/TestLeaveMapper.java index 55b6a8e48..cd1edba89 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/TestLeaveMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/TestLeaveMapper.java @@ -1,8 +1,8 @@ package org.dromara.workflow.mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.workflow.domain.TestLeave; import org.dromara.workflow.domain.vo.TestLeaveVo; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; /** * 请假Mapper接口 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfBusinessFormMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfBusinessFormMapper.java index 8e850aa93..e5f0f7d40 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfBusinessFormMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfBusinessFormMapper.java @@ -1,8 +1,8 @@ package org.dromara.workflow.mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.workflow.domain.WfBusinessForm; import org.dromara.workflow.domain.vo.WfBusinessFormVo; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; /** * 发起流程Mapper接口 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfCategoryMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfCategoryMapper.java index 5d1f90b55..98aea024e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfCategoryMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfCategoryMapper.java @@ -1,8 +1,8 @@ package org.dromara.workflow.mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.workflow.domain.WfCategory; import org.dromara.workflow.domain.vo.WfCategoryVo; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; /** * 流程分类Mapper接口 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java index 0d3cb37a6..40617a894 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java @@ -1,8 +1,8 @@ package org.dromara.workflow.mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.workflow.domain.WfFormDefinition; import org.dromara.workflow.domain.vo.WfFormDefinitionVo; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; /** * 动态单与流程定义关联信息Mapper接口 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 f80dac205..86820bdef 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 @@ -20,7 +20,7 @@ public interface IActModelService { * @param modelBo 模型参数 * @return 返回分页列表 */ - TableDataInfo getByPage(ModelBo modelBo); + TableDataInfo page(ModelBo modelBo); /** * 新增模型 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java index 5f5f41a44..0fd94c807 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java @@ -19,7 +19,7 @@ public interface IActProcessDefinitionService { * @param processDefinitionBo 参数 * @return 返回分页列表 */ - TableDataInfo getByPage(ProcessDefinitionBo processDefinitionBo); + TableDataInfo page(ProcessDefinitionBo processDefinitionBo); /** * 查询历史流程定义列表 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ITestLeaveService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ITestLeaveService.java index 380979ffb..606b255ac 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ITestLeaveService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ITestLeaveService.java @@ -1,10 +1,10 @@ package org.dromara.workflow.service; -import org.dromara.workflow.domain.TestLeave; -import org.dromara.workflow.domain.vo.TestLeaveVo; -import org.dromara.workflow.domain.bo.TestLeaveBo; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.TestLeave; +import org.dromara.workflow.domain.bo.TestLeaveBo; +import org.dromara.workflow.domain.vo.TestLeaveVo; import java.util.Collection; import java.util.List; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfBusinessFormService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfBusinessFormService.java index b042c8136..7b8762917 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfBusinessFormService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfBusinessFormService.java @@ -1,10 +1,10 @@ package org.dromara.workflow.service; -import org.dromara.workflow.domain.WfBusinessForm; -import org.dromara.workflow.domain.vo.WfBusinessFormVo; -import org.dromara.workflow.domain.bo.WfBusinessFormBo; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.WfBusinessForm; +import org.dromara.workflow.domain.bo.WfBusinessFormBo; +import org.dromara.workflow.domain.vo.WfBusinessFormVo; import java.util.Collection; import java.util.List; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java index ebd2c0b54..acf0aa2bc 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfCategoryService.java @@ -1,8 +1,8 @@ package org.dromara.workflow.service; import org.dromara.workflow.domain.WfCategory; -import org.dromara.workflow.domain.vo.WfCategoryVo; import org.dromara.workflow.domain.bo.WfCategoryBo; +import org.dromara.workflow.domain.vo.WfCategoryVo; import java.util.Collection; import java.util.List; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java index 80dce253c..490da5375 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java @@ -1,9 +1,9 @@ package org.dromara.workflow.service; -import org.dromara.workflow.domain.vo.WfFormDefinitionVo; -import org.dromara.workflow.domain.bo.WfFormDefinitionBo; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.bo.WfFormDefinitionBo; +import org.dromara.workflow.domain.vo.WfFormDefinitionVo; import java.util.Collection; import java.util.List; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java index 1d3bf06fe..06d607b4f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java @@ -5,9 +5,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.workflow.domain.ActHiProcinst; -import org.springframework.stereotype.Service; import org.dromara.workflow.mapper.ActHiProcinstMapper; import org.dromara.workflow.service.IActHiProcinstService; +import org.springframework.stereotype.Service; import java.util.List; @@ -32,8 +32,8 @@ public class ActHiProcinstServiceImpl implements IActHiProcinstService { @Override public List selectByBusinessKeyIn(List businessKeys) { return baseMapper.selectList(new LambdaQueryWrapper() - .in(ActHiProcinst::getBusinessKey, businessKeys) - .eq(ActHiProcinst::getTenantId, TenantHelper.getTenantId())); + .in(ActHiProcinst::getBusinessKey, businessKeys) + .eq(TenantHelper.isEnable(), ActHiProcinst::getTenantId, TenantHelper.getTenantId())); } /** @@ -44,8 +44,8 @@ public class ActHiProcinstServiceImpl implements IActHiProcinstService { @Override public ActHiProcinst selectByBusinessKey(String businessKey) { return baseMapper.selectOne(new LambdaQueryWrapper() - .eq(ActHiProcinst::getBusinessKey, businessKey) - .eq(ActHiProcinst::getTenantId, TenantHelper.getTenantId())); + .eq(ActHiProcinst::getBusinessKey, businessKey) + .eq(TenantHelper.isEnable(), ActHiProcinst::getTenantId, TenantHelper.getTenantId())); } } 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 e57e4d396..c486455ff 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 @@ -17,6 +17,7 @@ import lombok.RequiredArgsConstructor; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.tenant.helper.TenantHelper; @@ -76,7 +77,7 @@ public class ActModelServiceImpl implements IActModelService { * @return 返回分页列表 */ @Override - public TableDataInfo getByPage(ModelBo modelBo) { + public TableDataInfo page(ModelBo modelBo) { ModelQuery query = repositoryService.createModelQuery(); query.modelTenantId(TenantHelper.getTenantId()); if (StringUtils.isNotEmpty(modelBo.getName())) { @@ -93,8 +94,8 @@ public class ActModelServiceImpl implements IActModelService { query.orderByCreateTime().desc(); // 分页查询 List modelList = query.listPage(modelBo.getPageNum(), modelBo.getPageSize()); - if (CollectionUtil.isNotEmpty(modelList)) { - modelList.forEach(e -> { + if (CollUtil.isNotEmpty(modelList)) { + modelList.parallelStream().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)); @@ -237,11 +238,11 @@ public class ActModelServiceImpl implements IActModelService { JsonNode childShapes = jsonNode.get("childShapes"); for (JsonNode childShape : childShapes) { JsonNode properties = childShape.get("properties"); - if(!properties.path("usertaskassignment").isMissingNode()){ + if (!properties.path("usertaskassignment").isMissingNode()) { JsonNode usertaskassignment = properties.get("usertaskassignment"); - if(!usertaskassignment.path("assignment").isMissingNode()){ + if (!usertaskassignment.path("assignment").isMissingNode()) { JsonNode assignment = usertaskassignment.get("assignment"); - if(!assignment.path("assignee").isMissingNode()){ + if (!assignment.path("assignee").isMissingNode()) { if ("$INITIATOR".equals(assignment.get("assignee").textValue())) { ((ObjectNode) assignment).put("assignee", "${INITIATOR}"); } @@ -406,16 +407,15 @@ public class ActModelServiceImpl implements IActModelService { public ResultListDataRepresentation getGroups(String filter) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.like(org.dromara.common.core.utils.StringUtils.isNotBlank(filter), SysRole::getRoleName, filter); + wrapper.like(StringUtils.isNotBlank(filter), SysRole::getRoleName, filter); List sysRoles = sysRoleMapper.selectList(wrapper); - List result = new ArrayList<>(); - for (SysRole sysRole : sysRoles) { + List result = StreamUtils.toList(sysRoles, sysRole -> { GroupRepresentation groupRepresentation = new GroupRepresentation(); groupRepresentation.setId(sysRole.getRoleId().toString()); groupRepresentation.setName(sysRole.getRoleName()); groupRepresentation.setType(sysRole.getRoleKey()); - result.add(groupRepresentation); - } + return groupRepresentation; + }); return new ResultListDataRepresentation(result); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index bb8af2405..ee32c9f09 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -12,6 +12,7 @@ import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.tenant.helper.TenantHelper; @@ -56,7 +57,7 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer private final ProcessMigrationService processMigrationService; - private final IWfCategoryService iWfCategoryService; + private final IWfCategoryService wfCategoryService; /** * 分页查询 @@ -65,7 +66,7 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer * @return 返回分页列表 */ @Override - public TableDataInfo getByPage(ProcessDefinitionBo processDefinitionBo) { + public TableDataInfo page(ProcessDefinitionBo processDefinitionBo) { ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery(); query.processDefinitionTenantId(TenantHelper.getTenantId()); if (StringUtils.isNotEmpty(processDefinitionBo.getKey())) { @@ -82,9 +83,8 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer List definitionList = query.latestVersion().listPage(processDefinitionBo.getPageNum(), processDefinitionBo.getPageSize()); List deploymentList = null; if (CollUtil.isNotEmpty(definitionList)) { - List deploymentIds = definitionList.stream().map(ProcessDefinition::getDeploymentId).collect(Collectors.toList()); - deploymentList = repositoryService.createDeploymentQuery() - .deploymentIds(deploymentIds).list(); + List deploymentIds = StreamUtils.toList(definitionList, ProcessDefinition::getDeploymentId); + deploymentList = repositoryService.createDeploymentQuery().deploymentIds(deploymentIds).list(); } for (ProcessDefinition processDefinition : definitionList) { ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class); @@ -281,7 +281,7 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer @Override public boolean deployByFile(MultipartFile file, String categoryCode) { try { - WfCategory wfCategory = iWfCategoryService.queryByCategoryCode(categoryCode); + WfCategory wfCategory = wfCategoryService.queryByCategoryCode(categoryCode); if (wfCategory == null) { throw new ServiceException("流程分类不存在"); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index eb2f562b6..323cc5e91 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -21,14 +21,20 @@ import org.dromara.workflow.domain.ActHiProcinst; import org.dromara.workflow.domain.bo.ProcessInstanceBo; import org.dromara.workflow.domain.bo.ProcessInvalidBo; import org.dromara.workflow.domain.bo.TaskUrgingBo; -import org.dromara.workflow.domain.vo.*; +import org.dromara.workflow.domain.vo.ActHistoryInfoVo; +import org.dromara.workflow.domain.vo.GraphicInfoVo; +import org.dromara.workflow.domain.vo.ProcessInstanceVo; +import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator; import org.dromara.workflow.flowable.cmd.DeleteExecutionCmd; import org.dromara.workflow.flowable.cmd.ExecutionChildByExecutionIdCmd; import org.dromara.workflow.service.IActHiProcinstService; import org.dromara.workflow.service.IActProcessInstanceService; import org.dromara.workflow.utils.WorkflowUtils; -import org.flowable.bpmn.model.*; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.FlowElement; +import org.flowable.bpmn.model.GraphicInfo; +import org.flowable.bpmn.model.UserTask; import org.flowable.engine.*; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; @@ -46,8 +52,8 @@ import org.springframework.transaction.annotation.Transactional; import java.awt.*; import java.io.InputStream; -import java.util.*; import java.util.List; +import java.util.*; import java.util.stream.Collectors; /** @@ -64,7 +70,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService private final RuntimeService runtimeService; private final HistoryService historyService; private final TaskService taskService; - private final IActHiProcinstService iActHiProcinstService; + private final IActHiProcinstService actHiProcinstService; private final ManagementService managementService; @Value("${flowable.activity-font-name}") @@ -105,7 +111,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService for (ProcessInstance processInstance : processInstances) { ProcessInstanceVo processInstanceVo = BeanUtil.toBean(processInstance, ProcessInstanceVo.class); processInstanceVo.setIsSuspended(processInstance.isSuspended()); - processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstance.getBusinessStatus())); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(processInstance.getBusinessStatus())); list.add(processInstanceVo); } long count = query.count(); @@ -141,7 +147,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService List historicProcessInstances = query.listPage(processInstanceBo.getPageNum(), processInstanceBo.getPageSize()); for (HistoricProcessInstance historicProcessInstance : historicProcessInstances) { ProcessInstanceVo processInstanceVo = BeanUtil.toBean(historicProcessInstance, ProcessInstanceVo.class); - processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(historicProcessInstance.getBusinessStatus())); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(historicProcessInstance.getBusinessStatus())); list.add(processInstanceVo); } long count = query.count(); @@ -212,7 +218,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService @Override public Map getHistoryRecord(String processInstanceId) { Map map = new HashMap<>(); - //查询任务办理记录 + // 查询任务办理记录 List list = historyService.createHistoricTaskInstanceQuery() .processInstanceId(processInstanceId).taskTenantId(TenantHelper.getTenantId()).orderByHistoricTaskInstanceEndTime().desc().list(); list = StreamUtils.sorted(list, Comparator.comparing(HistoricTaskInstance::getEndTime, Comparator.nullsFirst(Date::compareTo)).reversed()); @@ -230,7 +236,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService if (StringUtils.isNotBlank(e.getFullMessage())) { actHistoryInfoVo.setComment(e.getFullMessage()); actHistoryInfoVo.setStatus(e.getType()); - actHistoryInfoVo.setStatusName(TaskStatusEnum.getEnumsByStatus(e.getType())); + actHistoryInfoVo.setStatusName(TaskStatusEnum.findByStatus(e.getType())); } }); } @@ -245,13 +251,13 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService actHistoryInfoVoList.add(actHistoryInfoVo); } List collect = new ArrayList<>(); - //待办理 + // 待办理 List waitingTask = StreamUtils.filter(actHistoryInfoVoList, e -> e.getEndTime() == null); - //已办理 + // 已办理 List finishTask = StreamUtils.filter(actHistoryInfoVoList, e -> e.getEndTime() != null); collect.addAll(waitingTask); collect.addAll(finishTask); - //审批记录 + // 审批记录 map.put("historyRecordList", collect); List nodeInfoList = new ArrayList<>(); Map> groupByKey = StreamUtils.groupByKey(actHistoryInfoVoList, ActHistoryInfoVo::getTaskDefinitionKey); @@ -275,7 +281,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService }); nodeInfoList.add(actHistoryInfoVo); } - //节点信息 + // 节点信息 map.put("nodeListInfo", nodeInfoList); BpmnModel bpmnModel = repositoryService.getBpmnModel(list.get(0).getProcessDefinitionId()); List graphicInfoVos = new ArrayList<>(); @@ -367,7 +373,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService @Transactional(rollbackFor = Exception.class) public boolean deleteRuntimeProcessAndHisInst(List processInstanceIds) { try { - //1.删除运行中流程实例 + // 1.删除运行中流程实例 List list = taskService.createTaskQuery().processInstanceIdIn(processInstanceIds) .taskTenantId(TenantHelper.getTenantId()).list(); List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); @@ -375,7 +381,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService subTasks.forEach(e -> taskService.deleteTask(e.getId())); } runtimeService.bulkDeleteProcessInstances(processInstanceIds, LoginHelper.getUserId() + "删除了当前流程申请"); - //2.删除历史记录 + // 2.删除历史记录 List historicProcessInstanceList = historyService.createHistoricProcessInstanceQuery() .processInstanceTenantId(TenantHelper.getTenantId()).processInstanceIds(new HashSet<>(processInstanceIds)).list(); if (ObjectUtil.isNotEmpty(historicProcessInstanceList)) { @@ -397,8 +403,8 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService @Transactional(rollbackFor = Exception.class) public boolean deleteRuntimeProcessAndHisInstByBusinessKeys(List businessKeys) { try { - //1.删除运行中流程实例 - List actHiProcinsts = iActHiProcinstService.selectByBusinessKeyIn(businessKeys); + // 1.删除运行中流程实例 + List actHiProcinsts = actHiProcinstService.selectByBusinessKeyIn(businessKeys); if (CollUtil.isEmpty(actHiProcinsts)) { log.warn("当前业务ID:{}查询到流程实例为空!", businessKeys); return false; @@ -411,7 +417,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService subTasks.forEach(e -> taskService.deleteTask(e.getId())); } runtimeService.bulkDeleteProcessInstances(processInstanceIds, LoginHelper.getUserId() + "删除了当前流程申请"); - //2.删除历史记录 + // 2.删除历史记录 List historicProcessInstanceList = historyService.createHistoricProcessInstanceQuery() .processInstanceTenantId(TenantHelper.getTenantId()).processInstanceIds(new HashSet<>(processInstanceIds)).list(); if (ObjectUtil.isNotEmpty(historicProcessInstanceList)) { @@ -522,7 +528,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService } for (HistoricProcessInstance processInstance : historicProcessInstanceList) { ProcessInstanceVo processInstanceVo = BeanUtil.toBean(processInstance, ProcessInstanceVo.class); - processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstance.getBusinessStatus())); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(processInstance.getBusinessStatus())); if (CollUtil.isNotEmpty(taskVoList)) { List collect = StreamUtils.filter(taskVoList, e -> e.getProcessInstanceId().equals(processInstance.getId())); processInstanceVo.setTaskVoList(CollUtil.isNotEmpty(collect) ? collect : Collections.emptyList()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 25c005f6d..edd102e34 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -3,6 +3,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; @@ -218,12 +219,12 @@ public class ActTaskServiceImpl implements IActTaskService { if (CollUtil.isNotEmpty(processInstanceList)) { processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { taskVo.setBusinessStatus(e.getBusinessStatus()); - taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); + taskVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(taskVo.getBusinessStatus())); taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey()); taskVo.setProcessDefinitionName(e.getProcessDefinitionName()); }); } - taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); + taskVo.setAssignee(Convert.toLong(task.getAssignee())); taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); list.add(taskVo); @@ -261,7 +262,7 @@ public class ActTaskServiceImpl implements IActTaskService { if (CollUtil.isNotEmpty(processInstanceList)) { processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { taskVo.setBusinessStatus(e.getBusinessStatus()); - taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); + taskVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(taskVo.getBusinessStatus())); taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey()); taskVo.setProcessDefinitionName(e.getProcessDefinitionName()); }); @@ -306,7 +307,7 @@ public class ActTaskServiceImpl implements IActTaskService { if (CollUtil.isNotEmpty(historicProcessInstanceList)) { historicProcessInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { taskVo.setBusinessStatus(e.getBusinessStatus()); - taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); + taskVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(taskVo.getBusinessStatus())); taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey()); taskVo.setProcessDefinitionName(e.getProcessDefinitionName()); }); @@ -348,12 +349,12 @@ public class ActTaskServiceImpl implements IActTaskService { if (CollUtil.isNotEmpty(historicProcessInstanceList)) { historicProcessInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { taskVo.setBusinessStatus(e.getBusinessStatus()); - taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); + taskVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(taskVo.getBusinessStatus())); taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey()); taskVo.setProcessDefinitionName(e.getProcessDefinitionName()); }); } - taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); + taskVo.setAssignee(Convert.toLong(task.getAssignee())); list.add(taskVo); } long count = query.count(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index dc2055ada..b347a08a2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -1,28 +1,28 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import lombok.RequiredArgsConstructor; -import org.dromara.workflow.service.IActProcessInstanceService; -import org.dromara.workflow.utils.WorkflowUtils; -import org.springframework.stereotype.Service; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.TestLeave; import org.dromara.workflow.domain.bo.TestLeaveBo; import org.dromara.workflow.domain.vo.TestLeaveVo; -import org.dromara.workflow.domain.TestLeave; import org.dromara.workflow.mapper.TestLeaveMapper; +import org.dromara.workflow.service.IActProcessInstanceService; import org.dromara.workflow.service.ITestLeaveService; +import org.dromara.workflow.utils.WorkflowUtils; +import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Collection; /** * 请假Service业务层处理 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java index 53af1ba0a..27aacedbd 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java @@ -1,36 +1,35 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.collection.CollUtil; -import com.fasterxml.jackson.core.type.TypeReference; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.json.utils.JsonUtils; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import lombok.RequiredArgsConstructor; +import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.ActHiProcinst; +import org.dromara.workflow.domain.WfBusinessForm; import org.dromara.workflow.domain.WfFormDefinition; +import org.dromara.workflow.domain.bo.WfBusinessFormBo; +import org.dromara.workflow.domain.vo.WfBusinessFormVo; import org.dromara.workflow.domain.vo.WfFormDefinitionVo; +import org.dromara.workflow.mapper.WfBusinessFormMapper; import org.dromara.workflow.mapper.WfFormDefinitionMapper; import org.dromara.workflow.service.IActHiProcinstService; import org.dromara.workflow.service.IActProcessInstanceService; +import org.dromara.workflow.service.IWfBusinessFormService; import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; -import org.dromara.workflow.domain.bo.WfBusinessFormBo; -import org.dromara.workflow.domain.vo.WfBusinessFormVo; -import org.dromara.workflow.domain.WfBusinessForm; -import org.dromara.workflow.mapper.WfBusinessFormMapper; -import org.dromara.workflow.service.IWfBusinessFormService; import org.springframework.transaction.annotation.Transactional; +import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Collection; import java.util.stream.Collectors; /** @@ -45,8 +44,8 @@ public class WfBusinessFormServiceImpl implements IWfBusinessFormService { private final WfBusinessFormMapper baseMapper; private final WfFormDefinitionMapper wfFormDefinitionMapper; - private final IActProcessInstanceService iActProcessInstanceService; - private final IActHiProcinstService iActHiProcinstService; + private final IActProcessInstanceService actProcessInstanceService; + private final IActHiProcinstService actHiProcinstService; /** * 查询发起流程 @@ -104,8 +103,7 @@ public class WfBusinessFormServiceImpl implements IWfBusinessFormService { bo.setId(add.getId()); } if (StringUtils.isNotBlank(add.getContentValue())) { - Map variable = JsonUtils.parseObject(add.getContentValue(), new TypeReference<>() { - }); + Map variable = JsonUtils.parseMap(add.getContentValue()); add.setVariable(variable); } return add; @@ -119,8 +117,7 @@ public class WfBusinessFormServiceImpl implements IWfBusinessFormService { WfBusinessForm update = MapstructUtils.convert(bo, WfBusinessForm.class); baseMapper.updateById(update); if (StringUtils.isNotBlank(update.getContentValue())) { - Map variable = JsonUtils.parseObject(update.getContentValue(), new TypeReference<>() { - }); + Map variable = JsonUtils.parseMap(update.getContentValue()); update.setVariable(variable); } return update; @@ -132,9 +129,9 @@ public class WfBusinessFormServiceImpl implements IWfBusinessFormService { @Override @Transactional(rollbackFor = Exception.class) public Boolean deleteWithValidByIds(Collection ids) { - List actHiProcinsts = iActHiProcinstService.selectByBusinessKeyIn(StreamUtils.toList(ids, String::valueOf)); + List actHiProcinsts = actHiProcinstService.selectByBusinessKeyIn(StreamUtils.toList(ids, String::valueOf)); if (CollUtil.isNotEmpty(actHiProcinsts)) { - iActProcessInstanceService.deleteRuntimeProcessAndHisInst(actHiProcinsts.stream().map(ActHiProcinst::getId).collect(Collectors.toList())); + actProcessInstanceService.deleteRuntimeProcessAndHisInst(actHiProcinsts.stream().map(ActHiProcinst::getId).collect(Collectors.toList())); } return baseMapper.deleteBatchIds(ids) > 0; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java index a72086d21..620403aaa 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java @@ -1,24 +1,24 @@ package org.dromara.workflow.service.impl; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.workflow.domain.WfCategory; +import org.dromara.workflow.domain.bo.WfCategoryBo; +import org.dromara.workflow.domain.vo.WfCategoryVo; +import org.dromara.workflow.mapper.WfCategoryMapper; +import org.dromara.workflow.service.IWfCategoryService; import org.flowable.engine.RepositoryService; import org.flowable.engine.repository.Deployment; import org.flowable.engine.repository.Model; import org.flowable.engine.repository.ProcessDefinition; import org.springframework.stereotype.Service; -import org.dromara.workflow.domain.bo.WfCategoryBo; -import org.dromara.workflow.domain.vo.WfCategoryVo; -import org.dromara.workflow.domain.WfCategory; -import org.dromara.workflow.mapper.WfCategoryMapper; -import org.dromara.workflow.service.IWfCategoryService; import org.springframework.transaction.annotation.Transactional; -import java.util.List; import java.util.Collection; +import java.util.List; /** * 流程分类Service业务层处理 @@ -84,11 +84,11 @@ public class WfCategoryServiceImpl implements IWfCategoryService { WfCategoryVo wfCategoryVo = baseMapper.selectVoById(bo.getId()); List processDefinitionList = repositoryService.createProcessDefinitionQuery().processDefinitionCategory(wfCategoryVo.getCategoryCode()).list(); for (ProcessDefinition processDefinition : processDefinitionList) { - repositoryService.setProcessDefinitionCategory(processDefinition.getId(),bo.getCategoryCode()); + repositoryService.setProcessDefinitionCategory(processDefinition.getId(), bo.getCategoryCode()); } List deploymentList = repositoryService.createDeploymentQuery().deploymentCategory(wfCategoryVo.getCategoryCode()).list(); for (Deployment deployment : deploymentList) { - repositoryService.setDeploymentCategory(deployment.getId(),bo.getCategoryCode()); + repositoryService.setDeploymentCategory(deployment.getId(), bo.getCategoryCode()); } List modelList = repositoryService.createModelQuery().modelCategory(wfCategoryVo.getCategoryCode()).list(); for (Model model : modelList) { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java index 84d1ffa73..675c03fa9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java @@ -1,24 +1,24 @@ package org.dromara.workflow.service.impl; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.mybatis.core.page.PageQuery; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.WfFormDefinition; import org.dromara.workflow.domain.bo.WfFormDefinitionBo; import org.dromara.workflow.domain.vo.WfFormDefinitionVo; -import org.dromara.workflow.domain.WfFormDefinition; import org.dromara.workflow.mapper.WfFormDefinitionMapper; import org.dromara.workflow.service.IWfFormDefinitionService; +import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Collection; /** * 动态单与流程定义关联信息Service业务层处理 @@ -36,7 +36,7 @@ public class WfFormDefinitionServiceImpl implements IWfFormDefinitionService { * 查询动态单与流程定义关联信息 */ @Override - public WfFormDefinitionVo queryById(Long id){ + public WfFormDefinitionVo queryById(Long id) { return baseMapper.selectVoById(id); } @@ -98,9 +98,9 @@ public class WfFormDefinitionServiceImpl implements IWfFormDefinitionService { /** * 保存前的数据校验 */ - private void validEntityBeforeSave(WfFormDefinition entity){ + private void validEntityBeforeSave(WfFormDefinition entity) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.eq(WfFormDefinition::getFormId,entity.getFormId()); + wrapper.eq(WfFormDefinition::getFormId, entity.getFormId()); baseMapper.delete(wrapper); } @@ -109,7 +109,7 @@ public class WfFormDefinitionServiceImpl implements IWfFormDefinitionService { */ @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ + if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteBatchIds(ids) > 0; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java index 4cb658ccd..5fd0b34cc 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java @@ -58,6 +58,7 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { * @param sysUserMultiBo 参数 */ @Override + @SuppressWarnings("unchecked") public TableDataInfo getWorkflowAddMultiInstanceByPage(SysUserMultiBo sysUserMultiBo) { Task task = taskService.createTaskQuery().taskId(sysUserMultiBo.getTaskId()).singleResult(); if (task == null) { @@ -72,7 +73,7 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { queryWrapper.eq(StringUtils.isNotEmpty(sysUserMultiBo.getDeptId()), SysUser::getDeptId, sysUserMultiBo.getDeptId()); queryWrapper.eq(SysUser::getStatus, UserStatus.OK.getCode()); if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { - List assigneeList = (List) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList()); + List assigneeList = (List) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList()); queryWrapper.notIn(CollectionUtil.isNotEmpty(assigneeList), SysUser::getUserId, assigneeList); } else { List list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list(); @@ -92,6 +93,7 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { * @param taskId 任务id 任务id */ @Override + @SuppressWarnings("unchecked") public List getWorkflowDeleteMultiInstanceList(String taskId) { Task task = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).taskId(taskId).singleResult(); List taskList = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(task.getProcessInstanceId()).list(); @@ -161,11 +163,11 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { */ private Page recordPage(Page page) { List records = page.getRecords(); - if (CollectionUtil.isEmpty(records)) { + if (CollUtil.isEmpty(records)) { return page; } - List collectDeptId = records.stream().map(SysUserVo::getDeptId).filter(Objects::nonNull).collect(Collectors.toList()); - if (CollectionUtil.isEmpty(collectDeptId)) { + List collectDeptId = StreamUtils.toList(records, SysUserVo::getDeptId); + if (CollUtil.isEmpty(collectDeptId)) { return page; } List sysDeptList = sysDeptMapper.selectVoBatchIds(collectDeptId); @@ -187,7 +189,7 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { return Collections.emptyList(); } LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); - //检索条件 + // 检索条件 queryWrapper.eq(SysUser::getStatus, UserStatus.OK.getCode()); queryWrapper.in(SysUser::getUserId, userIds); List sysUserVos = sysUserMapper.selectVoList(queryWrapper); 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 index 4d8119914..63cec8da5 100644 --- 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 @@ -75,7 +75,7 @@ public class WorkflowUtils { if (jsonBytes == null) { return new byte[0]; } - //1. json字节码转成 BpmnModel 对象 + // 1. json字节码转成 BpmnModel 对象 ObjectMapper objectMapper = JsonUtils.getObjectMapper(); JsonNode jsonNode = objectMapper.readTree(jsonBytes); BpmnModel bpmnModel = new BpmnJsonConverter().convertToBpmnModel(jsonNode); @@ -83,7 +83,7 @@ public class WorkflowUtils { if (bpmnModel.getProcesses().isEmpty()) { return new byte[0]; } - //2.将bpmnModel转为xml + // 2.将bpmnModel转为xml return new BpmnXMLConverter().convertToXML(bpmnModel); } @@ -127,32 +127,32 @@ public class WorkflowUtils { private static void checkBpmnNode(Collection flowElements, boolean subtask) throws ServerException { if (CollUtil.isEmpty(flowElements)) { - throw new ServerException(subtask ? "子流程必须存在节点" : "" + "必须存在节点!"); + throw new ServerException(subtask ? "子流程必须存在节点" : "必须存在节点!"); } List startEventList = flowElements.stream().filter(StartEvent.class::isInstance).map(StartEvent.class::cast).collect(Collectors.toList()); if (CollUtil.isEmpty(startEventList)) { - throw new ServerException(subtask ? "子流程必须存在开始节点" : "" + "必须存在开始节点!"); + throw new ServerException(subtask ? "子流程必须存在开始节点" : "必须存在开始节点!"); } if (startEventList.size() > 1) { - throw new ServerException(subtask ? "子流程只能存在一个开始节点" : "" + "只能存在一个开始节点!"); + throw new ServerException(subtask ? "子流程只能存在一个开始节点" : "只能存在一个开始节点!"); } StartEvent startEvent = startEventList.get(0); List outgoingFlows = startEvent.getOutgoingFlows(); if (CollUtil.isEmpty(outgoingFlows)) { - throw new ServerException(subtask ? "子流程流程节点为空,请至少设计一条主线流程!" : "" + "流程节点为空,请至少设计一条主线流程!"); + throw new ServerException(subtask ? "子流程流程节点为空,请至少设计一条主线流程!" : "流程节点为空,请至少设计一条主线流程!"); } FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement(); if (!(targetFlowElement instanceof UserTask)) { - throw new ServerException(subtask ? "子流程开始节点后第一个节点必须是用户任务!" : "" + "开始节点后第一个节点必须是用户任务!"); + throw new ServerException(subtask ? "子流程开始节点后第一个节点必须是用户任务!" : "开始节点后第一个节点必须是用户任务!"); } List endEventList = flowElements.stream().filter(EndEvent.class::isInstance).map(EndEvent.class::cast).collect(Collectors.toList()); if (CollUtil.isEmpty(endEventList)) { - throw new ServerException(subtask ? "子流程必须存在结束节点!" : "" + "必须存在结束节点!"); + throw new ServerException(subtask ? "子流程必须存在结束节点!" : "必须存在结束节点!"); } } @@ -298,7 +298,7 @@ public class WorkflowUtils { return; } ProcessInstanceVo processInstanceVo = BeanUtil.toBean(actHiProcinst, ProcessInstanceVo.class); - processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstanceVo.getBusinessStatus())); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(processInstanceVo.getBusinessStatus())); ReflectUtils.invokeSetter(obj, PROCESS_INSTANCE_VO, processInstanceVo); } @@ -320,18 +320,18 @@ public class WorkflowUtils { if (CollUtil.isEmpty(actHiProcinstList)) { ProcessInstanceVo processInstanceVo = new ProcessInstanceVo(); processInstanceVo.setBusinessStatus(BusinessStatusEnum.DRAFT.getStatus()); - processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstanceVo.getBusinessStatus())); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(processInstanceVo.getBusinessStatus())); ReflectUtils.invokeSetter(o, PROCESS_INSTANCE_VO, processInstanceVo); } else { ActHiProcinst actHiProcinst = actHiProcinstList.stream().filter(e -> e.getBusinessKey().equals(fieldValue)).findFirst().orElse(null); if (ObjectUtil.isNotEmpty(actHiProcinst)) { ProcessInstanceVo processInstanceVo = BeanUtil.toBean(actHiProcinst, ProcessInstanceVo.class); - processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstanceVo.getBusinessStatus())); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(processInstanceVo.getBusinessStatus())); ReflectUtils.invokeSetter(o, PROCESS_INSTANCE_VO, processInstanceVo); } else { ProcessInstanceVo processInstanceVo = new ProcessInstanceVo(); processInstanceVo.setBusinessStatus(BusinessStatusEnum.DRAFT.getStatus()); - processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstanceVo.getBusinessStatus())); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(processInstanceVo.getBusinessStatus())); ReflectUtils.invokeSetter(o, PROCESS_INSTANCE_VO, processInstanceVo); } } 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 From 7fb78785ec4c7f1311ca45b15a5f3bf39d354f8b Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 30 Nov 2023 12:36:47 +0800 Subject: [PATCH 092/159] =?UTF-8?q?remove=20=E7=A7=BB=E9=99=A4=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E8=A1=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WfBusinessFormController.java | 107 ------------- .../workflow/controller/WfFormController.java | 110 -------------- .../WfFormDefinitionController.java | 42 ------ .../workflow/domain/WfBusinessForm.java | 66 --------- .../org/dromara/workflow/domain/WfForm.java | 49 ------ .../workflow/domain/WfFormDefinition.java | 57 ------- .../workflow/domain/bo/WfBusinessFormBo.java | 59 -------- .../dromara/workflow/domain/bo/WfFormBo.java | 67 --------- .../domain/bo/WfFormDefinitionBo.java | 61 -------- .../workflow/domain/vo/WfBusinessFormVo.java | 73 --------- .../domain/vo/WfFormDefinitionVo.java | 64 -------- .../dromara/workflow/domain/vo/WfFormVo.java | 67 --------- .../workflow/mapper/WfBusinessFormMapper.java | 15 -- .../mapper/WfFormDefinitionMapper.java | 15 -- .../dromara/workflow/mapper/WfFormMapper.java | 13 -- .../service/IWfBusinessFormService.java | 49 ------ .../service/IWfFormDefinitionService.java | 48 ------ .../workflow/service/IWfFormService.java | 64 -------- .../impl/WfBusinessFormServiceImpl.java | 138 ----------------- .../impl/WfFormDefinitionServiceImpl.java | 117 --------------- .../service/impl/WfFormServiceImpl.java | 140 ------------------ 21 files changed, 1421 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfBusinessFormController.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormController.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfBusinessForm.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfForm.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfBusinessFormBo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormBo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfBusinessFormVo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormVo.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfBusinessFormMapper.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormMapper.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfBusinessFormService.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormService.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormServiceImpl.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfBusinessFormController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfBusinessFormController.java deleted file mode 100644 index 1388aadfb..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfBusinessFormController.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.dromara.workflow.controller; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.excel.utils.ExcelUtil; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.log.enums.BusinessType; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.web.core.BaseController; -import org.dromara.workflow.domain.WfBusinessForm; -import org.dromara.workflow.domain.bo.WfBusinessFormBo; -import org.dromara.workflow.domain.vo.WfBusinessFormVo; -import org.dromara.workflow.service.IWfBusinessFormService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 发起流程 - * - * @author may - * @date 2023-09-16 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/businessForm") -public class WfBusinessFormController extends BaseController { - - private final IWfBusinessFormService wfBusinessFormService; - - /** - * 查询发起流程列表 - */ - @SaCheckPermission("workflow:businessForm:list") - @GetMapping("/list") - public TableDataInfo list(WfBusinessFormBo bo, PageQuery pageQuery) { - return wfBusinessFormService.queryPageList(bo, pageQuery); - } - - /** - * 导出发起流程列表 - */ - @SaCheckPermission("workflow:businessForm:export") - @Log(title = "发起流程", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(WfBusinessFormBo bo, HttpServletResponse response) { - List list = wfBusinessFormService.queryList(bo); - ExcelUtil.exportExcel(list, "发起流程", WfBusinessFormVo.class, response); - } - - /** - * 获取发起流程详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("workflow:businessForm:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(wfBusinessFormService.queryById(id)); - } - - /** - * 新增发起流程 - */ - @SaCheckPermission("workflow:businessForm:add") - @Log(title = "发起流程", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody WfBusinessFormBo bo) { - return R.ok(wfBusinessFormService.insertByBo(bo)); - } - - /** - * 修改发起流程 - */ - @SaCheckPermission("workflow:businessForm:edit") - @Log(title = "发起流程", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody WfBusinessFormBo bo) { - return R.ok(wfBusinessFormService.updateByBo(bo)); - } - - /** - * 删除发起流程 - * - * @param ids 主键串 - */ - @SaCheckPermission("workflow:businessForm:remove") - @Log(title = "发起流程", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(wfBusinessFormService.deleteWithValidByIds(List.of(ids))); - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormController.java deleted file mode 100644 index 21ab55091..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormController.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.dromara.workflow.controller; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.enums.UserStatus; -import org.dromara.common.core.validate.QueryGroup; -import org.dromara.common.excel.utils.ExcelUtil; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.log.enums.BusinessType; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.web.core.BaseController; -import org.dromara.workflow.domain.bo.WfFormBo; -import org.dromara.workflow.domain.vo.WfFormVo; -import org.dromara.workflow.service.IWfFormService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Arrays; -import java.util.List; - -/** - * 流程表单Controller - * - * @author KonBAI - */ -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/form") -public class WfFormController extends BaseController { - - private final IWfFormService formService; - - /** - * 查询流程表单列表 - */ - @SaCheckPermission("workflow:form:list") - @GetMapping("/list") - public TableDataInfo list(@Validated(QueryGroup.class) WfFormBo bo, PageQuery pageQuery) { - return formService.queryPageList(bo, pageQuery); - } - - /** - * 查询流程表单列表 - */ - @SaCheckPermission("workflow:form:list") - @GetMapping("/queryList") - public R> queryList(WfFormBo bo) { - bo.setStatus(UserStatus.OK.getCode()); - return R.ok(formService.queryList(bo)); - } - - /** - * 导出流程表单列表 - */ - @SaCheckPermission("workflow:form:export") - @Log(title = "流程表单", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(@Validated WfFormBo bo, HttpServletResponse response) { - List list = formService.queryList(bo); - ExcelUtil.exportExcel(list, "流程表单", WfFormVo.class, response); - } - - /** - * 获取流程表单详细信息 - * - * @param formId 主键 - */ - @SaCheckPermission("workflow:form:query") - @GetMapping(value = "/{formId}") - public R getInfo(@NotNull(message = "主键不能为空") @PathVariable("formId") Long formId) { - return R.ok(formService.queryById(formId)); - } - - /** - * 新增流程表单 - */ - @SaCheckPermission("workflow:form:add") - @Log(title = "流程表单", businessType = BusinessType.INSERT) - @PostMapping - public R add(@RequestBody WfFormBo bo) { - return toAjax(formService.insertForm(bo)); - } - - /** - * 修改流程表单 - */ - @SaCheckPermission("workflow:form:edit") - @Log(title = "流程表单", businessType = BusinessType.UPDATE) - @PutMapping - public R edit(@RequestBody WfFormBo bo) { - return toAjax(formService.updateForm(bo)); - } - - /** - * 删除流程表单 - * - * @param formIds 主键串 - */ - @SaCheckPermission("workflow:form:remove") - @Log(title = "流程表单", businessType = BusinessType.DELETE) - @DeleteMapping("/{formIds}") - public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] formIds) { - return toAjax(formService.deleteWithValidByIds(Arrays.asList(formIds))); - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java deleted file mode 100644 index c6e7005c0..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.dromara.workflow.controller; - - -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.log.annotation.Log; -import org.dromara.common.log.enums.BusinessType; -import org.dromara.common.web.core.BaseController; -import org.dromara.workflow.domain.bo.WfFormDefinitionBo; -import org.dromara.workflow.service.IWfFormDefinitionService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 动态单与流程定义关联信息 - * - * @author may - * @date 2023-08-31 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/formDefinition") -public class WfFormDefinitionController extends BaseController { - - private final IWfFormDefinitionService wfFormDefinitionService; - - /** - * 新增动态单与流程定义关联信息 - */ - @Log(title = "动态单与流程定义关联信息", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody WfFormDefinitionBo bo) { - return toAjax(wfFormDefinitionService.insertByBo(bo)); - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfBusinessForm.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfBusinessForm.java deleted file mode 100644 index 5de725095..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfBusinessForm.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.dromara.workflow.domain; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.tenant.core.TenantEntity; - -import java.io.Serial; -import java.util.Map; - -/** - * 发起流程对象 wf_business_form - * - * @author may - * @date 2023-09-16 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("wf_business_form") -public class WfBusinessForm extends TenantEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 申请编码 - */ - private String applyCode; - - /** - * 表单id - */ - private Long formId; - - /** - * 表单名称 - */ - private String formName; - - /** - * 表单内容 - */ - private String content; - - /** - * 表单值 - */ - private String contentValue; - - /** - * 流程变量 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - @TableField(exist = false) - private Map variable; - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfForm.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfForm.java deleted file mode 100644 index ae1340e9f..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfForm.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.dromara.workflow.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.tenant.core.TenantEntity; - -import java.io.Serial; - -/** - * 流程表单对象 wf_form - * - * @author KonBAI - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("wf_form") -public class WfForm extends TenantEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 表单主键 - */ - @TableId(value = "form_id") - private Long formId; - - /** - * 表单名称 - */ - private String formName; - - /** - * 表单内容 - */ - private String content; - - /** - * 状态(0正常 1停用) - */ - private String status; - - /** - * 备注 - */ - private String remark; -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java deleted file mode 100644 index 1fb77531a..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.dromara.workflow.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.tenant.core.TenantEntity; - -import java.io.Serial; - -/** - * 动态单与流程定义关联信息对象 wf_form_definition - * - * @author may - * @date 2023-08-31 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("wf_form_definition") -public class WfFormDefinition extends TenantEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 动态表单id - */ - private Long formId; - - /** - * 流程定义key - */ - private String processDefinitionKey; - - /** - * 流程定义名称 - */ - private String processDefinitionName; - - /** - * 流程定义id - */ - private String processDefinitionId; - - /** - * 流程定义版本 - */ - private Long processDefinitionVersion; - - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfBusinessFormBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfBusinessFormBo.java deleted file mode 100644 index 797cf62e9..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfBusinessFormBo.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.workflow.domain.WfBusinessForm; - -/** - * 发起流程业务对象 wf_business_form - * - * @author may - * @date 2023-09-16 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = WfBusinessForm.class, reverseConvertGenerate = false) -public class WfBusinessFormBo extends BaseEntity { - - /** - * 主键 - */ - @NotNull(message = "主键不能为空", groups = {EditGroup.class}) - private Long id; - - /** - * 申请编码 - */ - private String applyCode; - - /** - * 表单id - */ - @NotNull(message = "表单id不能为空", groups = {AddGroup.class, EditGroup.class}) - private Long formId; - - /** - * 表单名称 - */ - @NotBlank(message = "表单名称不能为空", groups = {AddGroup.class, EditGroup.class}) - private String formName; - - /** - * 表单内容 - */ - @NotBlank(message = "表单内容不能为空", groups = {AddGroup.class, EditGroup.class}) - private String content; - - /** - * 表单值 - */ - private String contentValue; - - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormBo.java deleted file mode 100644 index 891a5a52f..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormBo.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.workflow.domain.WfForm; - -import java.io.Serial; - -/** - * 流程表单业务对象 - * - * @author KonBAI - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = WfForm.class, reverseConvertGenerate = false) -public class WfFormBo extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 表单主键 - */ - @NotNull(message = "表单ID不能为空", groups = {EditGroup.class}) - private Long formId; - - /** - * 表单名称 - */ - @NotBlank(message = "表单名称不能为空", groups = {AddGroup.class, EditGroup.class}) - private String formName; - - /** - * 表单配置 - */ - @NotBlank(message = "表单配置不能为空", groups = {AddGroup.class, EditGroup.class}) - private String formConfig; - - /** - * 表单内容 - */ - @NotBlank(message = "表单内容不能为空", groups = {AddGroup.class, EditGroup.class}) - private String content; - - /** - * 状态(0正常 1停用) - */ - @NotBlank(message = "状态不能为空", groups = {AddGroup.class, EditGroup.class}) - private String status; - - /** - * 备注 - */ - private String remark; - - /** - * 动态单与流程定义关联信息业务对象 - */ - private WfFormDefinitionBo wfFormDefinitionBo; -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java deleted file mode 100644 index be486ebb9..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.dromara.workflow.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.workflow.domain.WfFormDefinition; - -/** - * 动态单与流程定义关联信息业务对象 wf_form_definition - * - * @author may - * @date 2023-08-31 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = WfFormDefinition.class, reverseConvertGenerate = false) -public class WfFormDefinitionBo extends BaseEntity { - - /** - * 主键 - */ - @NotNull(message = "主键不能为空", groups = {EditGroup.class}) - private Long id; - - /** - * 动态表单id - */ - @NotNull(message = "动态表单id不能为空", groups = {AddGroup.class, EditGroup.class}) - private Long formId; - - /** - * 流程定义id - */ - @NotBlank(message = "流程定义key不能为空", groups = {AddGroup.class, EditGroup.class}) - private String processDefinitionKey; - - /** - * 流程定义名称 - */ - @NotBlank(message = "流程定义名称不能为空", groups = {AddGroup.class, EditGroup.class}) - private String processDefinitionName; - - /** - * 流程定义id - */ - @NotBlank(message = "流程定义id不能为空", groups = {AddGroup.class, EditGroup.class}) - private String processDefinitionId; - - /** - * 流程定义版本 - */ - @NotNull(message = "流程定义版本不能为空", groups = {AddGroup.class, EditGroup.class}) - private Long processDefinitionVersion; - - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfBusinessFormVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfBusinessFormVo.java deleted file mode 100644 index 05cb0fdeb..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfBusinessFormVo.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.dromara.workflow.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import org.dromara.workflow.domain.WfBusinessForm; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 发起流程视图对象 wf_business_form - * - * @author may - * @date 2023-09-16 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = WfBusinessForm.class) -public class WfBusinessFormVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @ExcelProperty(value = "主键") - private Long id; - - /** - * 申请编码 - */ - @ExcelProperty(value = "申请编码") - private String applyCode; - - /** - * 表单id - */ - @ExcelProperty(value = "表单id") - private Long formId; - - /** - * 表单名称 - */ - @ExcelProperty(value = "表单名称") - private String formName; - - /** - * 表单内容 - */ - @ExcelProperty(value = "表单内容") - private String content; - - /** - * 表单值 - */ - @ExcelProperty(value = "表单值") - private String contentValue; - - /** - * 动态单与流程定义关联信息业务对象 - */ - private WfFormDefinitionVo wfFormDefinitionVo; - - /** - * 流程实例对象 - */ - private ProcessInstanceVo processInstanceVo; - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java deleted file mode 100644 index 47bd0932e..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.dromara.workflow.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import org.dromara.workflow.domain.WfFormDefinition; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 动态单与流程定义关联信息视图对象 wf_form_definition - * - * @author may - * @date 2023-08-31 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = WfFormDefinition.class) -public class WfFormDefinitionVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @ExcelProperty(value = "主键") - private Long id; - - /** - * 动态表单id - */ - @ExcelProperty(value = "动态表单id") - private Long formId; - - /** - * 流程定义id - */ - @ExcelProperty(value = "流程定义key") - private String processDefinitionKey; - - /** - * 流程定义名称 - */ - @ExcelProperty(value = "流程定义名称") - private String processDefinitionName; - - /** - * 流程定义id - */ - @ExcelProperty(value = "流程定义id") - private String processDefinitionId; - - /** - * 流程定义版本 - */ - @ExcelProperty(value = "流程定义版本") - private Long processDefinitionVersion; - - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormVo.java deleted file mode 100644 index 7f8fa8e67..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormVo.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.dromara.workflow.domain.vo; - -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import org.dromara.workflow.domain.WfForm; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - -/** - * 流程分类视图对象 - * - * @author KonBAI - */ -@Data -@AutoMapper(target = WfForm.class) -public class WfFormVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 表单主键 - */ - private Long formId; - - /** - * 表单名称 - */ - private String formName; - - /** - * 表单配置 - */ - private String formConfig; - - /** - * 表单内容 - */ - private String content; - - /** - * 状态(0正常 1停用) - */ - private String status; - - /** - * 备注 - */ - private String remark; - - /** - * 创建时间 - */ - private Date createTime; - - /** - * 修改时间 - */ - private Date updateTime; - - /** - * 动态单与流程定义关联信息业务对象 - */ - private WfFormDefinitionVo wfFormDefinitionVo; -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfBusinessFormMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfBusinessFormMapper.java deleted file mode 100644 index e5f0f7d40..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfBusinessFormMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.dromara.workflow.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.WfBusinessForm; -import org.dromara.workflow.domain.vo.WfBusinessFormVo; - -/** - * 发起流程Mapper接口 - * - * @author may - * @date 2023-09-16 - */ -public interface WfBusinessFormMapper extends BaseMapperPlus { - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java deleted file mode 100644 index 40617a894..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.dromara.workflow.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.WfFormDefinition; -import org.dromara.workflow.domain.vo.WfFormDefinitionVo; - -/** - * 动态单与流程定义关联信息Mapper接口 - * - * @author may - * @date 2023-08-31 - */ -public interface WfFormDefinitionMapper extends BaseMapperPlus { - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormMapper.java deleted file mode 100644 index 97b8fb664..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormMapper.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.dromara.workflow.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.WfForm; -import org.dromara.workflow.domain.vo.WfFormVo; - -/** - * 流程表单Mapper接口 - * - * @author KonBAI - */ -public interface WfFormMapper extends BaseMapperPlus { -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfBusinessFormService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfBusinessFormService.java deleted file mode 100644 index 7b8762917..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfBusinessFormService.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.dromara.workflow.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.workflow.domain.WfBusinessForm; -import org.dromara.workflow.domain.bo.WfBusinessFormBo; -import org.dromara.workflow.domain.vo.WfBusinessFormVo; - -import java.util.Collection; -import java.util.List; - -/** - * 发起流程Service接口 - * - * @author may - * @date 2023-09-16 - */ -public interface IWfBusinessFormService { - - /** - * 查询发起流程 - */ - WfBusinessFormVo queryById(Long id); - - /** - * 查询发起流程列表 - */ - TableDataInfo queryPageList(WfBusinessFormBo bo, PageQuery pageQuery); - - /** - * 查询发起流程列表 - */ - List queryList(WfBusinessFormBo bo); - - /** - * 新增发起流程 - */ - WfBusinessForm insertByBo(WfBusinessFormBo bo); - - /** - * 修改发起流程 - */ - WfBusinessForm updateByBo(WfBusinessFormBo bo); - - /** - * 校验并批量删除发起流程信息 - */ - Boolean deleteWithValidByIds(Collection ids); -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java deleted file mode 100644 index 490da5375..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.dromara.workflow.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.workflow.domain.bo.WfFormDefinitionBo; -import org.dromara.workflow.domain.vo.WfFormDefinitionVo; - -import java.util.Collection; -import java.util.List; - -/** - * 动态单与流程定义关联信息Service接口 - * - * @author may - * @date 2023-08-31 - */ -public interface IWfFormDefinitionService { - - /** - * 查询动态单与流程定义关联信息 - */ - WfFormDefinitionVo queryById(Long id); - - /** - * 查询动态单与流程定义关联信息列表 - */ - TableDataInfo queryPageList(WfFormDefinitionBo bo, PageQuery pageQuery); - - /** - * 查询动态单与流程定义关联信息列表 - */ - List queryList(WfFormDefinitionBo bo); - - /** - * 新增动态单与流程定义关联信息 - */ - Boolean insertByBo(WfFormDefinitionBo bo); - - /** - * 修改动态单与流程定义关联信息 - */ - Boolean updateByBo(WfFormDefinitionBo bo); - - /** - * 校验并批量删除动态单与流程定义关联信息信息 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormService.java deleted file mode 100644 index d699ccf6b..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormService.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.dromara.workflow.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.workflow.domain.bo.WfFormBo; -import org.dromara.workflow.domain.vo.WfFormVo; - -import java.util.Collection; -import java.util.List; - -/** - * 流程表单 服务层 - * - * @author KonBAI - */ -public interface IWfFormService { - /** - * 查询流程表单 - * - * @param formId 流程表单ID - * @return 流程表单 - */ - WfFormVo queryById(Long formId); - - /** - * 查询流程表单列表 - * - * @param bo 流程表单 - * @return 流程表单集合 - */ - TableDataInfo queryPageList(WfFormBo bo, PageQuery pageQuery); - - /** - * 查询流程表单列表 - * - * @param bo 流程表单 - * @return 流程表单集合 - */ - List queryList(WfFormBo bo); - - /** - * 新增流程表单 - * - * @param bo 流程表单 - * @return 结果 - */ - int insertForm(WfFormBo bo); - - /** - * 修改流程表单 - * - * @param bo 流程表单 - * @return 结果 - */ - int updateForm(WfFormBo bo); - - /** - * 批量删除流程表单 - * - * @param formIds 需要删除的流程表单ID - * @return 结果 - */ - Boolean deleteWithValidByIds(Collection formIds); -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java deleted file mode 100644 index 27aacedbd..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfBusinessFormServiceImpl.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.dromara.workflow.service.impl; - -import cn.hutool.core.collection.CollUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.utils.DateUtils; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.json.utils.JsonUtils; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.workflow.domain.ActHiProcinst; -import org.dromara.workflow.domain.WfBusinessForm; -import org.dromara.workflow.domain.WfFormDefinition; -import org.dromara.workflow.domain.bo.WfBusinessFormBo; -import org.dromara.workflow.domain.vo.WfBusinessFormVo; -import org.dromara.workflow.domain.vo.WfFormDefinitionVo; -import org.dromara.workflow.mapper.WfBusinessFormMapper; -import org.dromara.workflow.mapper.WfFormDefinitionMapper; -import org.dromara.workflow.service.IActHiProcinstService; -import org.dromara.workflow.service.IActProcessInstanceService; -import org.dromara.workflow.service.IWfBusinessFormService; -import org.dromara.workflow.utils.WorkflowUtils; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * 发起流程Service业务层处理 - * - * @author may - * @date 2023-09-16 - */ -@RequiredArgsConstructor -@Service -public class WfBusinessFormServiceImpl implements IWfBusinessFormService { - - private final WfBusinessFormMapper baseMapper; - private final WfFormDefinitionMapper wfFormDefinitionMapper; - private final IActProcessInstanceService actProcessInstanceService; - private final IActHiProcinstService actHiProcinstService; - - /** - * 查询发起流程 - */ - @Override - public WfBusinessFormVo queryById(Long id) { - WfBusinessFormVo wfBusinessFormVo = baseMapper.selectVoById(id); - if (wfBusinessFormVo != null) { - WfFormDefinitionVo wfFormDefinitionVo = wfFormDefinitionMapper.selectVoOne( - new LambdaQueryWrapper().eq(WfFormDefinition::getFormId, wfBusinessFormVo.getFormId()) - ); - wfBusinessFormVo.setWfFormDefinitionVo(wfFormDefinitionVo); - } - return wfBusinessFormVo; - } - - /** - * 查询发起流程列表 - */ - @Override - public TableDataInfo queryPageList(WfBusinessFormBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - List records = result.getRecords(); - WorkflowUtils.setProcessInstanceListVo(records, StreamUtils.toList(records, e -> String.valueOf(e.getId())), "id"); - return TableDataInfo.build(result); - } - - /** - * 查询发起流程列表 - */ - @Override - public List queryList(WfBusinessFormBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(WfBusinessFormBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(StringUtils.isNotBlank(bo.getApplyCode()), WfBusinessForm::getApplyCode, bo.getApplyCode()); - lqw.like(StringUtils.isNotBlank(bo.getFormName()), WfBusinessForm::getFormName, bo.getFormName()); - return lqw; - } - - /** - * 新增发起流程 - */ - @Override - public WfBusinessForm insertByBo(WfBusinessFormBo bo) { - WfBusinessForm add = MapstructUtils.convert(bo, WfBusinessForm.class); - //规则自行修改 - add.setApplyCode(DateUtils.dateTimeNow()); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - if (StringUtils.isNotBlank(add.getContentValue())) { - Map variable = JsonUtils.parseMap(add.getContentValue()); - add.setVariable(variable); - } - return add; - } - - /** - * 修改发起流程 - */ - @Override - public WfBusinessForm updateByBo(WfBusinessFormBo bo) { - WfBusinessForm update = MapstructUtils.convert(bo, WfBusinessForm.class); - baseMapper.updateById(update); - if (StringUtils.isNotBlank(update.getContentValue())) { - Map variable = JsonUtils.parseMap(update.getContentValue()); - update.setVariable(variable); - } - return update; - } - - /** - * 批量删除发起流程 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean deleteWithValidByIds(Collection ids) { - List actHiProcinsts = actHiProcinstService.selectByBusinessKeyIn(StreamUtils.toList(ids, String::valueOf)); - if (CollUtil.isNotEmpty(actHiProcinsts)) { - actProcessInstanceService.deleteRuntimeProcessAndHisInst(actHiProcinsts.stream().map(ActHiProcinst::getId).collect(Collectors.toList())); - } - return baseMapper.deleteBatchIds(ids) > 0; - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java deleted file mode 100644 index 675c03fa9..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java +++ /dev/null @@ -1,117 +0,0 @@ -package org.dromara.workflow.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.workflow.domain.WfFormDefinition; -import org.dromara.workflow.domain.bo.WfFormDefinitionBo; -import org.dromara.workflow.domain.vo.WfFormDefinitionVo; -import org.dromara.workflow.mapper.WfFormDefinitionMapper; -import org.dromara.workflow.service.IWfFormDefinitionService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 动态单与流程定义关联信息Service业务层处理 - * - * @author may - * @date 2023-08-31 - */ -@RequiredArgsConstructor -@Service -public class WfFormDefinitionServiceImpl implements IWfFormDefinitionService { - - private final WfFormDefinitionMapper baseMapper; - - /** - * 查询动态单与流程定义关联信息 - */ - @Override - public WfFormDefinitionVo queryById(Long id) { - return baseMapper.selectVoById(id); - } - - /** - * 查询动态单与流程定义关联信息列表 - */ - @Override - public TableDataInfo queryPageList(WfFormDefinitionBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - /** - * 查询动态单与流程定义关联信息列表 - */ - @Override - public List queryList(WfFormDefinitionBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(WfFormDefinitionBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getFormId() != null, WfFormDefinition::getFormId, bo.getFormId()); - lqw.eq(StringUtils.isNotBlank(bo.getProcessDefinitionKey()), WfFormDefinition::getProcessDefinitionKey, bo.getProcessDefinitionKey()); - lqw.like(StringUtils.isNotBlank(bo.getProcessDefinitionName()), WfFormDefinition::getProcessDefinitionName, bo.getProcessDefinitionName()); - lqw.eq(StringUtils.isNotBlank(bo.getProcessDefinitionId()), WfFormDefinition::getProcessDefinitionId, bo.getProcessDefinitionId()); - lqw.eq(bo.getProcessDefinitionVersion() != null, WfFormDefinition::getProcessDefinitionVersion, bo.getProcessDefinitionVersion()); - return lqw; - } - - /** - * 新增动态单与流程定义关联信息 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean insertByBo(WfFormDefinitionBo bo) { - WfFormDefinition add = MapstructUtils.convert(bo, WfFormDefinition.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改动态单与流程定义关联信息 - */ - @Override - public Boolean updateByBo(WfFormDefinitionBo bo) { - WfFormDefinition update = MapstructUtils.convert(bo, WfFormDefinition.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(WfFormDefinition entity) { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.eq(WfFormDefinition::getFormId, entity.getFormId()); - baseMapper.delete(wrapper); - } - - /** - * 批量删除动态单与流程定义关联信息 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteBatchIds(ids) > 0; - } -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormServiceImpl.java deleted file mode 100644 index 1a7aacb1d..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormServiceImpl.java +++ /dev/null @@ -1,140 +0,0 @@ -package org.dromara.workflow.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.workflow.domain.WfForm; -import org.dromara.workflow.domain.WfFormDefinition; -import org.dromara.workflow.domain.bo.WfFormBo; -import org.dromara.workflow.domain.vo.WfFormDefinitionVo; -import org.dromara.workflow.domain.vo.WfFormVo; -import org.dromara.workflow.mapper.WfFormDefinitionMapper; -import org.dromara.workflow.mapper.WfFormMapper; -import org.dromara.workflow.service.IWfFormService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; - -/** - * 流程表单Service业务层处理 - * - * @author KonBAI - */ -@RequiredArgsConstructor -@Service -public class WfFormServiceImpl implements IWfFormService { - - private final WfFormMapper baseMapper; - - private final WfFormDefinitionMapper wfFormDefinitionMapper; - - /** - * 查询流程表单 - * - * @param formId 流程表单ID - * @return 流程表单 - */ - @Override - public WfFormVo queryById(Long formId) { - WfFormVo wfFormVo = baseMapper.selectVoById(formId); - if (wfFormVo != null) { - WfFormDefinitionVo wfFormDefinitionVo = wfFormDefinitionMapper.selectVoOne( - new LambdaQueryWrapper().eq(WfFormDefinition::getFormId, wfFormVo.getFormId()) - ); - wfFormVo.setWfFormDefinitionVo(wfFormDefinitionVo); - } - return wfFormVo; - } - - /** - * 查询流程表单列表 - * - * @param bo 流程表单 - * @return 流程表单 - */ - @Override - public TableDataInfo queryPageList(WfFormBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - List records = result.getRecords(); - if (CollUtil.isNotEmpty(records)) { - List formIds = StreamUtils.toList(records, WfFormVo::getFormId); - List wfFormDefinitionVos = wfFormDefinitionMapper.selectVoList( - new LambdaQueryWrapper().in(WfFormDefinition::getFormId, formIds) - ); - for (WfFormVo record : records) { - if (CollUtil.isNotEmpty(wfFormDefinitionVos)) { - wfFormDefinitionVos.stream().filter(e -> String.valueOf(e.getFormId()).equals(String.valueOf(record.getFormId()))).findFirst().ifPresent(record::setWfFormDefinitionVo); - } - } - } - return TableDataInfo.build(result); - } - - /** - * 查询流程表单列表 - * - * @param bo 流程表单 - * @return 流程表单 - */ - @Override - public List queryList(WfFormBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - /** - * 新增流程表单 - * - * @param bo 流程表单 - * @return 结果 - */ - @Override - public int insertForm(WfFormBo bo) { - WfForm WfForm = MapstructUtils.convert(bo, WfForm.class); - return baseMapper.insert(WfForm); - } - - /** - * 修改流程表单 - * - * @param bo 流程表单 - * @return 结果 - */ - @Override - public int updateForm(WfFormBo bo) { - return baseMapper.update(new WfForm(), new LambdaUpdateWrapper() - .set(StrUtil.isNotBlank(bo.getFormName()), WfForm::getFormName, bo.getFormName()) - .set(StrUtil.isNotBlank(bo.getContent()), WfForm::getContent, bo.getContent()) - .set(StrUtil.isNotBlank(bo.getRemark()), WfForm::getRemark, bo.getRemark()) - .set(StrUtil.isNotBlank(bo.getStatus()), WfForm::getStatus, bo.getStatus()) - .eq(WfForm::getFormId, bo.getFormId())); - } - - /** - * 批量删除流程表单 - * - * @param ids 需要删除的流程表单ID - * @return 结果 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids) { - return baseMapper.deleteBatchIds(ids) > 0; - } - - private LambdaQueryWrapper buildQueryWrapper(WfFormBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getFormName()), WfForm::getFormName, bo.getFormName()); - return lqw; - } -} From 516ff8eaacdef6a3389ad571779d2389f5149be9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Thu, 30 Nov 2023 13:25:39 +0800 Subject: [PATCH 093/159] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E8=AF=AF?= =?UTF-8?q?=E5=88=A0=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/ruoyi-demo/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ruoyi-modules/ruoyi-demo/pom.xml b/ruoyi-modules/ruoyi-demo/pom.xml index 4fd43bc5f..119fe61b7 100644 --- a/ruoyi-modules/ruoyi-demo/pom.xml +++ b/ruoyi-modules/ruoyi-demo/pom.xml @@ -63,6 +63,11 @@ ruoyi-common-excel + + org.dromara + ruoyi-common-security + + org.dromara ruoyi-common-web From 3b5e3210854d80a05d0f18e091c4a76f41f3d9b6 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 30 Nov 2023 14:11:47 +0800 Subject: [PATCH 094/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4flw=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 60 +++++++++++++++++++ .../java/org/dromara/DromaraApplication.java | 4 +- ruoyi-modules/ruoyi-workflow/pom.xml | 6 -- 3 files changed, 61 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index c7dec3258..0db3e5e80 100644 --- a/pom.xml +++ b/pom.xml @@ -322,6 +322,66 @@ org.mybatis mybatis + + flowable-dmn-spring-configurator + org.flowable + + + flowable-form-spring-configurator + org.flowable + + + flowable-idm-spring-configurator + org.flowable + + + flowable-cmmn-spring-configurator + org.flowable + + + flowable-spring-boot-starter-cmmn + org.flowable + + + flowable-spring-boot-starter-app + org.flowable + + + flowable-spring-boot-starter-dmn + org.flowable + + + flowable-spring-boot-starter-rest + org.flowable + + + flowable-spring-boot-starter-rest-api + org.flowable + + + flowable-spring-boot-starter-ui-idm + org.flowable + + + flowable-spring-boot-starter-ui-admin + org.flowable + + + flowable-spring-boot-starter-ui-modeler + org.flowable + + + flowable-spring-boot-starter-ui-task + org.flowable + + + flowable-spring-boot-starter-actuator + org.flowable + + + flowable-spring-security + org.flowable + diff --git a/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java b/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java index d0611154f..8ef33fe5f 100644 --- a/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java +++ b/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java @@ -10,9 +10,7 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt * @author Lion Li */ -@SpringBootApplication(exclude = { - org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, - org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class}) +@SpringBootApplication public class DromaraApplication { public static void main(String[] args) { diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index 3dedb40be..ba9bc2022 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -26,12 +26,6 @@ org.flowable flowable-spring-boot-starter - - - org.mybatis - mybatis - - From 323f3a69d6cdac278f267a23e46fe7f1b7308c34 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 30 Nov 2023 14:27:02 +0800 Subject: [PATCH 095/159] =?UTF-8?q?update=20=E7=A7=BB=E5=8A=A8=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=BF=BB=E8=AF=91=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ActModelController.java | 15 +++++++ .../controller/StencilsetRestResource.java | 39 ------------------- 2 files changed, 15 insertions(+), 39 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/StencilsetRestResource.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 500d06367..cc02e1147 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,11 +1,13 @@ package org.dromara.workflow.controller; import cn.hutool.core.convert.Convert; +import cn.hutool.core.io.resource.ResourceUtil; 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.apache.commons.io.IOUtils; import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.validate.AddGroup; @@ -27,6 +29,8 @@ import org.springframework.util.MultiValueMap; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.Arrays; /** @@ -163,4 +167,15 @@ public class ActModelController extends BaseController { return actModelService.getGroups(filter); } + /** + * 解析翻译模型设计器内容 + */ + @GetMapping(value = "/rest/stencil-sets/editor") + public String getStencilset() { + try (InputStream inputStream = ResourceUtil.getStream("static/stencilset.json")) { + 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/StencilsetRestResource.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/StencilsetRestResource.java deleted file mode 100644 index 73cef482b..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/StencilsetRestResource.java +++ /dev/null @@ -1,39 +0,0 @@ -/* 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.hutool.core.io.resource.ResourceUtil; -import org.apache.commons.io.IOUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.io.InputStream; -import java.nio.charset.StandardCharsets; - -/** - * @author Tijs Rademakers - */ -@RestController -@RequestMapping("/workflow/model") -public class StencilsetRestResource { - - @GetMapping(value = "/rest/stencil-sets/editor") - public String getStencilset() { - try (InputStream inputStream = ResourceUtil.getStream("static/stencilset.json")) { - return IOUtils.toString(inputStream, StandardCharsets.UTF_8); - } catch (Exception e) { - throw new SecurityException("Error while loading stencil set", e); - } - } -} From 3bee80fa1be1413327ec0309259718542772dd4e Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 30 Nov 2023 17:09:50 +0800 Subject: [PATCH 096/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4flw=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 ---- ruoyi-modules/ruoyi-workflow/pom.xml | 6 +----- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 0db3e5e80..6f4d79a19 100644 --- a/pom.xml +++ b/pom.xml @@ -374,10 +374,6 @@ flowable-spring-boot-starter-ui-task org.flowable - - flowable-spring-boot-starter-actuator - org.flowable - flowable-spring-security org.flowable diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index ba9bc2022..6ee07b7e5 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -16,10 +16,6 @@ 工作流模块 - - 6.8.0 - - @@ -38,7 +34,7 @@ org.flowable flowable-json-converter - ${flowable.version} + 6.8.0 From dd42f1b1409f01ef58dc559b3eaf0907c4cbeaaa Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 30 Nov 2023 17:22:05 +0800 Subject: [PATCH 097/159] =?UTF-8?q?update=20=E5=8D=87=E7=BA=A77.0=E5=90=8E?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E7=94=BB=E5=9B=BEmule=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flowable/CustomDefaultProcessDiagramGenerator.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramGenerator.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramGenerator.java index feda7e5a2..e4793a26f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramGenerator.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/CustomDefaultProcessDiagramGenerator.java @@ -184,9 +184,7 @@ public class CustomDefaultProcessDiagramGenerator implements ProcessDiagramGener ServiceTask serviceTask = (ServiceTask) flowNode; if ("camel".equalsIgnoreCase(serviceTask.getType())) { processDiagramCanvas.drawCamelTask(serviceTask.getName(), graphicInfo, scaleFactor); - } else if ("mule".equalsIgnoreCase(serviceTask.getType())) { - processDiagramCanvas.drawMuleTask(serviceTask.getName(), graphicInfo, scaleFactor); - } else if (ServiceTask.HTTP_TASK.equalsIgnoreCase(serviceTask.getType())) { + }else if (ServiceTask.HTTP_TASK.equalsIgnoreCase(serviceTask.getType())) { processDiagramCanvas.drawHttpTask(serviceTask.getName(), graphicInfo, scaleFactor); } else if (ServiceTask.DMN_TASK.equalsIgnoreCase(serviceTask.getType())) { processDiagramCanvas.drawDMNTask(serviceTask.getName(), graphicInfo, scaleFactor); From b56908002a92bb96bbc81aaae1d6643615f9acb8 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 30 Nov 2023 18:11:25 +0800 Subject: [PATCH 098/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4flw=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 62 ---------------------------- ruoyi-modules/ruoyi-workflow/pom.xml | 62 ++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 62 deletions(-) diff --git a/pom.xml b/pom.xml index 6f4d79a19..44ea240c8 100644 --- a/pom.xml +++ b/pom.xml @@ -317,68 +317,6 @@ org.flowable flowable-spring-boot-starter ${flowable.version} - - - org.mybatis - mybatis - - - flowable-dmn-spring-configurator - org.flowable - - - flowable-form-spring-configurator - org.flowable - - - flowable-idm-spring-configurator - org.flowable - - - flowable-cmmn-spring-configurator - org.flowable - - - flowable-spring-boot-starter-cmmn - org.flowable - - - flowable-spring-boot-starter-app - org.flowable - - - flowable-spring-boot-starter-dmn - org.flowable - - - flowable-spring-boot-starter-rest - org.flowable - - - flowable-spring-boot-starter-rest-api - org.flowable - - - flowable-spring-boot-starter-ui-idm - org.flowable - - - flowable-spring-boot-starter-ui-admin - org.flowable - - - flowable-spring-boot-starter-ui-modeler - org.flowable - - - flowable-spring-boot-starter-ui-task - org.flowable - - - flowable-spring-security - org.flowable - - diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index 6ee07b7e5..aafc26bbf 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -22,6 +22,68 @@ org.flowable flowable-spring-boot-starter + + + org.mybatis + mybatis + + + flowable-dmn-spring-configurator + org.flowable + + + flowable-form-spring-configurator + org.flowable + + + flowable-idm-spring-configurator + org.flowable + + + flowable-cmmn-spring-configurator + org.flowable + + + flowable-spring-boot-starter-cmmn + org.flowable + + + flowable-spring-boot-starter-app + org.flowable + + + flowable-spring-boot-starter-dmn + org.flowable + + + flowable-spring-boot-starter-rest + org.flowable + + + flowable-spring-boot-starter-rest-api + org.flowable + + + flowable-spring-boot-starter-ui-idm + org.flowable + + + flowable-spring-boot-starter-ui-admin + org.flowable + + + flowable-spring-boot-starter-ui-modeler + org.flowable + + + flowable-spring-boot-starter-ui-task + org.flowable + + + flowable-spring-security + org.flowable + + From 9e2e58ff299d7b20edd425e8afd481218755d7e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Thu, 30 Nov 2023 18:18:19 +0800 Subject: [PATCH 099/159] =?UTF-8?q?update=20=E4=BE=9D=E8=B5=96=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 22 ++++----- ruoyi-modules/ruoyi-workflow/pom.xml | 68 +++++----------------------- 2 files changed, 19 insertions(+), 71 deletions(-) diff --git a/pom.xml b/pom.xml index 44ea240c8..f41a861a8 100644 --- a/pom.xml +++ b/pom.xml @@ -113,6 +113,14 @@ import + + org.flowable + flowable-bom + ${flowable.version} + pom + import + + me.zhyd.oauth @@ -312,20 +320,6 @@ ${ip2region.version} - - - org.flowable - flowable-spring-boot-starter - ${flowable.version} - - - - - org.flowable - flowable-image-generator - ${flowable.version} - - com.alibaba fastjson diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index aafc26bbf..a59374274 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -21,71 +21,25 @@ org.flowable - flowable-spring-boot-starter + flowable-spring-boot-autoconfigure - org.mybatis - mybatis - - - flowable-dmn-spring-configurator org.flowable - - - flowable-form-spring-configurator - org.flowable - - - flowable-idm-spring-configurator - org.flowable - - - flowable-cmmn-spring-configurator - org.flowable - - - flowable-spring-boot-starter-cmmn - org.flowable - - - flowable-spring-boot-starter-app - org.flowable - - - flowable-spring-boot-starter-dmn - org.flowable - - - flowable-spring-boot-starter-rest - org.flowable - - - flowable-spring-boot-starter-rest-api - org.flowable - - - flowable-spring-boot-starter-ui-idm - org.flowable - - - flowable-spring-boot-starter-ui-admin - org.flowable - - - flowable-spring-boot-starter-ui-modeler - org.flowable - - - flowable-spring-boot-starter-ui-task - org.flowable - - flowable-spring-security - org.flowable + + org.flowable + flowable-spring-configurator + + + + org.flowable + flowable-spring-boot-starter-actuator + + org.flowable From 61a45cb4f83c8b672ba1610d8f1905eaf93b8acb Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Thu, 30 Nov 2023 21:21:16 +0800 Subject: [PATCH 100/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E4=BF=9D=E5=AD=98=E5=8F=91=E8=B5=B7=E4=BA=BA?= =?UTF-8?q?=E5=8F=98=E9=87=8F=EF=BC=8C=E4=BF=AE=E6=94=B9=E8=8F=9C=E5=8D=95?= =?UTF-8?q?sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/common/constant/FlowConstant.java | 10 ++++++++++ .../service/impl/ActModelServiceImpl.java | 16 ---------------- .../dromara/workflow/utils/WorkflowUtils.java | 9 ++++++++- script/sql/test.sql | 2 +- 4 files changed, 19 insertions(+), 18 deletions(-) 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 index e1ee141f7..6b5233796 100644 --- 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 @@ -64,6 +64,16 @@ public interface FlowConstant { */ String INITIATOR = "INITIATOR"; + /** + * 设计器中节点设置流程发起人 + */ + String INITIATOR_SET = "$INITIATOR"; + + /** + * 修改设计器设置的变量错误内容 + */ + String INITIATOR_SET_UPDATE = "${INITIATOR}"; + /** * 开启跳过表达式变量 */ 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 c486455ff..e25414ef9 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 @@ -1,7 +1,6 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -235,21 +234,6 @@ public class ActModelServiceImpl implements IActModelService { repositoryService.saveModel(model); //解决设计器选择设置流程发起人设置变量有问题 JsonNode jsonNode = objectMapper.readTree(values.getFirst("json_xml")); - JsonNode childShapes = jsonNode.get("childShapes"); - for (JsonNode childShape : childShapes) { - JsonNode properties = childShape.get("properties"); - if (!properties.path("usertaskassignment").isMissingNode()) { - JsonNode usertaskassignment = properties.get("usertaskassignment"); - if (!usertaskassignment.path("assignment").isMissingNode()) { - JsonNode assignment = usertaskassignment.get("assignment"); - if (!assignment.path("assignee").isMissingNode()) { - if ("$INITIATOR".equals(assignment.get("assignee").textValue())) { - ((ObjectNode) assignment).put("assignee", "${INITIATOR}"); - } - } - } - } - } byte[] xmlBytes = WorkflowUtils.bpmnJsonToXmlBytes(Objects.requireNonNull(JsonUtils.toJsonString(jsonNode)).getBytes(StandardCharsets.UTF_8)); if (ArrayUtil.isEmpty(xmlBytes)) { throw new ServiceException("模型不能为空!"); 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 index 63cec8da5..0e59b5220 100644 --- 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 @@ -50,7 +50,7 @@ import java.rmi.ServerException; import java.util.*; import java.util.stream.Collectors; -import static org.dromara.workflow.common.constant.FlowConstant.PROCESS_INSTANCE_VO; +import static org.dromara.workflow.common.constant.FlowConstant.*; /** * 工作流工具 @@ -83,6 +83,13 @@ public class WorkflowUtils { if (bpmnModel.getProcesses().isEmpty()) { return new byte[0]; } + //解决设计器选择设置流程发起人设置变量有问题 + Collection flowElements = bpmnModel.getMainProcess().getFlowElements(); + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof UserTask && INITIATOR_SET.equals(((UserTask) flowElement).getAssignee())) { + ((UserTask) flowElement).setAssignee(INITIATOR_SET_UPDATE); + } + } // 2.将bpmnModel转为xml return new BpmnXMLConverter().convertToXML(bpmnModel); } diff --git a/script/sql/test.sql b/script/sql/test.sql index 866ef661c..f6381301d 100644 --- a/script/sql/test.sql +++ b/script/sql/test.sql @@ -72,7 +72,7 @@ INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1510, '测试树表删除', 1506, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:remove', '#', 103, 1, sysdate(), NULL, NULL, ''); INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1511, '测试树表导出', 1506, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:export', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1638, '请假申请', 5, 1, 'leave', 'demo/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, sysdate(), NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, sysdate(), NULL, NULL, '请假申请菜单'); INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1639, '请假申请查询', 1638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, sysdate(), NULL, NULL, ''); INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1640, '请假申请新增', 1638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, sysdate(), NULL, NULL, ''); INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1641, '请假申请修改', 1638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, sysdate(), NULL, NULL, ''); From 8bc5478819b1792e0ef1e43d475956c41a5568d5 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Fri, 1 Dec 2023 12:09:55 +0800 Subject: [PATCH 101/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E8=AF=B7?= =?UTF-8?q?=E5=81=87=E7=94=B3=E8=AF=B7=EF=BC=8C=E8=B0=83=E6=95=B4=E8=8F=9C?= =?UTF-8?q?=E5=8D=95sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/domain/TestLeave.java | 17 ++- .../workflow/domain/bo/TestLeaveBo.java | 25 +++- .../workflow/domain/vo/TestLeaveVo.java | 21 ++- .../service/impl/TestLeaveServiceImpl.java | 2 +- script/sql/flowable.sql | 63 +++++++++ script/sql/oracle/oracle_ry_vue_5.X.sql | 30 ---- script/sql/postgres/postgres_ry_vue_5.X.sql | 30 ---- script/sql/ry_vue_5.X.sql | 133 ++---------------- script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 82 ----------- script/sql/test.sql | 23 --- 10 files changed, 125 insertions(+), 301 deletions(-) create mode 100644 script/sql/flowable.sql diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java index e02fc28ab..0e2646701 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java @@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode; import org.dromara.common.mybatis.core.domain.BaseEntity; import java.io.Serial; +import java.util.Date; /** * 请假对象 test_leave @@ -29,9 +30,19 @@ public class TestLeave extends BaseEntity { private Long id; /** - * 标题 + * 请假类型 */ - private String title; + private String leaveType; + + /** + * 开始时间 + */ + private Date startDate; + + /** + * 结束时间 + */ + private Date endDate; /** * 请假天数 @@ -39,7 +50,7 @@ public class TestLeave extends BaseEntity { private Integer leaveDays; /** - * 备注 + * 请假原因 */ private String remark; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java index 35acebc85..207eb16ae 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java @@ -1,5 +1,6 @@ package org.dromara.workflow.domain.bo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.github.linpeilie.annotations.AutoMapper; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -10,6 +11,8 @@ import org.dromara.common.core.validate.EditGroup; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.workflow.domain.TestLeave; +import java.util.Date; + /** * 请假业务对象 test_leave * @@ -28,10 +31,24 @@ public class TestLeaveBo extends BaseEntity { private Long id; /** - * 标题 + * 请假类型 */ - @NotBlank(message = "标题不能为空", groups = {AddGroup.class, EditGroup.class}) - private String title; + @NotBlank(message = "请假类型不能为空", groups = {AddGroup.class, EditGroup.class}) + private String leaveType; + + /** + * 开始时间 + */ + @NotNull(message = "开始时间不能为空", groups = {AddGroup.class, EditGroup.class}) + @JsonFormat(pattern = "yyyy-MM-dd") + private Date startDate; + + /** + * 结束时间 + */ + @NotNull(message = "结束时间不能为空", groups = {AddGroup.class, EditGroup.class}) + @JsonFormat(pattern = "yyyy-MM-dd") + private Date endDate; /** * 请假天数 @@ -40,7 +57,7 @@ public class TestLeaveBo extends BaseEntity { private Integer leaveDays; /** - * 备注 + * 请假原因 */ private String remark; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java index 749ff76d6..c62a35612 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java @@ -8,6 +8,7 @@ import org.dromara.workflow.domain.TestLeave; import java.io.Serial; import java.io.Serializable; +import java.util.Date; /** @@ -31,10 +32,22 @@ public class TestLeaveVo implements Serializable { private Long id; /** - * 标题 + * 请假类型 */ - @ExcelProperty(value = "标题") - private String title; + @ExcelProperty(value = "请假类型") + private String leaveType; + + /** + * 开始时间 + */ + @ExcelProperty(value = "开始时间") + private Date startDate; + + /** + * 结束时间 + */ + @ExcelProperty(value = "结束时间") + private Date endDate; /** * 请假天数 @@ -45,7 +58,7 @@ public class TestLeaveVo implements Serializable { /** * 备注 */ - @ExcelProperty(value = "备注") + @ExcelProperty(value = "请假原因") private String remark; /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index b347a08a2..6e291d2c3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -73,7 +73,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService { private LambdaQueryWrapper buildQueryWrapper(TestLeaveBo bo) { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(StringUtils.isNotBlank(bo.getTitle()), TestLeave::getTitle, bo.getTitle()); + lqw.eq(StringUtils.isNotBlank(bo.getLeaveType()), TestLeave::getLeaveType, bo.getLeaveType()); lqw.eq(bo.getLeaveDays() != null, TestLeave::getLeaveDays, bo.getLeaveDays()); return lqw; } diff --git a/script/sql/flowable.sql b/script/sql/flowable.sql new file mode 100644 index 000000000..5a0f13300 --- /dev/null +++ b/script/sql/flowable.sql @@ -0,0 +1,63 @@ +insert into sys_menu values('1616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1617', '模型管理', '1616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1618', '我的待办', '1616', '5', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1619', '待办任务', '1618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1620', '流程定义', '1616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1621', '流程实例', '1630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1622', '流程分类', '1616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1629', '我发起的', '1618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1630', '流程监控', '1616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1631', '待办任务', '1630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); + + +-- 流程分类管理相关按钮 +insert into sys_menu values ('1623', '流程分类查询', '1622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values ('1624', '流程分类新增', '1622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values ('1625', '流程分类修改', '1622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values ('1626', '流程分类删除', '1622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values ('1627', '流程分类导出', '1622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, sysdate(), null, null, ''); +-- 请假单信息 +DROP TABLE if EXISTS test_leave; +create table test_leave +( + id bigint not null comment '主键', + leave_type varchar(255) not null comment '请假类型', + startDate datetime not null comment '开始时间', + endDate datetime not null comment '结束时间', + leave_days int(10) not null comment '请假天数', + remark varchar(255) null comment '请假原因', + create_dept bigint null comment '创建部门', + create_by bigint null comment '创建者', + create_time datetime null comment '创建时间', + update_by bigint null comment '更新者', + update_time datetime null comment '更新时间', + tenant_id varchar(20) default '000000' null comment '租户编号', + PRIMARY KEY (id) USING BTREE +) ENGINE = InnoDB COMMENT = '请假申请表'; + +-- 流程分类信息表 +DROP TABLE if EXISTS wf_category; +create table wf_category +( + id bigint not null comment '主键' + primary key, + category_name varchar(255) null comment '分类名称', + category_code varchar(255) null comment '分类编码', + parent_id bigint null comment '父级id', + sort_num int(19) null comment '排序', + tenant_id varchar(20) default '000000' null comment '租户编号', + create_dept bigint null comment '创建部门', + create_by bigint null comment '创建者', + create_time datetime null comment '创建时间', + update_by bigint null comment '更新者', + update_time datetime null comment '更新时间', + constraint uni_category_code + unique (category_code) +) engine=innodb comment= '流程分类'; + +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, sysdate(), NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1639, '请假申请查询', 1638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1640, '请假申请新增', 1638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1641, '请假申请修改', 1638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1642, '请假申请删除', 1638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1643, '请假申请导出', 1638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, sysdate(), NULL, NULL, ''); diff --git a/script/sql/oracle/oracle_ry_vue_5.X.sql b/script/sql/oracle/oracle_ry_vue_5.X.sql index 670e7c1af..1100fa92e 100644 --- a/script/sql/oracle/oracle_ry_vue_5.X.sql +++ b/script/sql/oracle/oracle_ry_vue_5.X.sql @@ -1199,36 +1199,6 @@ insert into sys_oss_config values (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX', 'X insert into sys_oss_config values (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi-1250000000', '', 'cos.ap-beijing.myqcloud.com', '','N', 'ap-beijing', '1', '1', '', NULL, 103, 1, sysdate, 1, sysdate); insert into sys_oss_config values (5, '000000', 'image', 'ruoyi', 'ruoyi123', 'ruoyi', 'image', '127.0.0.1:9000', '','N', '', '1', '1', '', NULL, 103, 1, sysdate, 1, sysdate); --- ---------------------------- --- 流程表单信息表 --- ---------------------------- -create table wf_form ( - form_id number(20) not null, - form_name varchar(64) default '', - content nclob, - create_dept number(20) default null, - create_by number(20) default null, - create_time date, - update_by number(20) default null, - update_time date, - remark varchar(255) default '', - del_flag char(1) default '0' -); - -alter table wf_form add constraint pk_wf_form primary key (form_id); - -comment on table wf_form is '流程表单信息表'; -comment on column wf_form.form_id is '表单主键'; -comment on column wf_form.form_name is '表单名称'; -comment on column wf_form.content is '表单内容'; -comment on column wf_form.create_dept is '创建部门'; -comment on column wf_form.create_by is '创建者'; -comment on column wf_form.create_time is '创建时间'; -comment on column wf_form.update_by is '更新者'; -comment on column wf_form.update_time is '更新时间'; -comment on column wf_form.remark is '备注'; -comment on column wf_form.del_flag is '删除标志(0代表存在 2代表删除)'; - -- ---------------------------- -- 系统授权表 -- ---------------------------- diff --git a/script/sql/postgres/postgres_ry_vue_5.X.sql b/script/sql/postgres/postgres_ry_vue_5.X.sql index 4a82e5344..48860dc7c 100644 --- a/script/sql/postgres/postgres_ry_vue_5.X.sql +++ b/script/sql/postgres/postgres_ry_vue_5.X.sql @@ -1221,36 +1221,6 @@ insert into sys_oss_config values (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX', 'X insert into sys_oss_config values (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi-1250000000', '', 'cos.ap-beijing.myqcloud.com', '','N', 'ap-beijing', '1', '1', '', 103, 1, now(), 1, now(), null); insert into sys_oss_config values (5, '000000', 'image', 'ruoyi', 'ruoyi123', 'ruoyi', 'image', '127.0.0.1:9000', '','N', '', '1', '1', '', 103, 1, now(), 1, now(), NULL); --- ---------------------------- --- 流程表单信息表 --- ---------------------------- -drop table if exists bpmn_form; -create table if not exists bpmn_form -( - form_id int8, - tenant_id varchar(20) default '000000'::varchar, - form_name varchar(255) default ''::varchar not null, - content text, - create_dept int8, - create_by int8, - create_time timestamp, - update_by int8, - update_time timestamp, - remark varchar(500) default ''::varchar, - constraint bpmn_form_pk primary key (bpmn_form) -); - -comment on table wf_form is '流程表单信息表'; -comment on column bpmn_form.form_id is '表单主键'; -comment on column bpmn_form.form_name is '表单名称'; -comment on column bpmn_form.content is '表单内容'; -comment on column bpmn_form.create_dept is '创建部门'; -comment on column bpmn_form.create_by is '创建者'; -comment on column bpmn_form.create_time is '创建时间'; -comment on column bpmn_form.update_by is '更新者'; -comment on column bpmn_form.update_time is '更新时间'; -comment on column bpmn_form.remark is '备注'; -comment on column bpmn_form.del_flag is '删除标志(0代表存在 2代表删除)'; -- ---------------------------- -- 系统授权表 -- ---------------------------- diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index 3eb2711f0..09f15ff26 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -270,8 +270,6 @@ insert into sys_menu values('6', '租户管理', '0', '2', 'tenant', n insert into sys_menu values('2', '系统监控', '0', '3', 'monitor', null, '', 1, 0, 'M', '0', '0', '', 'monitor', 103, 1, sysdate(), null, null, '系统监控目录'); insert into sys_menu values('3', '系统工具', '0', '4', 'tool', null, '', 1, 0, 'M', '0', '0', '', 'tool', 103, 1, sysdate(), null, null, '系统工具目录'); insert into sys_menu values('4', 'PLUS官网', '0', '5', 'https://gitee.com/dromara/RuoYi-Vue-Plus', null, '', 0, 0, 'M', '0', '0', '', 'guide', 103, 1, sysdate(), null, null, 'RuoYi-Vue-Plus官网地址'); -insert into sys_menu values('1616', '工作流','0', '6', 'workflow', NULL, NULL, 1, 0, 'M', '0', '0', NULL, 'tree-table', 103, 1, sysdate(), null, null, '工作流目录'); - -- 二级菜单 insert into sys_menu values('100', '用户管理', '1', '1', 'user', 'system/user/index', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 103, 1, sysdate(), null, null, '用户管理菜单'); insert into sys_menu values('101', '角色管理', '1', '2', 'role', 'system/role/index', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 103, 1, sysdate(), null, null, '角色管理菜单'); @@ -286,17 +284,9 @@ insert into sys_menu values('109', '在线用户', '2', '1', 'online', insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 103, 1, sysdate(), null, null, '缓存监控菜单'); insert into sys_menu values('114', '表单构建', '3', '1', 'build', 'tool/build/index', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 103, 1, sysdate(), null, null, '表单构建菜单'); insert into sys_menu values('115', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 103, 1, sysdate(), null, null, '代码生成菜单'); -insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate(), null, null, '租户管理菜单'); -insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, '租户套餐管理菜单'); +insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate(), null, null, '租户管理菜单'); +insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, '租户套餐管理菜单'); insert into sys_menu values('123', '客户端管理', '1', '11', 'client', 'system/client/index', '', 1, 0, 'C', '0', '0', 'system:client:list', 'international', 103, 1, sysdate(), null, null, '客户端管理菜单'); -insert into sys_menu values('1622', '流程分类', '1616', '1', 'category', 'workflow/category/index', '', 1, 0, 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, sysdate(), null, null, '流程分类菜单'); -insert into sys_menu values('1617', '模型管理', '1616', '2', 'model', 'workflow/model/index', '', 1, 1, 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, sysdate(), null, null, '模型管理菜单'); -insert into sys_menu values('1620', '流程定义', '1616', '3', 'processDefinition', 'workflow/processDefinition/index', '', 1, 1, 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '流程定义菜单'); -insert into sys_menu values('1630', '流程监控', '1616', '4', 'monitor', '', '', 1, 0, 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '流程监控菜单'); -insert into sys_menu values('1618', '我的待办', '1616', '5', 'task', '', '', 1, 0, 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '我的待办菜单'); -insert into sys_menu values('1628', '动态表单', '1616', '6', 'form', 'workflow/form/index', '', 1, 1, 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '动态表单菜单'); -insert into sys_menu values('1638', '发起流程', '1616', '7', 'businessForm', 'workflow/businessForm/index', '', 1, 1, 'C', '0', '0', 'workflow:businessForm:list', 'tree-table', 103, 1, sysdate(), null, null, '发起流程菜单'); -insert into sys_menu values('1639', '我的单据', '1616', '8', 'businessFormList', 'workflow/businessForm/list', '', 1, 1, 'C', '0', '0', 'workflow:businessForm:list', 'tree-table', 103, 1, sysdate(), null, null, '我的单据菜单'); -- springboot-admin监控 insert into sys_menu values('117', 'Admin监控', '2', '5', 'Admin', 'monitor/admin/index', '', 1, 0, 'C', '0', '0', 'monitor:admin:list', 'dashboard', 103, 1, sysdate(), null, null, 'Admin监控菜单'); @@ -306,12 +296,8 @@ insert into sys_menu values('118', '文件管理', '1', '10', 'oss', insert into sys_menu values('120', '任务调度中心', '2', '5', 'powerjob', 'monitor/powerjob/index', '', 1, 0, 'C', '0', '0', 'monitor:powerjob:list', 'job', 103, 1, sysdate(), null, null, 'PowerJob控制台菜单'); -- 三级菜单 -insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 103, 1, sysdate(), null, null, '操作日志菜单'); -insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 103, 1, sysdate(), null, null, '登录日志菜单'); -insert into sys_menu values('1621', '流程实例', '1630','1', 'processInstance', 'workflow/processInstance/index', '', 1, 1, 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '流程实例'); -insert into sys_menu values('1631', '待办任务', '1630','2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', 1, 1, 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '待办任务'); -insert into sys_menu values('1619', '待办任务', '1618','2', 'taskWaiting', 'workflow/task/index', '', 1, 1, 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '待办任务'); -insert into sys_menu values('1629', '我的单据', '1618','1', 'myDocument', 'workflow/task/myDocument', '', 1, 1, 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), null, null, '我的单据'); +insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 103, 1, sysdate(), null, null, '操作日志菜单'); +insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 103, 1, sysdate(), null, null, '登录日志菜单'); -- 用户管理按钮 insert into sys_menu values('1001', '用户查询', '100', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('1002', '用户新增', '100', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 103, 1, sysdate(), null, null, ''); @@ -398,30 +384,12 @@ insert into sys_menu values ('1612', '租户套餐新增', '122', '2', '#', '', insert into sys_menu values ('1613', '租户套餐修改', '122', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:edit', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values ('1614', '租户套餐删除', '122', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:remove', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values ('1615', '租户套餐导出', '122', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:export', '#', 103, 1, sysdate(), null, null, ''); --- 动态表单管理相关按钮 -insert into sys_menu values ('1633', '动态表单查询', '1628', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:form:query', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1634', '动态表单新增', '1628', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:form:add', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1635', '动态表单修改', '1628', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:form:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1636', '动态表单删除', '1628', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:form:remove','#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1637', '动态表单导出', '1628', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:form:export','#', 103, 1, sysdate(), null, null, ''); --- 流程分类管理相关按钮 -insert into sys_menu values ('1623', '流程分类查询', '1622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1624', '流程分类新增', '1622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1625', '流程分类修改', '1622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1626', '流程分类删除', '1622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1627', '流程分类导出', '1622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, sysdate(), null, null, ''); -- 客户端管理按钮 insert into sys_menu values('1061', '客户端管理查询', '123', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:query', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('1062', '客户端管理新增', '123', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:add', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('1063', '客户端管理修改', '123', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:edit', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('1064', '客户端管理删除', '123', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:remove', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('1065', '客户端管理导出', '123', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:export', '#', 103, 1, sysdate(), null, null, ''); --- 发起流程按钮 -insert into sys_menu values('1640', '发起流程查询', '1638', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:businessForm:query', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('1641', '发起流程新增', '1638', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:businessForm:add', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('1642', '发起流程修改', '1638', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:businessForm:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('1643', '发起流程删除', '1638', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:businessForm:remove','#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('1644', '发起流程导出', '1638', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:businessForm:export','#', 103, 1, sysdate(), null, null, ''); -- ---------------------------- -- 6、用户和角色关联表 用户N-1角色 @@ -883,94 +851,11 @@ create table sys_oss_config ( primary key (oss_config_id) ) engine=innodb comment='对象存储配置表'; -insert into sys_oss_config values (1, '000000', 'minio', 'ruoyi', 'ruoyi123', 'ruoyi', '', '127.0.0.1:9000', '','N', '', '1' ,'0', '', 103, 1, sysdate(), 1, sysdate(), NULL); -insert into sys_oss_config values (2, '000000', 'qiniu', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 's3-cn-north-1.qiniucs.com', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), NULL); -insert into sys_oss_config values (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 'oss-cn-beijing.aliyuncs.com', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), NULL); -insert into sys_oss_config values (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi-1250000000', '', 'cos.ap-beijing.myqcloud.com', '','N', 'ap-beijing', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), NULL); -insert into sys_oss_config values (5, '000000', 'image', 'ruoyi', 'ruoyi123', 'ruoyi', 'image', '127.0.0.1:9000', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), NULL); - --- ---------------------------- --- 流程表单信息表 --- ---------------------------- -drop table if exists wf_form; -create table wf_form ( - form_id bigint not null comment '表单id', - tenant_id varchar(20) default '000000'comment '租户编号', - form_name varchar(255) default null comment '表单名称', - status char(1) default '1' comment '状态(0正常 1停用)', - content longtext comment '表单内容', - create_dept bigint default null comment '创建部门', - create_by bigint default null comment '创建者', - create_time datetime default null comment '创建时间', - update_by bigint default null comment '更新者', - update_time datetime default null comment '更新时间', - remark varchar(500) default null comment '备注', - primary key (form_id) -) engine=innodb comment='流程表单信息表'; - --- ---------------------------- --- 流程分类信息表 --- ---------------------------- -create table wf_category -( - id bigint not null comment '主键' - primary key, - category_name varchar(255) null comment '分类名称', - category_code varchar(255) null comment '分类编码', - parent_id bigint null comment '父级id', - sort_num int(19) null comment '排序', - tenant_id varchar(20) default '000000' null comment '租户编号', - create_dept bigint null comment '创建部门', - create_by bigint null comment '创建者', - create_time datetime null comment '创建时间', - update_by bigint null comment '更新者', - update_time datetime null comment '更新时间', - constraint uni_category_code - unique (category_code) -) engine=innodb comment= '流程分类'; - --- ---------------------------- --- 流程分类信息表 --- ---------------------------- -drop table if exists wf_form_definition; -create table wf_form_definition -( - id bigint not null comment '主键' - primary key, - form_id bigint not null comment '动态表单id', - process_definition_key varchar(255) not null comment '流程定义key', - process_definition_name varchar(255) not null comment '流程定义名称', - process_definition_id varchar(255) not null comment '流程定义id', - process_definition_version int not null comment '流程定义版本', - tenant_id varchar(20) default '000000' null comment '租户编号', - create_dept bigint null comment '创建部门', - create_by bigint null comment '创建者', - create_time datetime null comment '创建时间', - update_by bigint null comment '更新者', - update_time datetime null comment '更新时间' -) engine=innodb comment= '动态表单与流程定义关联信息'; - --- ---------------------------- --- 业务单据表 --- ---------------------------- -drop table if exists wf_business_form; -create table wf_business_form -( - id bigint not null comment '主键' - primary key, - apply_code varchar(255) not null comment '申请编码', - form_id bigint not null comment '表单id', - form_name varchar(255) not null comment '表单名称', - content longtext not null comment '表单内容', - tenant_id varchar(20) default '000000' null comment '租户编号', - create_dept bigint null comment '创建部门', - create_by bigint null comment '创建者', - create_time datetime null comment '创建时间', - update_by bigint null comment '更新者', - update_time datetime null comment '更新时间', - content_value longtext null comment '表单值' -) engine=innodb comment= '业务单据表'; - +insert into sys_oss_config values (1, '000000', 'minio', 'ruoyi', 'ruoyi123', 'ruoyi', '', '127.0.0.1:9000', '','N', '', '1' ,'0', '', 103, 1, sysdate(), 1, sysdate(), null); +insert into sys_oss_config values (2, '000000', 'qiniu', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 's3-cn-north-1.qiniucs.com', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), null); +insert into sys_oss_config values (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 'oss-cn-beijing.aliyuncs.com', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), null); +insert into sys_oss_config values (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi-1250000000', '', 'cos.ap-beijing.myqcloud.com', '','N', 'ap-beijing', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), null); +insert into sys_oss_config values (5, '000000', 'image', 'ruoyi', 'ruoyi123', 'ruoyi', 'image', '127.0.0.1:9000', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), null); -- ---------------------------- -- 系统授权表 diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql index c276355f8..2045c587e 100644 --- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql +++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql @@ -3079,88 +3079,6 @@ GO INSERT INTO sys_oss_config VALUES (N'5', N'000000', N'image', N'ruoyi', N'ruoyi123', N'ruoyi', N'image', N'127.0.0.1:9000', N'',N'N', N'', N'1', N'1', N'', 103, 1, getdate(), 1, getdate(), NULL) GO -CREATE TABLE wf_form -( - form_id bigint NOT NULL, - form_name nvarchar(64) DEFAULT '' NULL, - content nvarchar(max) NULL, - create_dept bigint NULL, - create_by nvarchar(64) DEFAULT '' NULL, - create_time datetime2(7) NULL, - update_by nvarchar(64) DEFAULT '' NULL, - update_time datetime2(7) NULL, - remark nvarchar(255) NULL, - del_flag nchar(1) DEFAULT ('0') NULL, - CONSTRAINT [PK__wf_form] PRIMARY KEY CLUSTERED ([form_id]) - WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) - ON [PRIMARY] -) -GO - -EXEC sp_addextendedproperty - 'MS_Description', N'表单主键', - 'SCHEMA', N'dbo', - 'TABLE', N'wf_form', - 'COLUMN', N'form_id' -GO -EXEC sp_addextendedproperty - 'MS_Description', N'表单名称', - 'SCHEMA', N'dbo', - 'TABLE', N'wf_form', - 'COLUMN', N'form_name' -GO -EXEC sp_addextendedproperty - 'MS_Description', N'表单内容', - 'SCHEMA', N'dbo', - 'TABLE', N'wf_form', - 'COLUMN', N'content' -GO -EXEC sp_addextendedproperty - 'MS_Description', N'创建部门' , - 'SCHEMA', N'dbo', - 'TABLE', N'wf_form', - 'COLUMN', N'create_dept' -GO -EXEC sp_addextendedproperty - 'MS_Description', N'创建者', - 'SCHEMA', N'dbo', - 'TABLE', N'wf_form', - 'COLUMN', N'create_by' -GO -EXEC sp_addextendedproperty - 'MS_Description', N'创建时间', - 'SCHEMA', N'dbo', - 'TABLE', N'wf_form', - 'COLUMN', N'create_time' -GO -EXEC sp_addextendedproperty - 'MS_Description', N'更新者', - 'SCHEMA', N'dbo', - 'TABLE', N'wf_form', - 'COLUMN', N'update_by' -GO -EXEC sp_addextendedproperty - 'MS_Description', N'更新时间', - 'SCHEMA', N'dbo', - 'TABLE', N'wf_form', - 'COLUMN', N'update_time' -GO -EXEC sp_addextendedproperty - 'MS_Description', N'备注', - 'SCHEMA', N'dbo', - 'TABLE', N'wf_form', - 'COLUMN', N'remark' -GO -EXEC sp_addextendedproperty - 'MS_Description', N'删除标志(0代表存在 2代表删除)', - 'SCHEMA', N'dbo', - 'TABLE', N'wf_form', - 'COLUMN', N'del_flag' -GO -EXEC sp_addextendedproperty - 'MS_Description', N'流程表单信息表', - 'SCHEMA', N'dbo', - 'TABLE', N'wf_form' CREATE TABLE sys_client ( diff --git a/script/sql/test.sql b/script/sql/test.sql index f6381301d..d4cea0567 100644 --- a/script/sql/test.sql +++ b/script/sql/test.sql @@ -37,22 +37,6 @@ CREATE TABLE test_tree PRIMARY KEY (id) USING BTREE ) ENGINE = InnoDB COMMENT = '测试树表'; -DROP TABLE if EXISTS test_leave; -create table test_leave -( - id bigint not null comment '主键', - title varchar(255) not null comment '标题', - leave_days int(10) not null comment '请假天数', - remark varchar(255) null comment '备注', - create_dept bigint null comment '创建部门', - create_by bigint null comment '创建者', - create_time datetime null comment '创建时间', - update_by bigint null comment '更新者', - update_time datetime null comment '更新时间', - tenant_id varchar(20) default '000000' null comment '租户编号', - PRIMARY KEY (id) USING BTREE -) ENGINE = InnoDB COMMENT = '请假表'; - INSERT INTO sys_user(user_id, tenant_id, dept_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar, password, status, del_flag, login_ip, login_date, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (3, '000000', 108, 'test', '本部门及以下 密码666666', 'sys_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), 3, sysdate(), NULL); INSERT INTO sys_user(user_id, tenant_id, dept_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar, password, status, del_flag, login_ip, login_date, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (4, '000000', 102, 'test1', '仅本人 密码666666', 'sys_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), 4, sysdate(), NULL); @@ -72,13 +56,6 @@ INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1510, '测试树表删除', 1506, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:remove', '#', 103, 1, sysdate(), NULL, NULL, ''); INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1511, '测试树表导出', 1506, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:export', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, sysdate(), NULL, NULL, '请假申请菜单'); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1639, '请假申请查询', 1638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1640, '请假申请新增', 1638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1641, '请假申请修改', 1638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1642, '请假申请删除', 1638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1643, '请假申请导出', 1638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, sysdate(), NULL, NULL, ''); - INSERT INTO sys_role(role_id, tenant_id, role_name, role_key, role_sort, data_scope, menu_check_strictly, dept_check_strictly, status, del_flag, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (3, '000000', '本部门及以下', 'test1', 3, '4', 1, 1, '0', '0', 103, 1, sysdate(), 1, NULL, NULL); INSERT INTO sys_role(role_id, tenant_id, role_name, role_key, role_sort, data_scope, menu_check_strictly, dept_check_strictly, status, del_flag, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (4, '000000', '仅本人', 'test2', 4, '5', 1, 1, '0', '0', 103, 1, sysdate(), 1, NULL, NULL); From dd83f0dc0cd178c190b703bcd282e3c2e9d4e73a Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Mon, 4 Dec 2023 18:12:42 +0800 Subject: [PATCH 102/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/flowable.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/sql/flowable.sql b/script/sql/flowable.sql index 5a0f13300..4713ab11d 100644 --- a/script/sql/flowable.sql +++ b/script/sql/flowable.sql @@ -22,8 +22,8 @@ create table test_leave ( id bigint not null comment '主键', leave_type varchar(255) not null comment '请假类型', - startDate datetime not null comment '开始时间', - endDate datetime not null comment '结束时间', + start_date datetime not null comment '开始时间', + end_date datetime not null comment '结束时间', leave_days int(10) not null comment '请假天数', remark varchar(255) null comment '请假原因', create_dept bigint null comment '创建部门', From 9cea9a557f48f21223b504ac80c2a95420419edf Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Tue, 5 Dec 2023 12:26:16 +0800 Subject: [PATCH 103/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0sql=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/postgres/postgres_flowable.sql | 119 ++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 script/sql/postgres/postgres_flowable.sql diff --git a/script/sql/postgres/postgres_flowable.sql b/script/sql/postgres/postgres_flowable.sql new file mode 100644 index 000000000..fdebd3e43 --- /dev/null +++ b/script/sql/postgres/postgres_flowable.sql @@ -0,0 +1,119 @@ +insert into sys_menu values('1616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1617', '模型管理', '1616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1618', '我的待办', '1616', '5', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1619', '待办任务', '1618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1620', '流程定义', '1616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1621', '流程实例', '1630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1622', '流程分类', '1616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1629', '我发起的', '1618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1630', '流程监控', '1616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1631', '待办任务', '1630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); + + +-- 流程分类管理相关按钮 +insert into sys_menu values ('1623', '流程分类查询', '1622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values ('1624', '流程分类新增', '1622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values ('1625', '流程分类修改', '1622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values ('1626', '流程分类删除', '1622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values ('1627', '流程分类导出', '1622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, sysdate(), null, null, ''); +-- 请假单信息 +DROP TABLE if EXISTS test_leave; +create table test_leave +( + id bigint not null + constraint test_leave_pk + primary key, + leave_type varchar(255), + start_date timestamp, + end_date timestamp, + remark varchar(255), + create_dept bigint, + create_by bigint, + create_time timestamp, + update_by bigint, + update_time timestamp, + tenant_id varchar(20) +); + +comment on table test_leave is '请假申请表'; + +comment on column test_leave.id is '主键'; + +comment on column test_leave.leave_type is '请假类型'; + +comment on column test_leave.start_date is '开始时间'; + +comment on column test_leave.end_date is '结束时间'; + +comment on column test_leave.remark is '请假原因'; + +comment on column test_leave.create_dept is '创建部门'; + +comment on column test_leave.create_by is '创建者'; + +comment on column test_leave.create_time is '创建时间'; + +comment on column test_leave.update_by is '更新者'; + +comment on column test_leave.update_time is '更新时间'; + +comment on column test_leave.tenant_id is '租户编码'; + +alter table test_leave + owner to postgres; + +-- 流程分类信息表 +DROP TABLE if EXISTS wf_category; +create table wf_category +( + id bigint not null + constraint wf_category_pk + primary key, + category_name varchar(255), + category_code varchar(255), + parent_id bigint, + sort_num bigint, + tenant_id bigint, + create_dept bigint, + create_by bigint, + create_time timestamp, + update_by bigint, + update_time timestamp +); + +comment on table wf_category is '流程分类'; + +comment on column wf_category.id is '主键'; + +comment on column wf_category.category_name is '分类名称'; + +comment on column wf_category.category_code is '分类编码'; + +comment on column wf_category.parent_id is '父级id'; + +comment on column wf_category.sort_num is '排序'; + +comment on column wf_category.tenant_id is '租户id'; + +comment on column wf_category.create_dept is '创建部门'; + +comment on column wf_category.create_by is '创建者'; + +comment on column wf_category.create_time is '创建时间'; + +comment on column wf_category.update_by is '修改者'; + +comment on column wf_category.update_time is '修改时间'; + +alter table wf_category + owner to postgres; + +create unique index uni_category_code + on wf_category (category_code); + +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, sysdate(), NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1639, '请假申请查询', 1638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1640, '请假申请新增', 1638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1641, '请假申请修改', 1638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1642, '请假申请删除', 1638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1643, '请假申请导出', 1638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, sysdate(), NULL, NULL, ''); From d998971d183b829cdac26510cc61481a135dd906 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Tue, 5 Dec 2023 16:24:58 +0800 Subject: [PATCH 104/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/postgres/postgres_flowable.sql | 43 ++++++++++++----------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/script/sql/postgres/postgres_flowable.sql b/script/sql/postgres/postgres_flowable.sql index fdebd3e43..4f5e108a5 100644 --- a/script/sql/postgres/postgres_flowable.sql +++ b/script/sql/postgres/postgres_flowable.sql @@ -1,21 +1,21 @@ -insert into sys_menu values('1616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1617', '模型管理', '1616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1618', '我的待办', '1616', '5', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1619', '待办任务', '1618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1620', '流程定义', '1616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1621', '流程实例', '1630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1622', '流程分类', '1616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1629', '我发起的', '1618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1630', '流程监控', '1616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1631', '待办任务', '1630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('1616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('1617', '模型管理', '1616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('1618', '我的待办', '1616', '5', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('1619', '待办任务', '1618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('1620', '流程定义', '1616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('1621', '流程实例', '1630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('1622', '流程分类', '1616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('1629', '我发起的', '1618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('1630', '流程监控', '1616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('1631', '待办任务', '1630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); -- 流程分类管理相关按钮 -insert into sys_menu values ('1623', '流程分类查询', '1622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1624', '流程分类新增', '1622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1625', '流程分类修改', '1622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1626', '流程分类删除', '1622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1627', '流程分类导出', '1622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values ('1623', '流程分类查询', '1622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values ('1624', '流程分类新增', '1622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values ('1625', '流程分类修改', '1622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values ('1626', '流程分类删除', '1622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, now(), null, null, ''); +insert into sys_menu values ('1627', '流程分类导出', '1622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, now(), null, null, ''); -- 请假单信息 DROP TABLE if EXISTS test_leave; create table test_leave @@ -26,6 +26,7 @@ create table test_leave leave_type varchar(255), start_date timestamp, end_date timestamp, + leave_days bigint, remark varchar(255), create_dept bigint, create_by bigint, @@ -111,9 +112,9 @@ alter table wf_category create unique index uni_category_code on wf_category (category_code); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, sysdate(), NULL, NULL, '请假申请菜单'); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1639, '请假申请查询', 1638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1640, '请假申请新增', 1638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1641, '请假申请修改', 1638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1642, '请假申请删除', 1638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1643, '请假申请导出', 1638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, now(), NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1639, '请假申请查询', 1638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1640, '请假申请新增', 1638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1641, '请假申请修改', 1638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1642, '请假申请删除', 1638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1643, '请假申请导出', 1638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, now(), NULL, NULL, ''); From b2a82d5637f88751f67f137d2f5afcdc4016e2ac Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 7 Dec 2023 18:14:42 +0800 Subject: [PATCH 105/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9E=E4=BE=8B=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/flowable/cmd/DeleteExecutionCmd.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java index 698cebd6e..215d31023 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java @@ -2,6 +2,7 @@ package org.dromara.workflow.flowable.cmd; import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.impl.persistence.entity.ExecutionEntity; import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager; import org.flowable.engine.impl.util.CommandContextUtil; @@ -12,7 +13,7 @@ import java.io.Serializable; * * @author may */ -public class DeleteExecutionCmd implements Command, Serializable { +public class DeleteExecutionCmd implements Command, Serializable { /** * 执行id @@ -24,9 +25,12 @@ public class DeleteExecutionCmd implements Command, Serializable { } @Override - public String execute(CommandContext commandContext) { + public Void execute(CommandContext commandContext) { ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); - executionEntityManager.delete(executionId); + ExecutionEntity entity = executionEntityManager.findById(executionId); + if (entity != null) { + executionEntityManager.deleteExecutionAndRelatedData(entity, "", false, false); + } return null; } } From 1d78b977329123fede3c8e41e20058acfb962b38 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 10 Dec 2023 11:18:34 +0800 Subject: [PATCH 106/159] =?UTF-8?q?update=20=20=E8=B0=83=E6=95=B4=E8=AF=B7?= =?UTF-8?q?=E5=81=87=E6=9F=A5=E8=AF=A2=20=E4=BF=AE=E6=94=B9=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=E6=9F=A5=E7=9C=8Bxml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ActProcessDefinitionController.java | 4 ++-- .../org/dromara/workflow/domain/bo/TestLeaveBo.java | 10 ++++++++++ .../workflow/service/impl/TestLeaveServiceImpl.java | 4 ++-- 3 files changed, 14 insertions(+), 4 deletions(-) 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 index 62c40188d..9b85168dd 100644 --- 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 @@ -4,7 +4,6 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; -import org.dromara.common.core.utils.StringUtils; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -16,6 +15,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -73,7 +73,7 @@ public class ActProcessDefinitionController extends BaseController { public R> getXml(@NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { Map map = new HashMap<>(); String xmlStr = actProcessDefinitionService.processDefinitionXml(processDefinitionId); - map.put("xml", StringUtils.splitList("\n")); + map.put("xml", Arrays.asList(xmlStr.split("\n"))); map.put("xmlStr", xmlStr); return R.ok(map); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java index 207eb16ae..e71be591a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java @@ -56,6 +56,16 @@ public class TestLeaveBo extends BaseEntity { @NotNull(message = "请假天数不能为空", groups = {AddGroup.class, EditGroup.class}) private Integer leaveDays; + /** + * 开始时间 + */ + private Integer startLeaveDays; + + /** + * 结束时间 + */ + private Integer endLeaveDays; + /** * 请假原因 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index 6e291d2c3..af4f93123 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -71,10 +71,10 @@ public class TestLeaveServiceImpl implements ITestLeaveService { } private LambdaQueryWrapper buildQueryWrapper(TestLeaveBo bo) { - Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(StringUtils.isNotBlank(bo.getLeaveType()), TestLeave::getLeaveType, bo.getLeaveType()); - lqw.eq(bo.getLeaveDays() != null, TestLeave::getLeaveDays, bo.getLeaveDays()); + lqw.ge(bo.getStartLeaveDays() != null,TestLeave::getLeaveDays, bo.getStartLeaveDays()); + lqw.le(bo.getEndLeaveDays() != null,TestLeave::getLeaveDays, bo.getEndLeaveDays()); return lqw; } From 0774b7f25bdab87fa8e798ef23e526ba77294a4d Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 10 Dec 2023 12:31:51 +0800 Subject: [PATCH 107/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=AE=A1=E6=89=B9=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ActProcessInstanceServiceImpl.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 323cc5e91..b1dee83b8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -31,10 +31,7 @@ import org.dromara.workflow.flowable.cmd.ExecutionChildByExecutionIdCmd; import org.dromara.workflow.service.IActHiProcinstService; import org.dromara.workflow.service.IActProcessInstanceService; import org.dromara.workflow.utils.WorkflowUtils; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.FlowElement; -import org.flowable.bpmn.model.GraphicInfo; -import org.flowable.bpmn.model.UserTask; +import org.flowable.bpmn.model.*; import org.flowable.engine.*; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; @@ -294,6 +291,18 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService graphicInfoVo.setNodeName(flowElement.getName()); graphicInfoVos.add(graphicInfoVo); } + if (flowElement instanceof SubProcess) { + Collection subFlowElements = ((SubProcess) flowElement).getFlowElements(); + for (FlowElement element : subFlowElements) { + if (element instanceof UserTask) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(element.getId()); + GraphicInfoVo graphicInfoVo = BeanUtil.toBean(graphicInfo, GraphicInfoVo.class); + graphicInfoVo.setNodeId(element.getId()); + graphicInfoVo.setNodeName(element.getName()); + graphicInfoVos.add(graphicInfoVo); + } + } + } } //节点图形信息 map.put("graphicInfoVos", graphicInfoVos); From b262fd64b743fc85fea7363d7eb1bdf8310cedfe Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Tue, 12 Dec 2023 21:37:18 +0800 Subject: [PATCH 108/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E7=9B=91=E5=90=AC=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/TestLeaveExecutionListener.java | 30 ++++++++++++++++++ .../listener/TestLeaveTaskListener.java | 21 ++++++++++++ script/bpmn/请假流程(监听)-leave8.zip | Bin 0 -> 1535 bytes 3 files changed, 51 insertions(+) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestLeaveExecutionListener.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestLeaveTaskListener.java create mode 100644 script/bpmn/请假流程(监听)-leave8.zip diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestLeaveExecutionListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestLeaveExecutionListener.java new file mode 100644 index 000000000..a3c220f15 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestLeaveExecutionListener.java @@ -0,0 +1,30 @@ +package org.dromara.workflow.listener; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.task.api.Task; +import org.springframework.stereotype.Component; + +/** + * 流程实例监听测试 + * + * @author may + * @date 2023-12-12 + */ +@Slf4j +@RequiredArgsConstructor +@Component("testLeaveExecutionListener") +public class TestLeaveExecutionListener implements ExecutionListener { + + private final TaskService taskService; + + @Override + public void notify(DelegateExecution execution) { + Task task = taskService.createTaskQuery().executionId(execution.getId()).singleResult(); + log.info("执行监听【" + task.getName() + "】"); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestLeaveTaskListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestLeaveTaskListener.java new file mode 100644 index 000000000..5c62417a2 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestLeaveTaskListener.java @@ -0,0 +1,21 @@ +package org.dromara.workflow.listener; + +import lombok.extern.slf4j.Slf4j; +import org.flowable.task.service.delegate.DelegateTask; +import org.flowable.task.service.delegate.TaskListener; +import org.springframework.stereotype.Component; + +/** + * 流程任务监听测试 + * + * @author may + * @date 2023-12-12 + */ +@Slf4j +@Component("testLeaveTaskListener") +public class TestLeaveTaskListener implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + log.info("执行监听【" + delegateTask.getName() + "】"); + } +} diff --git a/script/bpmn/请假流程(监听)-leave8.zip b/script/bpmn/请假流程(监听)-leave8.zip new file mode 100644 index 0000000000000000000000000000000000000000..4c655036e6429cd7df284b01ac88fb038fdd6f7a GIT binary patch literal 1535 zcma)+Yd8}M7{|AWsW5lpq;kU4TnaHH=1>+%2SdswF}F}Ib4}!$OD?%J#9VUEZI(+e z*+NZji!BzJEzz2`WWuRWr}ORn-Vg8pdH&D)yx)E{2tIyE00;yEB-Y<|0Q`p9&&+JX z(c_Yq+v6BDX{_#KM)3oBRz0gb1?uPN7V4>|?jGnLa8gq}+~02wX_ZDbm+fUZ)Rez< zM4VDWUGJ9X2<`7G&hkT8f=r&ObRLt!64{%S-!MW1hb)9VV{1k?K!^fQ&y8k zbPdiQjxC;%YZ$*)o0S}FAp?V+XP~|2=SbYiaU1;w$3xY_jkPTA+JT$^N?OiNBdJW(A1ltq9|((qk;2ur-z84? zQv>Gk2c`IsM@D$vda34yiWYP9j|hmo7fQx79ysDTQU89nQO^EyuDnNyDsJ*TnLgr1 z`2a70E=MD`M&7x-ukZ0qop`bc(MpCbjSG3zX7}laPCqZ*{kHN^CU%?0;kGu>x__*5 zGiklNWyWcZ=eBuzqSojz+gAzD79kA}6YW4tdwvx|$jBY^J9x>Eg8O&%iJIl3ayI+5 z(gczzC5Oa)WRHwb_gMP^8{DmeOa8FftU&)sBNo-6l}~E2!CWDD#z(R16073zo%~6i z^FKbZV&b-UHy7`LTr6r&4;z=9y%hAI4IQ}bG&Sz8c-P=ed87Pcfk=3j;>lOd4aISd zYUsjQ=N}8sfpu+|c&vAFf_4WUattV}of!d~Fe>kFd1apAB`!(PJ<{=6Q0^*rX=9Ak zy9>ATF=$r`^fq45tf98w@RA2q5}vOP&HBi z0;6!?UShM+KxMBm~Nq|Hx7;wl2fO8Xp>7w18F z)$V^|9qpLY*sqzTK4AMORwKiJNOD=AM{c+ZQsc)iPf@az^vB{jF#rO*Ci8$EzXPk8&?wH!`8a@=(hVj3xLUqqWd*Cb3uIFe)tr^rVS&sDiUg-SxWA-DaMe7sw$?Fy!9FXPHcj5T{x92HU7{5NJfpi=;v2hg#^>vDo1t{D7IcSy0<(buMQd#h=DtQ z?(4dvdqbGgD&y*pN~0+6J`8>HsnmgDn~r?#^rBNkv^Y$cb}#R-2z2y8dCPC>2BOf|+9>5OWiW_*A%a;QtGGG+N3F-UH{ z#pn5}ITj+JQtQmy#fEey8CyiiHe9ZpMop3Oo+xePe=ULqH(RYR3A!Qn=CmNTtGAYA zh^%LaKT^4;?M&L%*1kH6TGq9uLy(zRcHpVoZ-||3%89DIo0-Fyba{>=@5(o7t9oot zE3J!+(%Gr&+7Put2!e6}_%Qvw0Kh(J0Kf(T+#?D2SINJ3zm)u6{=cAY5PJoF-2#6O M^5=f=^B(~44@aE$iU0rr literal 0 HcmV?d00001 From c91f089212f8fa73a475ad1f1db06e9066c38b12 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 14 Dec 2023 16:26:28 +0800 Subject: [PATCH 109/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0SQLserve?= =?UTF-8?q?=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/sqlserver/flowable.sql | 153 ++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 script/sql/sqlserver/flowable.sql diff --git a/script/sql/sqlserver/flowable.sql b/script/sql/sqlserver/flowable.sql new file mode 100644 index 000000000..f8b781fe8 --- /dev/null +++ b/script/sql/sqlserver/flowable.sql @@ -0,0 +1,153 @@ +insert into sys_menu values('1616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('1617', '模型管理', '1616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('1618', '我的待办', '1616', '5', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('1619', '待办任务', '1618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('1620', '流程定义', '1616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('1621', '流程实例', '1630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('1622', '流程分类', '1616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('1629', '我发起的', '1618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('1630', '流程监控', '1616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('1631', '待办任务', '1630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); + + +-- 流程分类管理相关按钮 +insert into sys_menu values ('1623', '流程分类查询', '1622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, getdate(), null, null, ''); +insert into sys_menu values ('1624', '流程分类新增', '1622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, getdate(), null, null, ''); +insert into sys_menu values ('1625', '流程分类修改', '1622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, getdate(), null, null, ''); +insert into sys_menu values ('1626', '流程分类删除', '1622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, getdate(), null, null, ''); +insert into sys_menu values ('1627', '流程分类导出', '1622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, getdate(), null, null, ''); +-- 请假单信息 +DROP TABLE if EXISTS test_leave; +create table test_leave +( + id bigint not null + primary key, + leave_type nvarchar(255) not null, + start_date datetime2 not null, + end_date datetime2 not null, + leave_days int not null, + remark nvarchar(255), + create_dept bigint, + create_by bigint, + create_time datetime2, + update_by bigint, + update_time datetime2, + tenant_id nvarchar(20) default '000000' +) +go + +exec sp_addextendedproperty 'MS_Description', N'请假申请表', 'SCHEMA', 'dbo', 'TABLE', 'test_leave' +go + +exec sp_addextendedproperty 'MS_Description', N'主键', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'id' +go + +exec sp_addextendedproperty 'MS_Description', N'请假类型', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', + 'leave_type' +go + +exec sp_addextendedproperty 'MS_Description', N'开始时间', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', + 'start_date' +go + +exec sp_addextendedproperty 'MS_Description', N'结束时间', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'end_date' +go + +exec sp_addextendedproperty 'MS_Description', N'请假天数', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', + 'leave_days' +go + +exec sp_addextendedproperty 'MS_Description', N'请假原因', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'remark' +go + +exec sp_addextendedproperty 'MS_Description', N'创建部门', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', + 'create_dept' +go + +exec sp_addextendedproperty 'MS_Description', N'创建者', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'create_by' +go + +exec sp_addextendedproperty 'MS_Description', N'创建时间', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', + 'create_time' +go + +exec sp_addextendedproperty 'MS_Description', N'更新者', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'update_by' +go + +exec sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', + 'update_time' +go + +exec sp_addextendedproperty 'MS_Description', N'租户编号', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'tenant_id' +go + +-- 流程分类信息表 +DROP TABLE if EXISTS wf_category; +create table wf_category +( + id bigint not null + primary key, + category_name nvarchar(255), + category_code nvarchar(255) + constraint uni_category_code + unique, + parent_id bigint, + sort_num int, + tenant_id nvarchar(20) default '000000', + create_dept bigint, + create_by bigint, + create_time datetime2, + update_by bigint, + update_time datetime2 +) +go + +exec sp_addextendedproperty 'MS_Description', N'流程分类', 'SCHEMA', 'dbo', 'TABLE', 'wf_category' +go + +exec sp_addextendedproperty 'MS_Description', N'主键', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', 'id' +go + +exec sp_addextendedproperty 'MS_Description', N'分类名称', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', + 'category_name' +go + +exec sp_addextendedproperty 'MS_Description', N'分类编码', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', + 'category_code' +go + +exec sp_addextendedproperty 'MS_Description', N'父级id', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', 'parent_id' +go + +exec sp_addextendedproperty 'MS_Description', N'排序', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', 'sort_num' +go + +exec sp_addextendedproperty 'MS_Description', N'租户编号', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', + 'tenant_id' +go + +exec sp_addextendedproperty 'MS_Description', N'创建部门', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', + 'create_dept' +go + +exec sp_addextendedproperty 'MS_Description', N'创建者', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', 'create_by' +go + +exec sp_addextendedproperty 'MS_Description', N'创建时间', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', + 'create_time' +go + +exec sp_addextendedproperty 'MS_Description', N'更新者', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', 'update_by' +go + +exec sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', 'dbo', 'TABLE', 'wf_category', 'COLUMN', + 'update_time' +go + + +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, getdate(), NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1639, '请假申请查询', 1638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, getdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1640, '请假申请新增', 1638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, getdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1641, '请假申请修改', 1638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, getdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1642, '请假申请删除', 1638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, getdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1643, '请假申请导出', 1638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, getdate(), NULL, NULL, ''); From 85c93b28ce133a00abaa9539d41e442445859a1a Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 24 Dec 2023 23:13:56 +0800 Subject: [PATCH 110/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0sql=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/flowable.sql | 42 +++++------ script/sql/oracle/flowable.sql | 91 +++++++++++++++++++++++ script/sql/postgres/postgres_flowable.sql | 42 +++++------ script/sql/sqlserver/flowable.sql | 42 +++++------ 4 files changed, 154 insertions(+), 63 deletions(-) create mode 100644 script/sql/oracle/flowable.sql diff --git a/script/sql/flowable.sql b/script/sql/flowable.sql index 4713ab11d..00c94a28f 100644 --- a/script/sql/flowable.sql +++ b/script/sql/flowable.sql @@ -1,21 +1,21 @@ -insert into sys_menu values('1616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1617', '模型管理', '1616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1618', '我的待办', '1616', '5', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1619', '待办任务', '1618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1620', '流程定义', '1616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1621', '流程实例', '1630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1622', '流程分类', '1616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1629', '我发起的', '1618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1630', '流程监控', '1616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('1631', '待办任务', '1630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('11618', '我的待办', '11616', '5', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('11619', '待办任务', '11618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -- 流程分类管理相关按钮 -insert into sys_menu values ('1623', '流程分类查询', '1622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1624', '流程分类新增', '1622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1625', '流程分类修改', '1622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1626', '流程分类删除', '1622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1627', '流程分类导出', '1622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, sysdate(), null, null, ''); -- 请假单信息 DROP TABLE if EXISTS test_leave; create table test_leave @@ -55,9 +55,9 @@ create table wf_category unique (category_code) ) engine=innodb comment= '流程分类'; -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, sysdate(), NULL, NULL, '请假申请菜单'); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1639, '请假申请查询', 1638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1640, '请假申请新增', 1638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1641, '请假申请修改', 1638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1642, '请假申请删除', 1638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, sysdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1643, '请假申请导出', 1638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, sysdate(), NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, sysdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, sysdate(), NULL, NULL, ''); diff --git a/script/sql/oracle/flowable.sql b/script/sql/oracle/flowable.sql new file mode 100644 index 000000000..315c60e92 --- /dev/null +++ b/script/sql/oracle/flowable.sql @@ -0,0 +1,91 @@ +insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); +insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); +insert into sys_menu values('11618', '我的待办', '11616', '5', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); +insert into sys_menu values('11619', '待办任务', '11618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); +insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); +insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); +insert into sys_menu values('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); +insert into sys_menu values('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); +insert into sys_menu values('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); +insert into sys_menu values('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); + + +-- 流程分类管理相关按钮 +insert into sys_menu values ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, sysdate, null, null, ''); +insert into sys_menu values ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, sysdate, null, null, ''); +insert into sys_menu values ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, sysdate, null, null, ''); +insert into sys_menu values ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, sysdate, null, null, ''); +insert into sys_menu values ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, sysdate, null, null, ''); + +-- 请假单信息 +create table TEST_LEAVE +( + ID NUMBER(20) not null + constraint PK_TEST_LEAVE + primary key, + LEAVE_TYPE VARCHAR2(255), + START_DATE DATE, + END_DATE DATE, + LEAVE_DAYS NUMBER(10), + REMARK VARCHAR2(255), + CREATE_DEPT NUMBER(20), + CREATE_BY NUMBER(20), + CREATE_TIME DATE, + UPDATE_BY NUMBER(20), + UPDATE_TIME DATE, + TENANT_ID VARCHAR2(255) default '000000' +); + +comment on table TEST_LEAVE is '请假申请表' +comment on column TEST_LEAVE.ID is '主键' +comment on column TEST_LEAVE.LEAVE_TYPE is '请假类型' +comment on column TEST_LEAVE.START_DATE is '开始时间' +comment on column TEST_LEAVE.END_DATE is '结束时间' +comment on column TEST_LEAVE.LEAVE_DAYS is '请假天数' +comment on column TEST_LEAVE.REMARK is '请假原因' +comment on column TEST_LEAVE.CREATE_DEPT is '创建部门' +comment on column TEST_LEAVE.CREATE_BY is '创建者' +comment on column TEST_LEAVE.CREATE_TIME is '创建时间' +comment on column TEST_LEAVE.UPDATE_BY is '更新者' +comment on column TEST_LEAVE.UPDATE_TIME is '更新时间' +comment on column TEST_LEAVE.TENANT_ID is '租户编号' + +-- 流程分类信息表 +create table WF_CATEGORY +( + ID NUMBER(20) not null + constraint PK_WF_CATEGORY + primary key, + CATEGORY_NAME VARCHAR2(255), + CATEGORY_CODE VARCHAR2(255) + constraint UNI_CATEGORY_CODE + unique, + PARENT_ID NUMBER(20), + SORT_NUM NUMBER(10), + TENANT_ID NUMBER(20), + CREATE_DEPT NUMBER(20), + CREATE_BY NUMBER(20), + CREATE_TIME DATE, + UPDATE_BY NUMBER(20), + UPDATE_TIME DATE +); + +comment on table WF_CATEGORY is '流程分类' +comment on column WF_CATEGORY.ID is '主键' +comment on column WF_CATEGORY.CATEGORY_NAME is '分类名称' +comment on column WF_CATEGORY.CATEGORY_CODE is '分类编码' +comment on column WF_CATEGORY.PARENT_ID is '父级id' +comment on column WF_CATEGORY.SORT_NUM is '排序' +comment on column WF_CATEGORY.TENANT_ID is '租户编号' +comment on column WF_CATEGORY.CREATE_DEPT is '创建部门' +comment on column WF_CATEGORY.CREATE_BY is '创建者' +comment on column WF_CATEGORY.CREATE_TIME is '创建时间' +comment on column WF_CATEGORY.UPDATE_BY is '更新者' +comment on column WF_CATEGORY.UPDATE_TIME is '更新时间' + +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, sysdate, NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, sysdate, NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, sysdate, NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, sysdate, NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, sysdate, NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, sysdate, NULL, NULL, ''); diff --git a/script/sql/postgres/postgres_flowable.sql b/script/sql/postgres/postgres_flowable.sql index 4f5e108a5..e901f8dcd 100644 --- a/script/sql/postgres/postgres_flowable.sql +++ b/script/sql/postgres/postgres_flowable.sql @@ -1,21 +1,21 @@ -insert into sys_menu values('1616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('1617', '模型管理', '1616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('1618', '我的待办', '1616', '5', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('1619', '待办任务', '1618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('1620', '流程定义', '1616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('1621', '流程实例', '1630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('1622', '流程分类', '1616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('1629', '我发起的', '1618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('1630', '流程监控', '1616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('1631', '待办任务', '1630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('11618', '我的待办', '11616', '5', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('11619', '待办任务', '11618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); -- 流程分类管理相关按钮 -insert into sys_menu values ('1623', '流程分类查询', '1622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, now(), null, null, ''); -insert into sys_menu values ('1624', '流程分类新增', '1622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, now(), null, null, ''); -insert into sys_menu values ('1625', '流程分类修改', '1622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, now(), null, null, ''); -insert into sys_menu values ('1626', '流程分类删除', '1622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, now(), null, null, ''); -insert into sys_menu values ('1627', '流程分类导出', '1622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, now(), null, null, ''); +insert into sys_menu values ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, now(), null, null, ''); +insert into sys_menu values ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, now(), null, null, ''); -- 请假单信息 DROP TABLE if EXISTS test_leave; create table test_leave @@ -112,9 +112,9 @@ alter table wf_category create unique index uni_category_code on wf_category (category_code); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, now(), NULL, NULL, '请假申请菜单'); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1639, '请假申请查询', 1638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1640, '请假申请新增', 1638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1641, '请假申请修改', 1638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1642, '请假申请删除', 1638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, now(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1643, '请假申请导出', 1638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, now(), NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, now(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, now(), NULL, NULL, ''); diff --git a/script/sql/sqlserver/flowable.sql b/script/sql/sqlserver/flowable.sql index f8b781fe8..46d04b245 100644 --- a/script/sql/sqlserver/flowable.sql +++ b/script/sql/sqlserver/flowable.sql @@ -1,21 +1,21 @@ -insert into sys_menu values('1616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('1617', '模型管理', '1616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('1618', '我的待办', '1616', '5', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('1619', '待办任务', '1618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('1620', '流程定义', '1616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('1621', '流程实例', '1630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('1622', '流程分类', '1616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('1629', '我发起的', '1618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('1630', '流程监控', '1616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('1631', '待办任务', '1630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('11618', '我的待办', '11616', '5', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('11619', '待办任务', '11618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('11629', '我发起的', '11618', '1', 'myDocument', 'workflow/task/myDocument', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('11630', '流程监控', '11616', '4', 'monitor', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('11631', '待办任务', '11630', '2', 'allTaskWaiting', 'workflow/task/allTaskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); -- 流程分类管理相关按钮 -insert into sys_menu values ('1623', '流程分类查询', '1622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, getdate(), null, null, ''); -insert into sys_menu values ('1624', '流程分类新增', '1622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, getdate(), null, null, ''); -insert into sys_menu values ('1625', '流程分类修改', '1622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, getdate(), null, null, ''); -insert into sys_menu values ('1626', '流程分类删除', '1622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, getdate(), null, null, ''); -insert into sys_menu values ('1627', '流程分类导出', '1622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, getdate(), null, null, ''); +insert into sys_menu values ('11623', '流程分类查询', '11622', '1', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:query', '#', 103, 1, getdate(), null, null, ''); +insert into sys_menu values ('11624', '流程分类新增', '11622', '2', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:add', '#', 103, 1, getdate(), null, null, ''); +insert into sys_menu values ('11625', '流程分类修改', '11622', '3', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:edit', '#', 103, 1, getdate(), null, null, ''); +insert into sys_menu values ('11626', '流程分类删除', '11622', '4', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:remove','#', 103, 1, getdate(), null, null, ''); +insert into sys_menu values ('11627', '流程分类导出', '11622', '5', '#', '', '', 1, 0, 'F', '0', '0', 'workflow:category:export','#', 103, 1, getdate(), null, null, ''); -- 请假单信息 DROP TABLE if EXISTS test_leave; create table test_leave @@ -145,9 +145,9 @@ exec sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', 'dbo', go -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, getdate(), NULL, NULL, '请假申请菜单'); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1639, '请假申请查询', 1638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, getdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1640, '请假申请新增', 1638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, getdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1641, '请假申请修改', 1638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, getdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1642, '请假申请删除', 1638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, getdate(), NULL, NULL, ''); -INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1643, '请假申请导出', 1638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, getdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, getdate(), NULL, NULL, '请假申请菜单'); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, getdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, getdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, getdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, getdate(), NULL, NULL, ''); +INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, getdate(), NULL, NULL, ''); From e7630e0da6db53f2f6ea52805c36827145f88a2f Mon Sep 17 00:00:00 2001 From: Ray <343509740@qq.com> Date: Wed, 27 Dec 2023 14:22:42 +0800 Subject: [PATCH 111/159] =?UTF-8?q?update-=E5=AE=8C=E5=96=84=E5=AF=B9?= =?UTF-8?q?=E6=A8=A1=E5=9E=8Bkey=E6=A0=A1=E9=AA=8C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/FlowConstant.java | 4 +++ .../dromara/workflow/domain/bo/ModelBo.java | 3 +++ .../service/impl/ActModelServiceImpl.java | 27 ++++++++++++++----- 3 files changed, 28 insertions(+), 6 deletions(-) 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 index 6b5233796..ed5ef4ece 100644 --- 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 @@ -79,4 +79,8 @@ public interface FlowConstant { */ String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; + /** + * 模型标识key命名规范正则表达式 + */ + String MODE_KEY_PATTERN = "^[a-zA-Z][a-zA-Z0-9_]{0,254}$"; } 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 40204a561..733dba3ef 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 @@ -1,10 +1,12 @@ package org.dromara.workflow.domain.bo; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; import lombok.Data; import lombok.EqualsAndHashCode; import org.dromara.common.core.validate.AddGroup; import org.dromara.workflow.common.PageEntity; +import org.dromara.workflow.common.constant.FlowConstant; import java.io.Serial; import java.io.Serializable; @@ -31,6 +33,7 @@ public class ModelBo extends PageEntity implements Serializable { * 模型标识key */ @NotBlank(message = "模型标识key不能为空", groups = {AddGroup.class}) + @Pattern(regexp = FlowConstant.MODE_KEY_PATTERN, message = "模型标识key只能字符或者下划线开头", groups = {AddGroup.class}) private String key; /** 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 e25414ef9..0a251fc90 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 @@ -1,6 +1,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Validator; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -24,6 +25,7 @@ import org.dromara.system.domain.SysRole; import org.dromara.system.domain.SysUser; import org.dromara.system.mapper.SysRoleMapper; import org.dromara.system.mapper.SysUserMapper; +import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.domain.bo.ModelBo; import org.dromara.workflow.domain.vo.GroupRepresentation; import org.dromara.workflow.domain.vo.ResultListDataRepresentation; @@ -89,7 +91,7 @@ public class ActModelServiceImpl implements IActModelService { query.modelCategory(modelBo.getCategoryCode()); } query.orderByLastUpdateTime().desc(); - //创建时间降序排列 + // 创建时间降序排列 query.orderByCreateTime().desc(); // 分页查询 List modelList = query.listPage(modelBo.getPageNum(), modelBo.getPageSize()); @@ -226,14 +228,27 @@ public class ActModelServiceImpl implements IActModelService { model.setVersion(model.getVersion() + 1); // 获取唯一标识key String key = values.getFirst("key"); + // 校验key命名规范 + if (!Validator.isMatchRegex(FlowConstant.MODE_KEY_PATTERN, key)) { + throw new ServiceException("模型标识key只能字符或者下划线开头!"); + } List list = repositoryService.createModelQuery().modelKey(key).modelTenantId(TenantHelper.getTenantId()).list(); list.stream().filter(e -> !e.getId().equals(model.getId())).findFirst().ifPresent(e -> { - throw new ServiceException("模型key已存在!"); + throw new ServiceException("模型标识key已存在!"); }); model.setKey(key); repositoryService.saveModel(model); - //解决设计器选择设置流程发起人设置变量有问题 + // 解决设计器选择设置流程发起人设置变量有问题 JsonNode jsonNode = objectMapper.readTree(values.getFirst("json_xml")); + // 校验流程标识 + String processId = jsonNode.get("properties").get("process_id").textValue(); + if (StringUtils.isBlank(processId)) { + throw new ServiceException("流程标识不能为空!"); + } + if (!Validator.isMatchRegex(FlowConstant.MODE_KEY_PATTERN, processId)) { + throw new ServiceException("流程标识只能字符或者下划线开头!"); + } + byte[] xmlBytes = WorkflowUtils.bpmnJsonToXmlBytes(Objects.requireNonNull(JsonUtils.toJsonString(jsonNode)).getBytes(StandardCharsets.UTF_8)); if (ArrayUtil.isEmpty(xmlBytes)) { throw new ServiceException("模型不能为空!"); @@ -256,7 +271,7 @@ public class ActModelServiceImpl implements IActModelService { @Transactional(rollbackFor = Exception.class) public boolean modelDeploy(String id) { try { - //查询流程定义模型xml + // 查询流程定义模型xml byte[] xmlBytes = repositoryService.getModelEditorSource(id); if (ArrayUtil.isEmpty(xmlBytes)) { throw new ServiceException("模型数据为空,请先设计流程定义模型,再进行部署!"); @@ -279,7 +294,7 @@ public class ActModelServiceImpl implements IActModelService { Model model = repositoryService.getModel(id); // xml资源的名称 ,对应act_ge_bytearray表中的name_字段 String processName = model.getName() + ".bpmn20.xml"; - //调用部署相关的api方法进行部署流程定义 + // 调用部署相关的api方法进行部署流程定义 Deployment deployment = repositoryService.createDeployment() // 部署名称 .name(model.getName()) @@ -319,7 +334,7 @@ public class ActModelServiceImpl implements IActModelService { zos = ZipUtil.getZipOutputStream(response.getOutputStream(), StandardCharsets.UTF_8); // 压缩包文件名 String zipName = "模型不存在"; - //查询模型基本信息 + // 查询模型基本信息 Model model = repositoryService.getModel(modelId); byte[] xmlBytes = repositoryService.getModelEditorSource(modelId); if (ObjectUtil.isNotNull(model)) { From b68410ca45d28fe5dbfcdc166a703a100878fb05 Mon Sep 17 00:00:00 2001 From: Ray <343509740@qq.com> Date: Wed, 27 Dec 2023 14:31:42 +0800 Subject: [PATCH 112/159] =?UTF-8?q?update-=E4=BF=AE=E6=94=B9=E5=B8=B8?= =?UTF-8?q?=E9=87=8F=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/common/constant/FlowConstant.java | 2 +- .../src/main/java/org/dromara/workflow/domain/bo/ModelBo.java | 2 +- .../dromara/workflow/service/impl/ActModelServiceImpl.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) 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 index ed5ef4ece..0ccfd0fa5 100644 --- 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 @@ -82,5 +82,5 @@ public interface FlowConstant { /** * 模型标识key命名规范正则表达式 */ - String MODE_KEY_PATTERN = "^[a-zA-Z][a-zA-Z0-9_]{0,254}$"; + String MODEL_KEY_PATTERN = "^[a-zA-Z][a-zA-Z0-9_]{0,254}$"; } 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 733dba3ef..152f65445 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 @@ -33,7 +33,7 @@ public class ModelBo extends PageEntity implements Serializable { * 模型标识key */ @NotBlank(message = "模型标识key不能为空", groups = {AddGroup.class}) - @Pattern(regexp = FlowConstant.MODE_KEY_PATTERN, message = "模型标识key只能字符或者下划线开头", groups = {AddGroup.class}) + @Pattern(regexp = FlowConstant.MODEL_KEY_PATTERN, message = "模型标识key只能字符或者下划线开头", groups = {AddGroup.class}) private String key; /** 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 0a251fc90..1c0ea8c6b 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 @@ -229,7 +229,7 @@ public class ActModelServiceImpl implements IActModelService { // 获取唯一标识key String key = values.getFirst("key"); // 校验key命名规范 - if (!Validator.isMatchRegex(FlowConstant.MODE_KEY_PATTERN, key)) { + if (!Validator.isMatchRegex(FlowConstant.MODEL_KEY_PATTERN, key)) { throw new ServiceException("模型标识key只能字符或者下划线开头!"); } List list = repositoryService.createModelQuery().modelKey(key).modelTenantId(TenantHelper.getTenantId()).list(); @@ -245,7 +245,7 @@ public class ActModelServiceImpl implements IActModelService { if (StringUtils.isBlank(processId)) { throw new ServiceException("流程标识不能为空!"); } - if (!Validator.isMatchRegex(FlowConstant.MODE_KEY_PATTERN, processId)) { + if (!Validator.isMatchRegex(FlowConstant.MODEL_KEY_PATTERN, processId)) { throw new ServiceException("流程标识只能字符或者下划线开头!"); } From ed66fbf38e6bf96c2cbcadc073e6fc5fbf7cfdd1 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Wed, 27 Dec 2023 22:06:12 +0800 Subject: [PATCH 113/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E4=BB=BB=E5=8A=A1=E7=9B=91=E5=90=AC=E7=AD=96?= =?UTF-8?q?=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../annotation/FlowListenerAnnotation.java | 27 ++++++++ .../config/GlobalFlowableListener.java | 30 ++++++++ .../flowable/strategy/FlowEventStrategy.java | 68 +++++++++++++++++++ .../strategy/FlowProcessEventHandler.java | 19 ++++++ .../strategy/FlowTaskEventHandler.java | 19 ++++++ .../listener/TestCustomProcessHandler.java | 24 +++++++ .../listener/TestCustomTaskHandler.java | 24 +++++++ .../listener/TestLeaveExecutionListener.java | 1 - .../impl/ActProcessInstanceServiceImpl.java | 7 ++ .../service/impl/ActTaskServiceImpl.java | 9 +++ 10 files changed, 227 insertions(+), 1 deletion(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/annotation/FlowListenerAnnotation.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowEventStrategy.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowProcessEventHandler.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowTaskEventHandler.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomProcessHandler.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/annotation/FlowListenerAnnotation.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/annotation/FlowListenerAnnotation.java new file mode 100644 index 000000000..ad90df179 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/annotation/FlowListenerAnnotation.java @@ -0,0 +1,27 @@ +package org.dromara.workflow.annotation; + + +import java.lang.annotation.*; + +/** + * 流程任务监听注解 + * + * @author may + * @date 2023-12-27 + */ +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface FlowListenerAnnotation { + + /** + * 流程定义 + */ + String processDefinitionKey(); + + /** + * 节点定义 + */ + String taskDefId() default ""; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java index 039783528..c483eab63 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java @@ -2,6 +2,8 @@ package org.dromara.workflow.flowable.config; import cn.hutool.core.collection.CollUtil; import org.dromara.workflow.common.enums.TaskStatusEnum; +import org.dromara.workflow.flowable.strategy.FlowEventStrategy; +import org.dromara.workflow.flowable.strategy.FlowTaskEventHandler; import org.flowable.bpmn.model.BoundaryEvent; import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.FlowElement; @@ -10,9 +12,11 @@ import org.flowable.common.engine.impl.cfg.TransactionState; import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; +import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.Execution; import org.flowable.engine.task.Comment; import org.flowable.task.api.Task; +import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; @@ -40,12 +44,16 @@ public class GlobalFlowableListener implements FlowableEventListener { @Lazy private RepositoryService repositoryService; + @Autowired + private FlowEventStrategy flowEventStrategy; + @Override public void onEvent(FlowableEvent flowableEvent) { if (flowableEvent instanceof FlowableEngineEvent flowableEngineEvent) { FlowableEngineEventType engineEventType = (FlowableEngineEventType) flowableEvent.getType(); switch (engineEventType) { case JOB_EXECUTION_SUCCESS -> jobExecutionSuccess((FlowableEngineEntityEvent) flowableEngineEvent); + case TASK_COMPLETED -> taskCompleted((FlowableEngineEntityEvent) flowableEngineEvent); } } } @@ -65,6 +73,11 @@ public class GlobalFlowableListener implements FlowableEventListener { return TransactionState.COMMITTED.name(); } + /** + * 处理边界定时事件自动审批记录 + * + * @param event 事件 + */ protected void jobExecutionSuccess(FlowableEngineEntityEvent event) { Execution execution = runtimeService.createExecutionQuery().executionId(event.getExecutionId()).singleResult(); BpmnModel bpmnModel = repositoryService.getBpmnModel(event.getProcessDefinitionId()); @@ -83,4 +96,21 @@ public class GlobalFlowableListener implements FlowableEventListener { } } } + + /** + * 处理任务办理监听 + * + * @param event 事件 + */ + protected void taskCompleted(FlowableEngineEntityEvent event) { + TaskEntity entity = (TaskEntity) event.getEntity(); + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(entity.getProcessDefinitionId()).singleResult(); + String processDefinitionKey = processDefinition.getKey(); + String taskDefinitionKey = entity.getTaskDefinitionKey(); + String beanName = processDefinitionKey + "_" + taskDefinitionKey; + FlowTaskEventHandler handler = flowEventStrategy.getTaskHandler(beanName); + if (handler != null) { + handler.handleTask(entity); + } + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowEventStrategy.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowEventStrategy.java new file mode 100644 index 000000000..3b00a4843 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowEventStrategy.java @@ -0,0 +1,68 @@ +package org.dromara.workflow.flowable.strategy; + +import org.dromara.common.core.utils.StringUtils; +import org.dromara.workflow.annotation.FlowListenerAnnotation; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +/** + * 流程任务监听策略 + * + * @author may + * @date 2023-12-27 + */ +@Component +public class FlowEventStrategy implements BeanPostProcessor { + + private final Map flowTaskEventHandlers = new HashMap<>(); + private final Map flowProcessEventHandlers = new HashMap<>(); + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof FlowTaskEventHandler || bean instanceof FlowProcessEventHandler) { + FlowListenerAnnotation annotation = bean.getClass().getAnnotation(FlowListenerAnnotation.class); + if (null != annotation) { + if (StringUtils.isNotBlank(annotation.processDefinitionKey()) && StringUtils.isNotBlank(annotation.taskDefId())) { + String id = annotation.processDefinitionKey() + "_" + annotation.taskDefId(); + if (!flowTaskEventHandlers.containsKey(id)) { + flowTaskEventHandlers.put(id, (FlowTaskEventHandler) bean); + } + } + if (StringUtils.isNotBlank(annotation.processDefinitionKey()) && StringUtils.isBlank(annotation.taskDefId())) { + if (!flowProcessEventHandlers.containsKey(annotation.processDefinitionKey())) { + flowProcessEventHandlers.put(annotation.processDefinitionKey(), (FlowProcessEventHandler) bean); + } + } + } + } + return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName); + } + + /** + * 获取可执行bean + * + * @param beanName beanName + */ + public FlowTaskEventHandler getTaskHandler(String beanName) { + if (!flowTaskEventHandlers.containsKey(beanName)) { + return null; + } + return flowTaskEventHandlers.get(beanName); + } + + /** + * 获取可执行bean + * + * @param beanName beanName + */ + public FlowProcessEventHandler getProcessHandler(String beanName) { + if (!flowProcessEventHandlers.containsKey(beanName)) { + return null; + } + return flowProcessEventHandlers.get(beanName); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowProcessEventHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowProcessEventHandler.java new file mode 100644 index 000000000..a9ce28e57 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowProcessEventHandler.java @@ -0,0 +1,19 @@ +package org.dromara.workflow.flowable.strategy; + + +/** + * 流程监听 + * + * @author may + * @date 2023-12-27 + */ +public interface FlowProcessEventHandler { + + /** + * 执行办理任务监听 + * + * @param processInstanceId 流程实例id + * @param status 状态 + */ + void handleProcess(String processInstanceId, String status); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowTaskEventHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowTaskEventHandler.java new file mode 100644 index 000000000..98be53426 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowTaskEventHandler.java @@ -0,0 +1,19 @@ +package org.dromara.workflow.flowable.strategy; + +import org.flowable.task.service.impl.persistence.entity.TaskEntity; + +/** + * 流程任务监听 + * + * @author may + * @date 2023-12-27 + */ +public interface FlowTaskEventHandler { + + /** + * 执行办理任务监听 + * + * @param taskEntity 任务 + */ + void handleTask(TaskEntity taskEntity); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomProcessHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomProcessHandler.java new file mode 100644 index 000000000..b24ecdf35 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomProcessHandler.java @@ -0,0 +1,24 @@ +package org.dromara.workflow.listener; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.workflow.annotation.FlowListenerAnnotation; +import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler; +import org.springframework.stereotype.Component; + +/** + * 自定义监听测试 + * + * @author may + * @date 2023-12-27 + */ +@Slf4j +@Component +@FlowListenerAnnotation(processDefinitionKey = "leave1") +public class TestCustomProcessHandler implements FlowProcessEventHandler { + + + @Override + public void handleProcess(String processInstanceId, String status) { + log.info("流程实例ID:" + processInstanceId + ",状态:" + status); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java new file mode 100644 index 000000000..aa119a6bd --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java @@ -0,0 +1,24 @@ +package org.dromara.workflow.listener; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.workflow.annotation.FlowListenerAnnotation; +import org.dromara.workflow.flowable.strategy.FlowTaskEventHandler; +import org.flowable.task.service.impl.persistence.entity.TaskEntity; +import org.springframework.stereotype.Component; + +/** + * 自定义监听测试 + * + * @author may + * @date 2023-12-27 + */ +@Slf4j +@Component +@FlowListenerAnnotation(processDefinitionKey = "leave1", taskDefId = "sid-31C52262-04C3-43D8-A3FB-8434017A6572") +public class TestCustomTaskHandler implements FlowTaskEventHandler { + + @Override + public void handleTask(TaskEntity taskEntity) { + log.info("任务名称:" + taskEntity.getName()); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestLeaveExecutionListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestLeaveExecutionListener.java index a3c220f15..1a75414c0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestLeaveExecutionListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestLeaveExecutionListener.java @@ -2,7 +2,6 @@ package org.dromara.workflow.listener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.ExecutionListener; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index b1dee83b8..14f38c79c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -26,8 +26,10 @@ import org.dromara.workflow.domain.vo.GraphicInfoVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator; +import org.dromara.workflow.flowable.strategy.FlowEventStrategy; import org.dromara.workflow.flowable.cmd.DeleteExecutionCmd; import org.dromara.workflow.flowable.cmd.ExecutionChildByExecutionIdCmd; +import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler; import org.dromara.workflow.service.IActHiProcinstService; import org.dromara.workflow.service.IActProcessInstanceService; import org.dromara.workflow.utils.WorkflowUtils; @@ -69,6 +71,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService private final TaskService taskService; private final IActHiProcinstService actHiProcinstService; private final ManagementService managementService; + private final FlowEventStrategy flowEventStrategy; @Value("${flowable.activity-font-name}") private String activityFontName; @@ -366,6 +369,8 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService } runtimeService.updateBusinessStatus(processInvalidBo.getProcessInstanceId(), BusinessStatusEnum.INVALID.getStatus()); runtimeService.deleteProcessInstance(processInvalidBo.getProcessInstanceId(), deleteReason); + FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey()); + processHandler.handleProcess(historicProcessInstance.getId(), BusinessStatusEnum.INVALID.getStatus()); return true; } catch (Exception e) { e.printStackTrace(); @@ -495,6 +500,8 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService managementService.executeCommand(deleteExecutionCmd); } runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.CANCEL.getStatus()); + FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); + processHandler.handleProcess(processInstanceId, BusinessStatusEnum.CANCEL.getStatus()); return true; } catch (Exception e) { e.printStackTrace(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index edd102e34..9e38f45de 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -20,7 +20,9 @@ import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.TaskVo; +import org.dromara.workflow.flowable.strategy.FlowEventStrategy; import org.dromara.workflow.flowable.cmd.*; +import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler; import org.dromara.workflow.service.IActTaskService; import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.common.engine.impl.identity.Authentication; @@ -59,6 +61,7 @@ public class ActTaskServiceImpl implements IActTaskService { private final HistoryService historyService; private final IdentityService identityService; private final ManagementService managementService; + private final FlowEventStrategy flowEventStrategy; /** * 启动任务 @@ -161,6 +164,8 @@ public class ActTaskServiceImpl implements IActTaskService { if (CollUtil.isEmpty(list)) { UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); managementService.executeCommand(updateBusinessStatusCmd); + FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); + processHandler.handleProcess(processInstance.getId(), BusinessStatusEnum.FINISH.getStatus()); } else { sendMessage(list, processInstance.getName(), completeTaskBo.getMessageType(), null); } @@ -431,6 +436,8 @@ public class ActTaskServiceImpl implements IActTaskService { runtimeService.deleteProcessInstance(task.getProcessInstanceId(), StrUtil.EMPTY); } runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.TERMINATION.getStatus()); + FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey()); + processHandler.handleProcess(historicProcessInstance.getId(), BusinessStatusEnum.TERMINATION.getStatus()); return true; } catch (Exception e) { throw new ServiceException(e.getMessage()); @@ -609,6 +616,8 @@ public class ActTaskServiceImpl implements IActTaskService { managementService.executeCommand(deleteExecutionCmd); } runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.BACK.getStatus()); + FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); + processHandler.handleProcess(processInstanceId, BusinessStatusEnum.BACK.getStatus()); } catch (Exception e) { throw new ServiceException(e.getMessage()); } From 5bb3f65baea38410e69253a04fbe27bbc2ac3efd Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 28 Dec 2023 12:42:21 +0800 Subject: [PATCH 114/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../annotation/FlowListenerAnnotation.java | 4 ++-- .../config/GlobalFlowableListener.java | 4 ++-- .../flowable/strategy/FlowEventStrategy.java | 23 +++++++++++-------- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/annotation/FlowListenerAnnotation.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/annotation/FlowListenerAnnotation.java index ad90df179..5ea262d17 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/annotation/FlowListenerAnnotation.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/annotation/FlowListenerAnnotation.java @@ -16,12 +16,12 @@ import java.lang.annotation.*; public @interface FlowListenerAnnotation { /** - * 流程定义 + * 流程定义key */ String processDefinitionKey(); /** - * 节点定义 + * 节点id */ String taskDefId() default ""; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java index c483eab63..444799b90 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java @@ -107,8 +107,8 @@ public class GlobalFlowableListener implements FlowableEventListener { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(entity.getProcessDefinitionId()).singleResult(); String processDefinitionKey = processDefinition.getKey(); String taskDefinitionKey = entity.getTaskDefinitionKey(); - String beanName = processDefinitionKey + "_" + taskDefinitionKey; - FlowTaskEventHandler handler = flowEventStrategy.getTaskHandler(beanName); + String key = processDefinitionKey + "_" + taskDefinitionKey; + FlowTaskEventHandler handler = flowEventStrategy.getTaskHandler(key); if (handler != null) { handler.handleTask(entity); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowEventStrategy.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowEventStrategy.java index 3b00a4843..9da577633 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowEventStrategy.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowEventStrategy.java @@ -23,7 +23,7 @@ public class FlowEventStrategy implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { - if (bean instanceof FlowTaskEventHandler || bean instanceof FlowProcessEventHandler) { + if (bean instanceof FlowTaskEventHandler) { FlowListenerAnnotation annotation = bean.getClass().getAnnotation(FlowListenerAnnotation.class); if (null != annotation) { if (StringUtils.isNotBlank(annotation.processDefinitionKey()) && StringUtils.isNotBlank(annotation.taskDefId())) { @@ -32,6 +32,11 @@ public class FlowEventStrategy implements BeanPostProcessor { flowTaskEventHandlers.put(id, (FlowTaskEventHandler) bean); } } + } + } + if (bean instanceof FlowProcessEventHandler) { + FlowListenerAnnotation annotation = bean.getClass().getAnnotation(FlowListenerAnnotation.class); + if (null != annotation) { if (StringUtils.isNotBlank(annotation.processDefinitionKey()) && StringUtils.isBlank(annotation.taskDefId())) { if (!flowProcessEventHandlers.containsKey(annotation.processDefinitionKey())) { flowProcessEventHandlers.put(annotation.processDefinitionKey(), (FlowProcessEventHandler) bean); @@ -45,24 +50,24 @@ public class FlowEventStrategy implements BeanPostProcessor { /** * 获取可执行bean * - * @param beanName beanName + * @param key key */ - public FlowTaskEventHandler getTaskHandler(String beanName) { - if (!flowTaskEventHandlers.containsKey(beanName)) { + public FlowTaskEventHandler getTaskHandler(String key) { + if (!flowTaskEventHandlers.containsKey(key)) { return null; } - return flowTaskEventHandlers.get(beanName); + return flowTaskEventHandlers.get(key); } /** * 获取可执行bean * - * @param beanName beanName + * @param key key */ - public FlowProcessEventHandler getProcessHandler(String beanName) { - if (!flowProcessEventHandlers.containsKey(beanName)) { + public FlowProcessEventHandler getProcessHandler(String key) { + if (!flowProcessEventHandlers.containsKey(key)) { return null; } - return flowProcessEventHandlers.get(beanName); + return flowProcessEventHandlers.get(key); } } From afb2c67022d653699f965c6784f42e7eb2893562 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 28 Dec 2023 14:01:53 +0800 Subject: [PATCH 115/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=89=A7=E8=A1=8C=E9=9D=9E=E7=A9=BA=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E6=95=B4=E4=BB=BB=E5=8A=A1=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/GlobalFlowableListener.java | 25 ------------------- .../strategy/FlowTaskEventHandler.java | 6 ++--- .../listener/TestCustomTaskHandler.java | 6 ++--- .../impl/ActProcessInstanceServiceImpl.java | 8 ++++-- .../service/impl/ActTaskServiceImpl.java | 18 ++++++++++--- 5 files changed, 27 insertions(+), 36 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java index 444799b90..826a5e6b1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java @@ -2,8 +2,6 @@ package org.dromara.workflow.flowable.config; import cn.hutool.core.collection.CollUtil; import org.dromara.workflow.common.enums.TaskStatusEnum; -import org.dromara.workflow.flowable.strategy.FlowEventStrategy; -import org.dromara.workflow.flowable.strategy.FlowTaskEventHandler; import org.flowable.bpmn.model.BoundaryEvent; import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.FlowElement; @@ -12,11 +10,9 @@ import org.flowable.common.engine.impl.cfg.TransactionState; import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; -import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.Execution; import org.flowable.engine.task.Comment; import org.flowable.task.api.Task; -import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; @@ -44,16 +40,12 @@ public class GlobalFlowableListener implements FlowableEventListener { @Lazy private RepositoryService repositoryService; - @Autowired - private FlowEventStrategy flowEventStrategy; - @Override public void onEvent(FlowableEvent flowableEvent) { if (flowableEvent instanceof FlowableEngineEvent flowableEngineEvent) { FlowableEngineEventType engineEventType = (FlowableEngineEventType) flowableEvent.getType(); switch (engineEventType) { case JOB_EXECUTION_SUCCESS -> jobExecutionSuccess((FlowableEngineEntityEvent) flowableEngineEvent); - case TASK_COMPLETED -> taskCompleted((FlowableEngineEntityEvent) flowableEngineEvent); } } } @@ -96,21 +88,4 @@ public class GlobalFlowableListener implements FlowableEventListener { } } } - - /** - * 处理任务办理监听 - * - * @param event 事件 - */ - protected void taskCompleted(FlowableEngineEntityEvent event) { - TaskEntity entity = (TaskEntity) event.getEntity(); - ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(entity.getProcessDefinitionId()).singleResult(); - String processDefinitionKey = processDefinition.getKey(); - String taskDefinitionKey = entity.getTaskDefinitionKey(); - String key = processDefinitionKey + "_" + taskDefinitionKey; - FlowTaskEventHandler handler = flowEventStrategy.getTaskHandler(key); - if (handler != null) { - handler.handleTask(entity); - } - } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowTaskEventHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowTaskEventHandler.java index 98be53426..32ae62ba6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowTaskEventHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowTaskEventHandler.java @@ -1,6 +1,6 @@ package org.dromara.workflow.flowable.strategy; -import org.flowable.task.service.impl.persistence.entity.TaskEntity; +import org.flowable.task.api.Task; /** * 流程任务监听 @@ -13,7 +13,7 @@ public interface FlowTaskEventHandler { /** * 执行办理任务监听 * - * @param taskEntity 任务 + * @param task 任务 */ - void handleTask(TaskEntity taskEntity); + void handleTask(Task task); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java index aa119a6bd..0dd2d6f79 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java @@ -3,7 +3,7 @@ package org.dromara.workflow.listener; import lombok.extern.slf4j.Slf4j; import org.dromara.workflow.annotation.FlowListenerAnnotation; import org.dromara.workflow.flowable.strategy.FlowTaskEventHandler; -import org.flowable.task.service.impl.persistence.entity.TaskEntity; +import org.flowable.task.api.Task; import org.springframework.stereotype.Component; /** @@ -18,7 +18,7 @@ import org.springframework.stereotype.Component; public class TestCustomTaskHandler implements FlowTaskEventHandler { @Override - public void handleTask(TaskEntity taskEntity) { - log.info("任务名称:" + taskEntity.getName()); + public void handleTask(Task task) { + log.info("任务名称:" + task.getName()); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 14f38c79c..53ee343b9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -370,7 +370,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService runtimeService.updateBusinessStatus(processInvalidBo.getProcessInstanceId(), BusinessStatusEnum.INVALID.getStatus()); runtimeService.deleteProcessInstance(processInvalidBo.getProcessInstanceId(), deleteReason); FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey()); - processHandler.handleProcess(historicProcessInstance.getId(), BusinessStatusEnum.INVALID.getStatus()); + if (processHandler != null) { + processHandler.handleProcess(historicProcessInstance.getId(), BusinessStatusEnum.INVALID.getStatus()); + } return true; } catch (Exception e) { e.printStackTrace(); @@ -501,7 +503,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService } runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.CANCEL.getStatus()); FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); - processHandler.handleProcess(processInstanceId, BusinessStatusEnum.CANCEL.getStatus()); + if (processHandler != null) { + processHandler.handleProcess(processInstanceId, BusinessStatusEnum.CANCEL.getStatus()); + } return true; } catch (Exception e) { e.printStackTrace(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 9e38f45de..e35fcfad5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -23,6 +23,7 @@ import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.flowable.strategy.FlowEventStrategy; import org.dromara.workflow.flowable.cmd.*; import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler; +import org.dromara.workflow.flowable.strategy.FlowTaskEventHandler; import org.dromara.workflow.service.IActTaskService; import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.common.engine.impl.identity.Authentication; @@ -152,6 +153,11 @@ public class ActTaskServiceImpl implements IActTaskService { return true; } runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.WAITING.getStatus()); + String key = processInstance.getProcessDefinitionKey() + "_" + task.getTaskDefinitionKey(); + FlowTaskEventHandler taskHandler = flowEventStrategy.getTaskHandler(key); + if (taskHandler != null) { + taskHandler.handleTask(task); + } //办理意见 taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage()); //办理任务 @@ -165,7 +171,9 @@ public class ActTaskServiceImpl implements IActTaskService { UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); managementService.executeCommand(updateBusinessStatusCmd); FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); - processHandler.handleProcess(processInstance.getId(), BusinessStatusEnum.FINISH.getStatus()); + if (processHandler != null) { + processHandler.handleProcess(processInstance.getId(), BusinessStatusEnum.FINISH.getStatus()); + } } else { sendMessage(list, processInstance.getName(), completeTaskBo.getMessageType(), null); } @@ -437,7 +445,9 @@ public class ActTaskServiceImpl implements IActTaskService { } runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.TERMINATION.getStatus()); FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey()); - processHandler.handleProcess(historicProcessInstance.getId(), BusinessStatusEnum.TERMINATION.getStatus()); + if (processHandler != null) { + processHandler.handleProcess(historicProcessInstance.getId(), BusinessStatusEnum.TERMINATION.getStatus()); + } return true; } catch (Exception e) { throw new ServiceException(e.getMessage()); @@ -617,7 +627,9 @@ public class ActTaskServiceImpl implements IActTaskService { } runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.BACK.getStatus()); FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); - processHandler.handleProcess(processInstanceId, BusinessStatusEnum.BACK.getStatus()); + if (processHandler != null) { + processHandler.handleProcess(processInstanceId, BusinessStatusEnum.BACK.getStatus()); + } } catch (Exception e) { throw new ServiceException(e.getMessage()); } From 472dfc165dee7ef16cf4d7eb8a8e9b9b23063cc9 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Fri, 29 Dec 2023 23:42:29 +0800 Subject: [PATCH 116/159] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E5=AD=90?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E4=B8=AD=E8=AE=BE=E7=BD=AE=E5=8F=91=E8=B5=B7?= =?UTF-8?q?=E4=BA=BA=E5=8F=98=E9=87=8F=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/utils/WorkflowUtils.java | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) 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 index 0e59b5220..38a81dcc9 100644 --- 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 @@ -85,15 +85,29 @@ public class WorkflowUtils { } //解决设计器选择设置流程发起人设置变量有问题 Collection flowElements = bpmnModel.getMainProcess().getFlowElements(); - for (FlowElement flowElement : flowElements) { - if (flowElement instanceof UserTask && INITIATOR_SET.equals(((UserTask) flowElement).getAssignee())) { - ((UserTask) flowElement).setAssignee(INITIATOR_SET_UPDATE); - } - } + repairInitiatorVariable(flowElements); // 2.将bpmnModel转为xml return new BpmnXMLConverter().convertToXML(bpmnModel); } + /** + * 修复发起人节点变量错误问题 + * + * @param flowElements 节点 + */ + private static void repairInitiatorVariable(Collection flowElements) { + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof SubProcess) { + Collection subFlowElements = ((SubProcess) flowElement).getFlowElements(); + repairInitiatorVariable(subFlowElements); + } else { + if (flowElement instanceof UserTask && INITIATOR_SET.equals(((UserTask) flowElement).getAssignee())) { + ((UserTask) flowElement).setAssignee(INITIATOR_SET_UPDATE); + } + } + } + } + /** * xml转为bpmnModel * @@ -153,8 +167,8 @@ public class WorkflowUtils { } FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement(); - if (!(targetFlowElement instanceof UserTask)) { - throw new ServerException(subtask ? "子流程开始节点后第一个节点必须是用户任务!" : "开始节点后第一个节点必须是用户任务!"); + if (!(targetFlowElement instanceof UserTask) && !subtask) { + throw new ServerException("开始节点后第一个节点必须是用户任务!"); } List endEventList = flowElements.stream().filter(EndEvent.class::isInstance).map(EndEvent.class::cast).collect(Collectors.toList()); From 763d5aa3d2620cb000de209d30e3475989f732e3 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Thu, 4 Jan 2024 21:03:17 +0800 Subject: [PATCH 117/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=8A=9E=E7=90=86=E4=BC=98=E5=8C=96=E6=92=A4=E9=94=80?= =?UTF-8?q?=EF=BC=8C=E9=A9=B3=E5=9B=9E=EF=BC=8C=E8=8D=89=E7=A8=BF=E7=AD=89?= =?UTF-8?q?=E5=8A=A8=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ActTaskController.java | 2 +- .../strategy/FlowProcessEventHandler.java | 2 +- .../service/impl/ActTaskServiceImpl.java | 57 ++++++++----------- .../dromara/workflow/utils/WorkflowUtils.java | 13 ++++- 4 files changed, 37 insertions(+), 37 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java index 0ceadddc6..6fd8f10f5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java @@ -209,7 +209,7 @@ public class ActTaskController extends BaseController { */ @GetMapping("/getBusinessStatus/{taskId}") public R getBusinessStatus(@PathVariable String taskId) { - return R.ok("操作成功", WorkflowUtils.getBusinessStatus(taskId)); + return R.ok("操作成功", WorkflowUtils.getBusinessStatusByTaskId(taskId)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowProcessEventHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowProcessEventHandler.java index a9ce28e57..a9015d122 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowProcessEventHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowProcessEventHandler.java @@ -10,7 +10,7 @@ package org.dromara.workflow.flowable.strategy; public interface FlowProcessEventHandler { /** - * 执行办理任务监听 + * 执行办理任务监听 当状态为草稿,驳回,撤销时说明流程为申请人节点提交办理 * * @param processInstanceId 流程实例id * @param status 状态 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index e35fcfad5..91bacba67 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -77,8 +77,7 @@ public class ActTaskServiceImpl implements IActTaskService { throw new ServiceException("启动工作流时必须包含业务ID"); } // 判断当前业务是否启动过流程 - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceBusinessKey(startProcessBo.getBusinessKey()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey(startProcessBo.getBusinessKey()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); if (ObjectUtil.isNotEmpty(historicProcessInstance)) { BusinessStatusEnum.checkStartStatus(historicProcessInstance.getBusinessStatus()); } @@ -130,8 +129,7 @@ public class ActTaskServiceImpl implements IActTaskService { List roles = LoginHelper.getLoginUser().getRoles(); String userId = String.valueOf(LoginHelper.getUserId()); TaskQuery taskQuery = taskService.createTaskQuery(); - taskQuery.taskId(completeTaskBo.getTaskId()) - .taskTenantId(TenantHelper.getTenantId()).taskCandidateOrAssigned(userId); + taskQuery.taskId(completeTaskBo.getTaskId()).taskTenantId(TenantHelper.getTenantId()).taskCandidateOrAssigned(userId); if (CollUtil.isNotEmpty(roles)) { List groupIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId())); taskQuery.taskCandidateGroupIn(groupIds); @@ -166,11 +164,18 @@ public class ActTaskServiceImpl implements IActTaskService { } else { taskService.complete(completeTaskBo.getTaskId()); } + FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); + + String businessStatus = WorkflowUtils.getBusinessStatus(task.getProcessInstanceId()); + if (BusinessStatusEnum.DRAFT.getStatus().equals(businessStatus) || BusinessStatusEnum.BACK.getStatus().equals(businessStatus) || BusinessStatusEnum.CANCEL.getStatus().equals(businessStatus)) { + if (processHandler != null) { + processHandler.handleProcess(processInstance.getId(), businessStatus); + } + } List list = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(task.getProcessInstanceId()).list(); if (CollUtil.isEmpty(list)) { UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); managementService.executeCommand(updateBusinessStatusCmd); - FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); if (processHandler != null) { processHandler.handleProcess(processInstance.getId(), BusinessStatusEnum.FINISH.getStatus()); } @@ -297,8 +302,7 @@ public class ActTaskServiceImpl implements IActTaskService { @Override public TableDataInfo getTaskFinishByPage(TaskBo taskBo) { String userId = String.valueOf(LoginHelper.getUserId()); - HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery() - .taskAssignee(userId).taskTenantId(TenantHelper.getTenantId()).finished().orderByHistoricTaskInstanceStartTime().desc(); + HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery().taskAssignee(userId).taskTenantId(TenantHelper.getTenantId()).finished().orderByHistoricTaskInstanceStartTime().desc(); if (StringUtils.isNotBlank(taskBo.getName())) { query.taskNameLike("%" + taskBo.getName() + "%"); } @@ -339,8 +343,7 @@ public class ActTaskServiceImpl implements IActTaskService { */ @Override public TableDataInfo getAllTaskFinishByPage(TaskBo taskBo) { - HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery() - .taskTenantId(TenantHelper.getTenantId()).finished().orderByHistoricTaskInstanceStartTime().desc(); + HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery().taskTenantId(TenantHelper.getTenantId()).finished().orderByHistoricTaskInstanceStartTime().desc(); if (StringUtils.isNotBlank(taskBo.getName())) { query.taskNameLike("%" + taskBo.getName() + "%"); } @@ -382,9 +385,7 @@ public class ActTaskServiceImpl implements IActTaskService { @Override @Transactional(rollbackFor = Exception.class) public boolean delegateTask(DelegateBo delegateBo) { - TaskEntity task = (TaskEntity) taskService.createTaskQuery() - .taskTenantId(TenantHelper.getTenantId()).taskId(delegateBo.getTaskId()) - .taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); + TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).taskId(delegateBo.getTaskId()).taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); if (ObjectUtil.isEmpty(task)) { throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); } @@ -413,8 +414,7 @@ public class ActTaskServiceImpl implements IActTaskService { @Override @Transactional(rollbackFor = Exception.class) public boolean terminationTask(TerminationBo terminationBo) { - Task task = taskService.createTaskQuery() - .taskTenantId(TenantHelper.getTenantId()).taskId(terminationBo.getTaskId()).singleResult(); + Task task = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).taskId(terminationBo.getTaskId()).singleResult(); if (ObjectUtil.isEmpty(task)) { throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); @@ -422,8 +422,7 @@ public class ActTaskServiceImpl implements IActTaskService { if (task.isSuspended()) { throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); } - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceBusinessKey(task.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey(task.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); if (ObjectUtil.isNotEmpty(historicProcessInstance)) { BusinessStatusEnum.checkStatus(historicProcessInstance.getBusinessStatus()); } @@ -434,8 +433,7 @@ public class ActTaskServiceImpl implements IActTaskService { terminationBo.setComment(LoginHelper.getLoginUser().getNickname() + "终止了申请:" + terminationBo.getComment()); } taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.TERMINATION.getStatus(), terminationBo.getComment()); - List list = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()) - .processInstanceId(task.getProcessInstanceId()).list(); + List list = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(task.getProcessInstanceId()).list(); if (CollectionUtil.isNotEmpty(list)) { List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); if (CollectionUtil.isNotEmpty(subTasks)) { @@ -461,8 +459,7 @@ public class ActTaskServiceImpl implements IActTaskService { */ @Override public boolean transferTask(TransmitBo transmitBo) { - Task task = taskService.createTaskQuery().taskId(transmitBo.getTaskId()).taskTenantId(TenantHelper.getTenantId()) - .taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); + Task task = taskService.createTaskQuery().taskId(transmitBo.getTaskId()).taskTenantId(TenantHelper.getTenantId()).taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); if (ObjectUtil.isEmpty(task)) { throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); } @@ -471,8 +468,7 @@ public class ActTaskServiceImpl implements IActTaskService { } try { TaskEntity newTask = WorkflowUtils.createNewTask(task); - taskService.addComment(newTask.getId(), task.getProcessInstanceId(), TaskStatusEnum.TRANSFER.getStatus(), - StringUtils.isNotBlank(transmitBo.getComment()) ? transmitBo.getComment() : LoginHelper.getUsername() + "转办了任务"); + taskService.addComment(newTask.getId(), task.getProcessInstanceId(), TaskStatusEnum.TRANSFER.getStatus(), StringUtils.isNotBlank(transmitBo.getComment()) ? transmitBo.getComment() : LoginHelper.getUsername() + "转办了任务"); taskService.complete(newTask.getId()); taskService.setAssignee(task.getId(), transmitBo.getUserId()); return true; @@ -489,8 +485,7 @@ public class ActTaskServiceImpl implements IActTaskService { */ @Override public boolean addMultiInstanceExecution(AddMultiBo addMultiBo) { - Task task = taskService.createTaskQuery().taskId(addMultiBo.getTaskId()).taskTenantId(TenantHelper.getTenantId()) - .taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); + Task task = taskService.createTaskQuery().taskId(addMultiBo.getTaskId()).taskTenantId(TenantHelper.getTenantId()).taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); if (ObjectUtil.isEmpty(task)) { throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); } @@ -533,8 +528,7 @@ public class ActTaskServiceImpl implements IActTaskService { */ @Override public boolean deleteMultiInstanceExecution(DeleteMultiBo deleteMultiBo) { - Task task = taskService.createTaskQuery().taskId(deleteMultiBo.getTaskId()).taskTenantId(TenantHelper.getTenantId()) - .taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); + Task task = taskService.createTaskQuery().taskId(deleteMultiBo.getTaskId()).taskTenantId(TenantHelper.getTenantId()).taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); if (ObjectUtil.isEmpty(task)) { throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); } @@ -580,8 +574,7 @@ public class ActTaskServiceImpl implements IActTaskService { @Override @Transactional(rollbackFor = Exception.class) public String backProcess(BackProcessBo backProcessBo) { - Task task = taskService.createTaskQuery().taskId(backProcessBo.getTaskId()).taskTenantId(TenantHelper.getTenantId()) - .taskAssignee(String.valueOf(LoginHelper.getUserId())).singleResult(); + Task task = taskService.createTaskQuery().taskId(backProcessBo.getTaskId()).taskTenantId(TenantHelper.getTenantId()).taskAssignee(String.valueOf(LoginHelper.getUserId())).singleResult(); if (ObjectUtil.isEmpty(task)) { throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); } @@ -604,14 +597,10 @@ public class ActTaskServiceImpl implements IActTaskService { taskService.addComment(task.getId(), processInstanceId, TaskStatusEnum.BACK.getStatus(), StringUtils.isNotBlank(backProcessBo.getMessage()) ? backProcessBo.getMessage() : "退回"); if (taskList.size() > 1) { //当前多个任务驳回到单个节点 - runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId) - .moveActivityIdsToSingleActivityId(taskList.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList()), backTaskDefinitionKey) - .changeState(); + runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId).moveActivityIdsToSingleActivityId(taskList.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList()), backTaskDefinitionKey).changeState(); } else { //当前单个节点驳回单个节点 - runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId) - .moveActivityIdTo(task.getTaskDefinitionKey(), backTaskDefinitionKey) - .changeState(); + runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId).moveActivityIdTo(task.getTaskDefinitionKey(), backTaskDefinitionKey).changeState(); } List list = taskService.createTaskQuery().processInstanceId(processInstanceId).taskTenantId(TenantHelper.getTenantId()).list(); for (Task t : list) { 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 index 38a81dcc9..d73e852ff 100644 --- 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 @@ -297,13 +297,24 @@ public class WorkflowUtils { * * @param taskId 任务id */ - public static String getBusinessStatus(String taskId) { + public static String getBusinessStatusByTaskId(String taskId) { HistoricTaskInstance historicTaskInstance = PROCESS_ENGINE.getHistoryService().createHistoricTaskInstanceQuery().taskId(taskId).taskTenantId(TenantHelper.getTenantId()).singleResult(); HistoricProcessInstance historicProcessInstance = PROCESS_ENGINE.getHistoryService().createHistoricProcessInstanceQuery() .processInstanceId(historicTaskInstance.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); return historicProcessInstance.getBusinessStatus(); } + /** + * 获取当前流程状态 + * + * @param processInstanceId 流程实例id + */ + public static String getBusinessStatus(String processInstanceId) { + HistoricProcessInstance historicProcessInstance = PROCESS_ENGINE.getHistoryService().createHistoricProcessInstanceQuery() + .processInstanceId(processInstanceId).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); + return historicProcessInstance.getBusinessStatus(); + } + /** * 设置流程实例对象 * From ad73e4eeddfde421757283f1a54f79a92783e7a4 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Mon, 8 Jan 2024 20:34:20 +0800 Subject: [PATCH 118/159] =?UTF-8?q?update=20=E5=8A=9E=E7=90=86=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=89=A7=E8=A1=8C=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/ActTaskServiceImpl.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 91bacba67..84fd56111 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -150,6 +150,13 @@ public class ActTaskServiceImpl implements IActTaskService { taskService.complete(newTask.getId()); return true; } + FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); + String businessStatus = WorkflowUtils.getBusinessStatus(task.getProcessInstanceId()); + if (BusinessStatusEnum.DRAFT.getStatus().equals(businessStatus) || BusinessStatusEnum.BACK.getStatus().equals(businessStatus) || BusinessStatusEnum.CANCEL.getStatus().equals(businessStatus)) { + if (processHandler != null) { + processHandler.handleProcess(processInstance.getId(), businessStatus); + } + } runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.WAITING.getStatus()); String key = processInstance.getProcessDefinitionKey() + "_" + task.getTaskDefinitionKey(); FlowTaskEventHandler taskHandler = flowEventStrategy.getTaskHandler(key); @@ -164,14 +171,6 @@ public class ActTaskServiceImpl implements IActTaskService { } else { taskService.complete(completeTaskBo.getTaskId()); } - FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); - - String businessStatus = WorkflowUtils.getBusinessStatus(task.getProcessInstanceId()); - if (BusinessStatusEnum.DRAFT.getStatus().equals(businessStatus) || BusinessStatusEnum.BACK.getStatus().equals(businessStatus) || BusinessStatusEnum.CANCEL.getStatus().equals(businessStatus)) { - if (processHandler != null) { - processHandler.handleProcess(processInstance.getId(), businessStatus); - } - } List list = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(task.getProcessInstanceId()).list(); if (CollUtil.isEmpty(list)) { UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); From 5de71bcf1d3742171a7e8771e0481f641d5b954a Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Thu, 11 Jan 2024 21:16:03 +0800 Subject: [PATCH 119/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E9=80=89=E4=BA=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/WorkflowUserServiceImpl.java | 28 ++----------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java index 5fd0b34cc..8208203c3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java @@ -14,9 +14,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUserRole; -import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.mapper.SysDeptMapper; import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.mapper.SysUserRoleMapper; import org.dromara.workflow.domain.bo.SysUserMultiBo; @@ -34,8 +32,6 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; /** * 工作流用户选人管理 业务处理层 @@ -48,7 +44,6 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { private final SysUserMapper sysUserMapper; private final SysUserRoleMapper sysUserRoleMapper; - private final SysDeptMapper sysDeptMapper; private final TaskService taskService; private final RuntimeService runtimeService; @@ -121,9 +116,7 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { taskVo.setName(task.getName()); taskVo.setAssignee(userId); if (CollectionUtil.isNotEmpty(sysUsers)) { - sysUsers.stream().filter(u -> u.getUserId().toString().equals(userId.toString())).findFirst().ifPresent(u -> { - taskVo.setAssigneeName(u.getNickName()); - }); + sysUsers.stream().filter(u -> u.getUserId().toString().equals(userId.toString())).findFirst().ifPresent(u -> taskVo.setAssigneeName(u.getNickName())); } taskListVo.add(taskVo); } @@ -144,9 +137,7 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { taskVo.setName(t.getName()); taskVo.setAssignee(Long.valueOf(t.getAssignee())); if (CollectionUtil.isNotEmpty(sysUsers)) { - sysUsers.stream().filter(u -> u.getUserId().toString().equals(t.getAssignee())).findFirst().ifPresent(e -> { - taskVo.setAssigneeName(e.getNickName()); - }); + sysUsers.stream().filter(u -> u.getUserId().toString().equals(t.getAssignee())).findFirst().ifPresent(e -> taskVo.setAssigneeName(e.getNickName())); } taskListVo.add(taskVo); } @@ -170,10 +161,6 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { if (CollUtil.isEmpty(collectDeptId)) { return page; } - List sysDeptList = sysDeptMapper.selectVoBatchIds(collectDeptId); - records.forEach(e -> { - sysDeptList.stream().filter(d -> d.getDeptId().equals(e.getDeptId())).findFirst().ifPresent(e::setDept); - }); page.setRecords(records); return page; } @@ -192,16 +179,7 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { // 检索条件 queryWrapper.eq(SysUser::getStatus, UserStatus.OK.getCode()); queryWrapper.in(SysUser::getUserId, userIds); - List sysUserVos = sysUserMapper.selectVoList(queryWrapper); - List collectDeptId = sysUserVos.stream().map(SysUserVo::getDeptId).filter(Objects::nonNull).collect(Collectors.toList()); - if (CollectionUtil.isEmpty(collectDeptId)) { - return sysUserVos; - } - List sysDeptList = sysDeptMapper.selectVoBatchIds(collectDeptId); - sysUserVos.forEach(e -> { - sysDeptList.stream().filter(d -> d.getDeptId().equals(e.getDeptId())).findFirst().ifPresent(e::setDept); - }); - return sysUserVos; + return sysUserMapper.selectVoList(queryWrapper); } /** From efc4f5cfbc1802d282261a563c94c2e651f90d06 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Mon, 15 Jan 2024 23:05:46 +0800 Subject: [PATCH 120/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E5=8A=9E=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flowable/strategy/FlowProcessEventHandler.java | 9 +++++---- .../flowable/strategy/FlowTaskEventHandler.java | 5 +++-- .../workflow/listener/TestCustomProcessHandler.java | 4 ++-- .../workflow/listener/TestCustomTaskHandler.java | 4 ++-- .../service/impl/ActProcessInstanceServiceImpl.java | 4 ++-- .../workflow/service/impl/ActTaskServiceImpl.java | 10 +++++----- 6 files changed, 19 insertions(+), 17 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowProcessEventHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowProcessEventHandler.java index a9015d122..4af2c4784 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowProcessEventHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowProcessEventHandler.java @@ -10,10 +10,11 @@ package org.dromara.workflow.flowable.strategy; public interface FlowProcessEventHandler { /** - * 执行办理任务监听 当状态为草稿,驳回,撤销时说明流程为申请人节点提交办理 + * 执行办理任务监听 * - * @param processInstanceId 流程实例id - * @param status 状态 + * @param businessKey 业务id + * @param status 状态 + * @param submit 当为true时为申请人节点办理 */ - void handleProcess(String processInstanceId, String status); + void handleProcess(String businessKey, String status, boolean submit); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowTaskEventHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowTaskEventHandler.java index 32ae62ba6..4cf9d8931 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowTaskEventHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowTaskEventHandler.java @@ -13,7 +13,8 @@ public interface FlowTaskEventHandler { /** * 执行办理任务监听 * - * @param task 任务 + * @param task 任务 + * @param businessKey 业务id */ - void handleTask(Task task); + void handleTask(Task task, String businessKey); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomProcessHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomProcessHandler.java index b24ecdf35..dbb32aef8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomProcessHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomProcessHandler.java @@ -18,7 +18,7 @@ public class TestCustomProcessHandler implements FlowProcessEventHandler { @Override - public void handleProcess(String processInstanceId, String status) { - log.info("流程实例ID:" + processInstanceId + ",状态:" + status); + public void handleProcess(String businessKey, String status, boolean submit) { + log.info("业务ID:" + businessKey + ",状态:" + status); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java index 0dd2d6f79..478328391 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java @@ -18,7 +18,7 @@ import org.springframework.stereotype.Component; public class TestCustomTaskHandler implements FlowTaskEventHandler { @Override - public void handleTask(Task task) { - log.info("任务名称:" + task.getName()); + public void handleTask(Task task, String businessKey) { + log.info("任务名称:" + task.getName() + ",业务ID:" + businessKey); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 53ee343b9..829dd9589 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -371,7 +371,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService runtimeService.deleteProcessInstance(processInvalidBo.getProcessInstanceId(), deleteReason); FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey()); if (processHandler != null) { - processHandler.handleProcess(historicProcessInstance.getId(), BusinessStatusEnum.INVALID.getStatus()); + processHandler.handleProcess(historicProcessInstance.getBusinessKey(), BusinessStatusEnum.INVALID.getStatus(), false); } return true; } catch (Exception e) { @@ -504,7 +504,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.CANCEL.getStatus()); FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); if (processHandler != null) { - processHandler.handleProcess(processInstanceId, BusinessStatusEnum.CANCEL.getStatus()); + processHandler.handleProcess(processInstance.getBusinessKey(), BusinessStatusEnum.CANCEL.getStatus(), false); } return true; } catch (Exception e) { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 84fd56111..5d85ed580 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -154,14 +154,14 @@ public class ActTaskServiceImpl implements IActTaskService { String businessStatus = WorkflowUtils.getBusinessStatus(task.getProcessInstanceId()); if (BusinessStatusEnum.DRAFT.getStatus().equals(businessStatus) || BusinessStatusEnum.BACK.getStatus().equals(businessStatus) || BusinessStatusEnum.CANCEL.getStatus().equals(businessStatus)) { if (processHandler != null) { - processHandler.handleProcess(processInstance.getId(), businessStatus); + processHandler.handleProcess(processInstance.getBusinessKey(), businessStatus, true); } } runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.WAITING.getStatus()); String key = processInstance.getProcessDefinitionKey() + "_" + task.getTaskDefinitionKey(); FlowTaskEventHandler taskHandler = flowEventStrategy.getTaskHandler(key); if (taskHandler != null) { - taskHandler.handleTask(task); + taskHandler.handleTask(task, processInstance.getBusinessKey()); } //办理意见 taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage()); @@ -176,7 +176,7 @@ public class ActTaskServiceImpl implements IActTaskService { UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); managementService.executeCommand(updateBusinessStatusCmd); if (processHandler != null) { - processHandler.handleProcess(processInstance.getId(), BusinessStatusEnum.FINISH.getStatus()); + processHandler.handleProcess(processInstance.getBusinessKey(), BusinessStatusEnum.FINISH.getStatus(), false); } } else { sendMessage(list, processInstance.getName(), completeTaskBo.getMessageType(), null); @@ -443,7 +443,7 @@ public class ActTaskServiceImpl implements IActTaskService { runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.TERMINATION.getStatus()); FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey()); if (processHandler != null) { - processHandler.handleProcess(historicProcessInstance.getId(), BusinessStatusEnum.TERMINATION.getStatus()); + processHandler.handleProcess(historicProcessInstance.getBusinessKey(), BusinessStatusEnum.TERMINATION.getStatus(), false); } return true; } catch (Exception e) { @@ -616,7 +616,7 @@ public class ActTaskServiceImpl implements IActTaskService { runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.BACK.getStatus()); FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); if (processHandler != null) { - processHandler.handleProcess(processInstanceId, BusinessStatusEnum.BACK.getStatus()); + processHandler.handleProcess(processInstance.getBusinessKey(), BusinessStatusEnum.BACK.getStatus(), false); } } catch (Exception e) { throw new ServiceException(e.getMessage()); From 3e44e16857acd95dd565640e15213fd8d01c7a38 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 18 Jan 2024 13:28:40 +0800 Subject: [PATCH 121/159] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=AE=A1=E6=89=B9=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ActProcessInstanceServiceImpl.java | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 829dd9589..358a3566f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -55,6 +55,7 @@ import java.util.List; import java.util.*; import java.util.stream.Collectors; + /** * 流程实例 服务层实现 * @@ -286,30 +287,32 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService BpmnModel bpmnModel = repositoryService.getBpmnModel(list.get(0).getProcessDefinitionId()); List graphicInfoVos = new ArrayList<>(); Collection flowElements = bpmnModel.getMainProcess().getFlowElements(); + //节点图形信息 + buildGraphicInfo(flowElements, graphicInfoVos, bpmnModel); + map.put("graphicInfoVos", graphicInfoVos); + return map; + } + + /** + * 构建节点图形信息 + * + * @param flowElements 节点 + */ + private static void buildGraphicInfo(Collection flowElements, List graphicInfoVos, BpmnModel bpmnModel) { for (FlowElement flowElement : flowElements) { - if (flowElement instanceof UserTask) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowElement.getId()); - GraphicInfoVo graphicInfoVo = BeanUtil.toBean(graphicInfo, GraphicInfoVo.class); - graphicInfoVo.setNodeId(flowElement.getId()); - graphicInfoVo.setNodeName(flowElement.getName()); - graphicInfoVos.add(graphicInfoVo); - } if (flowElement instanceof SubProcess) { Collection subFlowElements = ((SubProcess) flowElement).getFlowElements(); - for (FlowElement element : subFlowElements) { - if (element instanceof UserTask) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(element.getId()); - GraphicInfoVo graphicInfoVo = BeanUtil.toBean(graphicInfo, GraphicInfoVo.class); - graphicInfoVo.setNodeId(element.getId()); - graphicInfoVo.setNodeName(element.getName()); - graphicInfoVos.add(graphicInfoVo); - } + buildGraphicInfo(subFlowElements, graphicInfoVos, bpmnModel); + } else { + if (flowElement instanceof UserTask) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowElement.getId()); + GraphicInfoVo graphicInfoVo = BeanUtil.toBean(graphicInfo, GraphicInfoVo.class); + graphicInfoVo.setNodeId(flowElement.getId()); + graphicInfoVo.setNodeName(flowElement.getName()); + graphicInfoVos.add(graphicInfoVo); } } } - //节点图形信息 - map.put("graphicInfoVos", graphicInfoVos); - return map; } /** From 8b9af5358c8d1d432108a2f04e2ce9b41ad7325b Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 18 Jan 2024 18:04:18 +0800 Subject: [PATCH 122/159] =?UTF-8?q?remove=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E6=B3=A8=E9=87=8A=20=E6=B7=BB=E5=8A=A0=E9=9D=9E?= =?UTF-8?q?=E7=A9=BA=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/service/impl/ActModelServiceImpl.java | 3 +-- .../main/java/org/dromara/workflow/utils/WorkflowUtils.java | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) 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 1c0ea8c6b..290a0ebfe 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 @@ -238,7 +238,6 @@ public class ActModelServiceImpl implements IActModelService { }); model.setKey(key); repositoryService.saveModel(model); - // 解决设计器选择设置流程发起人设置变量有问题 JsonNode jsonNode = objectMapper.readTree(values.getFirst("json_xml")); // 校验流程标识 String processId = jsonNode.get("properties").get("process_id").textValue(); @@ -382,7 +381,7 @@ public class ActModelServiceImpl implements IActModelService { public ResultListDataRepresentation getUsers(String filter) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.like(org.dromara.common.core.utils.StringUtils.isNotBlank(filter), SysUser::getNickName, filter); + wrapper.like(StringUtils.isNotBlank(filter), SysUser::getNickName, filter); List sysUsers = sysUserMapper.selectList(wrapper); List userRepresentations = new ArrayList<>(); for (SysUser sysUser : sysUsers) { 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 index d73e852ff..3cd72eb75 100644 --- 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 @@ -322,6 +322,9 @@ public class WorkflowUtils { * @param businessKey 业务id */ public static void setProcessInstanceVo(Object obj, String businessKey) { + if (StringUtils.isBlank(businessKey)) { + return; + } ActHiProcinst actHiProcinst = I_ACT_HI_PROCINST_SERVICE.selectByBusinessKey(businessKey); if (actHiProcinst == null) { ProcessInstanceVo processInstanceVo = new ProcessInstanceVo(); From c5742cff79bc718ffb29ec508b6ab5384c840763 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 21 Jan 2024 21:04:30 +0800 Subject: [PATCH 123/159] =?UTF-8?q?add=20=E5=B7=A5=E4=BD=9C=E6=B5=81?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WorkflowUserController.java | 18 ++++++++++++++---- .../service/IWorkflowUserService.java | 11 +++++++++++ .../service/impl/WorkflowUserServiceImpl.java | 19 +++++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java index 36430ecab..78f808fca 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java @@ -2,17 +2,16 @@ package org.dromara.workflow.controller; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.workflow.domain.bo.SysUserMultiBo; import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.service.IWorkflowUserService; 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 org.springframework.web.bind.annotation.*; import java.util.List; @@ -59,4 +58,15 @@ public class WorkflowUserController extends BaseController { public R> getUserListByIds(@PathVariable List userIds) { return R.ok(workflowUserService.getUserListByIds(userIds)); } + + /** + * 分页查询用户 + * + * @param sysUserBo 参数 + * @param pageQuery 分页 + */ + @GetMapping("/getUserListByPage") + public TableDataInfo getUserListByPage(SysUserBo sysUserBo, PageQuery pageQuery) { + return workflowUserService.getUserListByPage(sysUserBo, pageQuery); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java index d167163b8..3c915727a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java @@ -1,7 +1,9 @@ package org.dromara.workflow.service; +import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.workflow.domain.bo.SysUserMultiBo; import org.dromara.workflow.domain.vo.TaskVo; @@ -46,4 +48,13 @@ public interface IWorkflowUserService { * @return 结果 */ List getUserRoleListByRoleIds(List roleIds); + + /** + * 分页查询用户 + * + * @param sysUserBo 参数 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo getUserListByPage(SysUserBo sysUserBo, PageQuery pageQuery); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java index 8208203c3..647e6d4d7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java @@ -10,10 +10,12 @@ import org.dromara.common.core.enums.UserStatus; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.mapper.SysUserRoleMapper; @@ -191,4 +193,21 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { public List getUserRoleListByRoleIds(List roleIds) { return sysUserRoleMapper.selectList(new LambdaQueryWrapper().in(SysUserRole::getRoleId, roleIds)); } + + /** + * 分页查询用户 + * + * @param sysUserBo 参数 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo getUserListByPage(SysUserBo sysUserBo, PageQuery pageQuery) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(sysUserBo.getDeptId() != null, SysUser::getDeptId, sysUserBo.getDeptId()); + queryWrapper.eq(SysUser::getStatus, UserStatus.OK.getCode()); + queryWrapper.like(StringUtils.isNotEmpty(sysUserBo.getUserName()), SysUser::getUserName, sysUserBo.getUserName()); + queryWrapper.like(StringUtils.isNotEmpty(sysUserBo.getNickName()), SysUser::getNickName, sysUserBo.getNickName()); + Page userPage = sysUserMapper.selectVoPage(pageQuery.build(), queryWrapper); + return TableDataInfo.build(recordPage(userPage)); + } } From b4110ab2e2ff11c629d5d0064524480c7504172e Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Wed, 24 Jan 2024 21:40:27 +0800 Subject: [PATCH 124/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8A=9E=E7=90=86=E5=BC=82=E6=AD=A5=E6=97=B6=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E7=8A=B6=E6=80=81=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/service/impl/ActTaskServiceImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 5d85ed580..307676024 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -171,14 +171,16 @@ public class ActTaskServiceImpl implements IActTaskService { } else { taskService.complete(completeTaskBo.getTaskId()); } - List list = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(task.getProcessInstanceId()).list(); - if (CollUtil.isEmpty(list)) { + ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()) + .processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); + if (pi == null) { UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); managementService.executeCommand(updateBusinessStatusCmd); if (processHandler != null) { processHandler.handleProcess(processInstance.getBusinessKey(), BusinessStatusEnum.FINISH.getStatus(), false); } } else { + List list = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(task.getProcessInstanceId()).list(); sendMessage(list, processInstance.getName(), completeTaskBo.getMessageType(), null); } return true; From 82fb71391b323ddac6cd9f7221853b7cf3127753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sat, 27 Jan 2024 00:51:50 +0800 Subject: [PATCH 125/159] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=20=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E3=80=81=E9=83=A8=E9=97=A8=E3=80=81=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E3=80=81=E5=B2=97=E4=BD=8D=20=E4=B8=8B=E6=8B=89=E9=80=89?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=B8=8E=E4=BB=A3=E7=A0=81=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/system/SysDeptController.java | 14 +- .../controller/system/SysPostController.java | 15 +- .../controller/system/SysRoleController.java | 6 +- .../controller/system/SysUserController.java | 14 +- .../system/service/ISysDeptService.java | 8 + .../system/service/ISysPostService.java | 8 + .../system/service/ISysRoleService.java | 8 + .../system/service/ISysUserService.java | 9 ++ .../service/impl/SysDeptServiceImpl.java | 10 +- .../service/impl/SysPostServiceImpl.java | 18 ++- .../service/impl/SysRoleServiceImpl.java | 14 ++ .../service/impl/SysUserServiceImpl.java | 151 ++++++++++++------ 12 files changed, 214 insertions(+), 61 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java index 130c0d1f3..70463bd66 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java @@ -2,6 +2,7 @@ package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.convert.Convert; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.StringUtils; @@ -11,7 +12,6 @@ import org.dromara.common.web.core.BaseController; import org.dromara.system.domain.bo.SysDeptBo; import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.service.ISysDeptService; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -120,4 +120,16 @@ public class SysDeptController extends BaseController { deptService.checkDeptDataScope(deptId); return toAjax(deptService.deleteDeptById(deptId)); } + + /** + * 获取部门选择框列表 + * + * @param deptIds 部门ID串 + */ + @SaCheckPermission("system:dept:query") + @GetMapping("/optionselect") + public R> optionselect(@RequestParam(required = false) Long[] deptIds) { + return R.ok(deptService.selectDeptByIds(List.of(deptIds))); + } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java index fe62fdbbc..3221a4abc 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java @@ -1,6 +1,8 @@ package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.domain.R; import org.dromara.common.excel.utils.ExcelUtil; @@ -12,8 +14,6 @@ import org.dromara.common.web.core.BaseController; import org.dromara.system.domain.bo.SysPostBo; import org.dromara.system.domain.vo.SysPostVo; import org.dromara.system.service.ISysPostService; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -110,12 +110,13 @@ public class SysPostController extends BaseController { /** * 获取岗位选择框列表 + * + * @param postIds 岗位ID串 */ + @SaCheckPermission("system:dept:query") @GetMapping("/optionselect") - public R> optionselect() { - SysPostBo postBo = new SysPostBo(); - postBo.setStatus(UserConstants.POST_NORMAL); - List posts = postService.selectPostList(postBo); - return R.ok(posts); + public R> optionselect(@RequestParam(required = false) Long[] postIds) { + return R.ok(postService.selectPostByIds(List.of(postIds))); } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java index 3a9418b23..9d7fb301c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java @@ -149,11 +149,13 @@ public class SysRoleController extends BaseController { /** * 获取角色选择框列表 + * + * @param roleIds 角色ID串 */ @SaCheckPermission("system:role:query") @GetMapping("/optionselect") - public R> optionselect() { - return R.ok(roleService.selectRoleAll()); + public R> optionselect(@RequestParam(required = false) Long[] roleIds) { + return R.ok(roleService.selectRoleByIds(List.of(roleIds))); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java index 9ab25e71e..78688c6f5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -11,7 +11,6 @@ import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.encrypt.annotation.ApiEncrypt; @@ -206,6 +205,19 @@ public class SysUserController extends BaseController { return toAjax(userService.deleteUserByIds(userIds)); } + /** + * 根据用户ID串批量获取用户基础信息 + * + * @param userIds 用户ID串 + * @param deptId 部门ID + */ + @SaCheckPermission("system:user:query") + @GetMapping("/optionselect") + public R> optionselect(@RequestParam(required = false) Long[] userIds, + @RequestParam(required = false) Long deptId) { + return R.ok(userService.selectUserByIds(List.of(userIds), deptId)); + } + /** * 重置密码 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java index b20938187..bf16642fe 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java @@ -52,6 +52,14 @@ public interface ISysDeptService { */ SysDeptVo selectDeptById(Long deptId); + /** + * 通过部门ID串查询部门 + * + * @param deptIds 部门id串 + * @return 部门列表信息 + */ + List selectDeptByIds(List deptIds); + /** * 根据ID查询所有子部门数(正常状态) * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java index c6409c862..c43f0395c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java @@ -48,6 +48,14 @@ public interface ISysPostService { */ List selectPostListByUserId(Long userId); + /** + * 通过岗位ID串查询岗位 + * + * @param postIds 岗位id串 + * @return 岗位列表信息 + */ + List selectPostByIds(List postIds); + /** * 校验岗位名称 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java index f98a56733..64740aeff 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java @@ -74,6 +74,14 @@ public interface ISysRoleService { */ SysRoleVo selectRoleById(Long roleId); + /** + * 通过角色ID串查询角色 + * + * @param roleIds 角色ID串 + * @return 角色列表信息 + */ + List selectRoleByIds(List roleIds); + /** * 校验角色名称是否唯一 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java index a5a28cbec..74e1231f3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java @@ -66,6 +66,15 @@ public interface ISysUserService { */ SysUserVo selectUserById(Long userId); + /** + * 通过用户ID串查询用户 + * + * @param userIds 用户ID串 + * @param deptId 部门id + * @return 用户列表信息 + */ + List selectUserByIds(List userIds, Long deptId); + /** * 根据用户ID查询用户所属角色组 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 6525c487a..86edf59d4 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.exception.ServiceException; @@ -27,7 +28,6 @@ import org.dromara.system.mapper.SysDeptMapper; import org.dromara.system.mapper.SysRoleMapper; import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.service.ISysDeptService; -import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @@ -139,6 +139,14 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { return dept; } + @Override + public List selectDeptByIds(List deptIds) { + return baseMapper.selectDeptList(new LambdaQueryWrapper() + .select(SysDept::getDeptId, SysDept::getDeptName, SysDept::getLeader) + .eq(SysDept::getStatus, UserConstants.DEPT_NORMAL) + .in(CollUtil.isNotEmpty(deptIds), SysDept::getDeptId, deptIds)); + } + /** * 通过部门ID查询部门名称 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java index 9e2912dc1..33b98af59 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -1,10 +1,13 @@ package org.dromara.system.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; @@ -18,7 +21,6 @@ import org.dromara.system.domain.vo.SysPostVo; import org.dromara.system.mapper.SysPostMapper; import org.dromara.system.mapper.SysUserPostMapper; import org.dromara.system.service.ISysPostService; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.Arrays; @@ -97,6 +99,20 @@ public class SysPostServiceImpl implements ISysPostService { return StreamUtils.toList(list, SysPostVo::getPostId); } + /** + * 通过岗位ID串查询岗位 + * + * @param postIds 岗位id串 + * @return 岗位列表信息 + */ + @Override + public List selectPostByIds(List postIds) { + return baseMapper.selectVoList(new LambdaQueryWrapper() + .select(SysPost::getPostId, SysPost::getPostName, SysPost::getPostCode) + .eq(SysPost::getStatus, UserConstants.POST_NORMAL) + .in(CollUtil.isNotEmpty(postIds), SysPost::getPostId, postIds)); + } + /** * 校验岗位名称是否唯一 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java index 191dc98dd..f8935aaf2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java @@ -166,6 +166,20 @@ public class SysRoleServiceImpl implements ISysRoleService { return baseMapper.selectRoleById(roleId); } + /** + * 通过角色ID串查询角色 + * + * @param roleIds 角色ID串 + * @return 角色列表信息 + */ + @Override + public List selectRoleByIds(List roleIds) { + return baseMapper.selectRoleList(new LambdaQueryWrapper() + .select(SysRole::getRoleId, SysRole::getRoleName, SysRole::getRoleKey) + .eq(SysRole::getStatus, UserConstants.ROLE_NORMAL) + .in(CollUtil.isNotEmpty(roleIds), SysRole::getRoleId, roleIds)); + } + /** * 校验角色名称是否唯一 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 5dcd683e5..d3a9a0dac 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -78,20 +78,20 @@ public class SysUserServiceImpl implements ISysUserService, UserService { Map params = user.getParams(); QueryWrapper wrapper = Wrappers.query(); wrapper.eq("u.del_flag", UserConstants.USER_NORMAL) - .eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId()) - .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) - .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) - .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) - .between(params.get("beginTime") != null && params.get("endTime") != null, - "u.create_time", params.get("beginTime"), params.get("endTime")) - .and(ObjectUtil.isNotNull(user.getDeptId()), w -> { - List deptList = deptMapper.selectList(new LambdaQueryWrapper() - .select(SysDept::getDeptId) - .apply(DataBaseHelper.findInSet(user.getDeptId(), "ancestors"))); - List ids = StreamUtils.toList(deptList, SysDept::getDeptId); - ids.add(user.getDeptId()); - w.in("u.dept_id", ids); - }).orderByAsc("u.user_id"); + .eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId()) + .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) + .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) + .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + "u.create_time", params.get("beginTime"), params.get("endTime")) + .and(ObjectUtil.isNotNull(user.getDeptId()), w -> { + List deptList = deptMapper.selectList(new LambdaQueryWrapper() + .select(SysDept::getDeptId) + .apply(DataBaseHelper.findInSet(user.getDeptId(), "ancestors"))); + List ids = StreamUtils.toList(deptList, SysDept::getDeptId); + ids.add(user.getDeptId()); + w.in("u.dept_id", ids); + }).orderByAsc("u.user_id"); return wrapper; } @@ -105,11 +105,11 @@ public class SysUserServiceImpl implements ISysUserService, UserService { public TableDataInfo selectAllocatedList(SysUserBo user, PageQuery pageQuery) { QueryWrapper wrapper = Wrappers.query(); wrapper.eq("u.del_flag", UserConstants.USER_NORMAL) - .eq(ObjectUtil.isNotNull(user.getRoleId()), "r.role_id", user.getRoleId()) - .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) - .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) - .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) - .orderByAsc("u.user_id"); + .eq(ObjectUtil.isNotNull(user.getRoleId()), "r.role_id", user.getRoleId()) + .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) + .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) + .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) + .orderByAsc("u.user_id"); Page page = baseMapper.selectAllocatedList(pageQuery.build(), wrapper); return TableDataInfo.build(page); } @@ -125,11 +125,11 @@ public class SysUserServiceImpl implements ISysUserService, UserService { List userIds = userRoleMapper.selectUserIdsByRoleId(user.getRoleId()); QueryWrapper wrapper = Wrappers.query(); wrapper.eq("u.del_flag", UserConstants.USER_NORMAL) - .and(w -> w.ne("r.role_id", user.getRoleId()).or().isNull("r.role_id")) - .notIn(CollUtil.isNotEmpty(userIds), "u.user_id", userIds) - .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) - .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) - .orderByAsc("u.user_id"); + .and(w -> w.ne("r.role_id", user.getRoleId()).or().isNull("r.role_id")) + .notIn(CollUtil.isNotEmpty(userIds), "u.user_id", userIds) + .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) + .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) + .orderByAsc("u.user_id"); Page page = baseMapper.selectUnallocatedList(pageQuery.build(), wrapper); return TableDataInfo.build(page); } @@ -172,6 +172,22 @@ public class SysUserServiceImpl implements ISysUserService, UserService { return user; } + /** + * 通过用户ID串查询用户 + * + * @param userIds 用户ID串 + * @param deptId 部门id + * @return 用户列表信息 + */ + @Override + public List selectUserByIds(List userIds, Long deptId) { + return baseMapper.selectVoList(new LambdaQueryWrapper() + .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName) + .eq(SysUser::getStatus, UserConstants.USER_NORMAL) + .eq(ObjectUtil.isNotNull(deptId), SysUser::getDeptId, deptId) + .in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds)); + } + /** * 查询用户所属角色组 * @@ -211,8 +227,8 @@ public class SysUserServiceImpl implements ISysUserService, UserService { @Override public boolean checkUserNameUnique(SysUserBo user) { boolean exist = baseMapper.exists(new LambdaQueryWrapper() - .eq(SysUser::getUserName, user.getUserName()) - .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); + .eq(SysUser::getUserName, user.getUserName()) + .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); return !exist; } @@ -224,8 +240,8 @@ public class SysUserServiceImpl implements ISysUserService, UserService { @Override public boolean checkPhoneUnique(SysUserBo user) { boolean exist = baseMapper.exists(new LambdaQueryWrapper() - .eq(SysUser::getPhonenumber, user.getPhonenumber()) - .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); + .eq(SysUser::getPhonenumber, user.getPhonenumber()) + .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); return !exist; } @@ -237,8 +253,8 @@ public class SysUserServiceImpl implements ISysUserService, UserService { @Override public boolean checkEmailUnique(SysUserBo user) { boolean exist = baseMapper.exists(new LambdaQueryWrapper() - .eq(SysUser::getEmail, user.getEmail()) - .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); + .eq(SysUser::getEmail, user.getEmail()) + .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); return !exist; } @@ -351,9 +367,9 @@ public class SysUserServiceImpl implements ISysUserService, UserService { @Override public int updateUserStatus(Long userId, String status) { return baseMapper.update(null, - new LambdaUpdateWrapper() - .set(SysUser::getStatus, status) - .eq(SysUser::getUserId, userId)); + new LambdaUpdateWrapper() + .set(SysUser::getStatus, status) + .eq(SysUser::getUserId, userId)); } /** @@ -365,12 +381,12 @@ public class SysUserServiceImpl implements ISysUserService, UserService { @Override public int updateUserProfile(SysUserBo user) { return baseMapper.update(null, - new LambdaUpdateWrapper() - .set(ObjectUtil.isNotNull(user.getNickName()), SysUser::getNickName, user.getNickName()) - .set(SysUser::getPhonenumber, user.getPhonenumber()) - .set(SysUser::getEmail, user.getEmail()) - .set(SysUser::getSex, user.getSex()) - .eq(SysUser::getUserId, user.getUserId())); + new LambdaUpdateWrapper() + .set(ObjectUtil.isNotNull(user.getNickName()), SysUser::getNickName, user.getNickName()) + .set(SysUser::getPhonenumber, user.getPhonenumber()) + .set(SysUser::getEmail, user.getEmail()) + .set(SysUser::getSex, user.getSex()) + .eq(SysUser::getUserId, user.getUserId())); } /** @@ -383,9 +399,9 @@ public class SysUserServiceImpl implements ISysUserService, UserService { @Override public boolean updateUserAvatar(Long userId, Long avatar) { return baseMapper.update(null, - new LambdaUpdateWrapper() - .set(SysUser::getAvatar, avatar) - .eq(SysUser::getUserId, userId)) > 0; + new LambdaUpdateWrapper() + .set(SysUser::getAvatar, avatar) + .eq(SysUser::getUserId, userId)) > 0; } /** @@ -398,9 +414,9 @@ public class SysUserServiceImpl implements ISysUserService, UserService { @Override public int resetUserPwd(Long userId, String password) { return baseMapper.update(null, - new LambdaUpdateWrapper() - .set(SysUser::getPassword, password) - .eq(SysUser::getUserId, userId)); + new LambdaUpdateWrapper() + .set(SysUser::getPassword, password) + .eq(SysUser::getUserId, userId)); } /** @@ -524,8 +540,8 @@ public class SysUserServiceImpl implements ISysUserService, UserService { /** * 通过部门id查询当前部门所有用户 * - * @param deptId - * @return + * @param deptId 部门ID + * @return 用户信息集合信息 */ @Override public List selectUserListByDept(Long deptId) { @@ -535,14 +551,26 @@ public class SysUserServiceImpl implements ISysUserService, UserService { return baseMapper.selectVoList(lqw); } + /** + * 通过用户ID查询用户账户 + * + * @param userId 用户ID + * @return 用户账户 + */ @Cacheable(cacheNames = CacheNames.SYS_USER_NAME, key = "#userId") @Override public String selectUserNameById(Long userId) { SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper() - .select(SysUser::getUserName).eq(SysUser::getUserId, userId)); + .select(SysUser::getUserName).eq(SysUser::getUserId, userId)); return ObjectUtil.isNull(sysUser) ? null : sysUser.getUserName(); } + /** + * 通过用户ID查询用户账户 + * + * @param userId 用户ID + * @return 用户账户 + */ @Override @Cacheable(cacheNames = CacheNames.SYS_NICKNAME, key = "#userId") public String selectNicknameById(Long userId) { @@ -550,4 +578,31 @@ public class SysUserServiceImpl implements ISysUserService, UserService { .select(SysUser::getNickName).eq(SysUser::getUserId, userId)); return ObjectUtil.isNull(sysUser) ? null : sysUser.getNickName(); } + + /** + * 通过用户ID查询用户手机号 + * + * @param userId 用户id + * @return 用户手机号 + */ + @Override + public String selectPhonenumberById(Long userId) { + SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysUser::getPhonenumber).eq(SysUser::getUserId, userId)); + return ObjectUtil.isNull(sysUser) ? null : sysUser.getPhonenumber(); + } + + /** + * 通过用户ID查询用户邮箱 + * + * @param userId 用户id + * @return 用户邮箱 + */ + @Override + public String selectEmailById(Long userId) { + SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysUser::getEmail).eq(SysUser::getUserId, userId)); + return ObjectUtil.isNull(sysUser) ? null : sysUser.getEmail(); + } + } From 3ce110f904c0176564605e1934d7b02388acf5c2 Mon Sep 17 00:00:00 2001 From: LiuHao Date: Sat, 27 Jan 2024 16:16:13 +0800 Subject: [PATCH 126/159] =?UTF-8?q?update=20=E4=BF=AE=E5=A4=8D=E5=91=BD?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/system/controller/system/SysUserController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java index 78688c6f5..4783125a5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -212,8 +212,8 @@ public class SysUserController extends BaseController { * @param deptId 部门ID */ @SaCheckPermission("system:user:query") - @GetMapping("/optionselect") - public R> optionselect(@RequestParam(required = false) Long[] userIds, + @GetMapping("/optionSelect") + public R> optionSelect(@RequestParam(required = false) Long[] userIds, @RequestParam(required = false) Long deptId) { return R.ok(userService.selectUserByIds(List.of(userIds), deptId)); } From a8a9c060ea26c03045d4bd1c010f9bf25680b268 Mon Sep 17 00:00:00 2001 From: LiuHao Date: Sat, 27 Jan 2024 16:20:35 +0800 Subject: [PATCH 127/159] =?UTF-8?q?reset=20=E8=BF=98=E5=8E=9F=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/system/controller/system/SysUserController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java index 4783125a5..9b856bf60 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -212,8 +212,8 @@ public class SysUserController extends BaseController { * @param deptId 部门ID */ @SaCheckPermission("system:user:query") - @GetMapping("/optionSelect") - public R> optionSelect(@RequestParam(required = false) Long[] userIds, + @GetMapping("/optionselect") + public R> optioselect(@RequestParam(required = false) Long[] userIds, @RequestParam(required = false) Long deptId) { return R.ok(userService.selectUserByIds(List.of(userIds), deptId)); } From c561c0c00c4cc3cad5337ddb856ff38bae7becc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sun, 28 Jan 2024 23:15:37 +0800 Subject: [PATCH 128/159] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E8=A7=82=E6=B5=8B=E7=94=A8=E6=97=A5=E5=BF=97=E8=AE=B0?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../redis/manager/CaffeineCacheDecorator.java | 15 ++++++----- .../satoken/core/dao/PlusSaTokenDao.java | 2 -- .../service/impl/SysUserServiceImpl.java | 26 ------------------- 3 files changed, 8 insertions(+), 35 deletions(-) diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java index 1d02efda7..7d3ab4266 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java @@ -32,17 +32,19 @@ public class CaffeineCacheDecorator implements Cache { return cache.getNativeCache(); } + public String getUniqueKey(Object key) { + return cache.getName() + ":" + key; + } + @Override public ValueWrapper get(Object key) { - Object o = CAFFEINE.get(key, k -> cache.get(key)); - Console.log("redisson caffeine -> key: " + key + ",value:" + o); + Object o = CAFFEINE.get(getUniqueKey(key), k -> cache.get(key)); return (ValueWrapper) o; } @SuppressWarnings("unchecked") public T get(Object key, Class type) { - Object o = CAFFEINE.get(key, k -> cache.get(key, type)); - Console.log("redisson caffeine -> key: " + key + ",value:" + o); + Object o = CAFFEINE.get(getUniqueKey(key), k -> cache.get(key, type)); return (T) o; } @@ -63,7 +65,7 @@ public class CaffeineCacheDecorator implements Cache { public boolean evictIfPresent(Object key) { boolean b = cache.evictIfPresent(key); if (b) { - CAFFEINE.invalidate(key); + CAFFEINE.invalidate(getUniqueKey(key)); } return b; } @@ -80,8 +82,7 @@ public class CaffeineCacheDecorator implements Cache { @SuppressWarnings("unchecked") @Override public T get(Object key, Callable valueLoader) { - Object o = CAFFEINE.get(key, k -> cache.get(key, valueLoader)); - Console.log("redisson caffeine -> key: " + key + ",value:" + o); + Object o = CAFFEINE.get(getUniqueKey(key), k -> cache.get(key, valueLoader)); return (T) o; } diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java index 2cfc927c5..0664755a4 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java @@ -37,7 +37,6 @@ public class PlusSaTokenDao implements SaTokenDao { @Override public String get(String key) { Object o = CAFFEINE.get(key, k -> RedisUtils.getCacheObject(key)); - Console.log("caffeine -> key:" + key + ",value:" + o); return (String) o; } @@ -101,7 +100,6 @@ public class PlusSaTokenDao implements SaTokenDao { @Override public Object getObject(String key) { Object o = CAFFEINE.get(key, k -> RedisUtils.getCacheObject(key)); - Console.log("caffeine -> key:" + key + ",value:" + o); return o; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index d3a9a0dac..a133060ea 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -579,30 +579,4 @@ public class SysUserServiceImpl implements ISysUserService, UserService { return ObjectUtil.isNull(sysUser) ? null : sysUser.getNickName(); } - /** - * 通过用户ID查询用户手机号 - * - * @param userId 用户id - * @return 用户手机号 - */ - @Override - public String selectPhonenumberById(Long userId) { - SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper() - .select(SysUser::getPhonenumber).eq(SysUser::getUserId, userId)); - return ObjectUtil.isNull(sysUser) ? null : sysUser.getPhonenumber(); - } - - /** - * 通过用户ID查询用户邮箱 - * - * @param userId 用户id - * @return 用户邮箱 - */ - @Override - public String selectEmailById(Long userId) { - SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper() - .select(SysUser::getEmail).eq(SysUser::getUserId, userId)); - return ObjectUtil.isNull(sysUser) ? null : sysUser.getEmail(); - } - } From ebbd85275cff2e19fefbcf5a63c86a1a202508b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Wed, 31 Jan 2024 23:24:51 +0800 Subject: [PATCH 129/159] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E4=B8=8B?= =?UTF-8?q?=E6=8B=89=E9=80=89=E6=8E=A5=E5=8F=A3=E6=95=B0=E6=8D=AE=E6=9D=83?= =?UTF-8?q?=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/system/SysDeptController.java | 2 +- .../system/controller/system/SysPostController.java | 2 +- .../system/controller/system/SysRoleController.java | 2 +- .../system/controller/system/SysUserController.java | 2 +- .../java/org/dromara/system/mapper/SysUserMapper.java | 6 ++++++ .../dromara/system/service/impl/SysRoleServiceImpl.java | 7 +++---- .../dromara/system/service/impl/SysUserServiceImpl.java | 2 +- .../src/main/resources/mapper/system/SysDeptMapper.xml | 2 +- .../src/main/resources/mapper/system/SysUserMapper.xml | 9 +++++++-- 9 files changed, 22 insertions(+), 12 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java index 70463bd66..4f5f23f32 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java @@ -129,7 +129,7 @@ public class SysDeptController extends BaseController { @SaCheckPermission("system:dept:query") @GetMapping("/optionselect") public R> optionselect(@RequestParam(required = false) Long[] deptIds) { - return R.ok(deptService.selectDeptByIds(List.of(deptIds))); + return R.ok(deptService.selectDeptByIds(deptIds == null ? null : List.of(deptIds))); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java index 3221a4abc..b904b9b37 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java @@ -116,7 +116,7 @@ public class SysPostController extends BaseController { @SaCheckPermission("system:dept:query") @GetMapping("/optionselect") public R> optionselect(@RequestParam(required = false) Long[] postIds) { - return R.ok(postService.selectPostByIds(List.of(postIds))); + return R.ok(postService.selectPostByIds(postIds == null ? null : List.of(postIds))); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java index 9d7fb301c..d4a9dc8a4 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java @@ -155,7 +155,7 @@ public class SysRoleController extends BaseController { @SaCheckPermission("system:role:query") @GetMapping("/optionselect") public R> optionselect(@RequestParam(required = false) Long[] roleIds) { - return R.ok(roleService.selectRoleByIds(List.of(roleIds))); + return R.ok(roleService.selectRoleByIds(roleIds == null ? null : List.of(roleIds))); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java index 9b856bf60..c44f24cb6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -215,7 +215,7 @@ public class SysUserController extends BaseController { @GetMapping("/optionselect") public R> optioselect(@RequestParam(required = false) Long[] userIds, @RequestParam(required = false) Long deptId) { - return R.ok(userService.selectUserByIds(List.of(userIds), deptId)); + return R.ok(userService.selectUserByIds(userIds == null ? null : List.of(userIds), deptId)); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java index d226d9976..fc7fc6e16 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java @@ -26,6 +26,12 @@ public interface SysUserMapper extends BaseMapperPlus { }) Page selectPageUserList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + List selectUserList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + /** * 根据条件分页查询用户列表 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java index f8935aaf2..abd294f3e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java @@ -174,10 +174,9 @@ public class SysRoleServiceImpl implements ISysRoleService { */ @Override public List selectRoleByIds(List roleIds) { - return baseMapper.selectRoleList(new LambdaQueryWrapper() - .select(SysRole::getRoleId, SysRole::getRoleName, SysRole::getRoleKey) - .eq(SysRole::getStatus, UserConstants.ROLE_NORMAL) - .in(CollUtil.isNotEmpty(roleIds), SysRole::getRoleId, roleIds)); + return baseMapper.selectRoleList(new QueryWrapper() + .eq("r.status", UserConstants.ROLE_NORMAL) + .in(CollUtil.isNotEmpty(roleIds), "r.role_id", roleIds)); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index a133060ea..89270326e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -181,7 +181,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService { */ @Override public List selectUserByIds(List userIds, Long deptId) { - return baseMapper.selectVoList(new LambdaQueryWrapper() + return baseMapper.selectUserList(new LambdaQueryWrapper() .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName) .eq(SysUser::getStatus, UserConstants.USER_NORMAL) .eq(ObjectUtil.isNotNull(deptId), SysUser::getDeptId, deptId) diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml index 55c9b37c0..48a422680 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -8,7 +8,7 @@ - select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, - u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark + select ${ew.getSqlSelect} from sys_user u ${ew.getCustomSqlSegment} + + - select ${ew.getSqlSelect} from sys_dept ${ew.getCustomSqlSegment} + select + + ${ew.getSqlSelect} + + + * + + from sys_dept ${ew.getCustomSqlSegment} - select ${ew.getSqlSelect} + select + + ${ew.getSqlSelect} + + + u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, + u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark + from sys_user u ${ew.getCustomSqlSegment} From d93d3beb48db3a7b9272d6bb7748153033662b71 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 3 Feb 2024 13:46:29 +0800 Subject: [PATCH 132/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/controller/ActModelController.java | 2 +- .../org/dromara/workflow/service/impl/ActModelServiceImpl.java | 3 +-- 2 files changed, 2 insertions(+), 3 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 5cfaaf9b8..c6549b403 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 @@ -78,7 +78,7 @@ public class ActModelController extends BaseController { */ @Log(title = "模型管理", businessType = BusinessType.UPDATE) @RepeatSubmit() - @PostMapping(value = "/update") + @PutMapping(value = "/update") public R update(@RequestBody ModelBo modelBo) { return toAjax(actModelService.update(modelBo)); } 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 44adc4248..73df26497 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 @@ -114,6 +114,7 @@ public class ActModelServiceImpl implements IActModelService { model.setVersion(version); model.setCategory(categoryCode); model.setMetaInfo(description); + model.setTenantId(TenantHelper.getTenantId()); //保存初始化的模型基本信息数据 repositoryService.saveModel(model); repositoryService.addModelEditorSource(model.getId(), StrUtil.utf8Bytes(xml)); @@ -165,8 +166,6 @@ public class ActModelServiceImpl implements IActModelService { list.stream().filter(e -> !e.getId().equals(model.getId())).findFirst().ifPresent(e -> { throw new ServiceException("模型KEY已存在!"); }); - model.setKey(modelBo.getKey()); - model.setName(modelBo.getName()); model.setCategory(modelBo.getCategoryCode()); model.setMetaInfo(modelBo.getDescription()); repositoryService.saveModel(model); From b163ad0d82094e13fdc38b0f337a52eae1b5fc5d Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Mon, 5 Feb 2024 10:25:19 +0800 Subject: [PATCH 133/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/controller/ActModelController.java | 2 +- 1 file changed, 1 insertion(+), 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 c6549b403..31e31e6eb 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 @@ -90,7 +90,7 @@ public class ActModelController extends BaseController { */ @Log(title = "模型管理", businessType = BusinessType.UPDATE) @RepeatSubmit() - @PostMapping(value = "/editModelXml") + @PutMapping(value = "/editModelXml") public R editModel(@Validated(EditGroup.class) @RequestBody ModelBo modelBo) { return toAjax(actModelService.editModelXml(modelBo)); } From 16bc2a39446475f96ea671b5b8219796c0a68cc8 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Mon, 5 Feb 2024 13:51:49 +0800 Subject: [PATCH 134/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E8=BD=AC=E6=8D=A2=EF=BC=8C=E6=B5=81=E7=A8=8B=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=EF=BC=8C=E4=B8=8A=E4=BC=A0=E6=96=B0bpmn=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ActProcessDefinitionServiceImpl.java | 8 -------- .../service/impl/ActTaskServiceImpl.java | 8 +++++++- script/bpmn/请假流程(排他网关)-leave2.zip | Bin 2087 -> 1466 bytes script/bpmn/请假流程(普通流程)-leave1.zip | Bin 1657 -> 1255 bytes 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index ee32c9f09..b103b3056 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -6,8 +6,6 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.ObjectUtil; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; @@ -22,7 +20,6 @@ import org.dromara.workflow.domain.bo.ProcessDefinitionBo; import org.dromara.workflow.domain.vo.ProcessDefinitionVo; import org.dromara.workflow.service.IActProcessDefinitionService; import org.dromara.workflow.service.IWfCategoryService; -import org.flowable.editor.constants.ModelDataJsonConstants; import org.flowable.engine.HistoryService; import org.flowable.engine.ProcessMigrationService; import org.flowable.engine.RepositoryService; @@ -257,11 +254,6 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer modelData.setKey(pd.getKey()); modelData.setName(pd.getName()); modelData.setTenantId(pd.getTenantId()); - ObjectNode modelObjectNode = new ObjectMapper().createObjectNode(); - modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, pd.getName()); - modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, modelData.getVersion()); - modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, pd.getDescription()); - modelData.setMetaInfo(modelObjectNode.toString()); repositoryService.saveModel(modelData); repositoryService.addModelEditorSource(modelData.getId(), IoUtil.readBytes(inputStream)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 307676024..59348e5ae 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -26,6 +26,7 @@ import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler; import org.dromara.workflow.flowable.strategy.FlowTaskEventHandler; import org.dromara.workflow.service.IActTaskService; import org.dromara.workflow.utils.WorkflowUtils; +import org.flowable.common.engine.api.FlowableObjectNotFoundException; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.engine.*; import org.flowable.engine.history.HistoricProcessInstance; @@ -100,7 +101,12 @@ public class ActTaskServiceImpl implements IActTaskService { variables.put(FLOWABLE_SKIP_EXPRESSION_ENABLED, true); // 流程发起人 variables.put(INITIATOR, (String.valueOf(LoginHelper.getUserId()))); - ProcessInstance pi = runtimeService.startProcessInstanceByKeyAndTenantId(startProcessBo.getProcessKey(), startProcessBo.getBusinessKey(), variables, TenantHelper.getTenantId()); + ProcessInstance pi; + try { + pi = runtimeService.startProcessInstanceByKeyAndTenantId(startProcessBo.getProcessKey(), startProcessBo.getBusinessKey(), variables, TenantHelper.getTenantId()); + } catch (FlowableObjectNotFoundException e) { + throw new ServiceException("找不到当前【" + startProcessBo.getProcessKey() + "】流程定义!"); + } // 将流程定义名称 作为 流程实例名称 runtimeService.setProcessInstanceName(pi.getProcessInstanceId(), pi.getProcessDefinitionName()); // 申请人执行流程 diff --git a/script/bpmn/请假流程(排他网关)-leave2.zip b/script/bpmn/请假流程(排他网关)-leave2.zip index 7555193a564bf0073f552c10bf0662617d59dcc2..9e151e22d711ff9a75433af2c66f5431c68be6c6 100644 GIT binary patch delta 1342 zcmV-E1;P5K5V{KvP)h>@6aWYa2msSnMOcvzK!4R(NpIUm6u$dc5QCy8$6T~pl@uhE zTo|z3phP`Gm`8E0TQH5TLkEaF85yQTMj`{Aa>C|6WR4Cf1$%6hl{v5 zYGJe|b7tQ1z3;s@^W^sJE%cutg}ebR@Kf&crhCbshG$g&q?!^nA5mFQ)W<=nUJDj^}v; z+cM$6_)_)+Y}0mS&XupUZ`yM>G*PH1Hh;J`PfbV`#gPEC9dTxqa|R>|-4UXDaDs>f zb(By^pmAJVM})A1g6^6mwS%>UnHv+q8Pb4cF*6$9IO|M+h4`O7!wUvX`w&vNC`{tQ`^o8Zem+d!%?vp9de`1N@p&J^q^9oekBx_?^? z)<8LGG$D4|a=7iAl_R^s&Xgec0VIdq%^jWM8Kx%#b#tiV>Va@}`NK;F`}M0=kw47J zd6M=QZfE0CwapnFqBJf6LxhixrmSI*r^J!Py#R^WQ&&eHq5UK?ezy2_Iuf}sV8v~^ zq&5o!KKtzI$3KC@@(HIV4g9O0s(+eWYXV86z6A-vBMUJNHKGO`Q)GFa-#5{OF-^n? zI}0_L(49cJ`w)1byeb1N01d_;Sm#^Y256~|+H$6ra3|;bTS`($ep!YmFjiyl%DZP4ndiC?^)i2K$FV15b)FHbC4Sz_{2d+JJ z*afVvYwMNuYF?#>ATzkT+9ExoW*%2?aC zE3^7RDQn0wqRWwg4OB8V9Wu+kp+r7X2$tjof}|V^HE>ycL-}5^i#jaGSWzdjhZUV; z-N%;GGNNQwwI1GXnb<|oWq&rL2&@FYUj!>S5V3_h({0wZ-rUqbc3k$(vM-5^K`naX zu!f*pwmX4lbOyTbJY-BTQycs-?!glxy*r}sNg6Bh3}fMQ84HBJ>*As33x9-ad6QBP z!;uRoJlNQJ;I)r<(_`ZIOlYA{n6G?M$rB2iDV!X_uwxePkD(J;;D4(@{4Gq_NgS|A zt3{}5A2Oyu?0(>bUF)trwG1|mc7Rr8b$r79di6ZV1|4@mg?)|@9*wF0Eywg@;CA2; znbA?Eam_bgX@thLN@QHECXLH^))Ob3hGMpspO}Gxm&i&zLIoUEG@m22Q47ORl^99Q z5|X0Bl>-Snryvl~TYm+CR2%<+K>TZ@D3IWyDF~zXD5Z&d2B#;b#Wf$iWn+a delta 1968 zcmV;h2T%CA3#SkcP)h>@6aWYa2msoxbXSoMK!5F8TaVku6@K@xV1>Sp#Nk{xv)J8~ zmtj%BPK??u90Y;ENV8ft5~YgNUJwL`)5L9IAWe%l1&Tftg@L+2TR#Lv3$Kg*nO&=X z%3tV^B6XvdJG=4%NnkyRnmLE(JKs5H&Y9iqH;(!}<3Ns*Xb|r-VAE_EGHwq#QQX~W z{D0_f09fOV-5c8-xfjJzsx~Etl8BR?#(tU(w_2^k!^7sF-)#;?-BvP`?UsA{)|)NM zgr-R>+`9FaFK#xbGFwMUv?OJ8zjE7Lc_zD$N;dwKhk%Z8&tTd7t7kiTXyO66#$ z5fodDw}vt{?hMAGwlr=HIV zDqcpZIFNCgt4*Q~U|ew132flm0s#z#1voKXUx@mt-iV35jGXLjH{PFd-C%4PhS4{;n~yY4WrD@ ztx%TOl&WIS`T|-k zDvaNG$Mc=L&O2EizWc7iT&sJX4aJhG_j?1N%2?F9ngzY+SQS0Unf;US_R|!x$)7 z!=6m9XwqKTOO}~huYDFst#cx&QrRk@jUfrFEVXSxRFZRnfr~v85XiBM9E-Z9n3c?v zPhS4+zpsP(bx?opgBp3vR|Oh7j;j5h7Xa@1R6R1E1&sRylQO7Zd~`B7`PJm}hil^+ zf79c7voJb6`Sisf|9_^MB;)Mq!^xi>(ERglj-|C-3qypO(8a1(VJfJIaDn5R9C$wW z7;}hcI-=6G=rs*1U5i%ap40lpo#npTfgY#K@_=O$2Cz#_r3({)gl!`VZ5!ge11bgU zJm3guTfT__!BiRNx&*k;p#a%t0ELfDk@c}F9?(m}6%XiIy?@37>)Un&nTt#Ykg1en zpHjdvw1LlsYUYtT`)HLry;JekaktiTs@iU3GZzp~MG+Rtawl+XAUIM}gT)+!#ugyXf4xL*NIv~%qwx2R?MuSf4iL9^M~nG$5wWu z;YVS26!vo{3(xn9QM^FCAaJ`E#?r`sD2m*CY%g`>Tb4B}>$tNY4p(&O&#~oOawYfm zXZ!hKk>A*Cxr1@sNsN6Nb@!D4$jt7#4x>)GUp^e|G=D71%Dx?|=F>#kmBn^zQF>nb zSJ7Ppw%+7fg{?QiUjUme!iMGyH@6GiHoGR+dhuU{tv7RD02?pD#wBWuOSbuSq1HRF ztEewkDKAMjA*6tv$NhD{);sH}u=VQQrm!I**M?iCJ6VTY=a|15ZX1=j`E}8))nBcR za-F{H0)N;RTYx=%ILfe^CEJj03R`r#>riX;uO;eC$9;XV+1xm7Bm6=8eL1?PqBw`O zcJ=MDw9Qth-NZ~5;&WHuE>>5Z9c>+k$HPISCIIDAhH#UsgJ=3dyhx^nsG9GuRkT1( zz4Q`2nFsaR(QDEw?C6P|$BtFYj#bMJIe)cewtv>C%C;uAC^D(4Cdh;o72(e=%?~m0 zEO|DPw#ntC=ViKHdV|=|o8Kz2p(l17nY(FhP_mf0oU^HesnsNxq-TDbK-E2AX4fd# zgdwdzj8z%Z5<8C}Na`3`S$)L}Sp-fQVwiDGRG)X{{IfW1&Z)K)LmHYk;7ac%tHPC@ z*nc-6o2CaLqfNT_BfENLLDWP`pKIYw?=Gmqo1WO~6H-gszI^jEKOpOcH;4?qzo=It zLr?5FGP)*i%BZUKDauObJb96QWoqYl3Rf$*OF!o~Yt#F@>K)$hjqTRL|7Gp|A5cpN z2&JTMD^&*o0L&!-08mQ-0u%rg00;;O01n!%bXTRMZYxy>007J-lVAl@2D1kM0002E CN!$GZ diff --git a/script/bpmn/请假流程(普通流程)-leave1.zip b/script/bpmn/请假流程(普通流程)-leave1.zip index d85f86675082198dfd0beee08b91fd4974865014..2edee6a6e2080fcb34362812fc7fa0538ba4e257 100644 GIT binary patch delta 1129 zcmV-v1eW{x4Ce_BP)h>@6aWYa2mmouMOcvzK!3$oO>5jn7{2>gh&el!M%oX1+1-$2 z9WdBVXc8!tvdGe`b`q^-qnZ687!n%NmRws(d+en?HHT6PsiA+SPP(W5g^orVNn?Gi zZ3;Q9M)Q6=@AJ$%ueN)8Iq|hQ3MnQ*55OG*Xee-qivzC*o;<#PYZu(^Z*^TX!U1O7 zh<|F_BcMGnW^CHg^~GYbLnhu12|b-ok)z*zcyz3r1~iPO+0c(34E7H}?9*9NtoSV~ z;bs~J)IUEueB_ML#J+_C%Iv^F((7b830!>Dgo6X=$BkU4+HEk%Io(T>VUqbonRhVJ zsQ@OHdSpO+66%7h*lFaGg?-|q)KR_=*?%H8X<1i?0_Y&)%-zfx(3l;1h#lJ#M5nfc z6c+`}G$an9lnV;_TbkBQ)*9w%d}PlN1X{qu^uRyw{n@A)?$e*AU) z@+Z0cR(NxNu2snP=O|zzgjgOEHw$xd{_^6Nw~0A-AT#C>e!TkkIjkWZHI|q>?SJa& z>o}~Q#ZBJKC<-6j^qEL=$6lmA^<})1IQL%^MSt7QBt2F2 zNxiPEOv?DC=Aw|9BlD)s6=x||CMCbL#U$lY85FqL)g_*|4L)g;=T-Md3SBLcbCiUt zKUA@I#i5eua?n*wG48Is!^I+=j-6--4zTTo_C%!1t%s4g^19BMKlJSYrN&|vn`)6! zB6T_xQa*AK9*ym37D23r`G0FpiKA@rA=;rVB+vN42D#HKW_IT;nFTKY(C7iP!H4XM z{~G*vfn7H40gFG55%$I`e%5pTIdF&e3G%b8(%@zs+-j%6O)Coy8)|U9D!Q^GXsBoF z@;x$i@g=efH%$#kmKk#d+s(8LXyi!R-9S>ddE-KowyP;bHfBvBjeqv1FC=NgIz^H; zttq7S=@d~ejA9k#cU(yc?RMN7a4+i(tCefK7Pv0Reb+;UPoyG5@6aWYa2msivbXSoMK!4p?TaVjB6n^ioFn(r|u|1x#qwE%6 z5z=m3(H0d|RprLBiD_a7+u7{CQ7DC~F9mV!8@#kHv=RuAN+tdb+w4B^7Z^Ks;#_x{ zvJxUsab~_V=R4aVV}lH5QST!RD+^G!&c-6VS7uwdc_5rcz*j_)2Dku z7=NT}Qz9@#m~4riH0?L)_2F<>i+b%^6u0Y1pSJ4erQHj48A=eUGOF)hw4EJsjAa85S3T}X)*z(tT@0` zZ7934164~Bx104Tw6HZuXne&>Zci)`-9(z|LI8=Z03@3bn1<;9$F(JBVxs6oEh&t? z`h~Ih>-qD{bZMz{l72W~(xO@DCV$3tj19>k2Ec~l0E8?HXqv79RW&iomZ8`d7KJ2_ z@4IyG6}S}{o`AS$WC5wTxhf=zWT~=@WdM=IY$>(|48=8ph7<%PVqlfXlaTyz_vGt8 zMWHOJM$2Qe^SzW_WoB6)k%}y`gXlp@!>nSQF72_DB;^WQ>y3-6kvYR!#D87{Smg&@ zAQcKL)|czPSY-U(xNh0T72|q0IAltZbd7xA9lj-DrPhjiH*T;1tUPF~GhHu9Gs2tt zGy3M)=)uRMM|VdLo*w=5a3@&d%k-Qj?s%;<*k@fD1bz=p;tVqMW?p3?n{i~#2}}IR zuM97Z;%qBm0q%EcN;h+5&wuMCv%W01J}IX9ifZB$rljb)sbiacK}=)V(t&|&44_4@ z>l%t98E8S6e63FD|6(bFGB4}b3+eevB)>KBgS za6{hAjqx>f{P@e``#-PsLFN}^4n12%=12U$Bxymc6Ne}Oo0ox)qzD!j)Jj5fxTbmx+PE!vLXUc#F1O|oR2*|^CMn@oq}yTy)Lw`qJWYg-wu zrK|5Rtd6gk34d0FD_0p7!Qu}Fm0$;rp?BDi0(QG*Et8d)j+l=c(sW%V7>xsrDs?qQ ztTiReYE7ShB*J59CRtfL`E$iL$t>iG54I{-bMc Date: Mon, 5 Feb 2024 15:27:04 +0800 Subject: [PATCH 135/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E8=BF=90=E8=A1=8C=E4=B8=AD=E6=B5=81=E7=A8=8B=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=EF=BC=8C=E6=B5=81=E7=A8=8B=E6=89=A9=E5=B1=95=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=EF=BC=8C=E8=A1=A5=E5=85=85=E6=B3=A8=E8=A7=A3=EF=BC=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/FlowConstant.java | 38 ++++---- .../ActProcessDefinitionController.java | 6 ++ .../ActProcessInstanceController.java | 16 ++++ .../controller/ActTaskController.java | 9 ++ .../config/GlobalFlowableListener.java | 2 +- .../service/IActProcessInstanceService.java | 8 ++ .../impl/ActProcessDefinitionServiceImpl.java | 6 +- .../impl/ActProcessInstanceServiceImpl.java | 93 +++++++++++++++++++ .../dromara/workflow/utils/ModelUtils.java | 34 ++++++- .../mapper/workflow/WfBusinessFormMapper.xml | 7 -- .../workflow/WfFormDefinitionMapper.xml | 7 -- .../mapper/workflow/WfFormMapper.xml | 7 -- 12 files changed, 190 insertions(+), 43 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfBusinessFormMapper.xml delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormMapper.xml 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 index 0ccfd0fa5..614f9fffa 100644 --- 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 @@ -8,11 +8,6 @@ package org.dromara.workflow.common.constant; */ public interface FlowConstant { - /** - * 命名空间 - */ - String NAMESPACE = "http://b3mn.org/stencilset/bpmn2.0#"; - String MESSAGE_CURRENT_TASK_IS_NULL = "当前任务不存在或你不是任务办理人!"; String MESSAGE_SUSPENDED = "当前任务已挂起不可审批!"; @@ -22,6 +17,27 @@ public interface FlowConstant { */ String SEQUENCE_FLOW = "sequenceFlow"; + /** + * 并行网关 + */ + String PARALLEL_GATEWAY = "parallelGateway"; + + /** + * 排它网关 + */ + String EXCLUSIVE_GATEWAY = "exclusiveGateway"; + + /** + * 包含网关 + */ + String INCLUSIVE_GATEWAY = "inclusiveGateway"; + + /** + * 结束节点 + */ + String END_EVENT = "endEvent"; + + /** * 流程委派标识 */ @@ -62,17 +78,7 @@ public interface FlowConstant { /** * 流程发起人 */ - String INITIATOR = "INITIATOR"; - - /** - * 设计器中节点设置流程发起人 - */ - String INITIATOR_SET = "$INITIATOR"; - - /** - * 修改设计器设置的变量错误内容 - */ - String INITIATOR_SET_UPDATE = "${INITIATOR}"; + String INITIATOR = "initiator"; /** * 开启跳过表达式变量 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 index 9b85168dd..a19cba152 100644 --- 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 @@ -4,6 +4,7 @@ import jakarta.validation.constraints.NotBlank; 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.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -85,6 +86,7 @@ public class ActProcessDefinitionController extends BaseController { * @param processDefinitionId 流程定义id */ @Log(title = "流程定义管理", businessType = BusinessType.DELETE) + @RepeatSubmit() @DeleteMapping("/{deploymentId}/{processDefinitionId}") public R deleteDeployment(@NotBlank(message = "流程部署id不能为空") @PathVariable String deploymentId, @NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { @@ -97,6 +99,7 @@ public class ActProcessDefinitionController extends BaseController { * @param processDefinitionId 流程定义id */ @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() @PutMapping("/updateProcessDefState/{processDefinitionId}") public R updateProcDefState(@NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { return toAjax(actProcessDefinitionService.updateProcessDefState(processDefinitionId)); @@ -109,6 +112,7 @@ public class ActProcessDefinitionController extends BaseController { * @param fromProcessDefinitionId 需要迁移到的流程定义id */ @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() @PutMapping("/migrationProcessDefinition/{currentProcessDefinitionId}/{fromProcessDefinitionId}") public R migrationProcessDefinition(@NotBlank(message = "当前流程定义id") @PathVariable String currentProcessDefinitionId, @NotBlank(message = "需要迁移到的流程定义id") @PathVariable String fromProcessDefinitionId) { @@ -121,6 +125,7 @@ public class ActProcessDefinitionController extends BaseController { * @param processDefinitionId 流程定义id */ @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() @PutMapping("/convertToModel/{processDefinitionId}") public R convertToModel(@NotEmpty(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { return toAjax(actProcessDefinitionService.convertToModel(processDefinitionId)); @@ -133,6 +138,7 @@ public class ActProcessDefinitionController extends BaseController { * @param categoryCode 分类 */ @Log(title = "流程定义管理", businessType = BusinessType.INSERT) + @RepeatSubmit() @PostMapping("/deployByFile") public R deployByFile(@RequestParam("file") MultipartFile file, @RequestParam("categoryCode") String categoryCode) { return toAjax(actProcessDefinitionService.deployByFile(file, categoryCode)); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java index 20d6d68d8..cd2c9e2d6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java @@ -5,6 +5,7 @@ import jakarta.validation.constraints.NotNull; 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.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -63,6 +64,16 @@ public class ActProcessInstanceController extends BaseController { return R.ok("操作成功", actProcessInstanceService.getHistoryProcessImage(processInstanceId)); } + /** + * 通过流程实例id获取历史流程图运行中,历史等节点 + * + * @param processInstanceId 流程实例id + */ + @GetMapping("/getHistoryProcessList/{processInstanceId}") + public R> getHistoryProcessList(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) { + return R.ok("操作成功", actProcessInstanceService.getHistoryProcessList(processInstanceId)); + } + /** * 获取审批记录 * @@ -79,6 +90,7 @@ public class ActProcessInstanceController extends BaseController { * @param processInvalidBo 参数 */ @Log(title = "流程实例管理", businessType = BusinessType.DELETE) + @RepeatSubmit() @PostMapping("/deleteRuntimeProcessInst") public R deleteRuntimeProcessInst(@Validated(AddGroup.class) @RequestBody ProcessInvalidBo processInvalidBo) { return toAjax(actProcessInstanceService.deleteRuntimeProcessInst(processInvalidBo)); @@ -90,6 +102,7 @@ public class ActProcessInstanceController extends BaseController { * @param processInstanceIds 流程实例id */ @Log(title = "流程实例管理", businessType = BusinessType.DELETE) + @RepeatSubmit() @DeleteMapping("/deleteRuntimeProcessAndHisInst/{processInstanceIds}") public R deleteRuntimeProcessAndHisInst(@NotNull(message = "流程实例id不能为空") @PathVariable String[] processInstanceIds) { return toAjax(actProcessInstanceService.deleteRuntimeProcessAndHisInst(Arrays.asList(processInstanceIds))); @@ -101,6 +114,7 @@ public class ActProcessInstanceController extends BaseController { * @param processInstanceIds 流程实例id */ @Log(title = "流程实例管理", businessType = BusinessType.DELETE) + @RepeatSubmit() @DeleteMapping("/deleteFinishProcessAndHisInst/{processInstanceIds}") public R deleteFinishProcessAndHisInst(@NotNull(message = "流程实例id不能为空") @PathVariable String[] processInstanceIds) { return toAjax(actProcessInstanceService.deleteFinishProcessAndHisInst(Arrays.asList(processInstanceIds))); @@ -112,6 +126,7 @@ public class ActProcessInstanceController extends BaseController { * @param processInstanceId 流程实例id */ @Log(title = "流程实例管理", businessType = BusinessType.INSERT) + @RepeatSubmit() @PostMapping("/cancelProcessApply/{processInstanceId}") public R cancelProcessApply(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) { return toAjax(actProcessInstanceService.cancelProcessApply(processInstanceId)); @@ -133,6 +148,7 @@ public class ActProcessInstanceController extends BaseController { * @param taskUrgingBo 任务催办 */ @Log(title = "流程实例管理", businessType = BusinessType.INSERT) + @RepeatSubmit() @PostMapping("/taskUrging") public R taskUrging(@RequestBody TaskUrgingBo taskUrgingBo) { return toAjax(actProcessInstanceService.taskUrging(taskUrgingBo)); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java index 6fd8f10f5..912604fff 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java @@ -108,6 +108,7 @@ public class ActTaskController extends BaseController { * @param taskId 任务id */ @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() @PostMapping("/claim/{taskId}") public R claimTask(@NotBlank(message = "任务id不能为空") @PathVariable String taskId) { try { @@ -125,6 +126,7 @@ public class ActTaskController extends BaseController { * @param taskId 任务id */ @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() @PostMapping("/returnTask/{taskId}") public R returnTask(@NotBlank(message = "任务id不能为空") @PathVariable String taskId) { try { @@ -142,6 +144,7 @@ public class ActTaskController extends BaseController { * @param delegateBo 参数 */ @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() @PostMapping("/delegateTask") public R delegateTask(@Validated({AddGroup.class}) @RequestBody DelegateBo delegateBo) { return toAjax(actTaskService.delegateTask(delegateBo)); @@ -153,6 +156,7 @@ public class ActTaskController extends BaseController { * @param terminationBo 参数 */ @Log(title = "任务管理", businessType = BusinessType.DELETE) + @RepeatSubmit() @PostMapping("/terminationTask") public R terminationTask(@RequestBody TerminationBo terminationBo) { return toAjax(actTaskService.terminationTask(terminationBo)); @@ -164,6 +168,7 @@ public class ActTaskController extends BaseController { * @param transmitBo 参数 */ @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() @PostMapping("/transferTask") public R transferTask(@Validated({AddGroup.class}) @RequestBody TransmitBo transmitBo) { return toAjax(actTaskService.transferTask(transmitBo)); @@ -175,6 +180,7 @@ public class ActTaskController extends BaseController { * @param addMultiBo 参数 */ @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() @PostMapping("/addMultiInstanceExecution") public R addMultiInstanceExecution(@Validated({AddGroup.class}) @RequestBody AddMultiBo addMultiBo) { return toAjax(actTaskService.addMultiInstanceExecution(addMultiBo)); @@ -186,6 +192,7 @@ public class ActTaskController extends BaseController { * @param deleteMultiBo 参数 */ @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() @PostMapping("/deleteMultiInstanceExecution") public R deleteMultiInstanceExecution(@Validated({AddGroup.class}) @RequestBody DeleteMultiBo deleteMultiBo) { return toAjax(actTaskService.deleteMultiInstanceExecution(deleteMultiBo)); @@ -197,6 +204,7 @@ public class ActTaskController extends BaseController { * @param backProcessBo 参数 */ @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() @PostMapping("/backProcess") public R backProcess(@RequestBody BackProcessBo backProcessBo) { return R.ok(actTaskService.backProcess(backProcessBo)); @@ -220,6 +228,7 @@ public class ActTaskController extends BaseController { * @param userId 办理人id */ @Log(title = "任务管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() @PutMapping("/updateAssignee/{taskIds}/{userId}") public R updateAssignee(@PathVariable String[] taskIds, @PathVariable String userId) { return toAjax(actTaskService.updateAssignee(taskIds, userId)); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java index 826a5e6b1..2ff46a987 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java @@ -82,7 +82,7 @@ public class GlobalFlowableListener implements FlowableEventListener { if (task != null) { List taskComments = taskService.getTaskComments(task.getId()); if (CollUtil.isEmpty(taskComments)) { - taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), "自动审批!"); + taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), "超时自动审批!"); } } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java index b871807bd..c8af5a4c4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java @@ -23,6 +23,14 @@ public interface IActProcessInstanceService { */ String getHistoryProcessImage(String processInstanceId); + /** + * 通过流程实例id获取历史流程图运行中,历史等节点 + * + * @param processInstanceId 流程实例id + * @return 结果 + */ + Map getHistoryProcessList(String processInstanceId); + /** * 分页查询正在运行的流程实例 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index b103b3056..5c38fad8f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -23,6 +23,7 @@ import org.dromara.workflow.service.IWfCategoryService; import org.flowable.engine.HistoryService; import org.flowable.engine.ProcessMigrationService; import org.flowable.engine.RepositoryService; +import org.flowable.engine.impl.bpmn.deployer.ResourceNameUtil; import org.flowable.engine.repository.Deployment; import org.flowable.engine.repository.Model; import org.flowable.engine.repository.ProcessDefinition; @@ -35,6 +36,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.zip.ZipInputStream; @@ -297,11 +299,13 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer deployment = repositoryService.createDeployment() .tenantId(TenantHelper.getTenantId()) .addZipInputStream(new ZipInputStream(inputStream)).name(processName).key(processKey).category(categoryCode).deploy(); - } else { + } else if (Arrays.asList(ResourceNameUtil.BPMN_RESOURCE_SUFFIXES).contains(filename)) { // xml 或 bpmn deployment = repositoryService.createDeployment() .tenantId(TenantHelper.getTenantId()) .addInputStream(filename, inputStream).name(processName).key(processKey).category(categoryCode).deploy(); + } else { + throw new ServiceException("文件类型上传错误!"); } // 更新分类 ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 358a3566f..b334f2fc5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -39,6 +39,7 @@ import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstanceQuery; import org.flowable.engine.impl.persistence.entity.ExecutionEntity; +import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstanceQuery; import org.flowable.engine.task.Comment; @@ -50,7 +51,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.awt.*; +import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.*; import java.util.stream.Collectors; @@ -211,6 +214,96 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService return Base64.encode(IOUtils.toByteArray(inputStream)); } + /** + * 通过流程实例id获取历史流程图运行中,历史等节点 + * + * @param processInstanceId 流程实例id + */ + @Override + public Map getHistoryProcessList(String processInstanceId) { + Map map = new HashMap<>(); + List> taskList = new ArrayList<>(); + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + StringBuilder xml = new StringBuilder(); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(historicProcessInstance.getProcessDefinitionId()); + // 获取节点 + List highLightedFlowList = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).orderByHistoricActivityInstanceStartTime().asc().list(); + for (HistoricActivityInstance tempActivity : highLightedFlowList) { + Map task = new HashMap<>(); + if (!FlowConstant.SEQUENCE_FLOW.equals(tempActivity.getActivityType()) && + !FlowConstant.PARALLEL_GATEWAY.equals(tempActivity.getActivityType()) && + !FlowConstant.EXCLUSIVE_GATEWAY.equals(tempActivity.getActivityType()) && + !FlowConstant.INCLUSIVE_GATEWAY.equals(tempActivity.getActivityType()) + ) { + task.put("key", tempActivity.getActivityId()); + task.put("completed", tempActivity.getEndTime() != null); + task.put("activityType", tempActivity.getActivityType()); + taskList.add(task); + } + } + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + if (processInstance != null) { + taskList = taskList.stream().filter(e -> !e.get("activityType").equals(FlowConstant.END_EVENT)).collect(Collectors.toList()); + } + //查询出运行中节点 + List> runtimeNodeList = taskList.stream().filter(e -> !(Boolean) e.get("completed")).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(runtimeNodeList)) { + Iterator> iterator = taskList.iterator(); + while (iterator.hasNext()) { + Map next = iterator.next(); + runtimeNodeList.stream().filter(t -> t.get("key").equals(next.get("key")) && (Boolean) next.get("completed")).findFirst().ifPresent(t -> iterator.remove()); + } + } + map.put("taskList", taskList); + List historyTaskList = getHistoryTaskList(processInstanceId); + map.put("historyList", historyTaskList); + InputStream inputStream; + try { + inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName()); + xml.append(IOUtils.toString(inputStream, String.valueOf(StandardCharsets.UTF_8))); + map.put("xml", xml.toString()); + } catch (IOException e) { + e.printStackTrace(); + } + return map; + } + + /** + * 获取历史任务节点信息 + * + * @param processInstanceId 流程实例id + */ + private List getHistoryTaskList(String processInstanceId) { + //查询任务办理记录 + List list = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).orderByHistoricTaskInstanceEndTime().desc().list(); + list = StreamUtils.sorted(list, Comparator.comparing(HistoricTaskInstance::getEndTime, Comparator.nullsFirst(Date::compareTo)).reversed()); + List actHistoryInfoVoList = new ArrayList<>(); + for (HistoricTaskInstance historicTaskInstance : list) { + ActHistoryInfoVo actHistoryInfoVo = new ActHistoryInfoVo(); + BeanUtils.copyProperties(historicTaskInstance, actHistoryInfoVo); + actHistoryInfoVo.setStatus(actHistoryInfoVo.getEndTime() == null ? "待处理" : "已处理"); + if (ObjectUtil.isNotEmpty(historicTaskInstance.getDurationInMillis())) { + actHistoryInfoVo.setRunDuration(getDuration(historicTaskInstance.getDurationInMillis())); + } + actHistoryInfoVoList.add(actHistoryInfoVo); + } + List historyInfoVoList = new ArrayList<>(); + Map> groupByKey = StreamUtils.groupByKey(actHistoryInfoVoList, ActHistoryInfoVo::getTaskDefinitionKey); + for (Map.Entry> entry : groupByKey.entrySet()) { + ActHistoryInfoVo historyInfoVo = new ActHistoryInfoVo(); + BeanUtils.copyProperties(entry.getValue().get(0), historyInfoVo); + actHistoryInfoVoList.stream().filter(e -> e.getTaskDefinitionKey().equals(entry.getKey()) && e.getEndTime() == null).findFirst() + .ifPresent(e -> { + historyInfoVo.setStatus("待处理"); + historyInfoVo.setStartTime(e.getStartTime()); + historyInfoVo.setEndTime(null); + historyInfoVo.setRunDuration(null); + }); + historyInfoVoList.add(historyInfoVo); + } + return historyInfoVoList; + } + /** * 获取审批记录 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java index eb5bed0a0..18969b168 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java @@ -24,10 +24,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.rmi.ServerException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -191,4 +188,33 @@ public class ModelUtils { } } } + + /** + * 获取全部扩展信息 + * + * @param processDefinitionId 流程定义id + */ + public Map> getExtensionElements(String processDefinitionId) { + Map> map = new HashMap<>(); + List flowElements = getFlowElements(processDefinitionId); + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof UserTask && CollUtil.isNotEmpty(flowElement.getExtensionElements())) { + map.putAll(flowElement.getExtensionElements()); + } + } + return map; + } + + /** + * 获取某个节点的扩展信息 + * + * @param processDefinitionId 流程定义id + * @param flowElementId 节点id + */ + public Map> getExtensionElement(String processDefinitionId, String flowElementId) { + BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId); + Process process = bpmnModel.getMainProcess(); + FlowElement flowElement = process.getFlowElement(flowElementId); + return flowElement.getExtensionElements(); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfBusinessFormMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfBusinessFormMapper.xml deleted file mode 100644 index f8ec725f6..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfBusinessFormMapper.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml deleted file mode 100644 index 17a9e1dfc..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormMapper.xml deleted file mode 100644 index e9ee055c1..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormMapper.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - From 8fd1fa53d1c0ac4591c0993b3b78a43db5ba4b9d Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Mon, 5 Feb 2024 17:49:43 +0800 Subject: [PATCH 136/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E4=BC=9A?= =?UTF-8?q?=E7=AD=BE=E7=B1=BB=E5=9E=8B=E8=BD=AC=E6=8D=A2=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/DeleteSequenceMultiInstanceCmd.java | 9 +++++-- .../impl/ActProcessDefinitionServiceImpl.java | 23 ++++++++++++------ .../service/impl/ActTaskServiceImpl.java | 16 ++++++++++-- .../service/impl/WorkflowUserServiceImpl.java | 9 ++++--- script/bpmn/请假流程(会签)-leave5.zip | Bin 1770 -> 1342 bytes script/bpmn/请假流程(包容网关)-leave4.zip | Bin 2232 -> 1590 bytes script/bpmn/请假流程(并行网关)-leave3.zip | Bin 2156 -> 1520 bytes .../bpmn/请假流程(边界定时任务)-leave7.zip | Bin 2172 -> 0 bytes 8 files changed, 42 insertions(+), 15 deletions(-) delete mode 100644 script/bpmn/请假流程(边界定时任务)-leave7.zip diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java index e7edbd090..6773eefff 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java @@ -1,5 +1,6 @@ package org.dromara.workflow.flowable.cmd; +import cn.hutool.core.util.ObjectUtil; import lombok.AllArgsConstructor; import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandContext; @@ -51,10 +52,14 @@ public class DeleteSequenceMultiInstanceCmd implements Command { ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); ExecutionEntity entity = executionEntityManager.findById(executionId); // 设置流程变量 - List userIds = (List) entity.getVariable(assigneeList); + List userIds = new ArrayList<>(); + List variable = (List) entity.getVariable(assigneeList); + for (Object o : variable) { + userIds.add(Long.valueOf(o.toString())); + } List userIdList = new ArrayList<>(); userIds.forEach(e -> { - Long userId = assignees.stream().filter(id -> id.equals(e)).findFirst().orElse(null); + Long userId = assignees.stream().filter(id -> ObjectUtil.equals(id, e)).findFirst().orElse(null); if (userId == null) { userIdList.add(e); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index 5c38fad8f..009a1ad29 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -36,7 +36,6 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.zip.ZipInputStream; @@ -295,17 +294,25 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer InputStream inputStream = file.getInputStream(); Deployment deployment; if (FlowConstant.ZIP.equals(suffix)) { - // zip deployment = repositoryService.createDeployment() .tenantId(TenantHelper.getTenantId()) .addZipInputStream(new ZipInputStream(inputStream)).name(processName).key(processKey).category(categoryCode).deploy(); - } else if (Arrays.asList(ResourceNameUtil.BPMN_RESOURCE_SUFFIXES).contains(filename)) { - // xml 或 bpmn - deployment = repositoryService.createDeployment() - .tenantId(TenantHelper.getTenantId()) - .addInputStream(filename, inputStream).name(processName).key(processKey).category(categoryCode).deploy(); } else { - throw new ServiceException("文件类型上传错误!"); + String[] list = ResourceNameUtil.BPMN_RESOURCE_SUFFIXES; + boolean flag = false; + for (String str : list) { + if (filename.contains(str)) { + flag = true; + break; + } + } + if (flag) { + deployment = repositoryService.createDeployment() + .tenantId(TenantHelper.getTenantId()) + .addInputStream(filename, inputStream).name(processName).key(processKey).category(categoryCode).deploy(); + } else { + throw new ServiceException("文件类型上传错误!"); + } } // 更新分类 ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 59348e5ae..19c5de554 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -492,7 +492,13 @@ public class ActTaskServiceImpl implements IActTaskService { */ @Override public boolean addMultiInstanceExecution(AddMultiBo addMultiBo) { - Task task = taskService.createTaskQuery().taskId(addMultiBo.getTaskId()).taskTenantId(TenantHelper.getTenantId()).taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); + TaskQuery taskQuery = taskService.createTaskQuery(); + taskQuery.taskId(addMultiBo.getTaskId()); + taskQuery.taskTenantId(TenantHelper.getTenantId()); + if (!LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin()) { + taskQuery.taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())); + } + Task task = taskQuery.singleResult(); if (ObjectUtil.isEmpty(task)) { throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); } @@ -535,7 +541,13 @@ public class ActTaskServiceImpl implements IActTaskService { */ @Override public boolean deleteMultiInstanceExecution(DeleteMultiBo deleteMultiBo) { - Task task = taskService.createTaskQuery().taskId(deleteMultiBo.getTaskId()).taskTenantId(TenantHelper.getTenantId()).taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); + TaskQuery taskQuery = taskService.createTaskQuery(); + taskQuery.taskId(deleteMultiBo.getTaskId()); + taskQuery.taskTenantId(TenantHelper.getTenantId()); + if (!LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin()) { + taskQuery.taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())); + } + Task task = taskQuery.singleResult(); if (ObjectUtil.isEmpty(task)) { throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java index 647e6d4d7..e30e553eb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java @@ -99,13 +99,16 @@ public class WorkflowUserServiceImpl implements IWorkflowUserService { if (multiInstance == null) { return Collections.emptyList(); } - List assigneeList = null; + List assigneeList = new ArrayList<>(); if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { - assigneeList = (List) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList()); + List variable = (List) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList()); + for (Object o : variable) { + assigneeList.add(Long.valueOf(o.toString())); + } } if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { - List userIds = StreamUtils.filter(assigneeList, e -> !e.toString().equals(task.getAssignee())); + List userIds = StreamUtils.filter(assigneeList, e -> !String.valueOf(e).equals(task.getAssignee())); List sysUsers = null; if (CollectionUtil.isNotEmpty(userIds)) { sysUsers = sysUserMapper.selectVoBatchIds(userIds); diff --git a/script/bpmn/请假流程(会签)-leave5.zip b/script/bpmn/请假流程(会签)-leave5.zip index a5e03efce37dc78f36fb79effe9dd404461b99ce..afe031af786f627da067d531279da44ec388de6a 100644 GIT binary patch delta 1229 zcmV;;1Ty>T4ZaEvP)h>@6aWYa2mtDhMOcvzI)BYrNpBlB6u$dc42T{Z&!Wv1Bn3(2 z00v|?sMDf1ftsO5v}cC$kXqazKyvAV6lf1U_105+DGIdcmKgmtc9dKGLOJAc7Hejt zx(3pdHRM~q_kHB!gFAN@zNgJlNHGbzz}z-~h60;7IB>h*qsI^L?0~zyt&W3^aex^& zqJJ9q2xu3K8Jo0qeLkOW6W`q?p{vsgvi19q4i0t8Fb$(&)%Al9`g;Q)ecB6(bAI!h zaI*}<)IT{G9NA;!!#g;j34c$JxG#alKMoMw=vPF z046^5$bfhx)CE`4>DVK4IPy^9s1`)F$bU^)R@IRMw4ZY3tmh1942CXZhtNlK0&SFY z$)TBq#72~IK|yaz(>n3DhItwf!5L}*E#P6g;LXo}Ts{B%^>5FYKfZW-@x|rEcgvst zetYqy@Z+9brI78-P{4$<_&g*IGF5=9i)U9qyok-Y1DP_H@PpNR$N>#aXqdsLCx0D1 zS(ah-G;X{yr6_z1>8VI_&t`ar+4;~|G)FD-L?v5(`zr^0`SN9&5A%cUujWgZOK{Dd zGs}RhxD*UkK02H7tAZjYfh?N^Xp~Gt8-0k5^UO${#PVt-dUe6hjQWnP3cmdFmp9*k zB~<~M(zp#N#cqJO!Fx}lI8RIYP=9r<-YbriQ;;VCPtHmw%NFeCYAhKw=RGzs6+t8aet8j3A1Yi zAa&b2b(H|GpS@bX`g-}zXNByWDeq{(P!K(Od$LTbcKBXO!Ghh3oqJD2{ZWGjZ2%oE z4tQTI?K_}tKJDm*UMihln(x{PNR(Z7D^JF!#B^`irQ$5bvLwtG%A)vIvY^08-vIGz zXkup6&vr`>xq_ZAk#iJ>s((IF(z^t@LYIM_$0Tug)H5hPIqZU}vmF7rK% z#8vNJ#{7{71C$txFKMbpMzPe%yPEKkiEuQAlQe?(8fM>%T%6nnpF`S|h2)eUY>+v< zV(e+(C)2>;vsxEebv~z@^S=iFJI4+icR`K+93$+Gnf$G1{4?MNaDRlnbgMA9C4<*m zNpP!{1~=>Z;Cfl~+>W53nyu?yeCXh7WUci13XW=)~+GTgc~ zhUHvR#&A5flmpq>kYRNhHv*hn7UPMWepV-*-d0D?{FA4*^(zlhO9u$r^s@6aWYa2ms-&bXSoMI)Ck1TaVL56n^Jdq)}gIGqz`J&nmmr zR|#nsP?sVQLdZC?iHl>WwzC&il}c6hA}W=Kst>&NtuGX*Rd0a$Yk=^^U+A%8C(dQF zL+DDhYM$cEoHOS;-*?W;IPLRC{jhPslQf8SyrPj6Gojt$D`yL9SH1i^#PpvwqTUC?y!}!p<9rB4q^+REEd(e-n znfdolAd17jP}#wxj(@V5ZP$#fy3vZYW`B%erR;dXcf6=O^txOGJ3ksEJk2>=WhF7j zTGuXnSr1n5k}l6KdVQV_Jb!ljOv(mH?1O6%K(S1mWIWkwy5*F{r2&r`d+{*wd1E*3 z@Q^3dc~>i4sT(>dYx`WI(JuWp0w6Wy-T|l0Mg(DOHD5mZ{rTN5U;KJ^^y9r(Pk+C9 z_VmH%;a{(we%)*YsdL2rVKycQg@N#-2zC@UPMK?k|E##G66k;RCE2qO%c zGI0^rUE5M+OT$!YZns-g)6&;4<;fKxynvDS7_q zZ!drNW=vzVQHg5P1D$pw4inz}IQRca$t5huk1`(Rig7~T2V&A{1jhPfaer+VZOF^w z1o>Ws{J1{|dB)2!D<>^4{&EnYzH`H}jVs2DeJ@P;&6|LIwf9MYtrH_`_lIE?Tqs-D zP8<)co|kw&R6&qtfe(UD_lg9A|8T2WEM3crABQ3Lv!Yt^tn7eQZJ3XjyXqyuxCrt& z&02aE16vhr>$GS~{)LpRQGeBzEDQAIY6^(bU`QtpMKU%OMYa`(+3tdp#cFF#$wKNA zRkCbrIus#t6~#crfzS=cR3t0Zz`CP32Gc7gKl|h7|CM}_l8biypAa%3l8gyu2!z2v zUWSHrtiln((CCLvK$3Nle#1^p4+?RAmE7W;Ue7rA`ef^wKQP{CY8szJD~j_u1&d=c9W+J%4zA zCs+|rwbH+(&xlo|tbbY9Ra6YJc4Vj%7b?<_2yz@v!_09V!?G7EQmC`fRiscAEw4x( zb!JbXhDsp@A|q916!ta~_BP$YNU~g$LO2SX_;O#B;i?Qcra@(eNXT`F3LQ$pNH=W< zNw%UYx@5SNE@nWiCCp_&H0t>bw5uyZ@i4wsZRVFJJMg-R*MBdd)ShpZr~VRk&ERtA zMZA&!P-NNj$4Br$jza6z(b?a#b&7*q_*kY%wMc86jhErhcb=YvZEpf{# zu5e588Q~V&lz$g-iybi6!%Z+fd)z{;ZwYRp^T>L*DLs3>#TwosZn3Vv9&VMLJ>Nn- zdkJo_UVjR1S+C(9KLBiwBW89M^t@^LsD#z&!P?sNs5#M-k1pov4X6@(wYET&nAzJ%l|q3k*pw$9 zx;9s}^IF!K@gw%eXn`Lwv$v5Sif1|0003U002-+0Rj{N6aWYa2ms-&bXVI-FYzP>0003Ulj;Oc27Cqp G0000#@6aWYa2mnHcMOcvzK!43xOK;mo5Wf3Y5Jb^aV=gJ`SxG@t z*+l@`4Vnb#O`yrOL|Y*b5TMuI;!}GFilVXmZ>p#{$(VFq2#w5^^f?*dVPmTnuSHR_3X@9bY|iP!r(T?3w& zmVb$`ktbje%j=0_gq)5f&FAx7dpg>+-I3%uP?v7pIy{mTAOlcWRO#^Z!QO!w`g9ha znev<0h?@d{EPZ)+a9bb4sdmk@JfvAVWM0S4)H2L%7aZJVe%Q#+`EG+j!s*j!G1HEH zf|YkoTk;4n@+buc_QZB2lB>|^WMa>?<9`W^9N7!9THwYki+H2}-HdZ)l;=zokmimc zI?|@lb2J^MTvBKp*Vduu;ev|&9YN^QXTikFOrSP{swh}EOi%p#*WXtUzI*lCgZ0JZ zH&>5VKRjIh^2hqmr>loA-duf8ys5O4vBlQUUSQaN zy?hz3XX19AX4i{eb8t1~i8HTdaWNQ-K0NpFhJk?-L6%%a6g=B^b@&B5NoOXk7I~dz zA{7&MpwT=rBErv~u77^^`kRZ_KYv|_0;_aK*YK7xGz9PBAb7LNAJyWFzy*R7BMZWcROGs5`8FtT<5PfC4}Vr|<8TwC z+Bn;l_v@v zq$QYlJ2!0KGVqYz6O|g?jZ6F&;Jl)|3O8=Y=ZYv)fJ-Gt$&l-vDVcSxvqnE094kO zi&|SQ0J?GVuw%-Zwo4%n zfNcRdoMm``=@o;j9qy6K-%@~S}fMfx9u@HBy$mmmnc4xMs81J z?V8PhX_xBRDm@lX^}HUVx3_X)Wxc}yZ*8Z(B{6yp;Z=-Y8w-H6x6|ELZZC2Gr(Tm= zN_Yv%UVQpHT`BQT{{GHCP)i30{}z52WCZ{K8W;coP#H@B0u%rg00;;O078aESpOD& V7-R(i02&yRUIvP)h>@6aWYa2ms)%bXSoMK!5F8OOG4J5x(nJFhs6B?AP>TvAfPZ zg8-5(M2aE9FoZGL%bl1UGMw2Lf&g(6Ck|vJGGN$1PB{p$a)^B}f+UjiZ?tB7@?S{L zkV6hRB)69m0R<2VEXe7u>ZvS72JlJ=kzC*6bQ&+djm zG=JYXys_U=M{yEodQ;la6iIr}JkGM=UaNI>c4iIwU28Dvw$h<$x7^#e-fUrrAha=U z-FnLpZZ;=0d*^AqKzBw8G7KSV-Me-3PWxE(BM>KP7A0*pr|MiyRc=1&4bGzXdum2e zJ}7A3ANG@SXa2bpo9f~Jq@>fEI_>pjzJFgK@~T7|&RQVSCuJ8ybu&u3Cs9|K=&sI( zBbDYDZlXd`%GSNxQFg3Ph(=wNy&3gYI*i(j+ZRkW91YrAAJAp&Zj^p7PyoRLANbV4fn*`VwtrWuF#hZtt;O>vPjc2Jr&37uixVAMDmUGXIpoX^ zi4y{er~niq4+u&fAVQz|Ec60NakG&Y_Wh|kx`u93gl9xXYUBo~h`C8}huV_*I0P`1 zE}))g1Ib(nh(w-d%v|btHOb9vxg@y|wkI9O2Z$30C<;9weUAa=gb*{^VSkteYb1}8 zcJCyOPt}j3Or1p+GwDrvE;Cr?B*>wT1A_n%sCA;A2!Iqm0iMUG>xBWQ6waLF%TLFD z{p`EnKK|~D$IV6=Y7LcuaJs1V{C~l_p6}ds-pzyRz4x@<8+osiVY;M~_t608oD}!Alb{!0 z=nRIW;6INpeuNmY+JpY0NcE$x6sQ-aS#JF8WEy||_4vVW#((+U_`z3~e}8y0-XKqT z(h8A^0vct55okvV&}t2PD%(<|qo|iIBDI?P%#m7aJgJtZYOal4pMSVG)Hw-y1W;;2 zAgL_?wuy&4PY@_)DSZ6&+2zBJU%U2e*M1dUdu1K7Lyy^lL!GLru467`x+J;!Pl%`! z_%4>7sMRr}^08dUjB3O+>lo8*qsIcK%dQrj62yQ*Bmo#9mvTSn$u`unl@=k$We^b? zc*w_qGGPPPrwF(lhkqdnbOEPM%_3$6aJeTjl-{%_2|Nl3qXdMKaV>dBf$od65WeGL z<^=(Cc};S&{PyxBuO(O~5FT})3nXC@P@favLaZCXfI>f%p3kHx6YRIYemZ{o=kdee zzs|0&v+MsscJ%^=0^xgraH**pI>iS*M1IbzB-~^H?%P@_oe5nRYYT|L1&*UHKaPzs z4Y;rKCaPJ$EF~;iz*K6}Y>Hezkbz(Td)(8KL#biV;)MDF=L7-ep`6`mE+2jQ{K=o5 z|Lf7^qrbhJYJX{zmSC7#p=Ir^p|;u7p{};s$m9yOMOAGCOT970 zQ@thJk=kZqS6AC?Hgbj9w5m2OwI*VY_O8@6>qP5no3-cLp-rV->TT~zZ?itOuJ^SP z?bdpeU4N-<)-0?DZlexeU$^*AfkHtUV9P#cSi z+LJF@Yl-J*vlmr6=yX?TZT2fcsddidzB$?K9y#gS{6YHzHM*B)s$8v=tMAlSC(YZ8 zwn%cTSKpZi%963;y|d_IIEZx@o_7V3S&~XA1%DM%+MLmefvZ_$PO*{IywF}jy#P>d zLvwu0ZaFo4%*fW^qutJ4kI&NTOU8#|Y1x=^!Xd|;*!Il86tT+dnpkm8EjfSLWX2XF zfpjmXkE57uVEY0fnhlR?Aexb_191t6B@pR)m?jRe0YrQyh_=+$o**ZLg&3K?`89!K zx_{0SgrOid5|l7J0S;5E>J4lI+ZO=N?4DW!&W!9;j6RByMeKQ`@tL)WsJ!GgL7X>h z5?PXqoq%QbvvCb9GqN2;**Yjopf_5TP&6rJlb3+3lGOB7ig1?y-C*t2Z1qiwY9^FW zE--_#l7Z(>#cm?bY^GHM(Tr>tAR@Xc;(vHO9u#@_5xYv2Ot0d sTPXklP)h*<6aW+e2nYxO;H`95o%RA*<_7=(TPc&=1ylw^2mk;80NhIt#Q*>R diff --git a/script/bpmn/请假流程(并行网关)-leave3.zip b/script/bpmn/请假流程(并行网关)-leave3.zip index 8f7ffb08f4bb25fe1154273e18add5c03c706732..ab10060bc92368bb3908d322df71e61479bff81b 100644 GIT binary patch delta 1396 zcmV-)1&jLZ5bz5QP)h>@6aWYa2mtGYMOcvzK!3$p!EW0|5WV{=2%Z~rNs*E)NDi9X zDFWDT&?G=_!iro`v?-D%DND{NLD4ov3N!%%^xB@{TMt27G2#7P)>JxQ9+=iBbo+;)9a3OuAsckUk^NeYkw&=gfV{AzFiKummki@;+1 z=B?OG0YH|%IXrlvPtX+JvYa4Z!hQcMS7U!WAEHdG+cIhW+o` zx7m3Xmh-fDUizAYt0UXqyj8?SVNm+$bcP!SMNToY{3)UkxHDfzU!yUbnWS3r>mn1W zny`nA&e%u^zka#;_0@-OFFyQoA%6?}KSw_$zL{8N3`!<^5 z1PAoUVz%0+3*+%wZMJ~y8`IfoZMMoO$*5~A^fsmR?#boq^5@ly@2mK1!Up)EY>pNU z*i4~&Jl>EESj?P`I!Oz3d9{4;tWY2r1eWO_v>_E)gU-wa^)fyNp&Fn~Wq+JB0VCt0 zUUOpp5?5#r@o%Tc0L}bN%bfU$yqNff5T(6Bo1i9slBEse(;CwF9`vDYBb#`~N32KU zm5NT1x>C_zV@p-EqorRj=^94z8aYNbo#VfT;6xc|NaF!c<({T!aS`=%LbY>(H>)!W1M%14gxsu9>|%?#wap-G6u>YCCw~oa4E! z;D6_q5l-;m0RKHfmN~(}xybc=9!@$~gI6RzPhjL^|CY&v^PY%->TPCd?0b z3+e@-@1EcrOcf=im49Sk0a^B2IYzA-M%hoL!MjAEN*Y{Ivf#4H2A6ozH`eD^Me=A~ zq0hB1NePLLdK3C2Q@BE(bWT@5?P~vjF__CuN-2m z-3G+SQotcbR|YgF?i#SpxIS z2MC5na!eit005g8002-+0Rj{N6aWYa2mtGYMOcPLa!eit005g8lM)D227Cno0002+ CAGA;a delta 2037 zcmV@6aWYa2msuzbXSoMK!5F8OOG4J5x(nJFuXU}@5f?yop}ZU zBwL7-K!RZiW3rb!F<&9M+TB~6rvn9u3>XQJQ*w$fi4R5+#8UoE*0fLl3#l1$_!^Si z+!X;C5Fsqc>8|Rk`s%B$?$O~p7oB$HsT~Z{UiYX(+o=2Z@4Z{6m|!d@uitww zjP6z^G6xsKbV=@<!pgxC+*&O@?qP~B#H;Q z%!mC>x0soIZ>Fw(gg-3gU{bTOSu6|}gnxoXp)G4I3BgLE%f7vvbX#Xh%ewe(FZu&J z%rM+0MT{}^NB5J_DXfqTT6Xkq(y_yS(pa9p6te!H*8tU!0QoY#!N?Ads_}G6<-NY` zRvz@u1`S)e*K69g9n9zbq{u5-(~w!mcPf>`slG}Iptf!D)Us-&3uYWuzyAE+SAQS> z_N#w>Jbv-)+gG1l{pVj_|MmCd|9*P)>o2~2^}A{%9YzM?Q zr?xxF)eh4p@}w6K>0v}oXb@M5Ankh^v4~Nhh9WYOSC0?tbJ3};v!NY4OoksVXflBc zm4^hwG2%>6q?PZXP)i(#H1fCO{9#$ z0vV%y#7!uWkBLH9N*0@tvk?2$$}o@bkL<|~zD*Hc5OQ!M3&?_*+bj=cq>b?uiaaS1 zrx8Uy^)al&Sb#khXcern+$EMPmJ`qx(}*Ccr9hmM0C^mI7CH(&ZX$3OZ-217pA3?A z+qQp@jO=-GIWyi><%;~K6p3XNkihd1jYEaF2qWYh0ktzCAr86k6YbAZPc91ki=~Jl8C~bC7 zp=DZirgPTU!s#Hm`Mvjp(0_aAy`NF)gAc&%t-9CQFdc%@ebPfvk<#|fENG{fP``-L z>Zi%&_lab+Mz6DMQhBLs4QeODQ5O80*);y+=i_I;82|ZK<7fZ4`up>{=@xs6mDZS) zZ=cDiH$aV~i@>dZ+m3E%(n-=DE+e&G`z(>_8#2kQNC`hyQH(Xv1Ahb6BTkUdA|SCe zDh>jLO&FJ`?nJRwsyh*BJ=II3^c5ylV1r^W@DPtNMw-L~kyuHsV=nyAo00NwpN{|X z*;`V+CFOU9l#GQ+Xu%Ql6!0se8kvZNz%(9fxoQXUP!3NJ=s5QUi$G4dl0h1Sr3VCrk1kdozYEywG#yi{HTP{j!B2Q=?oBSN#z zHH7EdgX|)V@u(=TU;X^$_~jqQ&wul_w!W>c-+|g1>Xk9YxHSTy zF+5~3idbe>pcvFjsu1;v2WK@Qycm}v;8qe=Bj9NDY6K38n~D6#Omk&^F;VEqrz~q&*74vp>96Q;KdBe1xgUo=6{QR^TKUT=5X)JZMR;e?6%u! z?`Cj|9OTSzzOO8IYaYvPyYJ1 zdyS9m;C~UYH%D{r=;I>WXQPuoY9>qg#?i;q(UoAQ2XLhB_flvfA*NcGn&GDS$Vqs` zLRQV^Z&kDa&UWb~c(Mq(qvLkiFQMZmwhwgZ=F!K~(XBz17|;=us2Wi-R4n}45g@5a zZK_I=8rMt-JpGWppyl?GtIQ=Qu}x^@^>8CvD}SRaXo;<8@oUkdluWp!xi(PdvL-+0 z1KycURLYu}e~5C?bPKH9Uh9>xaueGVv&2?rl}-%H0cKf%=XFob15Amej43(!yCZH{ z-_4=r=8P*%fxa`f%TM=#q1*eK5{7PKn=o9#VFkl2D7^;0aRGIVVSzccL6k~13%1x5 zHh)cKo7Zim_3r!Tymj9$e49e-bgxw|#7<&wVqz%hdj#c*DGXg06Jpkvz~;a3*%2z0 z^-A-PU^BIpXhJE4S^YsCf2|J*G6z^@aa+dHjD+O9u!C6RDP(2LJ%7DF6UaO928D02BZS2nYb&t#nrh6RDP( T2LJ%7DU+53R0jA500000SDXYk diff --git a/script/bpmn/请假流程(边界定时任务)-leave7.zip b/script/bpmn/请假流程(边界定时任务)-leave7.zip deleted file mode 100644 index bd553753af1a443ee96e3faa6949f8f007f878b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2172 zcmbW3cRUo18^_PcibTa3Me43(W{*-L~`nGQ3W*uW97pk@$~tmOLw_;3WEJ}eSa z!j-eBF?(XE9-(MH6vfiU{i8If} z4+n9pw=yDWRq**(TaUqiGU=GieQT+mG6^zLgxHSc&~ua8&3x|Z9t!LnQYdz16Ru-{ zo;bB-oEE9MdfS)O#^^9&yOZS?9MGteG^NC^DeDy}cR^Mfyc48aM^)H0y`gF3m-vbl zkpYpHO6gIg)&@mV!toh8^PDp2%*O_bbLl6uv8dyX(3IZxLMI188kP4|Q{GUtUq4Ix zyQCj24VQhbneFse_RHfBEBW(*iPj>_H+pM5UdE6WW7{#** z-Lfe|wa1pNuJNAoqiNkM_taE^PH4YV6X2(N_nhIu3P-!R5vkLI)%mCU^J`Q%+Nw;G zAt0ZhxtnGFx*9ayW{ABAY%s4erZ2M)UW^Iu#W%Il5~V7`)1*YXJ8mb&A$y)oC%#o4 zTkk(KL6xrA=6ol4Y_ywPz|s}H6?vDI(+%RD!rO_s9%S?B*n7o#YY(7L{WccH{N@Ti zcYrV5*`@0^#Gc7yl7^hL1;gYe{5wuDfKxD|q?QVmXq`{b&x zdnD%DwPxr$hx&W&(iENHA;G(}Y06wSDc)=n+v*yoYe`_i+QjnP@rGF+<00iPUu`C@ z^oi73{GJycOU=A~S4BoRi=&8l|LH-S_@FwT7pfVuC`+uX+RGqC^ZV^-qVu!Wn?sI&Z6OWcEZDdN0AcwtvMznLi1a3282bt6}o`nz= z8Vee5#9xF4+!vAl1_Xqnekz$L_nNig>nF}{xz-ynX66X@0Ih+p5l+Ja1GRfWyUP)8 z6l0ILq?0Vca*c&?H^DrxM|=!kQ|GpT5n^EZoK_knc2vyBJ9gB5*j`JrM)1N7mZ+<5 z9F+yFBIG1IVy+o_JZCZ>%TV5mPatwbm3mF)3QL%t^jj{xmNx}+beT_6NNyyhV-1aHO}bcd@8s7Uodn^ z&y>)I0V8m!4n~~n`;?#ceZEJ+gT)mm$CQoD_uF&F2egE_O!VQz1Uz*25bGXcn9cdm zk*Hqv_Sgd)CUe_x%|d*`T~;XD5w5k}8HXxe*0vKnr<(rxHFb};{jrH7n{CE5@`=2@V5^||<(jXqc4sm?9=J%n)4o(tL_p3q_STpAJb{z(M0bfl0q$kNQ!4GuljbTFS|m;l7x4w4$>qWo28s zD4JWe!Vg^`iRwXDFwGdKXJ<52U4MYSPZ;Sb0v1B+&ah$r`N0nZ778_7iFb{=-6J@{ z{d*JO49wRm`?R#$#+NoO{+WzTAn=fB;7=ejtz%Y`49tRsNa#El%L@#vSMS$bdMtKV z9*gQx9vMb)pmx9}Ak}U=kr5{M^sd8TNT(GXnr*Q2+p{M@N4V@Lvb`_wBC({4f8X5kU3MF#Y{Q_h+8| K+4L-b+kXJqoHOeH From 714c87c259fc199c564dfdc5336e80d724a640b2 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Mon, 5 Feb 2024 21:37:06 +0800 Subject: [PATCH 137/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4bpmn?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=BF=AE=E5=A4=8D=E9=A9=B3=E5=9B=9E=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/TestCustomTaskHandler.java | 2 +- .../service/impl/ActTaskServiceImpl.java | 2 +- script/bpmn/请假流程(子流程)-leave6.zip | Bin 2182 -> 1587 bytes script/bpmn/请假流程(监听)-leave7.zip | Bin 0 -> 1232 bytes script/bpmn/请假流程(监听)-leave8.zip | Bin 1535 -> 0 bytes 5 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 script/bpmn/请假流程(监听)-leave7.zip delete mode 100644 script/bpmn/请假流程(监听)-leave8.zip diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java index 478328391..fb04cd01f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java @@ -14,7 +14,7 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -@FlowListenerAnnotation(processDefinitionKey = "leave1", taskDefId = "sid-31C52262-04C3-43D8-A3FB-8434017A6572") +@FlowListenerAnnotation(processDefinitionKey = "leave1", taskDefId = "Activity_14633hx") public class TestCustomTaskHandler implements FlowTaskEventHandler { @Override diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 19c5de554..031d676f3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -611,7 +611,7 @@ public class ActTaskServiceImpl implements IActTaskService { //判断是否有多个任务 List taskList = taskService.createTaskQuery().processInstanceId(processInstanceId).taskTenantId(TenantHelper.getTenantId()).list(); //申请人节点 - HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().finished().orderByHistoricTaskInstanceEndTime().asc().list().get(0); + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).finished().orderByHistoricTaskInstanceEndTime().asc().list().get(0); String backTaskDefinitionKey = historicTaskInstance.getTaskDefinitionKey(); taskService.addComment(task.getId(), processInstanceId, TaskStatusEnum.BACK.getStatus(), StringUtils.isNotBlank(backProcessBo.getMessage()) ? backProcessBo.getMessage() : "退回"); if (taskList.size() > 1) { diff --git a/script/bpmn/请假流程(子流程)-leave6.zip b/script/bpmn/请假流程(子流程)-leave6.zip index ded3cea9216eb9bc229ed475d7cd841b77cdd384..ca53c3bb6707ce3c12a27db7d55a07e21bdd8409 100644 GIT binary patch delta 1470 zcmV;v1ws0T5wi>qP)h>@6aWYa2mmdqMOcvzJ%8O~m!zJM6eP6+ z7_eQVNrB!3id<8)BvR%>4+jMjG)Nod&>ULyC)AfBhoUGD2k4)v? zB%ZfjUkOuS>7|kg_+vj%(p+Jsi>p+RJlhug{q*MP}f@ z=+K$2n_GhO-5x4&IJ|K`K5&#%s3 z|MmXc%b(xS@2^r-q>Ks`M7uNSMX7#zdFa~^P#c%;pI!d+nusF>KaLz9ajW+TVSnm_ zNvs~9)jCRc8=F;fyW~zB!r+M+j#4)dtjL|Y(Xy|eEp?}ULY-ZG{|mzW$GdmAKNoR% zQudeK=HpWJmJVi785e~?!-uCaIxR3!N|6=4$WrLXfdxN@$82VBsnXl!NR&#`1Q=tw zY=h?j)FQvR926YHgQG&}OM-$FW`C(!mqKU+F&M9=u*{kCTOSz5s$DZOuVs5naH`f% zIQB|p5z}SSY}%HV(dFXB^$)+x5D|e|>_*^XrP0VUR%BO8~Vt*K3gO@^< z*JAo%Ukv@&`tiw4^RBEZ5U8CsVtqslbp7@D^^fP5uijo=e0TNc<$t|WS^n2oY8;Ga z!_y5aMSKYw1+53aQIHy}E!I?rO*dwX^*^Z;&HwsJ)q#IDus5j`_QkJMRt#>XXaVv{ zLC;?8tg0D7XL=%wgQX#qI)A!C&8-UoTM&dmQ5HgAk!7zWC4VPXzxH*{o0vLf-iK!w zH=HY!ARS<5qh0}NCns+K_nWKRjf8ZqTyJE?H9a>D4A!_J zvd%n7(@>qQ)k(K+yMHUmD$T+bInp(pBhaX2VF0y|q~@9=75eT+2ZFg<6$oK>MIb<{ z-&rKgK`V#B?+v^d41h@mS~;oodV#TZ`8M)Bs4c@5sK|HL2;FdZF*Q9KBK;_cVHJ9V z769Z0Xw(V?NYCM>Nya0#Fv*+^Y6WIZRk!uRpH}}jQjUksDu0TTakL6~>+a7gnZ+u( zgQvBMKvGuRbs%^ms|tk7Y!!jDz#aD-GChip183|l^&GWv>pf@Jc3^2=E@Nc2=>kM# zWo|B~Xts+|+Uxj)YDr&FD&)xVVC5LZ39$8m$=WCYOqWVAkUAGgS&klq%>m=>Nd%be zR$?GcE|9VurGNY8fbp&*0!%h3F%Y0~k?;fwyEli7f6o*_Cck!yk!X#ZA*KV_#(>Fh zl%iutenS-lF}OfDa`oE+j8`)eV6wPX)LOeKDYV;yOja@xDagWBfkfvb;Rw>n@J5iC z+v#qGSHJSQ*W2nSh5u^xw*CfCO9u#l!0DK01pojG8yo-tP)h*<6aW+e2nYxOEvZFV Yf57ROX9WNN3mcO!2vG*Y1poj504q|!HUIzs delta 2081 zcmV++2;TRz42BU7P)h>@6aWYa2mtVCQ z45?nmG&X>ESj@1ys;la&SJ(3RgR9Z7^*o-=l5u*{MjhC0#c6NcPtw6j`zMb>Alo0D z-hVsp$7e~JWOmc6Whv6xN&7s@CP&@w<>h5(JQ{Sy(?NGOiF;l1@WF>&3=xD3)9!g zpm{bKrRC22xu3Y|;s2trS;Jy zPFs)07t>zcdNA(C!+5&d_tVm^ct={#I=$Cw9WVH`5)0}uj-JQ7-Ab((C+&Z~`hWYI z&wl;w-#)u}`QktS_|2O?e_cL*)ovxT;41E2WOHn@=|x&J?^eZ7rZWJ@$_*t`*g`kK;Jha^Z*GY0Td|% zwD2*&2r_~wHO8<~{+r+Z)vEBXZ-2hYS(ltjA>&_M*tm*wyDgb}BtRNkzC?Msm?8ki zXal&FQ3k#g7@Kx$Rv7ok@!2hOTfn;{a#ABVNJY$2@{4B=E0E>fv=Vk6!o&?xy_Ow>5o9kX^{aIdz$moV$o{&gO5F5Kh_`T9{$NER^y$# zo26JR+C+Lb1~xw=!~J9!CV$s9n;<2{&!g)fB2GHJ@n~JB`cV!d4Wn6>n}0v4ZvOD< z=EbjW{`AGoi@(?$aX;B1QF&6MP(?wDvhfu3q7+!wCc`+}Q>e3OI9tc7nR~^hx?6o} zGkY{Sxre!rx$%KO%BBHjgW2f7FA{5`mgA6f1se-_GklJdY1H(g~F(UKwP!evB8v%ucjA>we4gqBW z1)7i$5TE*n@X)Z3ugA^%pm`rO{|`aa*kUTmPzXZ=0u|UYAtVDD*?x^Etp!9>`bgJW zOs8gSv&D4kx*A)|ZGW=+9tp7^0vI0HpqD-e5-Z#8G6RWVTIzt-WOr-+He`1yrnizk zFq%N3wKcS5Mg_EDh>!q-wTB=k*6yq(yIW1Kwe}7P?N+iAO^pgQ1yU*7-b4FGV`&|M zcsS%l`-G92>~48=Lw47+-f%7Ht}Yh4u2_=dfCwG}jClYk_kS5MLC8QDViscP3#sc@ zEVoPFhAvK*qGnxcMJfyp*D_E*YnD3#w*tt(B7l$$KCC%mURk8R{pD+?3bm^~-G%CO z=W5d(tW0;JE^Vz!ZbJ{Iq>Xux0Irb@E>E*O$q5i5-=j=Hig;MBNKO-njfixLqUMOK zHJ}vxh%n)Skbhuq-)vscLCEu0MyW@TVW!@IHe0|ZAe-4V0ZP-nCKFrNBryQlijhxm zbP&|@t6NIguz;)7n-(}Or+&rDd{BCn&qMtr8cd^6p-Scb>0*$#(7HnKa2Ta=EB|8Q zE32Vj$)nh^&S9O$qw{F8!NYwJR-RHYdFnnKT*X{5?|(fqRujC)Zty;t);K4?RF#C z&*ka&;D7RN*MYj;Znv5J^v-?%(0V)F3L5lwyG^_+)MZ8Q`HNLs!IhhfgJpJ?8&p$f zcew!W2e(*Nw1dIz*4fncc5CnUtY{D(-p`%7vj)Z8y1Kpm+?wt?bo8JFkee=bOjK`6mt6j5u@z3XptQE)rXf^6Lz?bQb-6wnAz*wL11(n z(bQmcBfE=Hh7hzUvb|%g+Bh66xZHj(RYS#%>@JojS*AY71yhvopZicAq^n?(7#|ob zw}0N%uyP~2i(MY$|5E@}F4hOb#BKCm!+*q$Y#Sz<1!gmV$U#w2f~|EAa#=-`RD>cZ z85W4(+lCW_)p$~J6;4P92yJB|N~m3Yx8S(;buk*B59I4Z_|tpG-OA6hPyY*0O9u$Z z*;^Iq$ri?S2*?lr@il2 ze?KK@6Jfn=OH)I_dD&C9Hfni4keb&So2^k_@$tpI&OZ;nWF#Eo**(KZS;>%pI?q$f zrFHRvhYW1K$-KV7t<(A=L4$w(oVnV&R;|o(&(}_W-+xTl^4rVxoO(Z6b>A&py=qxa ziCJaVnS+ksH+X9l@e0IE-}iV{#r>AW#}D;O&UD**J7Y?5mA-G=-ZSc_YIQQ@<2Ii1zxLh*%dWZX&T}E;_L(oP z7bG=amdS*je57XW&2*4eiF@9&*ycx~%Vw{<JBSa#~? zrMFTs3m4n|mY811DY2-gVq3~urisGt)6Oe-ABkpTt6|uzWW3R@W_L{IrHBp7?%$sf zYOVX@ynbH&5ASI$yJ}rHw#6i@-_pYz5nQnNncVFM240;Nhwm+&w}CBL()2rva2j7@ zN)xZxB7?Z!jMlO>7JEK(vO1|>l$3mLRdec?+meW&oG7m&(Yh_MjVvF_Ia4mPDt&fl z?b#8RScTsKQy=ME)mrKlVm5g}{0f$JGkG=tnS@4bC*QMMIah?KYNN}s zK%rHVRc~U853uZ#`J%K;;=99{%zYjC2kJ^L_8M$rdh(%U=T{Rexg>+)#`G-z7N zv*O!(xAj#r52?9MGRxIi^81^JCQnb1=vCu&i(2CJ-|@b!yC%IhZ{5dTpZ>F2n(1oP z@=R3}vzuDP5jjO5x27yM;NG5-i5Iu}O*}1YeNonRH`61I8*&Yg`j)D&LiEwZFhdp!yjd9nCIM?`_-YU+DPZzx3~uG+kYnYynpa% z@9BSB+B^RrTJHXzF~FOhV~tnY5-t`721kAdh5&CyCJ_ci8G|ebDq~Oq@g+`xH!B-R PFC!3w3a%ueeGCi$m6bI2 literal 0 HcmV?d00001 diff --git a/script/bpmn/请假流程(监听)-leave8.zip b/script/bpmn/请假流程(监听)-leave8.zip deleted file mode 100644 index 4c655036e6429cd7df284b01ac88fb038fdd6f7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1535 zcma)+Yd8}M7{|AWsW5lpq;kU4TnaHH=1>+%2SdswF}F}Ib4}!$OD?%J#9VUEZI(+e z*+NZji!BzJEzz2`WWuRWr}ORn-Vg8pdH&D)yx)E{2tIyE00;yEB-Y<|0Q`p9&&+JX z(c_Yq+v6BDX{_#KM)3oBRz0gb1?uPN7V4>|?jGnLa8gq}+~02wX_ZDbm+fUZ)Rez< zM4VDWUGJ9X2<`7G&hkT8f=r&ObRLt!64{%S-!MW1hb)9VV{1k?K!^fQ&y8k zbPdiQjxC;%YZ$*)o0S}FAp?V+XP~|2=SbYiaU1;w$3xY_jkPTA+JT$^N?OiNBdJW(A1ltq9|((qk;2ur-z84? zQv>Gk2c`IsM@D$vda34yiWYP9j|hmo7fQx79ysDTQU89nQO^EyuDnNyDsJ*TnLgr1 z`2a70E=MD`M&7x-ukZ0qop`bc(MpCbjSG3zX7}laPCqZ*{kHN^CU%?0;kGu>x__*5 zGiklNWyWcZ=eBuzqSojz+gAzD79kA}6YW4tdwvx|$jBY^J9x>Eg8O&%iJIl3ayI+5 z(gczzC5Oa)WRHwb_gMP^8{DmeOa8FftU&)sBNo-6l}~E2!CWDD#z(R16073zo%~6i z^FKbZV&b-UHy7`LTr6r&4;z=9y%hAI4IQ}bG&Sz8c-P=ed87Pcfk=3j;>lOd4aISd zYUsjQ=N}8sfpu+|c&vAFf_4WUattV}of!d~Fe>kFd1apAB`!(PJ<{=6Q0^*rX=9Ak zy9>ATF=$r`^fq45tf98w@RA2q5}vOP&HBi z0;6!?UShM+KxMBm~Nq|Hx7;wl2fO8Xp>7w18F z)$V^|9qpLY*sqzTK4AMORwKiJNOD=AM{c+ZQsc)iPf@az^vB{jF#rO*Ci8$EzXPk8&?wH!`8a@=(hVj3xLUqqWd*Cb3uIFe)tr^rVS&sDiUg-SxWA-DaMe7sw$?Fy!9FXPHcj5T{x92HU7{5NJfpi=;v2hg#^>vDo1t{D7IcSy0<(buMQd#h=DtQ z?(4dvdqbGgD&y*pN~0+6J`8>HsnmgDn~r?#^rBNkv^Y$cb}#R-2z2y8dCPC>2BOf|+9>5OWiW_*A%a;QtGGG+N3F-UH{ z#pn5}ITj+JQtQmy#fEey8CyiiHe9ZpMop3Oo+xePe=ULqH(RYR3A!Qn=CmNTtGAYA zh^%LaKT^4;?M&L%*1kH6TGq9uLy(zRcHpVoZ-||3%89DIo0-Fyba{>=@5(o7t9oot zE3J!+(%Gr&+7Put2!e6}_%Qvw0Kh(J0Kf(T+#?D2SINJ3zm)u6{=cAY5PJoF-2#6O M^5=f=^B(~44@aE$iU0rr From 2551d16d08e06cb77485dd5f20b26c4be191f5d1 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 25 Feb 2024 22:07:01 +0800 Subject: [PATCH 138/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E9=99=84=E4=BB=B6=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/bo/CompleteTaskBo.java | 5 ++ .../workflow/flowable/cmd/AttachmentCmd.java | 68 +++++++++++++++++++ .../service/impl/ActTaskServiceImpl.java | 3 + 3 files changed, 76 insertions(+) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AttachmentCmd.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index 87c742e0b..9c31df7db 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -28,6 +28,11 @@ public class CompleteTaskBo implements Serializable { @NotBlank(message = "任务id不能为空", groups = {AddGroup.class}) private String taskId; + /** + * 附件id + */ + private String fileId; + /** * 消息类型 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AttachmentCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AttachmentCmd.java new file mode 100644 index 000000000..0257388d3 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AttachmentCmd.java @@ -0,0 +1,68 @@ +package org.dromara.workflow.flowable.cmd; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.vo.SysOssVo; +import org.dromara.system.service.ISysOssService; +import org.flowable.common.engine.impl.interceptor.Command; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.impl.persistence.entity.AttachmentEntity; +import org.flowable.engine.impl.persistence.entity.AttachmentEntityManager; +import org.flowable.engine.impl.util.CommandContextUtil; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +/** + * 串行加签 + * + * @author 附件上传 + */ +public class AttachmentCmd implements Command { + + private final String fileId; + + private final String taskId; + + private final String processInstanceId; + + public AttachmentCmd(String fileId, String taskId, String processInstanceId) { + this.fileId = fileId; + this.taskId = taskId; + this.processInstanceId = processInstanceId; + } + + @Override + public Boolean execute(CommandContext commandContext) { + try { + if (StringUtils.isNotBlank(fileId)) { + List fileIds = StreamUtils.toList(Arrays.asList(fileId.split(StrUtil.COMMA)), Long::valueOf); + List sysOssVos = SpringUtils.getBean(ISysOssService.class).listByIds(fileIds); + if (CollUtil.isNotEmpty(sysOssVos)) { + for (SysOssVo sysOssVo : sysOssVos) { + AttachmentEntityManager attachmentEntityManager = CommandContextUtil.getAttachmentEntityManager(); + AttachmentEntity attachmentEntity = attachmentEntityManager.create(); + attachmentEntity.setRevision(1); + attachmentEntity.setUserId(LoginHelper.getUserId().toString()); + attachmentEntity.setName(sysOssVo.getFileName()); + attachmentEntity.setDescription(sysOssVo.getOriginalName()); + attachmentEntity.setType(sysOssVo.getFileSuffix()); + attachmentEntity.setTaskId(taskId); + attachmentEntity.setProcessInstanceId(processInstanceId); + attachmentEntity.setContentId(sysOssVo.getOssId().toString()); + attachmentEntity.setTime(new Date()); + attachmentEntityManager.insert(attachmentEntity); + } + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 031d676f3..005a01a0b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -156,6 +156,9 @@ public class ActTaskServiceImpl implements IActTaskService { taskService.complete(newTask.getId()); return true; } + //附件上传 + AttachmentCmd attachmentCmd = new AttachmentCmd(completeTaskBo.getFileId(), task.getId(), task.getProcessInstanceId()); + managementService.executeCommand(attachmentCmd); FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); String businessStatus = WorkflowUtils.getBusinessStatus(task.getProcessInstanceId()); if (BusinessStatusEnum.DRAFT.getStatus().equals(businessStatus) || BusinessStatusEnum.BACK.getStatus().equals(businessStatus) || BusinessStatusEnum.CANCEL.getStatus().equals(businessStatus)) { From acbef6e1708a691b22033b543f599e3edc3a8b81 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Mon, 26 Feb 2024 21:41:37 +0800 Subject: [PATCH 139/159] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E9=99=84?= =?UTF-8?q?=E4=BB=B6=E4=BB=BB=E5=8A=A1=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/domain/vo/ActHistoryInfoVo.java | 7 +++++++ .../dromara/workflow/flowable/cmd/AttachmentCmd.java | 2 +- .../service/impl/ActProcessInstanceServiceImpl.java | 10 ++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java index 067b6f5d8..459b2d0f6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ActHistoryInfoVo.java @@ -3,10 +3,12 @@ package org.dromara.workflow.domain.vo; import lombok.Data; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; +import org.flowable.engine.task.Attachment; import java.io.Serial; import java.io.Serializable; import java.util.Date; +import java.util.List; /** * 流程审批记录视图 @@ -79,4 +81,9 @@ public class ActHistoryInfoVo implements Serializable { * 审批信息 */ private String comment; + + /** + * 审批附件 + */ + private List attachmentList; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AttachmentCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AttachmentCmd.java index 0257388d3..fc335048c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AttachmentCmd.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AttachmentCmd.java @@ -49,7 +49,7 @@ public class AttachmentCmd implements Command { AttachmentEntity attachmentEntity = attachmentEntityManager.create(); attachmentEntity.setRevision(1); attachmentEntity.setUserId(LoginHelper.getUserId().toString()); - attachmentEntity.setName(sysOssVo.getFileName()); + attachmentEntity.setName(sysOssVo.getOriginalName()); attachmentEntity.setDescription(sysOssVo.getOriginalName()); attachmentEntity.setType(sysOssVo.getFileSuffix()); attachmentEntity.setTaskId(taskId); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index b334f2fc5..318e1227f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -42,6 +42,7 @@ import org.flowable.engine.impl.persistence.entity.ExecutionEntity; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstanceQuery; +import org.flowable.engine.task.Attachment; import org.flowable.engine.task.Comment; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; @@ -318,6 +319,8 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService list = StreamUtils.sorted(list, Comparator.comparing(HistoricTaskInstance::getEndTime, Comparator.nullsFirst(Date::compareTo)).reversed()); List actHistoryInfoVoList = new ArrayList<>(); List processInstanceComments = taskService.getProcessInstanceComments(processInstanceId); + //附件 + List attachmentList = taskService.getProcessInstanceAttachments(processInstanceId); for (HistoricTaskInstance historicTaskInstance : list) { ActHistoryInfoVo actHistoryInfoVo = new ActHistoryInfoVo(); BeanUtils.copyProperties(historicTaskInstance, actHistoryInfoVo); @@ -342,6 +345,13 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService } catch (NumberFormatException ignored) { log.warn("当前任务【{}】,办理人转换人员ID【{}】异常!", historicTaskInstance.getName(), historicTaskInstance.getAssignee()); } + //附件 + if (CollUtil.isNotEmpty(attachmentList)) { + List attachments = attachmentList.stream().filter(e -> e.getTaskId().equals(historicTaskInstance.getId())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(attachments)) { + actHistoryInfoVo.setAttachmentList(attachments); + } + } actHistoryInfoVoList.add(actHistoryInfoVo); } List collect = new ArrayList<>(); From 305f9ea1392d73b6c7790edffc7505409edb1416 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 26 Feb 2024 23:13:15 +0800 Subject: [PATCH 140/159] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81id=E7=94=9F=E6=88=90=E5=99=A8=E4=BF=9D?= =?UTF-8?q?=E6=8C=81=E5=85=A8=E5=B1=80=E7=BB=9F=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/flowable/config/FlowableConfig.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java index 3fee71a5c..95233d1eb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java @@ -1,6 +1,8 @@ package org.dromara.workflow.flowable.config; +import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import org.flowable.common.engine.impl.cfg.IdGenerator; import org.flowable.spring.SpringProcessEngineConfiguration; import org.flowable.spring.boot.EngineConfigurationConfigurer; import org.springframework.beans.factory.annotation.Autowired; @@ -19,10 +21,12 @@ public class FlowableConfig implements EngineConfigurationConfigurer identifierGenerator.nextId(null).toString()); processEngineConfiguration.setEventListeners(Collections.singletonList(globalFlowableListener)); } } From 448cd53734381603eaf856563a21d0aebe1f44fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 27 Feb 2024 00:23:54 +0800 Subject: [PATCH 141/159] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E6=97=A0=E6=B3=95=E8=87=AA=E5=8A=A8=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E5=BB=BA=E8=A1=A8sql=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application-dev.yml | 4 ++-- ruoyi-admin/src/main/resources/application-prod.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index d4484926e..85db5c9be 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -43,7 +43,7 @@ spring: driverClassName: com.mysql.cj.jdbc.Driver # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) - url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true + url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true username: root password: root # 从库数据源 @@ -51,7 +51,7 @@ spring: lazy: true type: ${spring.datasource.type} driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true + url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true username: password: # oracle: diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index af8d2e399..0e0f92b41 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -46,7 +46,7 @@ spring: driverClassName: com.mysql.cj.jdbc.Driver # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) - url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true + url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true username: root password: root # 从库数据源 @@ -54,7 +54,7 @@ spring: lazy: true type: ${spring.datasource.type} driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true + url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true username: password: # oracle: From 3ace3643cc683cbb8e59620037d936f125dd187d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 27 Feb 2024 00:42:00 +0800 Subject: [PATCH 142/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=8E=92=E5=BA=8F=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/ActProcessDefinitionServiceImpl.java | 1 + .../workflow/service/impl/ActProcessInstanceServiceImpl.java | 1 + .../org/dromara/workflow/service/impl/ActTaskServiceImpl.java | 1 + .../org/dromara/workflow/service/impl/TestLeaveServiceImpl.java | 2 ++ 4 files changed, 5 insertions(+) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index 009a1ad29..fda10d322 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -76,6 +76,7 @@ public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionSer if (StringUtils.isNotEmpty(processDefinitionBo.getName())) { query.processDefinitionNameLike("%" + processDefinitionBo.getName() + "%"); } + query.orderByDeploymentId().desc(); // 分页查询 List processDefinitionVoList = new ArrayList<>(); List definitionList = query.latestVersion().listPage(processDefinitionBo.getPageNum(), processDefinitionBo.getPageSize()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 318e1227f..1c2acde5b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -112,6 +112,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService if (StringUtils.isNotBlank(processInstanceBo.getCategoryCode())) { query.processDefinitionCategory(processInstanceBo.getCategoryCode()); } + query.orderByStartTime().desc(); List processInstances = query.listPage(processInstanceBo.getPageNum(), processInstanceBo.getPageSize()); for (ProcessInstance processInstance : processInstances) { ProcessInstanceVo processInstanceVo = BeanUtil.toBean(processInstance, ProcessInstanceVo.class); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 005a01a0b..1782cd24b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -278,6 +278,7 @@ public class ActTaskServiceImpl implements IActTaskService { if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) { query.processDefinitionKey(taskBo.getProcessDefinitionKey()); } + query.orderByTaskCreateTime().desc(); List taskList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); List processInstanceList = null; if (CollUtil.isNotEmpty(taskList)) { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index af4f93123..7b55ee5a1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -8,6 +8,7 @@ import lombok.RequiredArgsConstructor; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.TestLeave; @@ -75,6 +76,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService { lqw.eq(StringUtils.isNotBlank(bo.getLeaveType()), TestLeave::getLeaveType, bo.getLeaveType()); lqw.ge(bo.getStartLeaveDays() != null,TestLeave::getLeaveDays, bo.getStartLeaveDays()); lqw.le(bo.getEndLeaveDays() != null,TestLeave::getLeaveDays, bo.getEndLeaveDays()); + lqw.orderByDesc(BaseEntity::getCreateTime); return lqw; } From fa31ee44f65502a4bed4f2bdc7e9c37a41984c39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 27 Feb 2024 00:43:10 +0800 Subject: [PATCH 143/159] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20flowable?= =?UTF-8?q?=20=E9=85=8D=E7=BD=AE=E5=88=B0=E4=B8=BByml=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yml | 18 ------------------ .../src/main/resources/application-prod.yml | 18 ------------------ ruoyi-admin/src/main/resources/application.yml | 18 ++++++++++++++++++ 3 files changed, 18 insertions(+), 36 deletions(-) diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index 85db5c9be..69ee3995d 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -88,24 +88,6 @@ 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 0e0f92b41..c2cbd2d5d 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -91,24 +91,6 @@ 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-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 265e1ef1b..7cc02071c 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -266,3 +266,21 @@ websocket: path: /resource/websocket # 设置访问源地址 allowedOrigins: '*' + +--- #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 From ac2e88dc0ad7c251cc0f71c3e9b9ee8a4306c479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 27 Feb 2024 22:27:07 +0800 Subject: [PATCH 144/159] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E4=BD=9C=E5=BA=9F=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ActProcessInstanceServiceImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 1c2acde5b..ed9c70083 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -470,10 +470,10 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.INVALID.getStatus(), deleteReason); } HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceBusinessKey(processInvalidBo.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); - if (ObjectUtil.isNotEmpty(historicProcessInstance)) { - BusinessStatusEnum.checkStatus(historicProcessInstance.getBusinessStatus()); - } + .processInstanceId(processInvalidBo.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); +// if (ObjectUtil.isNotEmpty(historicProcessInstance)) { +// BusinessStatusEnum.checkStatus(historicProcessInstance.getBusinessStatus()); +// } runtimeService.updateBusinessStatus(processInvalidBo.getProcessInstanceId(), BusinessStatusEnum.INVALID.getStatus()); runtimeService.deleteProcessInstance(processInvalidBo.getProcessInstanceId(), deleteReason); FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey()); From 40ab60b4fc4feebeaf17c64915d4c25ded0e819a Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 29 Feb 2024 19:07:25 +0800 Subject: [PATCH 145/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E4=BD=9C?= =?UTF-8?q?=E5=BA=9F=EF=BC=8C=E6=92=A4=E9=94=80=E7=AD=89=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ActProcessInstanceServiceImpl.java | 10 ++++++---- .../workflow/service/impl/ActTaskServiceImpl.java | 7 +++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index ed9c70083..39b44000c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -471,9 +471,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService } HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(processInvalidBo.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); -// if (ObjectUtil.isNotEmpty(historicProcessInstance)) { -// BusinessStatusEnum.checkStatus(historicProcessInstance.getBusinessStatus()); -// } + if (ObjectUtil.isNotEmpty(historicProcessInstance) && BusinessStatusEnum.FINISH.getStatus().equals(historicProcessInstance.getBusinessStatus())) { + throw new ServiceException("该单据已完成申请!"); + } runtimeService.updateBusinessStatus(processInvalidBo.getProcessInstanceId(), BusinessStatusEnum.INVALID.getStatus()); runtimeService.deleteProcessInstance(processInvalidBo.getProcessInstanceId(), deleteReason); FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey()); @@ -587,7 +587,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService if (processInstance.isSuspended()) { throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); } - BusinessStatusEnum.checkStatus(processInstance.getBusinessStatus()); + if (BusinessStatusEnum.CANCEL.getStatus().equals(processInstance.getBusinessStatus())) { + throw new ServiceException("该单据已撤销!"); + } List taskList = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(processInstanceId).list(); for (Task task : taskList) { taskService.setAssignee(task.getId(), String.valueOf(LoginHelper.getUserId())); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 1782cd24b..3a27c30b1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -434,8 +434,8 @@ public class ActTaskServiceImpl implements IActTaskService { throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); } HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey(task.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); - if (ObjectUtil.isNotEmpty(historicProcessInstance)) { - BusinessStatusEnum.checkStatus(historicProcessInstance.getBusinessStatus()); + if (ObjectUtil.isNotEmpty(historicProcessInstance) && BusinessStatusEnum.TERMINATION.getStatus().equals(historicProcessInstance.getBusinessStatus())) { + throw new ServiceException("该单据已终止!"); } try { if (StringUtils.isBlank(terminationBo.getComment())) { @@ -612,6 +612,9 @@ public class ActTaskServiceImpl implements IActTaskService { List executionEntities = managementService.executeCommand(childByExecutionIdCmd); //校验单据 BusinessStatusEnum.checkStatus(processInstance.getBusinessStatus()); + if (BusinessStatusEnum.BACK.getStatus().equals(processInstance.getBusinessStatus())) { + throw new ServiceException("该单据已退回!"); + } //判断是否有多个任务 List taskList = taskService.createTaskQuery().processInstanceId(processInstanceId).taskTenantId(TenantHelper.getTenantId()).list(); //申请人节点 From f8d26c14ccb6cb92eed0a84811435b33ae1e3bef Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 29 Feb 2024 19:08:07 +0800 Subject: [PATCH 146/159] =?UTF-8?q?remove=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/BusinessStatusEnum.java | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java index d23bb5dab..43204f542 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java @@ -89,26 +89,5 @@ public enum BusinessStatusEnum { throw new ServiceException("流程状态为空!"); } } - - /** - * 校验流程申请 - * - * @param status 状态 - */ - public static void checkStatus(String status) { - if (FINISH.getStatus().equals(status)) { - throw new ServiceException("该单据已完成申请!"); - } else if (INVALID.getStatus().equals(status)) { - throw new ServiceException("该单据已作废!"); - } else if (CANCEL.getStatus().equals(status)) { - throw new ServiceException("该单据已撤销!"); - } else if (BACK.getStatus().equals(status)) { - throw new ServiceException("该单据已退回!"); - } else if (TERMINATION.getStatus().equals(status)) { - throw new ServiceException("该单据已终止!"); - } else if (StringUtils.isBlank(status)) { - throw new ServiceException("流程状态为空!"); - } - } } From c3b8681a0326b8da77d285b1956d02dd2dfd550e Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 29 Feb 2024 19:26:23 +0800 Subject: [PATCH 147/159] =?UTF-8?q?remove=20=E5=88=A0=E9=99=A4=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/service/impl/ActTaskServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 3a27c30b1..663014ed3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -611,7 +611,6 @@ public class ActTaskServiceImpl implements IActTaskService { ExecutionChildByExecutionIdCmd childByExecutionIdCmd = new ExecutionChildByExecutionIdCmd(task.getExecutionId()); List executionEntities = managementService.executeCommand(childByExecutionIdCmd); //校验单据 - BusinessStatusEnum.checkStatus(processInstance.getBusinessStatus()); if (BusinessStatusEnum.BACK.getStatus().equals(processInstance.getBusinessStatus())) { throw new ServiceException("该单据已退回!"); } From bc218cb23a386e1a63d30decc0ec186b3b7964f5 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Thu, 29 Feb 2024 20:01:04 +0800 Subject: [PATCH 148/159] =?UTF-8?q?add=20=E6=8A=84=E9=80=81=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/bo/CompleteTaskBo.java | 6 +++ .../dromara/workflow/domain/vo/WfCopy.java | 23 ++++++++ .../service/impl/ActTaskServiceImpl.java | 9 ++++ .../dromara/workflow/utils/WorkflowUtils.java | 53 +++++++++++++------ 4 files changed, 74 insertions(+), 17 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCopy.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index 9c31df7db..062390551 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -3,6 +3,7 @@ package org.dromara.workflow.domain.bo; import jakarta.validation.constraints.NotBlank; import lombok.Data; import org.dromara.common.core.validate.AddGroup; +import org.dromara.workflow.domain.vo.WfCopy; import java.io.Serial; import java.io.Serializable; @@ -33,6 +34,11 @@ public class CompleteTaskBo implements Serializable { */ private String fileId; + /** + * 抄送人员 + */ + private List wfCopyList; + /** * 消息类型 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCopy.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCopy.java new file mode 100644 index 000000000..b1d41bbe5 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCopy.java @@ -0,0 +1,23 @@ +package org.dromara.workflow.domain.vo; + +import lombok.Data; + +/** + * 抄送 + * + * @author may + */ +@Data +public class WfCopy { + + /** + * 用户id + */ + private Long userId; + + /** + * 用户名称 + */ + private String userName; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 663014ed3..bd5e5ab3b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -20,6 +20,7 @@ import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.TaskVo; +import org.dromara.workflow.domain.vo.WfCopy; import org.dromara.workflow.flowable.strategy.FlowEventStrategy; import org.dromara.workflow.flowable.cmd.*; import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler; @@ -190,6 +191,14 @@ public class ActTaskServiceImpl implements IActTaskService { } } else { List list = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(task.getProcessInstanceId()).list(); + if (CollUtil.isNotEmpty(list) && CollUtil.isNotEmpty(completeTaskBo.getWfCopyList())) { + TaskEntity newTask = WorkflowUtils.createNewTask(task); + taskService.addComment(newTask.getId(), task.getProcessInstanceId(), TaskStatusEnum.COPY.getStatus(), + LoginHelper.getLoginUser().getNickname() + "【抄送】给" + String.join(",", StreamUtils.toList(completeTaskBo.getWfCopyList(), WfCopy::getUserName))); + taskService.complete(newTask.getId()); + List taskList = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list(); + WorkflowUtils.createCopyTask(taskList, StreamUtils.toList(completeTaskBo.getWfCopyList(), WfCopy::getUserId)); + } sendMessage(list, processInstance.getName(), completeTaskBo.getMessageType(), null); } return true; 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 index d84834ade..742ebe4c8 100644 --- 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 @@ -2,15 +2,11 @@ package org.dromara.workflow.utils; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.ObjectUtil; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.reflect.ReflectUtils; -import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.mail.utils.MailUtils; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.websocket.dto.WebSocketMessageDto; @@ -28,10 +24,8 @@ import org.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd; import org.dromara.workflow.service.IActHiProcinstService; import org.dromara.workflow.service.IWorkflowUserService; import org.dromara.workflow.service.impl.WorkflowUserServiceImpl; -import org.flowable.bpmn.converter.BpmnXMLConverter; import org.flowable.bpmn.model.*; import org.flowable.common.engine.api.delegate.Expression; -import org.flowable.editor.language.json.converter.BpmnJsonConverter; import org.flowable.engine.ProcessEngine; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; @@ -41,14 +35,7 @@ import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.service.impl.persistence.entity.TaskEntity; -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.rmi.ServerException; import java.util.*; -import java.util.stream.Collectors; import static org.dromara.workflow.common.constant.FlowConstant.*; @@ -95,6 +82,40 @@ public class WorkflowUtils { return task; } + /** + * 抄送任务 + * + * @param parentTaskList 父级任务 + * @param userIds 人员id + */ + public static void createCopyTask(List parentTaskList, List userIds) { + List list = new ArrayList<>(); + for (Task parentTask : parentTaskList) { + for (Long userId : userIds) { + TaskEntity newTask = (TaskEntity) PROCESS_ENGINE.getTaskService().newTask(); + newTask.setParentTaskId(parentTask.getId()); + newTask.setAssignee(userId.toString()); + newTask.setName("【抄送】-" + parentTask.getName()); + newTask.setProcessDefinitionId(parentTask.getProcessDefinitionId()); + newTask.setProcessInstanceId(parentTask.getProcessInstanceId()); + newTask.setTaskDefinitionKey(parentTask.getTaskDefinitionKey()); + list.add(newTask); + } + } + PROCESS_ENGINE.getTaskService().bulkSaveTasks(list); + /*if (CollectionUtil.isNotEmpty(list) && CollectionUtil.isNotEmpty(parentTaskList)) { + String processInstanceId = parentTaskList.get(0).getProcessInstanceId(); + String processDefinitionId = parentTaskList.get(0).getProcessDefinitionId(); + List taskIds = list.stream().map(Task::getId).collect(Collectors.toList()); + ActHiTaskinst actHiTaskinst = new ActHiTaskinst(); + actHiTaskinst.setProcDefId(processDefinitionId); + actHiTaskinst.setProcInstId(processInstanceId); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(ActHiTaskinst::getId, Collections.singletonList(taskIds)); + actHiTaskinstMapper.update(actHiTaskinst, updateWrapper); + }*/ + } + /** * 获取当前任务参与者 * @@ -188,8 +209,7 @@ public class WorkflowUtils { */ public static String getBusinessStatusByTaskId(String taskId) { HistoricTaskInstance historicTaskInstance = PROCESS_ENGINE.getHistoryService().createHistoricTaskInstanceQuery().taskId(taskId).taskTenantId(TenantHelper.getTenantId()).singleResult(); - HistoricProcessInstance historicProcessInstance = PROCESS_ENGINE.getHistoryService().createHistoricProcessInstanceQuery() - .processInstanceId(historicTaskInstance.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); + HistoricProcessInstance historicProcessInstance = PROCESS_ENGINE.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(historicTaskInstance.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); return historicProcessInstance.getBusinessStatus(); } @@ -199,8 +219,7 @@ public class WorkflowUtils { * @param processInstanceId 流程实例id */ public static String getBusinessStatus(String processInstanceId) { - HistoricProcessInstance historicProcessInstance = PROCESS_ENGINE.getHistoryService().createHistoricProcessInstanceQuery() - .processInstanceId(processInstanceId).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); + HistoricProcessInstance historicProcessInstance = PROCESS_ENGINE.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).processInstanceTenantId(TenantHelper.getTenantId()).singleResult(); return historicProcessInstance.getBusinessStatus(); } From 3c349485af5ea837fc6a1ae53424908ab98b17e8 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 3 Mar 2024 18:11:17 +0800 Subject: [PATCH 149/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=9F=A5=E8=AF=A2=20=E6=B7=BB=E5=8A=A0=E6=8A=84?= =?UTF-8?q?=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/ActHiTaskinst.java | 192 ++++++++++++++++++ .../workflow/mapper/ActHiTaskinstMapper.java | 16 ++ .../workflow/mapper/ActTaskMapper.java | 28 +++ .../service/IActHiTaskinstService.java | 11 + .../impl/ActHiTaskinstServiceImpl.java | 22 ++ .../impl/ActProcessInstanceServiceImpl.java | 8 +- .../service/impl/ActTaskServiceImpl.java | 59 +++--- .../dromara/workflow/utils/WorkflowUtils.java | 22 +- .../mapper/workflow/ActHiTaskinstMapper.xml | 7 + .../mapper/workflow/ActTaskMapper.xml | 46 +++++ 10 files changed, 369 insertions(+), 42 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiTaskinstMapper.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiTaskinstService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiTaskinstMapper.xml create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java new file mode 100644 index 000000000..c5b64357e --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java @@ -0,0 +1,192 @@ +package org.dromara.workflow.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.util.Date; + +import java.io.Serial; + +/** + * 流程历史任务对象 act_hi_taskinst + * + * @author gssong + * @date 2024-03-02 + */ +@Data +@TableName("act_hi_taskinst") +public class ActHiTaskinst { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id_") + private String id; + + /** + * 版本 + */ + @TableField(value = "rev_") + private Long rev; + + /** + * 流程定义id + */ + @TableField(value = "proc_def_id_") + private String procDefId; + + /** + * + */ + @TableField(value = "task_def_id_") + private String taskDefId; + + /** + * 任务节点id + */ + @TableField(value = "task_def_key_") + private String taskDefKey; + + /** + * 流程实例id + */ + @TableField(value = "proc_inst_id_") + private String procInstId; + + /** + * 流程执行id + */ + @TableField(value = "execution_id") + private String executionId; + + /** + * + */ + @TableField(value = "scope_id_") + private String scopeId; + + /** + * + */ + @TableField(value = "sub_scope_id_") + private String subScopeId; + + /** + * 先用当前字段标识抄送类型 + */ + @TableField(value = "scope_type_") + private String scopeType; + + /** + * + */ + @TableField(value = "scope_definition_id_") + private String scopeDefinitionId; + + /** + * + */ + @TableField(value = "propagated_stage_inst_id_") + private String propagatedStageInstId; + + /** + * 任务名称 + */ + @TableField(value = "name_") + private String name; + + /** + * 父级id + */ + @TableField(value = "parent_task_id_") + private String parentTaskId; + + /** + * 描述 + */ + @TableField(value = "description_") + private String description; + + /** + * 办理人 + */ + @TableField(value = "owner_") + private String owner; + + /** + * 办理人 + */ + @TableField(value = "assignee_") + private String assignee; + + /** + * 开始事件 + */ + @TableField(value = "start_time_") + private Date startTime; + + /** + * 认领时间 + */ + @TableField(value = "claim_time_") + private Date claimTime; + + /** + * 结束时间 + */ + @TableField(value = "end_time_") + private Date endTime; + + /** + * 持续时间 + */ + @TableField(value = "duration_") + private Long duration; + + /** + * 删除原因 + */ + @TableField(value = "delete_reason_") + private String deleteReason; + + /** + * 优先级 + */ + @TableField(value = "priority_") + private Long priority; + + /** + * 到期时间 + */ + @TableField(value = "due_date_") + private Date dueDate; + + /** + * + */ + @TableField(value = "form_key_") + private String formKey; + + /** + * 分类 + */ + @TableField(value = "category_") + private String category; + + /** + * 最后修改时间 + */ + @TableField(value = "last_updated_time_") + private Date lastUpdatedTime; + + /** + * 租户id + */ + @TableField(value = "tenant_id_") + private String tenantId; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiTaskinstMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiTaskinstMapper.java new file mode 100644 index 000000000..f8bb2605c --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiTaskinstMapper.java @@ -0,0 +1,16 @@ +package org.dromara.workflow.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.dromara.workflow.domain.ActHiTaskinst; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 流程历史任务Mapper接口 + * + * @author gssong + * @date 2024-03-02 + */ +@InterceptorIgnore(tenantLine = "true") +public interface ActHiTaskinstMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java new file mode 100644 index 000000000..eb90d5a31 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java @@ -0,0 +1,28 @@ +package org.dromara.workflow.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.workflow.domain.vo.TaskVo; + + +/** + * 任务信息Mapper接口 + * + * @author gssong + * @date 2024-03-02 + */ +@InterceptorIgnore(tenantLine = "true") +public interface ActTaskMapper extends BaseMapperPlus { + /** + * 获取待办信息 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 结果 + */ + Page getTaskWaitByPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiTaskinstService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiTaskinstService.java new file mode 100644 index 000000000..d71e93f87 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiTaskinstService.java @@ -0,0 +1,11 @@ +package org.dromara.workflow.service; + + +/** + * 流程历史任务Service接口 + * + * @author gssong + * @date 2024-03-02 + */ +public interface IActHiTaskinstService { +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java new file mode 100644 index 000000000..f44ddd246 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java @@ -0,0 +1,22 @@ +package org.dromara.workflow.service.impl; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.workflow.mapper.ActHiTaskinstMapper; +import org.dromara.workflow.service.IActHiTaskinstService; + + +/** + * 流程历史任务Service业务层处理 + * + * @author gssong + * @date 2024-03-02 + */ +@RequiredArgsConstructor +@Service +public class ActHiTaskinstServiceImpl implements IActHiTaskinstService { + + private final ActHiTaskinstMapper baseMapper; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 39b44000c..b195cc79d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -331,11 +331,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService } if (CollUtil.isNotEmpty(processInstanceComments)) { processInstanceComments.stream().filter(e -> e.getTaskId().equals(historicTaskInstance.getId())).findFirst().ifPresent(e -> { - if (StringUtils.isNotBlank(e.getFullMessage())) { - actHistoryInfoVo.setComment(e.getFullMessage()); - actHistoryInfoVo.setStatus(e.getType()); - actHistoryInfoVo.setStatusName(TaskStatusEnum.findByStatus(e.getType())); - } + actHistoryInfoVo.setComment(e.getFullMessage()); + actHistoryInfoVo.setStatus(e.getType()); + actHistoryInfoVo.setStatusName(TaskStatusEnum.findByStatus(e.getType())); }); } if (ObjectUtil.isNotEmpty(historicTaskInstance.getDurationInMillis())) { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index bd5e5ab3b..56dedb821 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -6,11 +6,14 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; @@ -25,6 +28,7 @@ import org.dromara.workflow.flowable.strategy.FlowEventStrategy; import org.dromara.workflow.flowable.cmd.*; import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler; import org.dromara.workflow.flowable.strategy.FlowTaskEventHandler; +import org.dromara.workflow.mapper.ActTaskMapper; import org.dromara.workflow.service.IActTaskService; import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.common.engine.api.FlowableObjectNotFoundException; @@ -65,6 +69,7 @@ public class ActTaskServiceImpl implements IActTaskService { private final IdentityService identityService; private final ManagementService managementService; private final FlowEventStrategy flowEventStrategy; + private final ActTaskMapper actTaskMapper; /** * 启动任务 @@ -227,47 +232,37 @@ public class ActTaskServiceImpl implements IActTaskService { */ @Override public TableDataInfo getTaskWaitByPage(TaskBo taskBo) { + PageQuery pageQuery = new PageQuery(); + pageQuery.setPageNum(taskBo.getPageNum()); + pageQuery.setPageSize(taskBo.getPageSize()); + QueryWrapper queryWrapper = new QueryWrapper<>(); List roles = LoginHelper.getLoginUser().getRoles(); String userId = String.valueOf(LoginHelper.getUserId()); - TaskQuery query = taskService.createTaskQuery(); - query.taskTenantId(TenantHelper.getTenantId()).taskCandidateOrAssigned(userId); - if (CollUtil.isNotEmpty(roles)) { - List groupIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId())); - query.taskCandidateGroupIn(groupIds); - } + queryWrapper.eq("t.business_status_", BusinessStatusEnum.WAITING.getStatus()); + queryWrapper.eq("t.tenant_id_", TenantHelper.getTenantId()); + queryWrapper.and(w1 -> + w1.eq("t.assignee_", userId) + .or(w2 -> w2.isNull("t.assignee_") + .and(w3 -> w3.eq("t.user_id_", userId).or().in("t.group_id_", StreamUtils.toList(roles, RoleDTO::getRoleId)))) + ); if (StringUtils.isNotBlank(taskBo.getName())) { - query.taskNameLike("%" + taskBo.getName() + "%"); + queryWrapper.like("t.name_", taskBo.getName()); } if (StringUtils.isNotBlank(taskBo.getProcessDefinitionName())) { - query.processDefinitionNameLike("%" + taskBo.getProcessDefinitionName() + "%"); + queryWrapper.like("t.processDefinitionName", taskBo.getProcessDefinitionName()); } if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) { - query.processDefinitionKey(taskBo.getProcessDefinitionKey()); + queryWrapper.eq("t.processDefinitionKey", taskBo.getProcessDefinitionKey()); } - List taskList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); - List processInstanceList = null; - if (CollUtil.isNotEmpty(taskList)) { - Set processInstanceIds = StreamUtils.toSet(taskList, Task::getProcessInstanceId); - processInstanceList = runtimeService.createProcessInstanceQuery().processInstanceIds(processInstanceIds).list(); + Page page = actTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); + + List taskList = page.getRecords(); + for (TaskVo task : taskList) { + task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); + task.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); + task.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); } - List list = new ArrayList<>(); - for (Task task : taskList) { - TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); - if (CollUtil.isNotEmpty(processInstanceList)) { - processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { - taskVo.setBusinessStatus(e.getBusinessStatus()); - taskVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(taskVo.getBusinessStatus())); - taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey()); - taskVo.setProcessDefinitionName(e.getProcessDefinitionName()); - }); - } - taskVo.setAssignee(Convert.toLong(task.getAssignee())); - taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); - taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); - list.add(taskVo); - } - long count = query.count(); - return new TableDataInfo<>(list, count); + return new TableDataInfo<>(taskList, page.getTotal()); } /** 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 index 742ebe4c8..feb30030b 100644 --- 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 @@ -3,6 +3,8 @@ package org.dromara.workflow.utils; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -16,11 +18,14 @@ import org.dromara.system.domain.vo.SysUserVo; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.enums.BusinessStatusEnum; import org.dromara.workflow.common.enums.MessageTypeEnum; +import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.ActHiProcinst; +import org.dromara.workflow.domain.ActHiTaskinst; import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.ParticipantVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; import org.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd; +import org.dromara.workflow.mapper.ActHiTaskinstMapper; import org.dromara.workflow.service.IActHiProcinstService; import org.dromara.workflow.service.IWorkflowUserService; import org.dromara.workflow.service.impl.WorkflowUserServiceImpl; @@ -52,6 +57,7 @@ public class WorkflowUtils { private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class); private static final IWorkflowUserService I_WORKFLOW_USER_SERVICE = SpringUtils.getBean(WorkflowUserServiceImpl.class); private static final IActHiProcinstService I_ACT_HI_PROCINST_SERVICE = SpringUtils.getBean(IActHiProcinstService.class); + private static final ActHiTaskinstMapper ACT_HI_TASKINST_MAPPER = SpringUtils.getBean(ActHiTaskinstMapper.class); /** * 创建一个新任务 @@ -99,21 +105,27 @@ public class WorkflowUtils { newTask.setProcessDefinitionId(parentTask.getProcessDefinitionId()); newTask.setProcessInstanceId(parentTask.getProcessInstanceId()); newTask.setTaskDefinitionKey(parentTask.getTaskDefinitionKey()); + newTask.setTenantId(TenantHelper.getTenantId()); list.add(newTask); } } PROCESS_ENGINE.getTaskService().bulkSaveTasks(list); - /*if (CollectionUtil.isNotEmpty(list) && CollectionUtil.isNotEmpty(parentTaskList)) { + if (CollUtil.isNotEmpty(list) && CollUtil.isNotEmpty(parentTaskList)) { String processInstanceId = parentTaskList.get(0).getProcessInstanceId(); String processDefinitionId = parentTaskList.get(0).getProcessDefinitionId(); - List taskIds = list.stream().map(Task::getId).collect(Collectors.toList()); + List taskIds = StreamUtils.toList(list, Task::getId); ActHiTaskinst actHiTaskinst = new ActHiTaskinst(); actHiTaskinst.setProcDefId(processDefinitionId); actHiTaskinst.setProcInstId(processInstanceId); + actHiTaskinst.setScopeType(TaskStatusEnum.COPY.getStatus()); + actHiTaskinst.setTenantId(TenantHelper.getTenantId()); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(ActHiTaskinst::getId, Collections.singletonList(taskIds)); - actHiTaskinstMapper.update(actHiTaskinst, updateWrapper); - }*/ + updateWrapper.in(ActHiTaskinst::getId, Collections.singletonList(taskIds)); + ACT_HI_TASKINST_MAPPER.update(actHiTaskinst, updateWrapper); + for (Task task : list) { + PROCESS_ENGINE.getTaskService().addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.COPY.getStatus(), StrUtil.EMPTY); + } + } } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiTaskinstMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiTaskinstMapper.xml new file mode 100644 index 000000000..51a095e35 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiTaskinstMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml new file mode 100644 index 000000000..40d91a1c1 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 4cf19c9356f8ef40229ccd03fdf3205d16c915b3 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 3 Mar 2024 18:18:03 +0800 Subject: [PATCH 150/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4sql=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/flowable.sql | 2 +- script/sql/oracle/flowable.sql | 2 +- script/sql/postgres/postgres_flowable.sql | 2 +- script/sql/sqlserver/flowable.sql | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/script/sql/flowable.sql b/script/sql/flowable.sql index 00c94a28f..694cc18f9 100644 --- a/script/sql/flowable.sql +++ b/script/sql/flowable.sql @@ -1,6 +1,6 @@ insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('11618', '我的待办', '11616', '5', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values('11619', '待办任务', '11618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); diff --git a/script/sql/oracle/flowable.sql b/script/sql/oracle/flowable.sql index 315c60e92..9158229e0 100644 --- a/script/sql/oracle/flowable.sql +++ b/script/sql/oracle/flowable.sql @@ -1,6 +1,6 @@ insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); -insert into sys_menu values('11618', '我的待办', '11616', '5', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); +insert into sys_menu values('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); insert into sys_menu values('11619', '待办任务', '11618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); diff --git a/script/sql/postgres/postgres_flowable.sql b/script/sql/postgres/postgres_flowable.sql index e901f8dcd..789d5a652 100644 --- a/script/sql/postgres/postgres_flowable.sql +++ b/script/sql/postgres/postgres_flowable.sql @@ -1,6 +1,6 @@ insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('11618', '我的待办', '11616', '5', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); insert into sys_menu values('11619', '待办任务', '11618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); diff --git a/script/sql/sqlserver/flowable.sql b/script/sql/sqlserver/flowable.sql index 46d04b245..ed302ff36 100644 --- a/script/sql/sqlserver/flowable.sql +++ b/script/sql/sqlserver/flowable.sql @@ -1,6 +1,6 @@ insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('11618', '我的待办', '11616', '5', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); insert into sys_menu values('11619', '待办任务', '11618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); From 218c9fc30c3351beab1afb8e2e7b70111350c125 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 3 Mar 2024 21:25:45 +0800 Subject: [PATCH 151/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E8=8F=9C?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/flowable.sql | 3 ++- script/sql/oracle/flowable.sql | 3 ++- script/sql/postgres/postgres_flowable.sql | 3 ++- script/sql/sqlserver/flowable.sql | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/script/sql/flowable.sql b/script/sql/flowable.sql index 694cc18f9..37bfecfb6 100644 --- a/script/sql/flowable.sql +++ b/script/sql/flowable.sql @@ -1,7 +1,8 @@ insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); -insert into sys_menu values('11619', '待办任务', '11618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); diff --git a/script/sql/oracle/flowable.sql b/script/sql/oracle/flowable.sql index 9158229e0..b66572800 100644 --- a/script/sql/oracle/flowable.sql +++ b/script/sql/oracle/flowable.sql @@ -1,7 +1,8 @@ insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); insert into sys_menu values('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); -insert into sys_menu values('11619', '待办任务', '11618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); +insert into sys_menu values('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); +insert into sys_menu values('11632', '我的待办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); insert into sys_menu values('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); diff --git a/script/sql/postgres/postgres_flowable.sql b/script/sql/postgres/postgres_flowable.sql index 789d5a652..0bbdd4ade 100644 --- a/script/sql/postgres/postgres_flowable.sql +++ b/script/sql/postgres/postgres_flowable.sql @@ -1,7 +1,8 @@ insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, now(), NULL, NULL, ''); insert into sys_menu values('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); -insert into sys_menu values('11619', '待办任务', '11618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); insert into sys_menu values('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, now(), NULL, NULL, ''); diff --git a/script/sql/sqlserver/flowable.sql b/script/sql/sqlserver/flowable.sql index ed302ff36..742b1b07e 100644 --- a/script/sql/sqlserver/flowable.sql +++ b/script/sql/sqlserver/flowable.sql @@ -1,7 +1,8 @@ insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); insert into sys_menu values('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); -insert into sys_menu values('11619', '待办任务', '11618', '2', 'taskWaiting', 'workflow/task/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); insert into sys_menu values('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); From 5017aff5c3a832fd82f4178383309f96e4b58cc3 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 3 Mar 2024 22:01:10 +0800 Subject: [PATCH 152/159] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4sql=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8A=84=E9=80=81=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ActTaskController.java | 10 ++++++ .../workflow/mapper/ActTaskMapper.java | 10 ++++++ .../workflow/service/IActTaskService.java | 8 +++++ .../service/impl/ActTaskServiceImpl.java | 32 +++++++++++++++++++ .../dromara/workflow/utils/WorkflowUtils.java | 2 +- .../mapper/workflow/ActTaskMapper.xml | 14 ++++++++ script/sql/flowable.sql | 1 + script/sql/oracle/flowable.sql | 3 +- script/sql/postgres/postgres_flowable.sql | 1 + script/sql/sqlserver/flowable.sql | 1 + 10 files changed, 80 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java index 912604fff..7bf61a7d0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java @@ -92,6 +92,16 @@ public class ActTaskController extends BaseController { return actTaskService.getTaskFinishByPage(taskBo); } + /** + * 查询当前用户的抄送 + * + * @param taskBo 参数 + */ + @GetMapping("/getTaskCopyByPage") + public TableDataInfo getTaskCopyByPage(TaskBo taskBo) { + return actTaskService.getTaskCopyByPage(taskBo); + } + /** * 查询当前租户所有已办任务 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java index eb90d5a31..e7094f543 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java @@ -2,6 +2,7 @@ package org.dromara.workflow.mapper; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; @@ -25,4 +26,13 @@ public interface ActTaskMapper extends BaseMapperPlus { * @return 结果 */ Page getTaskWaitByPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 查询当前用户的抄送 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 结果 + */ + Page getTaskCopyByPage(@Param("page") Page page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java index a3a77b637..b5596a53f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActTaskService.java @@ -54,6 +54,14 @@ public interface IActTaskService { */ TableDataInfo getTaskFinishByPage(TaskBo taskBo); + /** + * 查询当前用户的抄送 + * + * @param taskBo 参数 + * @return 结果 + */ + TableDataInfo getTaskCopyByPage(TaskBo taskBo); + /** * 查询当前租户所有已办任务 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 56dedb821..653b733b6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -351,6 +351,38 @@ public class ActTaskServiceImpl implements IActTaskService { return new TableDataInfo<>(list, count); } + /** + * 查询当前用户的抄送 + * + * @param taskBo 参数 + */ + @Override + public TableDataInfo getTaskCopyByPage(TaskBo taskBo) { + PageQuery pageQuery = new PageQuery(); + pageQuery.setPageNum(taskBo.getPageNum()); + pageQuery.setPageSize(taskBo.getPageSize()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + String userId = String.valueOf(LoginHelper.getUserId()); + if (StringUtils.isNotBlank(taskBo.getName())) { + queryWrapper.like("t.name_", taskBo.getName()); + } + if (StringUtils.isNotBlank(taskBo.getProcessDefinitionName())) { + queryWrapper.like("t.processDefinitionName", taskBo.getProcessDefinitionName()); + } + if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) { + queryWrapper.eq("t.processDefinitionKey", taskBo.getProcessDefinitionKey()); + } + queryWrapper.eq("t.assignee_", userId); + Page page = actTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper); + + List taskList = page.getRecords(); + for (TaskVo task : taskList) { + task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); + task.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); + } + return new TableDataInfo<>(taskList, page.getTotal()); + } + /** * 查询当前租户所有已办任务 * 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 index feb30030b..711d793b9 100644 --- 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 @@ -120,7 +120,7 @@ public class WorkflowUtils { actHiTaskinst.setScopeType(TaskStatusEnum.COPY.getStatus()); actHiTaskinst.setTenantId(TenantHelper.getTenantId()); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.in(ActHiTaskinst::getId, Collections.singletonList(taskIds)); + updateWrapper.in(ActHiTaskinst::getId, taskIds); ACT_HI_TASKINST_MAPPER.update(actHiTaskinst, updateWrapper); for (Task task : list) { PROCESS_ENGINE.getTaskService().addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.COPY.getStatus(), StrUtil.EMPTY); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml index 40d91a1c1..eefb49b1e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml @@ -43,4 +43,18 @@ WHERE RES.PARENT_TASK_ID_ is null ORDER BY RES.CREATE_TIME_ DESC) t ${ew.getCustomSqlSegment} + + diff --git a/script/sql/flowable.sql b/script/sql/flowable.sql index 37bfecfb6..b06464714 100644 --- a/script/sql/flowable.sql +++ b/script/sql/flowable.sql @@ -3,6 +3,7 @@ insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', insert into sys_menu values('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); +insert into sys_menu values('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); insert into sys_menu values('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, sysdate(), NULL, NULL, ''); diff --git a/script/sql/oracle/flowable.sql b/script/sql/oracle/flowable.sql index b66572800..308c7c479 100644 --- a/script/sql/oracle/flowable.sql +++ b/script/sql/oracle/flowable.sql @@ -2,7 +2,8 @@ insert into sys_menu values('11616', '工作流' , '0', '6', 'workflow', insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', 'workflow/model/index', '', '1', '1', 'C', '0', '0', 'workflow:model:list', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); insert into sys_menu values('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); insert into sys_menu values('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); -insert into sys_menu values('11632', '我的待办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); +insert into sys_menu values('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); +insert into sys_menu values('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); insert into sys_menu values('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, sysdate, NULL, NULL, ''); diff --git a/script/sql/postgres/postgres_flowable.sql b/script/sql/postgres/postgres_flowable.sql index 0bbdd4ade..aa68592b2 100644 --- a/script/sql/postgres/postgres_flowable.sql +++ b/script/sql/postgres/postgres_flowable.sql @@ -3,6 +3,7 @@ insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', insert into sys_menu values('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); insert into sys_menu values('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); insert into sys_menu values('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); +insert into sys_menu values('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, now(), NULL, NULL, ''); insert into sys_menu values('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, now(), NULL, NULL, ''); diff --git a/script/sql/sqlserver/flowable.sql b/script/sql/sqlserver/flowable.sql index 742b1b07e..2c3f706a0 100644 --- a/script/sql/sqlserver/flowable.sql +++ b/script/sql/sqlserver/flowable.sql @@ -3,6 +3,7 @@ insert into sys_menu values('11617', '模型管理', '11616', '2', 'model', insert into sys_menu values('11618', '我的任务', '0', '7', 'task', '', '', '1', '0', 'M', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); insert into sys_menu values('11619', '我的待办', '11618', '2', 'taskWaiting', 'workflow/task/taskWaiting', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); insert into sys_menu values('11632', '我的已办', '11618', '3', 'taskFinish', 'workflow/task/taskFinish', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); +insert into sys_menu values('11633', '我的抄送', '11618', '4', 'taskCopyList', 'workflow/task/taskCopyList', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); insert into sys_menu values('11620', '流程定义', '11616', '3', 'processDefinition', 'workflow/processDefinition/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); insert into sys_menu values('11621', '流程实例', '11630', '1', 'processInstance', 'workflow/processInstance/index', '', '1', '1', 'C', '0', '0', '', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); insert into sys_menu values('11622', '流程分类', '11616', '1', 'category', 'workflow/category/index', '', '1', '0', 'C', '0', '0', 'workflow:category:list', 'tree-table', 103, 1, getdate(), NULL, NULL, ''); From 8cd159127194a5f1cfc5b864af56389368530215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 5 Mar 2024 21:51:51 +0800 Subject: [PATCH 153/159] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=90=8D=E7=A7=B0=E7=BC=96=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/system/controller/system/SysUserController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java index e721aff75..b1502ac92 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -213,8 +213,8 @@ public class SysUserController extends BaseController { */ @SaCheckPermission("system:user:query") @GetMapping("/optionselect") - public R> optioselect(@RequestParam(required = false) Long[] userIds, - @RequestParam(required = false) Long deptId) { + public R> optionselect(@RequestParam(required = false) Long[] userIds, + @RequestParam(required = false) Long deptId) { return R.ok(userService.selectUserByIds(userIds == null ? null : List.of(userIds), deptId)); } From fd694839d1b05ef673f92280e8614b2c75258f29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 5 Mar 2024 21:54:51 +0800 Subject: [PATCH 154/159] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E7=BB=9F?= =?UTF-8?q?=E4=B8=80sql=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/postgres/{postgres_flowable.sql => flowable.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename script/sql/postgres/{postgres_flowable.sql => flowable.sql} (100%) diff --git a/script/sql/postgres/postgres_flowable.sql b/script/sql/postgres/flowable.sql similarity index 100% rename from script/sql/postgres/postgres_flowable.sql rename to script/sql/postgres/flowable.sql From a99f3b11df2a3c0a35f3d12e439d7be11bca0682 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 5 Mar 2024 22:04:24 +0800 Subject: [PATCH 155/159] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E8=A1=A8?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=98=A0=E5=B0=84=E4=BA=8E=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E4=BF=9D=E6=8C=81=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/ActHiTaskinst.java | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java index c5b64357e..0516c3368 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java @@ -23,169 +23,169 @@ public class ActHiTaskinst { /** * */ - @TableId(value = "id_") + @TableId(value = "ID_") private String id; /** * 版本 */ - @TableField(value = "rev_") + @TableField(value = "REV_") private Long rev; /** * 流程定义id */ - @TableField(value = "proc_def_id_") + @TableField(value = "PROC_DEF_ID_") private String procDefId; /** * */ - @TableField(value = "task_def_id_") + @TableField(value = "TASK_DEF_ID_") private String taskDefId; /** * 任务节点id */ - @TableField(value = "task_def_key_") + @TableField(value = "TASK_DEF_KEY_") private String taskDefKey; /** * 流程实例id */ - @TableField(value = "proc_inst_id_") + @TableField(value = "PROC_INST_ID_") private String procInstId; /** * 流程执行id */ - @TableField(value = "execution_id") + @TableField(value = "EXECUTION_ID") private String executionId; /** * */ - @TableField(value = "scope_id_") + @TableField(value = "SCOPE_ID_") private String scopeId; /** * */ - @TableField(value = "sub_scope_id_") + @TableField(value = "SUB_SCOPE_ID_") private String subScopeId; /** * 先用当前字段标识抄送类型 */ - @TableField(value = "scope_type_") + @TableField(value = "SCOPE_TYPE_") private String scopeType; /** * */ - @TableField(value = "scope_definition_id_") + @TableField(value = "SCOPE_DEFINITION_ID_") private String scopeDefinitionId; /** * */ - @TableField(value = "propagated_stage_inst_id_") + @TableField(value = "PROPAGATED_STAGE_INST_ID_") private String propagatedStageInstId; /** * 任务名称 */ - @TableField(value = "name_") + @TableField(value = "NAME_") private String name; /** * 父级id */ - @TableField(value = "parent_task_id_") + @TableField(value = "PARENT_TASK_ID_") private String parentTaskId; /** * 描述 */ - @TableField(value = "description_") + @TableField(value = "DESCRIPTION_") private String description; /** * 办理人 */ - @TableField(value = "owner_") + @TableField(value = "OWNER_") private String owner; /** * 办理人 */ - @TableField(value = "assignee_") + @TableField(value = "ASSIGNEE_") private String assignee; /** * 开始事件 */ - @TableField(value = "start_time_") + @TableField(value = "START_TIME_") private Date startTime; /** * 认领时间 */ - @TableField(value = "claim_time_") + @TableField(value = "CLAIM_TIME_") private Date claimTime; /** * 结束时间 */ - @TableField(value = "end_time_") + @TableField(value = "END_TIME_") private Date endTime; /** * 持续时间 */ - @TableField(value = "duration_") + @TableField(value = "DURATION_") private Long duration; /** * 删除原因 */ - @TableField(value = "delete_reason_") + @TableField(value = "DELETE_REASON_") private String deleteReason; /** * 优先级 */ - @TableField(value = "priority_") + @TableField(value = "PRIORITY_") private Long priority; /** * 到期时间 */ - @TableField(value = "due_date_") + @TableField(value = "DUE_DATE_") private Date dueDate; /** * */ - @TableField(value = "form_key_") + @TableField(value = "FORM_KEY_") private String formKey; /** * 分类 */ - @TableField(value = "category_") + @TableField(value = "CATEGORY_") private String category; /** * 最后修改时间 */ - @TableField(value = "last_updated_time_") + @TableField(value = "LAST_UPDATED_TIME_") private Date lastUpdatedTime; /** * 租户id */ - @TableField(value = "tenant_id_") + @TableField(value = "TENANT_ID_") private String tenantId; From c3146dd64124731a34034a758e312ccbf2b914ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 5 Mar 2024 22:05:02 +0800 Subject: [PATCH 156/159] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E7=B1=BB=E6=9C=AA=E5=AE=9E=E7=8E=B0=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96=E6=8E=A5=E5=8F=A3=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dromara/workflow/domain/ActHiTaskinst.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java index 0516c3368..578ea9c87 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java @@ -3,6 +3,7 @@ package org.dromara.workflow.domain; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; +import java.io.Serializable; import java.util.Date; import java.io.Serial; @@ -15,7 +16,7 @@ import java.io.Serial; */ @Data @TableName("act_hi_taskinst") -public class ActHiTaskinst { +public class ActHiTaskinst implements Serializable { @Serial private static final long serialVersionUID = 1L; From 85bb75dcb45ead875f2e74d51daede2993f69305 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Tue, 5 Mar 2024 22:44:41 +0800 Subject: [PATCH 157/159] =?UTF-8?q?remove=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/ActHiTaskinstServiceImpl.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java index f44ddd246..7faabc2b4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java @@ -2,7 +2,6 @@ package org.dromara.workflow.service.impl; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import org.dromara.workflow.mapper.ActHiTaskinstMapper; import org.dromara.workflow.service.IActHiTaskinstService; @@ -16,7 +15,4 @@ import org.dromara.workflow.service.IActHiTaskinstService; @Service public class ActHiTaskinstServiceImpl implements IActHiTaskinstService { - private final ActHiTaskinstMapper baseMapper; - - } From c27d6645f8627301226898a3623a929a78ffd11b Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Tue, 5 Mar 2024 22:45:28 +0800 Subject: [PATCH 158/159] =?UTF-8?q?remove=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/service/impl/ActModelServiceImpl.java | 4 ---- 1 file changed, 4 deletions(-) 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 73df26497..01bb12e57 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 @@ -17,8 +17,6 @@ import org.apache.commons.lang3.StringUtils; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.system.mapper.SysRoleMapper; -import org.dromara.system.mapper.SysUserMapper; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.domain.bo.ModelBo; import org.dromara.workflow.domain.vo.ModelVo; @@ -55,8 +53,6 @@ import java.util.zip.ZipOutputStream; public class ActModelServiceImpl implements IActModelService { private final RepositoryService repositoryService; - private final SysUserMapper sysUserMapper; - private final SysRoleMapper sysRoleMapper; /** * 分页查询模型 From b7c74ae3a4658603cd699dbb388a204abfe38b37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 5 Mar 2024 22:46:56 +0800 Subject: [PATCH 159/159] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E8=A1=A8?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=98=A0=E5=B0=84=E4=BA=8E=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E4=BF=9D=E6=8C=81=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/mapper/workflow/ActTaskMapper.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml index eefb49b1e..64d90e610 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml @@ -31,11 +31,11 @@ select * from (SELECT AHT.*, - AHP.business_status_, - ARP.name_ as processDefinitionName, - ARP.key_ as processDefinitionKey + AHP.BUSINESS_STATUS_, + ARP.NAME_ as processDefinitionName, + ARP.KEY_ as processDefinitionKey FROM ACT_HI_TASKINST AHT INNER JOIN ACT_HI_PROCINST AHP ON AHT.PROC_INST_ID_ = AHP.PROC_INST_ID_ INNER JOIN ACT_RE_PROCDEF ARP ON ARP.ID_ = AHT.PROC_DEF_ID_