Ver código fonte

重新初始化:
- 成功新增商户分类管理
- 各平台端使用`X-Platform-Code`进行隔离

Huanyi 2 meses atrás
pai
commit
cfc13cb2c8
61 arquivos alterados com 828 adições e 200 exclusões
  1. 3 3
      pom.xml
  2. 1 1
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java
  3. 2 1
      ruoyi-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java
  4. 0 1
      ruoyi-auth/src/main/resources/application.yml
  5. 8 6
      ruoyi-auth/src/main/resources/banner.txt
  6. 2 2
      ruoyi-auth/src/main/resources/logback-plus.xml
  7. 1 0
      ruoyi-common/pom.xml
  8. 7 0
      ruoyi-common/ruoyi-common-bom/pom.xml
  9. 4 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java
  10. 4 6
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserType.java
  11. 3 7
      ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/config/CustomBeanFactoryPostProcessor.java
  12. 0 23
      ruoyi-common/ruoyi-common-mybatis/src/main/java/com/yingpaipay/common/mybatis/utils/WrapperUtils.java
  13. 6 6
      ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java
  14. 4 0
      ruoyi-common/ruoyi-common-tenant/pom.xml
  15. 10 0
      ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java
  16. 1 1
      ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java
  17. 21 0
      ruoyi-common/yingpaipay-common-platform/pom.xml
  18. 32 0
      ruoyi-common/yingpaipay-common-platform/src/main/java/org/dromara/common/platform/Platform.java
  19. 0 1
      ruoyi-example/ruoyi-demo/src/main/resources/application.yml
  20. 0 1
      ruoyi-example/ruoyi-test-mq/src/main/resources/application.yml
  21. 1 1
      ruoyi-gateway/src/main/resources/application.yml
  22. 8 6
      ruoyi-gateway/src/main/resources/banner.txt
  23. 1 4
      ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/RuoYiGenApplication.java
  24. 8 0
      ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/constant/GenConstants.java
  25. 1 1
      ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/GenUtils.java
  26. 1 1
      ruoyi-modules/ruoyi-gen/src/main/resources/application.yml
  27. 8 6
      ruoyi-modules/ruoyi-gen/src/main/resources/banner.txt
  28. 1 4
      ruoyi-modules/ruoyi-gen/src/main/resources/logback-plus.xml
  29. 1 1
      ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm
  30. 1 4
      ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/RuoYiJobApplication.java
  31. 1 1
      ruoyi-modules/ruoyi-job/src/main/resources/application.yml
  32. 8 6
      ruoyi-modules/ruoyi-job/src/main/resources/banner.txt
  33. 1 1
      ruoyi-modules/ruoyi-job/src/main/resources/logback-plus.xml
  34. 1 7
      ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/RuoYiResourceApplication.java
  35. 1 1
      ruoyi-modules/ruoyi-resource/src/main/resources/application.yml
  36. 8 6
      ruoyi-modules/ruoyi-resource/src/main/resources/banner.txt
  37. 1 1
      ruoyi-modules/ruoyi-resource/src/main/resources/logback-plus.xml
  38. 1 4
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/RuoYiSystemApplication.java
  39. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantCategoriesController.java
  40. 59 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantCategories.java
  41. 4 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java
  42. 54 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantCategoriesBo.java
  43. 93 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantCategoriesVo.java
  44. 2 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java
  45. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantCategoriesMapper.java
  46. 69 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantCategoriesService.java
  47. 137 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantCategoriesServiceImpl.java
  48. 41 42
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java
  49. 1 1
      ruoyi-modules/ruoyi-system/src/main/resources/application.yml
  50. 8 6
      ruoyi-modules/ruoyi-system/src/main/resources/banner.txt
  51. 1 1
      ruoyi-modules/ruoyi-system/src/main/resources/logback-plus.xml
  52. 1 4
      ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/RuoYiWorkflowApplication.java
  53. 1 0
      ruoyi-modules/ruoyi-workflow/src/main/resources/application.yml
  54. 8 6
      ruoyi-modules/ruoyi-workflow/src/main/resources/banner.txt
  55. 1 1
      ruoyi-modules/ruoyi-workflow/src/main/resources/logback-plus.xml
  56. 8 7
      ruoyi-visual/ruoyi-monitor/src/main/resources/banner.txt
  57. 4 4
      ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties
  58. 6 6
      ruoyi-visual/ruoyi-seata-server/src/main/resources/banner.txt
  59. 8 6
      ruoyi-visual/ruoyi-snailjob-server/src/main/resources/banner.txt
  60. 14 0
      script/sql/business/create.sql
  61. 25 0
      script/sql/business/update.sql

+ 3 - 3
pom.xml

@@ -8,11 +8,12 @@
     <artifactId>pet-system</artifactId>
     <version>${revision}</version>
 
+
     <properties>
         <revision>2.5.3</revision>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <java.version>21</java.version>
+        <java.version>17</java.version>
         <spring-boot.version>3.5.9</spring-boot.version>
         <spring-cloud.version>2025.0.1</spring-cloud.version>
         <spring-boot-admin.version>3.5.6</spring-boot-admin.version>
@@ -73,8 +74,7 @@
                 <nacos.config.group>DEFAULT_GROUP</nacos.config.group>
                 <nacos.username>nacos</nacos.username>
                 <nacos.password>nacos</nacos.password>
-                <nacos.discovery.address>192.168.1.118</nacos.discovery.address>
-                <logstash.address>127.0.0.1:4560</logstash.address>
+                <logstash.address>192.168.1.118:4560</logstash.address>
             </properties>
             <activation>
                 <!-- 默认环境 -->

+ 1 - 1
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java

@@ -24,7 +24,7 @@ public interface RemoteUserService {
      * @param tenantId 租户id
      * @return 结果
      */
-    LoginUser getUserInfo(String username, String tenantId) throws UserException;
+    LoginUser getUserInfo(String username, String tenantId, Integer platformId) throws UserException;
 
     /**
      * 通过用户id查询用户信息

+ 2 - 1
ruoyi-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java

@@ -49,6 +49,7 @@ public class PasswordAuthStrategy implements IAuthStrategy {
     public LoginVo login(String body, RemoteClientVo client) {
         PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class);
         ValidatorUtils.validate(loginBody);
+        int platformId = loginBody.getPlatformId();
         String tenantId = loginBody.getTenantId();
         String username = loginBody.getUsername();
         String password = loginBody.getPassword();
@@ -60,7 +61,7 @@ public class PasswordAuthStrategy implements IAuthStrategy {
             validateCaptcha(tenantId, username, code, uuid);
         }
         LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
-            LoginUser user = remoteUserService.getUserInfo(username, tenantId);
+            LoginUser user = remoteUserService.getUserInfo(username, tenantId, platformId);
             loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
             return user;
         });

+ 0 - 1
ruoyi-auth/src/main/resources/application.yml

@@ -23,7 +23,6 @@ spring:
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}
-        ip: @nacos.discovery.address@
       config:
         # 配置组
         group: @nacos.config.group@

+ 8 - 6
ruoyi-auth/src/main/resources/banner.txt

@@ -1,8 +1,10 @@
 Spring Boot Version: ${spring-boot.version}
 Spring Application Name: ${spring.application.name}
-__________        __      _________               __                      _____          __  .__
-\______   \ _____/  |_   /   _____/__.__. _______/  |_  ____   _____     /  _  \  __ ___/  |_|  |__
- |     ___// __ \   __\  \_____  <   |  |/  ___/\   __\/ __ \ /     \   /  /_\  \|  |  \   __\  |  \
- |    |   \  ___/|  |    /        \___  |\___ \  |  | \  ___/|  Y Y  \ /    |    \  |  /|  | |   Y  \
- |____|    \___  >__|   /_______  / ____/____  > |__|  \___  >__|_|  / \____|__  /____/ |__| |___|  /
-               \/               \/\/         \/            \/      \/          \/                 \/
+                            _                        _    _     
+                           (_)                      | |  | |    
+ _ __  _   _   ___   _   _  _  ______   __ _  _   _ | |_ | |__  
+| '__|| | | | / _ \ | | | || ||______| / _` || | | || __|| '_ \ 
+| |   | |_| || (_) || |_| || |        | (_| || |_| || |_ | | | |
+|_|    \__,_| \___/  \__, ||_|         \__,_| \__,_| \__||_| |_|
+                      __/ |                                     
+                     |___/                                      

+ 2 - 2
ruoyi-auth/src/main/resources/logback-plus.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="60 seconds" debug="false">
     <!-- 日志存放路径 -->
-<!--    <property name="log.path" value="logs/${project.artifactId}"/>-->
+    <property name="log.path" value="logs/${project.artifactId}"/>
     <!-- 日志输出格式 -->
     <property name="console.log.pattern"
               value="%cyan(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
@@ -14,7 +14,7 @@
         </encoder>
     </appender>
 
-<!--    <include resource="logback-common.xml" />-->
+    <include resource="logback-common.xml" />
 
     <include resource="logback-logstash.xml" />
 

+ 1 - 0
ruoyi-common/pom.xml

@@ -44,6 +44,7 @@
         <module>ruoyi-common-nacos</module>
         <module>ruoyi-common-bus</module>
         <module>ruoyi-common-sse</module>
+        <module>yingpaipay-common-platform</module>
     </modules>
 
     <artifactId>ruoyi-common</artifactId>

+ 7 - 0
ruoyi-common/ruoyi-common-bom/pom.xml

@@ -250,6 +250,13 @@
                 <version>${revision}</version>
             </dependency>
 
+            <!-- 平台 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>yingpaipay-common-platform</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 </project>

+ 4 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java

@@ -1,6 +1,7 @@
 package org.dromara.common.core.domain.model;
 
 import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -19,6 +20,9 @@ public class LoginBody {
     @NotBlank(message = "{auth.clientid.not.blank}")
     private String clientId;
 
+    @NotNull(message = "未知平台")
+    private Integer platformId;
+
     /**
      * 授权类型
      */

+ 4 - 6
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserType.java

@@ -18,12 +18,10 @@ public enum UserType {
      */
     SYS_USER("sys_user"),
 
-//    /**
-//     * 移动客户端用户
-//     */
-//    APP_USER("app_user"),
-
-    ;
+    /**
+     * 移动客户端用户
+     */
+    APP_USER("app_user");
 
     /**
      * 用户类型标识(用于 token、权限识别等)

+ 3 - 7
ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/config/CustomBeanFactoryPostProcessor.java

@@ -64,8 +64,7 @@ public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor,
 
         // 创建临时的 InetUtils 实例
         try (InetUtils inetUtils = new InetUtils(properties)) {
-            // String ip = "127.0.0.1";
-            // 改为自己的内网IP
+//            String ip = "127.0.0.1";
             String ip = "192.168.1.118";
             // 获取第一个非回环地址
             InetAddress address = inetUtils.findFirstNonLoopbackAddress();
@@ -80,12 +79,9 @@ public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor,
                     ip = ipv6AddressString;
                 } else {
                     // 处理 IPv4 地址
-                    // ip = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
-
-                    // 避免VM的IP进行污染
+//                    ip = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
                     String newIp = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
-                    // 这个是我本地vm的IP, 即10.0.0.0和10.0.1.0
-                    if (!newIp.startsWith("10.0")) {
+                    if (!newIp.startsWith("10.0.")) {
                         ip = newIp;
                     }
                 }

+ 0 - 23
ruoyi-common/ruoyi-common-mybatis/src/main/java/com/yingpaipay/common/mybatis/utils/WrapperUtils.java

@@ -1,23 +0,0 @@
-package com.yingpaipay.common.mybatis.utils;
-
-import java.util.List;
-
-/**
- * 用于 {@code LambdaWrapper} 的增强工具类。
- * @Author Huanyi
- * @CreateTime 2026/02/07
- */
-
-public class WrapperUtils {
-
-    public static final List<Long> EMPTY_IDS = List.of(-1L);
-
-    /**
-     * {@code IN} 和 {@code NOT IN} 不能使用空集合<br>
-     * 当输入不存在的文本时,查处的{@code ids}为空,此时需要使用一个不存在的{@code id}来限制其不要查询到任何数据
-     */
-    public static List<Long> convertIds(List<Long> ids) {
-        return ids.isEmpty() ? EMPTY_IDS : ids;
-    }
-
-}

+ 6 - 6
ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java

@@ -37,9 +37,9 @@ public class SaPermissionImpl implements StpInterface {
             }
         }
         UserType userType = UserType.getUserType(loginUser.getUserType());
-//        if (userType == UserType.APP_USER) {
-//            // 其他端 自行根据业务编写
-//        }
+        if (userType == UserType.APP_USER) {
+            // 其他端 自行根据业务编写
+        }
         if (CollUtil.isNotEmpty(loginUser.getMenuPermission())) {
             // SYS_USER 默认返回权限
             return new ArrayList<>(loginUser.getMenuPermission());
@@ -64,9 +64,9 @@ public class SaPermissionImpl implements StpInterface {
             }
         }
         UserType userType = UserType.getUserType(loginUser.getUserType());
-//        if (userType == UserType.APP_USER) {
-//            // 其他端 自行根据业务编写
-//        }
+        if (userType == UserType.APP_USER) {
+            // 其他端 自行根据业务编写
+        }
         if (CollUtil.isNotEmpty(loginUser.getRolePermission())) {
             // SYS_USER 默认返回权限
             return new ArrayList<>(loginUser.getRolePermission());

+ 4 - 0
ruoyi-common/ruoyi-common-tenant/pom.xml

@@ -27,6 +27,10 @@
             <artifactId>ruoyi-common-redis</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>yingpaipay-common-platform</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 10 - 0
ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java

@@ -14,6 +14,7 @@ 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.platform.Platform;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 
@@ -39,6 +40,15 @@ public class TenantHelper {
      * 租户功能是否启用
      */
     public static boolean isEnable() {
+
+        // 通过平台进行分离 @author: Huanyi
+        if (SaHolder.getContext().isValid()) {
+            String header = SaHolder.getRequest().getHeader("X-Platform-Code");
+            if (StringUtils.isNotBlank(header)) {
+                return Platform.isNotAdmin(header);
+            }
+        }
+
         return Convert.toBool(SpringUtils.getProperty("tenant.enable"), false);
     }
 

+ 1 - 1
ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java

@@ -150,7 +150,7 @@ public class GlobalExceptionHandler {
     public R<Void> handleRuntimeException(RuntimeException e, HttpServletRequest request) {
         String requestURI = request.getRequestURI();
         log.error("请求地址'{}',发生未知异常.", requestURI, e);
-        return R.fail("系统内部异常");
+        return R.fail(e.getMessage());
     }
 
     /**

+ 21 - 0
ruoyi-common/yingpaipay-common-platform/pom.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-common</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>yingpaipay-common-platform</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 32 - 0
ruoyi-common/yingpaipay-common-platform/src/main/java/org/dromara/common/platform/Platform.java

@@ -0,0 +1,32 @@
+package org.dromara.common.platform;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 平台分割,包含平台ID和平台码
+ * @Author Huanyi
+ * @CreateTime 2026-02-11
+ */
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum Platform {
+
+    ADMIN(0, "4pwuAzDBzUd6hekvGHHKedT4VX5WHERAXHpeztPFAzRaUsBUrD", "管理后台"),
+    MERCHANT(1, "MfJkMNMW2JKXBuPcbP2rxkD3ynXmReAZZFm4fN7cAGwGJdKCmd", "商户后台"),
+    ;
+
+    private final Integer id;
+    private final String code;
+    private final String label;
+
+    public static boolean isNotAdmin(String header) {
+        return !isAdmin(header);
+    }
+
+    public static boolean isAdmin(String header) {
+        return header.equals(ADMIN.code);
+    }
+}

+ 0 - 1
ruoyi-example/ruoyi-demo/src/main/resources/application.yml

@@ -23,7 +23,6 @@ spring:
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}
-        ip: @nacos.discovery.address@
       config:
         # 配置组
         group: @nacos.config.group@

+ 0 - 1
ruoyi-example/ruoyi-test-mq/src/main/resources/application.yml

@@ -56,7 +56,6 @@ spring:
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}
-        ip: @nacos.discovery.address@
       config:
         # 配置组
         group: @nacos.config.group@

+ 1 - 1
ruoyi-gateway/src/main/resources/application.yml

@@ -22,10 +22,10 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
+        ip: 192.168.1.118
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}
-        ip: @nacos.discovery.address@
       config:
         # 配置组
         group: @nacos.config.group@

+ 8 - 6
ruoyi-gateway/src/main/resources/banner.txt

@@ -1,8 +1,10 @@
 Spring Boot Version: ${spring-boot.version}
 Spring Application Name: ${spring.application.name}
-__________        __      _________               __                     ________        __
-\______   \ _____/  |_   /   _____/__.__. _______/  |_  ____   _____    /  _____/_____ _/  |_  ______  _  _______  ___.__.
- |     ___// __ \   __\  \_____  <   |  |/  ___/\   __\/ __ \ /     \  /   \  ___\__  \\   __\/ __ \ \/ \/ /\__  \<   |  |
- |    |   \  ___/|  |    /        \___  |\___ \  |  | \  ___/|  Y Y  \ \    \_\  \/ __ \|  | \  ___/\     /  / __ \\___  |
- |____|    \___  >__|   /_______  / ____/____  > |__|  \___  >__|_|  /  \______  (____  /__|  \___  >\/\_/  (____  / ____|
-               \/               \/\/         \/            \/      \/          \/     \/          \/             \/\/
+                            _                        _                                 
+                           (_)                      | |                                
+ _ __  _   _   ___   _   _  _  ______   __ _   __ _ | |_   ___ __      __  __ _  _   _ 
+| '__|| | | | / _ \ | | | || ||______| / _` | / _` || __| / _ \\ \ /\ / / / _` || | | |
+| |   | |_| || (_) || |_| || |        | (_| || (_| || |_ |  __/ \ V  V / | (_| || |_| |
+|_|    \__,_| \___/  \__, ||_|         \__, | \__,_| \__| \___|  \_/\_/   \__,_| \__, |
+                      __/ |             __/ |                                     __/ |
+                     |___/             |___/                                     |___/ 

+ 1 - 4
ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/RuoYiGenApplication.java

@@ -11,10 +11,7 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
  * @author ruoyi
  */
 @EnableDubbo
-@SpringBootApplication(scanBasePackages = {
-    "org.dromara.*",
-    "com.yingpaipay.*"
-})
+@SpringBootApplication
 public class RuoYiGenApplication {
     public static void main(String[] args) {
         SpringApplication application = new SpringApplication(RuoYiGenApplication.class);

+ 8 - 0
ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/constant/GenConstants.java

@@ -58,8 +58,16 @@ public interface GenConstants {
     String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp", "year", "interval",
         "smalldatetime", "datetime2", "datetimeoffset", "timestamptz"};
 
+    /**
+     * 十进制小数类型
+     * @Author Huanyi
+     */
     String[] COLOMNTYPE_DECIMAL = {"decimal"};
 
+    /**
+     * 普通整形
+     * @Author Huanyi
+     */
     String[] COLOMNTYPE_INTEGER = {"tinyint", "smallint", "mediumint", "int", "int2", "int4", "int8", "number", "integer"};
 
     /**

+ 1 - 1
ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/GenUtils.java

@@ -58,7 +58,7 @@ public class GenUtils {
             column.setJavaType(GenConstants.TYPE_DATE);
             column.setHtmlType(GenConstants.HTML_DATETIME);
 
-            // 新增将 BigDecimal 和 Integer 补全
+            // 新增将 BigDecimal 和 Integer 补全 @author: Huanyi
         } else if (arraysContains(GenConstants.COLOMNTYPE_DECIMAL, dataType)) {
             column.setHtmlType(GenConstants.HTML_INPUT);
             column.setJavaType(GenConstants.TYPE_BIGDECIMAL);

+ 1 - 1
ruoyi-modules/ruoyi-gen/src/main/resources/application.yml

@@ -20,10 +20,10 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
+        ip: 192.168.1.118
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}
-        ip: @nacos.discovery.address@
       config:
         # 配置组
         group: @nacos.config.group@

+ 8 - 6
ruoyi-modules/ruoyi-gen/src/main/resources/banner.txt

@@ -1,8 +1,10 @@
 Spring Boot Version: ${spring-boot.version}
 Spring Application Name: ${spring.application.name}
-__________        __      _________               __                     ________
-\______   \ _____/  |_   /   _____/__.__. _______/  |_  ____   _____    /  _____/  ____   ____
- |     ___// __ \   __\  \_____  <   |  |/  ___/\   __\/ __ \ /     \  /   \  ____/ __ \ /    \
- |    |   \  ___/|  |    /        \___  |\___ \  |  | \  ___/|  Y Y  \ \    \_\  \  ___/|   |  \
- |____|    \___  >__|   /_______  / ____/____  > |__|  \___  >__|_|  /  \______  /\___  >___|  /
-               \/               \/\/         \/            \/      \/          \/     \/     \/
+                            _                             
+                           (_)                            
+ _ __  _   _   ___   _   _  _  ______   __ _   ___  _ __  
+| '__|| | | | / _ \ | | | || ||______| / _` | / _ \| '_ \ 
+| |   | |_| || (_) || |_| || |        | (_| ||  __/| | | |
+|_|    \__,_| \___/  \__, ||_|         \__, | \___||_| |_|
+                      __/ |             __/ |             
+                     |___/             |___/              

+ 1 - 4
ruoyi-modules/ruoyi-gen/src/main/resources/logback-plus.xml

@@ -14,13 +14,10 @@
         </encoder>
     </appender>
 
-<!--    <include resource="logback-common.xml" />-->
+    <include resource="logback-common.xml" />
 
     <include resource="logback-logstash.xml" />
 
-    <!-- 开启 skywalking 日志收集 -->
-    <include resource="logback-skylog.xml" />
-
     <!--系统操作日志-->
     <root level="info">
         <appender-ref ref="console"/>

+ 1 - 1
ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm

@@ -99,7 +99,7 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
 #end
 #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
 #if($column.isPk==1)
-        lqw.orderByDesc(${ClassName}::get$AttrName);
+        lqw.orderByAsc(${ClassName}::get$AttrName);
 #end
 #end
         return lqw;

+ 1 - 4
ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/RuoYiJobApplication.java

@@ -11,10 +11,7 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
  * @author Lion Li
  */
 @EnableDubbo
-@SpringBootApplication(scanBasePackages = {
-    "org.dromara.*",
-    "com.yingpaipay.*"
-})
+@SpringBootApplication
 public class RuoYiJobApplication {
 
     public static void main(String[] args) {

+ 1 - 1
ruoyi-modules/ruoyi-job/src/main/resources/application.yml

@@ -20,10 +20,10 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
+        ip: 192.168.1.118
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}
-        ip: @nacos.discovery.address@
       config:
         # 配置组
         group: @nacos.config.group@

+ 8 - 6
ruoyi-modules/ruoyi-job/src/main/resources/banner.txt

@@ -1,8 +1,10 @@
 Spring Boot Version: ${spring-boot.version}
 Spring Application Name: ${spring.application.name}
-__________        __      _________               __                        ____.     ___.
-\______   \ _____/  |_   /   _____/__.__. _______/  |_  ____   _____       |    | ____\_ |__
- |     ___// __ \   __\  \_____  <   |  |/  ___/\   __\/ __ \ /     \      |    |/  _ \| __ \
- |    |   \  ___/|  |    /        \___  |\___ \  |  | \  ___/|  Y Y  \ /\__|    (  <_> ) \_\ \
- |____|    \___  >__|   /_______  / ____/____  > |__|  \___  >__|_|  / \________|\____/|___  /
-               \/               \/\/         \/            \/      \/                      \/
+                        _        _       _
+                       (_)      (_)     | |
+ _ __ _   _  ___  _   _ _ ______ _  ___ | |__
+| '__| | | |/ _ \| | | | |______| |/ _ \| '_ \
+| |  | |_| | (_) | |_| | |      | | (_) | |_) |
+|_|   \__,_|\___/ \__, |_|      | |\___/|_.__/
+                   __/ |       _/ |
+                  |___/       |__/

+ 1 - 1
ruoyi-modules/ruoyi-job/src/main/resources/logback-plus.xml

@@ -14,7 +14,7 @@
         </encoder>
     </appender>
 
-<!--    <include resource="logback-common.xml" />-->
+    <include resource="logback-common.xml" />
 
     <include resource="logback-logstash.xml" />
 

+ 1 - 7
ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/RuoYiResourceApplication.java

@@ -12,13 +12,7 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
  * @author Lion Li
  */
 @EnableDubbo
-@SpringBootApplication(
-    exclude = {DataSourceAutoConfiguration.class},
-    scanBasePackages = {
-    "org.dromara.*",
-    "com.yingpaipay.*"
-}
-)
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
 public class RuoYiResourceApplication {
     public static void main(String[] args) {
         SpringApplication application = new SpringApplication(RuoYiResourceApplication.class);

+ 1 - 1
ruoyi-modules/ruoyi-resource/src/main/resources/application.yml

@@ -20,10 +20,10 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
+        ip: 192.168.1.118
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}
-        ip: @nacos.discovery.address@
       config:
         # 配置组
         group: @nacos.config.group@

+ 8 - 6
ruoyi-modules/ruoyi-resource/src/main/resources/banner.txt

@@ -1,8 +1,10 @@
 Spring Boot Version: ${spring-boot.version}
 Spring Application Name: ${spring.application.name}
-__________        __      _________               __                   __________
-\______   \ _____/  |_   /   _____/__.__. _______/  |_  ____   _____   \______   \ ____   __________  __ _________   ____  ____
- |     ___// __ \   __\  \_____  <   |  |/  ___/\   __\/ __ \ /     \   |       _// __ \ /  ___/  _ \|  |  \_  __ \_/ ___\/ __ \
- |    |   \  ___/|  |    /        \___  |\___ \  |  | \  ___/|  Y Y  \  |    |   \  ___/ \___ (  <_> )  |  /|  | \/\  \__\  ___/
- |____|    \___  >__|   /_______  / ____/____  > |__|  \___  >__|_|  /  |____|_  /\___  >____  >____/|____/ |__|    \___  >___  >
-               \/               \/\/         \/            \/      \/          \/     \/     \/                         \/    \/
+                        _
+                       (_)
+ _ __ _   _  ___  _   _ _ ______ _ __ ___  ___  ___  _   _ _ __ ___ ___
+| '__| | | |/ _ \| | | | |______| '__/ _ \/ __|/ _ \| | | | '__/ __/ _ \
+| |  | |_| | (_) | |_| | |      | | |  __/\__ \ (_) | |_| | | | (_|  __/
+|_|   \__,_|\___/ \__, |_|      |_|  \___||___/\___/ \__,_|_|  \___\___|
+                   __/ |
+                  |___/

+ 1 - 1
ruoyi-modules/ruoyi-resource/src/main/resources/logback-plus.xml

@@ -14,7 +14,7 @@
         </encoder>
     </appender>
 
-<!--    <include resource="logback-common.xml" />-->
+    <include resource="logback-common.xml" />
 
     <include resource="logback-logstash.xml" />
 

+ 1 - 4
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/RuoYiSystemApplication.java

@@ -11,10 +11,7 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
  * @author ruoyi
  */
 @EnableDubbo
-@SpringBootApplication(scanBasePackages = {
-    "org.dromara.*",
-    "com.yingpaipay.*"
-})
+@SpringBootApplication
 public class RuoYiSystemApplication {
     public static void main(String[] args) {
         SpringApplication application = new SpringApplication(RuoYiSystemApplication.class);

+ 106 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantCategoriesController.java

@@ -0,0 +1,106 @@
+package org.dromara.system.controller.system;
+
+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.system.domain.vo.SysTenantCategoriesVo;
+import org.dromara.system.domain.bo.SysTenantCategoriesBo;
+import org.dromara.system.service.ISysTenantCategoriesService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 商户分类
+ * 前端访问路由地址为:/system/tenantCategories
+ *
+ * @author Huanyi
+ * @date 2026-02-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/tenantCategories")
+public class SysTenantCategoriesController extends BaseController {
+
+    private final ISysTenantCategoriesService sysTenantCategoriesService;
+
+    /**
+     * 查询商户分类列表
+     */
+    @SaCheckPermission("system:tenantCategories:list")
+    @GetMapping("/list")
+    public TableDataInfo<SysTenantCategoriesVo> list(SysTenantCategoriesBo bo, PageQuery pageQuery) {
+        return sysTenantCategoriesService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出商户分类列表
+     */
+    @SaCheckPermission("system:tenantCategories:export")
+    @Log(title = "商户分类", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SysTenantCategoriesBo bo, HttpServletResponse response) {
+        List<SysTenantCategoriesVo> list = sysTenantCategoriesService.queryList(bo);
+        ExcelUtil.exportExcel(list, "商户分类", SysTenantCategoriesVo.class, response);
+    }
+
+    /**
+     * 获取商户分类详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("system:tenantCategories:query")
+    @GetMapping("/{id}")
+    public R<SysTenantCategoriesVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(sysTenantCategoriesService.queryById(id));
+    }
+
+    /**
+     * 新增商户分类
+     */
+    @SaCheckPermission("system:tenantCategories:add")
+    @Log(title = "商户分类", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysTenantCategoriesBo bo) {
+        return toAjax(sysTenantCategoriesService.insertByBo(bo));
+    }
+
+    /**
+     * 修改商户分类
+     */
+    @SaCheckPermission("system:tenantCategories:edit")
+    @Log(title = "商户分类", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysTenantCategoriesBo bo) {
+        return toAjax(sysTenantCategoriesService.updateByBo(bo));
+    }
+
+    /**
+     * 删除商户分类
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("system:tenantCategories:remove")
+    @Log(title = "商户分类", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(sysTenantCategoriesService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 59 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantCategories.java

@@ -0,0 +1,59 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+
+/**
+ * 商户分类对象 sys_tenant_categories
+ *
+ * @author Huanyi
+ * @date 2026-02-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_tenant_categories")
+public class SysTenantCategories extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 分类名称
+     */
+    private String name;
+
+    /**
+     * 排序
+     */
+    private Long sort;
+
+    /**
+     * 图标
+     */
+    private Long icon;
+
+    /**
+     * 状态
+     */
+    private Integer status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 4 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java

@@ -103,6 +103,10 @@ public class SysUser extends TenantEntity {
      */
     private String remark;
 
+    /**
+     * 平台ID 当前用户属于哪一个平台
+     */
+    private Integer platformId;
 
     public SysUser(Long userId) {
         this.userId = userId;

+ 54 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantCategoriesBo.java

@@ -0,0 +1,54 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysTenantCategories;
+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 org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+/**
+ * 商户分类业务对象 sys_tenant_categories
+ *
+ * @author Huanyi
+ * @date 2026-02-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysTenantCategories.class, reverseConvertGenerate = false)
+public class SysTenantCategoriesBo extends BaseEntity {
+
+    /**
+     * 序号
+     */
+    @NotNull(message = "序号不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 分类名称
+     */
+    @NotBlank(message = "分类名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String name;
+
+    /**
+     * 排序
+     */
+    private Long sort;
+
+    /**
+     * 图标
+     */
+    private Long icon;
+
+    /**
+     * 状态
+     */
+    @NotNull(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Integer status;
+
+
+}

+ 93 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantCategoriesVo.java

@@ -0,0 +1,93 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.system.domain.SysTenantCategories;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.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;
+
+
+
+/**
+ * 商户分类视图对象 sys_tenant_categories
+ *
+ * @author Huanyi
+ * @date 2026-02-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysTenantCategories.class)
+public class SysTenantCategoriesVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    @ExcelProperty(value = "序号")
+    private Long id;
+
+    /**
+     * 分类名称
+     */
+    @ExcelProperty(value = "分类名称")
+    private String name;
+
+    /**
+     * 排序
+     */
+    @ExcelProperty(value = "排序")
+    private Long sort;
+
+    /**
+     * 图标
+     */
+    @ExcelProperty(value = "图标")
+    private Long icon;
+
+    /**
+     * 图标Url
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "icon")
+    private String iconUrl;
+    /**
+     * 状态
+     */
+    @ExcelProperty(value = "状态")
+    private Integer status;
+
+    /**
+     * 创建者
+     */
+    @ExcelProperty(value = "创建者")
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @ExcelProperty(value = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+
+}

+ 2 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java

@@ -68,9 +68,9 @@ public class RemoteUserServiceImpl implements RemoteUserService {
      * @return 结果
      */
     @Override
-    public LoginUser getUserInfo(String username, String tenantId) throws UserException {
+    public LoginUser getUserInfo(String username, String tenantId, Integer platformId) throws UserException {
         return TenantHelper.dynamic(tenantId, () -> {
-            SysUserVo sysUser = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, username));
+            SysUserVo sysUser = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, username).eq(SysUser::getPlatformId, platformId));
             if (ObjectUtil.isNull(sysUser)) {
                 throw new UserException("user.not.exists", username);
             }

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantCategoriesMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysTenantCategories;
+import org.dromara.system.domain.vo.SysTenantCategoriesVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 商户分类Mapper接口
+ *
+ * @author Huanyi
+ * @date 2026-02-11
+ */
+public interface SysTenantCategoriesMapper extends BaseMapperPlus<SysTenantCategories, SysTenantCategoriesVo> {
+
+}

+ 69 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantCategoriesService.java

@@ -0,0 +1,69 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.SysTenantCategories;
+import org.dromara.system.domain.vo.SysTenantCategoriesVo;
+import org.dromara.system.domain.bo.SysTenantCategoriesBo;
+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 Huanyi
+ * @date 2026-02-11
+ */
+public interface ISysTenantCategoriesService {
+
+    /**
+     * 查询商户分类
+     *
+     * @param id 主键
+     * @return 商户分类
+     */
+    SysTenantCategoriesVo queryById(Long id);
+
+    /**
+     * 分页查询商户分类列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 商户分类分页列表
+     */
+    TableDataInfo<SysTenantCategoriesVo> queryPageList(SysTenantCategoriesBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的商户分类列表
+     *
+     * @param bo 查询条件
+     * @return 商户分类列表
+     */
+    List<SysTenantCategoriesVo> queryList(SysTenantCategoriesBo bo);
+
+    /**
+     * 新增商户分类
+     *
+     * @param bo 商户分类
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysTenantCategoriesBo bo);
+
+    /**
+     * 修改商户分类
+     *
+     * @param bo 商户分类
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysTenantCategoriesBo bo);
+
+    /**
+     * 校验并批量删除商户分类信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 137 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantCategoriesServiceImpl.java

@@ -0,0 +1,137 @@
+package org.dromara.system.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 lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysTenantCategoriesBo;
+import org.dromara.system.domain.vo.SysTenantCategoriesVo;
+import org.dromara.system.domain.SysTenantCategories;
+import org.dromara.system.mapper.SysTenantCategoriesMapper;
+import org.dromara.system.service.ISysTenantCategoriesService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 商户分类Service业务层处理
+ *
+ * @author Huanyi
+ * @date 2026-02-11
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysTenantCategoriesServiceImpl implements ISysTenantCategoriesService {
+
+    private final SysTenantCategoriesMapper baseMapper;
+
+    /**
+     * 查询商户分类
+     *
+     * @param id 主键
+     * @return 商户分类
+     */
+    @Override
+    public SysTenantCategoriesVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询商户分类列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 商户分类分页列表
+     */
+    @Override
+    public TableDataInfo<SysTenantCategoriesVo> queryPageList(SysTenantCategoriesBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysTenantCategories> lqw = buildQueryWrapper(bo);
+        Page<SysTenantCategoriesVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的商户分类列表
+     *
+     * @param bo 查询条件
+     * @return 商户分类列表
+     */
+    @Override
+    public List<SysTenantCategoriesVo> queryList(SysTenantCategoriesBo bo) {
+        LambdaQueryWrapper<SysTenantCategories> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysTenantCategories> buildQueryWrapper(SysTenantCategoriesBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysTenantCategories> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysTenantCategories::getId);
+        lqw.like(StringUtils.isNotBlank(bo.getName()), SysTenantCategories::getName, bo.getName());
+        lqw.eq(bo.getStatus() != null, SysTenantCategories::getStatus, bo.getStatus());
+        lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,
+            SysTenantCategories::getCreateTime ,params.get("beginCreateTime"), params.get("endCreateTime"));
+        lqw.between(params.get("beginUpdateTime") != null && params.get("endUpdateTime") != null,
+            SysTenantCategories::getUpdateTime ,params.get("beginUpdateTime"), params.get("endUpdateTime"));
+        return lqw;
+    }
+
+    /**
+     * 新增商户分类
+     *
+     * @param bo 商户分类
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysTenantCategoriesBo bo) {
+        SysTenantCategories add = MapstructUtils.convert(bo, SysTenantCategories.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改商户分类
+     *
+     * @param bo 商户分类
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysTenantCategoriesBo bo) {
+        SysTenantCategories update = MapstructUtils.convert(bo, SysTenantCategories.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysTenantCategories entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除商户分类信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 41 - 42
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java

@@ -173,48 +173,47 @@ public class SysTenantServiceImpl implements ISysTenantService {
         userRole.setRoleId(roleId);
         userRoleMapper.insert(userRole);
 
-        // TODO 暂定 菜单、系统配置 不进行租户隔离
-//        String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID;
-//        List<SysDictType> dictTypeList = dictTypeMapper.selectList(
-//            new LambdaQueryWrapper<SysDictType>().eq(SysDictType::getTenantId, defaultTenantId));
-//        List<SysDictData> dictDataList = dictDataMapper.selectList(
-//            new LambdaQueryWrapper<SysDictData>().eq(SysDictData::getTenantId, defaultTenantId));
-//        for (SysDictType dictType : dictTypeList) {
-//            dictType.setDictId(null);
-//            dictType.setTenantId(tenantId);
-//            dictType.setCreateDept(null);
-//            dictType.setCreateBy(null);
-//            dictType.setCreateTime(null);
-//            dictType.setUpdateBy(null);
-//            dictType.setUpdateTime(null);
-//        }
-//        for (SysDictData dictData : dictDataList) {
-//            dictData.setDictCode(null);
-//            dictData.setTenantId(tenantId);
-//            dictData.setCreateDept(null);
-//            dictData.setCreateBy(null);
-//            dictData.setCreateTime(null);
-//            dictData.setUpdateBy(null);
-//            dictData.setUpdateTime(null);
-//        }
-//        dictTypeMapper.insertBatch(dictTypeList);
-//        dictDataMapper.insertBatch(dictDataList);
-//
-//        List<SysConfig> sysConfigList = configMapper.selectList(
-//            new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getTenantId, defaultTenantId));
-//        for (SysConfig config : sysConfigList) {
-//            config.setConfigId(null);
-//            config.setTenantId(tenantId);
-//            config.setCreateDept(null);
-//            config.setCreateBy(null);
-//            config.setCreateTime(null);
-//            config.setUpdateBy(null);
-//            config.setUpdateTime(null);
-//        }
-//        configMapper.insertBatch(sysConfigList);
-//
-//        // 新增租户流程定义
-//        remoteWorkflowService.syncDef(tenantId);
+        String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID;
+        List<SysDictType> dictTypeList = dictTypeMapper.selectList(
+            new LambdaQueryWrapper<SysDictType>().eq(SysDictType::getTenantId, defaultTenantId));
+        List<SysDictData> dictDataList = dictDataMapper.selectList(
+            new LambdaQueryWrapper<SysDictData>().eq(SysDictData::getTenantId, defaultTenantId));
+        for (SysDictType dictType : dictTypeList) {
+            dictType.setDictId(null);
+            dictType.setTenantId(tenantId);
+            dictType.setCreateDept(null);
+            dictType.setCreateBy(null);
+            dictType.setCreateTime(null);
+            dictType.setUpdateBy(null);
+            dictType.setUpdateTime(null);
+        }
+        for (SysDictData dictData : dictDataList) {
+            dictData.setDictCode(null);
+            dictData.setTenantId(tenantId);
+            dictData.setCreateDept(null);
+            dictData.setCreateBy(null);
+            dictData.setCreateTime(null);
+            dictData.setUpdateBy(null);
+            dictData.setUpdateTime(null);
+        }
+        dictTypeMapper.insertBatch(dictTypeList);
+        dictDataMapper.insertBatch(dictDataList);
+
+        List<SysConfig> sysConfigList = configMapper.selectList(
+            new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getTenantId, defaultTenantId));
+        for (SysConfig config : sysConfigList) {
+            config.setConfigId(null);
+            config.setTenantId(tenantId);
+            config.setCreateDept(null);
+            config.setCreateBy(null);
+            config.setCreateTime(null);
+            config.setUpdateBy(null);
+            config.setUpdateTime(null);
+        }
+        configMapper.insertBatch(sysConfigList);
+
+        // 新增租户流程定义
+        remoteWorkflowService.syncDef(tenantId);
         return true;
     }
 

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/resources/application.yml

@@ -20,10 +20,10 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
+        ip: 192.168.1.118
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}
-        ip: @nacos.discovery.address@
       config:
         # 配置组
         group: @nacos.config.group@

+ 8 - 6
ruoyi-modules/ruoyi-system/src/main/resources/banner.txt

@@ -1,8 +1,10 @@
 Spring Boot Version: ${spring-boot.version}
 Spring Application Name: ${spring.application.name}
-__________        __      _________               __                     _________               __
-\______   \ _____/  |_   /   _____/__.__. _______/  |_  ____   _____    /   _____/__.__. _______/  |_  ____   _____
- |     ___// __ \   __\  \_____  <   |  |/  ___/\   __\/ __ \ /     \   \_____  <   |  |/  ___/\   __\/ __ \ /     \
- |    |   \  ___/|  |    /        \___  |\___ \  |  | \  ___/|  Y Y  \  /        \___  |\___ \  |  | \  ___/|  Y Y  \
- |____|    \___  >__|   /_______  / ____/____  > |__|  \___  >__|_|  / /_______  / ____/____  > |__|  \___  >__|_|  /
-               \/               \/\/         \/            \/      \/          \/\/         \/            \/      \/
+                            _                           _                    
+                           (_)                         | |                   
+ _ __  _   _   ___   _   _  _  ______  ___  _   _  ___ | |_   ___  _ __ ___  
+| '__|| | | | / _ \ | | | || ||______|/ __|| | | |/ __|| __| / _ \| '_ ` _ \ 
+| |   | |_| || (_) || |_| || |        \__ \| |_| |\__ \| |_ |  __/| | | | | |
+|_|    \__,_| \___/  \__, ||_|        |___/ \__, ||___/ \__| \___||_| |_| |_|
+                      __/ |                  __/ |                           
+                     |___/                  |___/                            

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/resources/logback-plus.xml

@@ -14,7 +14,7 @@
         </encoder>
     </appender>
 
-<!--    <include resource="logback-common.xml" />-->
+    <include resource="logback-common.xml" />
 
     <include resource="logback-logstash.xml" />
 

+ 1 - 4
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/RuoYiWorkflowApplication.java

@@ -11,10 +11,7 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
  * @author ruoyi
  */
 @EnableDubbo
-@SpringBootApplication(scanBasePackages = {
-    "org.dromara.*",
-    "com.yingpaipay.*"
-})
+@SpringBootApplication
 public class RuoYiWorkflowApplication {
     public static void main(String[] args) {
         SpringApplication application = new SpringApplication(RuoYiWorkflowApplication.class);

+ 1 - 0
ruoyi-modules/ruoyi-workflow/src/main/resources/application.yml

@@ -20,6 +20,7 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
+        ip: 192.168.1.118
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}

+ 8 - 6
ruoyi-modules/ruoyi-workflow/src/main/resources/banner.txt

@@ -1,8 +1,10 @@
 Spring Boot Version: ${spring-boot.version}
 Spring Application Name: ${spring.application.name}
-__________        __      _________               __                    __      __             __      _____.__
-\______   \ _____/  |_   /   _____/__.__. _______/  |_  ____   _____   /  \    /  \___________|  | ___/ ____\  |   ______  _  __
- |     ___// __ \   __\  \_____  <   |  |/  ___/\   __\/ __ \ /     \  \   \/\/   /  _ \_  __ \  |/ /\   __\|  |  /  _ \ \/ \/ /
- |    |   \  ___/|  |    /        \___  |\___ \  |  | \  ___/|  Y Y  \  \        (  <_> )  | \/    <  |  |  |  |_(  <_> )     /
- |____|    \___  >__|   /_______  / ____/____  > |__|  \___  >__|_|  /   \__/\  / \____/|__|  |__|_ \ |__|  |____/\____/ \/\_/
-               \/               \/\/         \/            \/      \/         \/                   \/
+                        _                           _     __ _
+                       (_)                         | |   / _| |
+ _ __ _   _  ___  _   _ _ ________      _____  _ __| | _| |_| | _____      __
+| '__| | | |/ _ \| | | | |______\ \ /\ / / _ \| '__| |/ /  _| |/ _ \ \ /\ / /
+| |  | |_| | (_) | |_| | |       \ V  V / (_) | |  |   <| | | | (_) \ V  V /
+|_|   \__,_|\___/ \__, |_|        \_/\_/ \___/|_|  |_|\_\_| |_|\___/ \_/\_/
+                   __/ |
+                  |___/

+ 1 - 1
ruoyi-modules/ruoyi-workflow/src/main/resources/logback-plus.xml

@@ -14,7 +14,7 @@
         </encoder>
     </appender>
 
-<!--    <include resource="logback-common.xml" />-->
+    <include resource="logback-common.xml" />
 
     <include resource="logback-logstash.xml" />
 

+ 8 - 7
ruoyi-visual/ruoyi-monitor/src/main/resources/banner.txt

@@ -1,9 +1,10 @@
 Spring Boot Version: ${spring-boot.version}
 Spring Application Name: ${spring.application.name}
-
-__________        __      _________               __                      _____                .__  __
-\______   \ _____/  |_   /   _____/__.__. _______/  |_  ____   _____     /     \   ____   ____ |__|/  |_  ___________
- |     ___// __ \   __\  \_____  <   |  |/  ___/\   __\/ __ \ /     \   /  \ /  \ /  _ \ /    \|  \   __\/  _ \_  __ \
- |    |   \  ___/|  |    /        \___  |\___ \  |  | \  ___/|  Y Y  \ /    Y    (  <_> )   |  \  ||  | (  <_> )  | \/
- |____|    \___  >__|   /_______  / ____/____  > |__|  \___  >__|_|  / \____|__  /\____/|___|  /__||__|  \____/|__|
-               \/               \/\/         \/            \/      \/          \/            \/
+                            _                                   _  _                
+                           (_)                                 (_)| |               
+ _ __  _   _   ___   _   _  _  ______  _ __ ___    ___   _ __   _ | |_   ___   _ __ 
+| '__|| | | | / _ \ | | | || ||______|| '_ ` _ \  / _ \ | '_ \ | || __| / _ \ | '__|
+| |   | |_| || (_) || |_| || |        | | | | | || (_) || | | || || |_ | (_) || |   
+|_|    \__,_| \___/  \__, ||_|        |_| |_| |_| \___/ |_| |_||_| \__| \___/ |_|   
+                      __/ |                                                         
+                     |___/                                                          

+ 4 - 4
ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties

@@ -75,7 +75,7 @@ nacos.naming.empty-service.clean.period-time-ms=30000
 
 
 #*************** Metrics Related Configurations ***************#
-# 指向 ruoyi-monitor 监控
+# 指向 ruoyi-monitor 监控
 spring.boot.admin.client.url=http://127.0.0.1:9100
 spring.boot.admin.client.username=ruoyi
 spring.boot.admin.client.password=123456
@@ -119,7 +119,7 @@ nacos.core.auth.enable.userAgentAuthWhite=false
 
 ### Since 1.4.1, worked when nacos.core.auth.enabled=true and nacos.core.auth.enable.userAgentAuthWhite=false.
 ### The two properties is the white list for auth and used by identity the request from other server.
-### 此处为用户名密码 需要自行修改
+### 此处为用户名密码 需要自行修改
 nacos.core.auth.server.identity.key=ruoyi-vue-plus-key
 nacos.core.auth.server.identity.value=ruoyi-vue-plus-value
 
@@ -129,10 +129,10 @@ nacos.core.auth.plugin.nacos.token.cache.enable=false
 nacos.core.auth.plugin.nacos.token.expire.seconds=18000
 ### The default token (Base64 string):
 #nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
-### 此处为token密钥 需要自行修改
+### 此处为token密钥 需要自行修改
 nacos.core.auth.plugin.nacos.token.secret.key=rE7bYayhpvduYwCxuhckybEPDXyna6xwm5m7MZjtjrdXjVxAbXAMccXHyaJvB346
 
-### worked when nacos.core.auth.system.type=ldap,{0} is Placeholder,replace login username
+### worked when nacos.core.auth.system.type=ldap{0} is Placeholder,replace login username
 #nacos.core.auth.ldap.url=ldap://localhost:389
 #nacos.core.auth.ldap.basedc=dc=example,dc=org
 #nacos.core.auth.ldap.userDn=cn=admin,${nacos.core.auth.ldap.basedc}

+ 6 - 6
ruoyi-visual/ruoyi-seata-server/src/main/resources/banner.txt

@@ -1,8 +1,8 @@
 Spring Boot Version: ${spring-boot.version}
 Spring Application Name: ${spring.application.name}
-  _________              __             _________
- /   _____/ ____ _____ _/  |______     /   _____/ ______________  __ ___________
- \_____  \_/ __ \\__  \\   __\__  \    \_____  \_/ __ \_  __ \  \/ // __ \_  __ \
- /        \  ___/ / __ \|  |  / __ \_  /        \  ___/|  | \/\   /\  ___/|  | \/
-/_______  /\___  >____  /__| (____  / /_______  /\___  >__|    \_/  \___  >__|
-        \/     \/     \/          \/          \/     \/                 \/
+                _
+               | |
+ ___  ___  __ _| |_ __ _ ______ ___  ___ _ ____   _____ _ __
+/ __|/ _ \/ _` | __/ _` |______/ __|/ _ \ '__\ \ / / _ \ '__|
+\__ \  __/ (_| | || (_| |      \__ \  __/ |   \ V /  __/ |
+|___/\___|\__,_|\__\__,_|      |___/\___|_|    \_/ \___|_|

+ 8 - 6
ruoyi-visual/ruoyi-snailjob-server/src/main/resources/banner.txt

@@ -1,8 +1,10 @@
 Application Version: ${revision}
 Spring Boot Version: ${spring-boot.version}
-  _________             .__.__       __      ___.       _________
- /   _____/ ____ _____  |__|  |     |__| ____\_ |__    /   _____/ ______________  __ ___________
- \_____  \ /    \\__  \ |  |  |     |  |/  _ \| __ \   \_____  \_/ __ \_  __ \  \/ // __ \_  __ \
- /        \   |  \/ __ \|  |  |__   |  (  <_> ) \_\ \  /        \  ___/|  | \/\   /\  ___/|  | \/
-/_______  /___|  (____  /__|____/\__|  |\____/|___  / /_______  /\___  >__|    \_/  \___  >__|
-        \/     \/     \/        \______|          \/          \/     \/                 \/
+                 _ _ _       _
+                (_) (_)     | |
+ ___ _ __   __ _ _| |_  ___ | |__ ______ ___  ___ _ ____   _____ _ __
+/ __| '_ \ / _` | | | |/ _ \| '_ \______/ __|/ _ \ '__\ \ / / _ \ '__|
+\__ \ | | | (_| | | | | (_) | |_) |     \__ \  __/ |   \ V /  __/ |
+|___/_| |_|\__,_|_|_| |\___/|_.__/      |___/\___|_|    \_/ \___|_|
+                   _/ |
+                  |__/

+ 14 - 0
script/sql/business/create.sql

@@ -0,0 +1,14 @@
+CREATE TABLE `pet_system`.`sys_tenant_categories`
+(
+    `id`          bigint PRIMARY KEY NOT NULL COMMENT '序号',
+    `name`        varchar(255)       NOT NULL COMMENT '分类名称',
+    `sort`        bigint COMMENT '排序',
+    `icon`        bigint COMMENT '图标',
+    `status`      tinyint            NOT NULL DEFAULT 0 COMMENT '状态',
+    `del_flag`    char(1)                     DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+    `create_dept` bigint(20) COMMENT '创建部门',
+    `create_by`   bigint(20) COMMENT '创建者',
+    `create_time` datetime COMMENT '创建时间',
+    `update_by`   bigint(20) COMMENT '更新者',
+    `update_time` datetime COMMENT '更新时间'
+) ENGINE = innoDB COMMENT = '商户分类表';

+ 25 - 0
script/sql/business/update.sql

@@ -0,0 +1,25 @@
+# 2026/02/10
+ALTER TABLE `pet_system`.`sys_menu` ADD COLUMN `platform_id` tinyint NOT NULL COMMENT '平台ID';
+ALTER TABLE `pet_system`.`sys_user` ADD COLUMN `platform_id` tinyint NOT NULL COMMENT '平台ID';
+
+# 2026/02/11
+-- 菜单 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, platform_id)
+values(2021464069248733185, '商户分类', '6', '1', 'tenantCategories', 'system/tenantCategories/index', 1, 0, 'C', '0', '0', 'system:tenantCategories:list', '#', 103, 1, sysdate(), null, null, '商户分类菜单', 0);
+
+-- 按钮 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, platform_id)
+values(2021464069248733186, '商户分类查询', 2021464069248733185, '1',  '#', '', 1, 0, 'F', '0', '0', 'system:tenantCategories:query',        '#', 103, 1, sysdate(), null, null, '', 0);
+
+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, platform_id)
+values(2021464069248733187, '商户分类新增', 2021464069248733185, '2',  '#', '', 1, 0, 'F', '0', '0', 'system:tenantCategories:add',          '#', 103, 1, sysdate(), null, null, '', 0);
+
+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, platform_id)
+values(2021464069248733188, '商户分类修改', 2021464069248733185, '3',  '#', '', 1, 0, 'F', '0', '0', 'system:tenantCategories:edit',         '#', 103, 1, sysdate(), null, null, '', 0);
+
+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, platform_id)
+values(2021464069248733189, '商户分类删除', 2021464069248733185, '4',  '#', '', 1, 0, 'F', '0', '0', 'system:tenantCategories:remove',       '#', 103, 1, sysdate(), null, null, '', 0);
+
+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, platform_id)
+values(2021464069248733190, '商户分类导出', 2021464069248733185, '5',  '#', '', 1, 0, 'F', '0', '0', 'system:tenantCategories:export',       '#', 103, 1, sysdate(), null, null, '', 0);
+