getAdminPostCfgPage(AdminPostCfgPageReqVO pageReqVO) {
+ return adminPostCfgMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/application-dev.yaml b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/application-dev.yaml
new file mode 100644
index 000000000..b63fe3a07
--- /dev/null
+++ b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/application-dev.yaml
@@ -0,0 +1,138 @@
+--- #################### 注册中心 + 配置中心相关配置 ####################
+
+spring:
+ cloud:
+ nacos:
+ server-addr: 192.168.1.128:8848 # Nacos 服务器地址
+ username: nacos # Nacos 账号
+ password: nacos # Nacos 密码
+ discovery: # 【配置中心】配置项
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+ metadata:
+ version: 1.0.0 # 服务实例的版本号,可用于灰度发布
+ config: # 【注册中心】配置项
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+
+--- #################### 数据库相关配置 ####################
+spring:
+ # 数据源配置项
+ autoconfigure:
+ exclude:
+ #- com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
+ - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置
+ datasource:
+ druid: # Druid 【监控】相关的全局配置
+ web-stat-filter:
+ enabled: true
+ stat-view-servlet:
+ enabled: true
+ allow: # 设置白名单,不填则允许所有访问
+ url-pattern: /druid/*
+ login-username: # 控制台管理用户名和密码
+ login-password:
+ filter:
+ stat:
+ enabled: true
+ log-slow-sql: true # 慢 SQL 记录
+ slow-sql-millis: 100
+ merge-sql: true
+ wall:
+ config:
+ multi-statement-allow: true
+ dynamic: # 多数据源配置
+ druid: # Druid 【连接池】相关的全局配置
+ initial-size: 1 # 初始连接数
+ min-idle: 1 # 最小连接池数量
+ max-active: 20 # 最大连接池数量
+ max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
+ time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
+ min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
+ max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
+ validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
+ test-while-idle: true
+ test-on-borrow: false
+ test-on-return: false
+ primary: master
+ datasource:
+ master:
+ url: jdbc:mysql://192.168.1.128/hs-hr-cloud?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ # url: jdbc:mysql://192.168.1.128/hs-mall-cloud?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例
+ # url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
+ # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
+ # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
+ # url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
+ username: root
+ password: hs-rootadmin
+ # username: sa # SQL Server 连接的示例
+ # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
+ # username: SYSDBA # DM 连接的示例
+ # password: SYSDBA # DM 连接的示例
+ slave: # 模拟从库,可根据自己需要修改
+ lazy: true # 开启懒加载,保证启动速度
+ url: jdbc:mysql://192.168.1.128/hs-hr-cloud?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
+ username: root
+ password: hs-rootadmin
+
+ # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
+ data:
+ redis:
+ host: 192.168.1.128 # 地址
+ port: 6379 # 端口
+ database: 0 # 数据库索引
+# password: 123456 # 密码,建议生产环境开启
+
+--- #################### MQ 消息队列相关配置 ####################
+
+--- #################### 定时任务相关配置 ####################
+
+xxl:
+ job:
+ enabled: true # 是否开启调度中心,默认为 true 开启
+ admin:
+ addresses: http://192.168.1.128:9090/xxl-job-admin # 调度中心部署跟地址
+
+--- #################### 服务保障相关配置 ####################
+
+# Lock4j 配置项
+lock4j:
+ acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒
+ expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒
+
+--- #################### 监控相关配置 ####################
+
+# Actuator 监控端点的配置项
+management:
+ endpoints:
+ web:
+ base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
+
+# Spring Boot Admin 配置项
+spring:
+ boot:
+ admin:
+ # Spring Boot Admin Client 客户端的相关配置
+ client:
+ instance:
+ service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
+
+# 日志文件配置
+logging:
+ level:
+ # 配置自己写的 MyBatis Mapper 打印日志
+ cn.iocoder.yudao.module.hrmrg.dal.mysql: debug
+ org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 芋艿:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示
+
+--- #################### 芋道相关配置 ####################
+
+# 芋道配置项,设置当前项目所有自定义的配置
+yudao:
+ env: # 多环境的配置项
+ tag: ${HOSTNAME}
+ security:
+ mock-enable: true
+ access-log: # 访问日志的配置项
+ enable: false
\ No newline at end of file
diff --git a/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/application-local.yaml b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/application-local.yaml
new file mode 100644
index 000000000..f4f51c7b0
--- /dev/null
+++ b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/application-local.yaml
@@ -0,0 +1,159 @@
+--- #################### 注册中心 + 配置中心相关配置 ####################
+
+spring:
+ cloud:
+ nacos:
+ server-addr: 192.168.1.128:8848 # Nacos 服务器地址
+ username: nacos # Nacos 账号
+ password: nacos # Nacos 密码
+ discovery: # 【配置中心】配置项
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+ metadata:
+ version: 1.0.0 # 服务实例的版本号,可用于灰度发布
+ config: # 【注册中心】配置项
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+
+--- #################### 数据库相关配置 ####################
+spring:
+
+ # 数据源配置项
+ autoconfigure:
+ exclude:
+ #- de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
+ #- de.codecentric.boot.admin.server.cloud.config.AdminServerDiscoveryAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
+ # - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
+ - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置
+ datasource:
+ druid: # Druid 【监控】相关的全局配置
+ web-stat-filter:
+ enabled: true
+ stat-view-servlet:
+ enabled: true
+ allow: # 设置白名单,不填则允许所有访问
+ url-pattern: /druid/*
+ login-username: # 控制台管理用户名和密码
+ login-password:
+ filter:
+ stat:
+ enabled: true
+ log-slow-sql: true # 慢 SQL 记录
+ slow-sql-millis: 100
+ merge-sql: true
+ wall:
+ config:
+ multi-statement-allow: true
+ dynamic: # 多数据源配置
+ druid: # Druid 【连接池】相关的全局配置
+ initial-size: 1 # 初始连接数
+ min-idle: 1 # 最小连接池数量
+ max-active: 20 # 最大连接池数量
+ max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
+ time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
+ min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
+ max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
+ validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
+ test-while-idle: true
+ test-on-borrow: false
+ test-on-return: false
+ primary: master
+ datasource:
+ master:
+ url: jdbc:mysql://192.168.1.128:3306/hs-hr-cloud?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ # url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例
+ # url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
+ # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
+ # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
+ # url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
+ username: root
+ password: hs-rootadmin
+ # username: sa # SQL Server 连接的示例
+ # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
+ # username: SYSDBA # DM 连接的示例
+ # password: SYSDBA # DM 连接的示例
+ slave: # 模拟从库,可根据自己需要修改
+ lazy: true # 开启懒加载,保证启动速度
+ url: jdbc:mysql://192.168.1.128:3306/hs-hr-cloud?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
+ username: root
+ password: hs-rootadmin
+
+ # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
+ data:
+ redis:
+ host: 192.168.1.128 # 地址
+ port: 6379 # 端口
+ database: 0 # 数据库索引
+# password: 123456 # 密码,建议生产环境开启
+
+--- #################### MQ 消息队列相关配置 ####################
+
+# rocketmq 配置项,对应 RocketMQProperties 配置类
+rocketmq:
+ name-server: 192.168.1.128:9876 # RocketMQ Namesrv
+
+spring:
+ # RabbitMQ 配置项,对应 RabbitProperties 配置类
+ rabbitmq:
+ host: 192.168.1.128 # RabbitMQ 服务的地址
+ port: 5672 # RabbitMQ 服务的端口
+ username: admin # RabbitMQ
+ password: hsrabbitmq # 服务的密码
+ # Kafka 配置项,对应 KafkaProperties 配置类
+ kafka:
+ bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
+
+--- #################### 定时任务相关配置 ####################
+xxl:
+ job:
+ enabled: false # 是否开启调度中心,默认为 true 开启
+ admin:
+ addresses: http://192.168.1.128:9090/xxl-job-admin # 调度中心部署跟地址
+
+--- #################### 服务保障相关配置 ####################
+
+# Lock4j 配置项
+lock4j:
+ acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒
+ expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒
+
+--- #################### 监控相关配置 ####################
+
+# Actuator 监控端点的配置项
+management:
+ endpoints:
+ web:
+ base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
+
+# Spring Boot Admin 配置项
+spring:
+ boot:
+ admin:
+ # Spring Boot Admin Client 客户端的相关配置
+ client:
+ instance:
+ service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
+ # Spring Boot Admin Server 服务端的相关配置
+ context-path: /admin # 配置 Spring
+
+# 日志文件配置
+logging:
+ level:
+ # 配置自己写的 MyBatis Mapper 打印日志
+ cn.iocoder.yudao.module.hrmrg.dal.mysql: debug
+ cn.iocoder.yudao.module.hrmrg.dal.mysql.logger.ApiErrorLogMapper: INFO # 配置 ApiErrorLogMapper 的日志级别为 info,避免和 GlobalExceptionHandler 重复打印
+ cn.iocoder.yudao.module.hrmrg.dal.mysql.file.FileConfigMapper: INFO # 配置 FileConfigMapper 的日志级别为 info
+ org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 芋艿:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示
+
+--- #################### 芋道相关配置 ####################
+
+# 芋道配置项,设置当前项目所有自定义的配置
+yudao:
+ env: # 多环境的配置项
+ tag: ${HOSTNAME}
+ security:
+ mock-enable: true
+ access-log: # 访问日志的配置项
+ enable: false
\ No newline at end of file
diff --git a/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/application.yaml b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/application.yaml
new file mode 100644
index 000000000..3857843aa
--- /dev/null
+++ b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/application.yaml
@@ -0,0 +1,127 @@
+spring:
+ application:
+ name: hrmrg-server
+
+ profiles:
+ active: local
+
+ main:
+ allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。
+ allow-bean-definition-overriding: true # 允许 Bean 覆盖,例如说 Feign 等会存在重复定义的服务
+
+ config:
+ import:
+ - optional:classpath:application-${spring.profiles.active}.yaml # 加载【本地】配置
+ - optional:nacos:${spring.application.name}-${spring.profiles.active}.yaml # 加载【Nacos】的配置
+
+ # Servlet 配置
+ servlet:
+ # 文件上传相关配置项
+ multipart:
+ max-file-size: 16MB # 单个文件大小
+ max-request-size: 32MB # 设置总上传的文件大小
+
+ # Jackson 配置项
+ jackson:
+ serialization:
+ write-dates-as-timestamps: true # 设置 LocalDateTime 的格式,使用时间戳
+ write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401
+ write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳
+ fail-on-empty-beans: false # 允许序列化无属性的 Bean
+
+ # Cache 配置项
+ cache:
+ type: REDIS
+ redis:
+ time-to-live: 1h # 设置过期时间为 1 小时
+
+server:
+ port: 48200
+
+logging:
+ file:
+ name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+
+--- #################### 接口文档配置 ####################
+
+springdoc:
+ api-docs:
+ enabled: true # 1. 是否开启 Swagger 接文档的元数据
+ path: /v3/api-docs
+ swagger-ui:
+ enabled: true # 2.1 是否开启 Swagger 文档的官方 UI 界面
+ path: /swagger-ui
+ default-flat-param-object: true # 参见 https://doc.xiaominfo.com/docs/faq/v4/knife4j-parameterobject-flat-param 文档
+
+knife4j:
+ enable: true # 2.2 是否开启 Swagger 文档的 Knife4j UI 界面
+ setting:
+ language: zh_cn
+
+# MyBatis Plus 的配置项
+mybatis-plus:
+ configuration:
+ map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
+ global-config:
+ db-config:
+ id-type: NONE # “智能”模式,基于 IdTypeEnvironmentPostProcessor + 数据源的类型,自动适配成 AUTO、INPUT 模式。
+ # id-type: AUTO # 自增 ID,适合 MySQL 等直接自增的数据库
+ # id-type: INPUT # 用户输入 ID,适合 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库
+ # id-type: ASSIGN_ID # 分配 ID,默认使用雪花算法。注意,Oracle、PostgreSQL、Kingbase、DB2、H2 数据库时,需要去除实体类上的 @KeySequence 注解
+ logic-delete-value: 1 # 逻辑已删除值(默认为 1)
+ logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
+ banner: false # 关闭控制台的 Banner 打印
+ type-aliases-package: ${yudao.info.base-package}.dal.dataobject
+ encryptor:
+ password: XDV71a+xqStEA3WH # 加解密的秘钥,可使用 https://www.imaegoo.com/2020/aes-key-generator/ 网站生成
+
+mybatis-plus-join:
+ banner: false # 关闭控制台的 Banner 打印
+
+# Spring Data Redis 配置
+spring:
+ data:
+ redis:
+ repositories:
+ enabled: false # 项目未使用到 Spring Data Redis 的 Repository,所以直接禁用,保证启动速度
+
+# VO 转换(数据翻译)相关
+easy-trans:
+ is-enable-global: true # 启用全局翻译(拦截所有 SpringMVC ResponseBody 进行自动翻译 )。如果对于性能要求很高可关闭此配置,或通过 @IgnoreTrans 忽略某个接口
+
+--- #################### RPC 远程调用相关配置 ####################
+
+--- #################### MQ 消息队列相关配置 ####################
+
+--- #################### 定时任务相关配置 ####################
+
+xxl:
+ job:
+ executor:
+ appname: ${spring.application.name} # 执行器 AppName
+ logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径
+ accessToken: default_token # 执行器通讯TOKEN
+
+--- #################### 芋道相关配置 ####################
+
+yudao:
+ info:
+ version: 1.0.0
+ base-package: cn.iocoder.yudao.module.hrmrg
+ web:
+ admin-ui:
+ url: http://dashboard.yudao.iocoder.cn # Admin 管理后台 UI 的地址
+ xss:
+ enable: false
+ exclude-urls: # 如下 url,仅仅是为了演示,去掉配置也没关系
+ - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求
+ swagger:
+ title: 管理后台
+ description: 提供管理员管理的所有功能
+ version: ${yudao.info.version}
+ tenant: # 多租户相关配置项
+ enable: true
+ ignore-urls:
+ ignore-tables:
+
+debug: false
diff --git a/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/logback-spring.xml b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/logback-spring.xml
new file mode 100644
index 000000000..b1b9f3faf
--- /dev/null
+++ b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/logback-spring.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ ${PATTERN_DEFAULT}
+
+
+
+
+
+
+
+
+
+ ${PATTERN_DEFAULT}
+
+
+
+ ${LOG_FILE}
+
+
+ ${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}
+
+ ${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}
+
+ ${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}
+
+ ${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}
+
+ ${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-30}
+
+
+
+
+
+ 0
+
+ 256
+
+
+
+
+
+
+
+ ${PATTERN_DEFAULT}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/mapper/adminatmk/AdminAtmkMapper.xml b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/mapper/adminatmk/AdminAtmkMapper.xml
new file mode 100644
index 000000000..df16dbae1
--- /dev/null
+++ b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/mapper/adminatmk/AdminAtmkMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/mapper/adminatmkface/AdminAtmkFaceMapper.xml b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/mapper/adminatmkface/AdminAtmkFaceMapper.xml
new file mode 100644
index 000000000..f3554af7f
--- /dev/null
+++ b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/mapper/adminatmkface/AdminAtmkFaceMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/mapper/adminatmkgroutcfg/AdminAtmkGroutCfgMapper.xml b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/mapper/adminatmkgroutcfg/AdminAtmkGroutCfgMapper.xml
new file mode 100644
index 000000000..3423539b7
--- /dev/null
+++ b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/mapper/adminatmkgroutcfg/AdminAtmkGroutCfgMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/mapper/adminperfcfg/AdminPerfCfgMapper.xml b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/mapper/adminperfcfg/AdminPerfCfgMapper.xml
new file mode 100644
index 000000000..eda558dd8
--- /dev/null
+++ b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/mapper/adminperfcfg/AdminPerfCfgMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/mapper/adminpostcfg/AdminPostCfgMapper.xml b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/mapper/adminpostcfg/AdminPostCfgMapper.xml
new file mode 100644
index 000000000..241d1f487
--- /dev/null
+++ b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/main/resources/mapper/adminpostcfg/AdminPostCfgMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/test/resources/application-unit-test.yaml b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/test/resources/application-unit-test.yaml
new file mode 100644
index 000000000..b337d1ece
--- /dev/null
+++ b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/test/resources/application-unit-test.yaml
@@ -0,0 +1,48 @@
+spring:
+ main:
+ lazy-initialization: true # 开启懒加载,加快速度
+ banner-mode: off # 单元测试,禁用 Banner
+
+--- #################### 数据库相关配置 ####################
+
+spring:
+ # 数据源配置项
+ datasource:
+ name: ruoyi-vue-pro
+ url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写
+ driver-class-name: org.h2.Driver
+ username: sa
+ password:
+ druid:
+ async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度
+ initial-size: 1 # 单元测试,配置为 1,提升启动速度
+ sql:
+ init:
+ schema-locations: classpath:/sql/create_tables.sql
+
+ # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
+ redis:
+ host: 127.0.0.1 # 地址
+ port: 16379 # 端口(单元测试,使用 16379 端口)
+ database: 0 # 数据库索引
+
+mybatis-plus:
+ lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试
+ type-aliases-package: ${yudao.info.base-package}.dal.dataobject
+
+--- #################### 定时任务相关配置 ####################
+
+--- #################### 配置中心相关配置 ####################
+
+--- #################### 服务保障相关配置 ####################
+
+# Lock4j 配置项(单元测试,禁用 Lock4j)
+
+--- #################### 监控相关配置 ####################
+
+--- #################### 芋道相关配置 ####################
+
+# 芋道配置项,设置当前项目所有自定义的配置
+yudao:
+ info:
+ base-package: cn.iocoder.yudao.module.product
diff --git a/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/test/resources/logback.xml b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/test/resources/logback.xml
new file mode 100644
index 000000000..daf756bff
--- /dev/null
+++ b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/test/resources/logback.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/test/resources/sql/clean.sql b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/test/resources/sql/clean.sql
new file mode 100644
index 000000000..e00e95b77
--- /dev/null
+++ b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/test/resources/sql/clean.sql
@@ -0,0 +1 @@
+delete from hr_admin_atmk
\ No newline at end of file
diff --git a/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/test/resources/sql/create_tables.sql b/yudao-module-hrmrg/yudao-module-hrmrg-biz/src/test/resources/sql/create_tables.sql
new file mode 100644
index 000000000..e69de29bb
diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-dev.yaml b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-dev.yaml
index 80dc8f7bf..1a19d0f18 100644
--- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-dev.yaml
+++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-dev.yaml
@@ -3,9 +3,9 @@
spring:
cloud:
nacos:
- server-addr: 127.0.0.1:8848 # Nacos 服务器地址
- username: # Nacos 账号
- password: # Nacos 密码
+ server-addr: 192.168.1.128:8848 # Nacos 服务器地址
+ username: nacos # Nacos 账号
+ password: nacos # Nacos 密码
discovery: # 【配置中心】配置项
namespace: dev # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
@@ -55,19 +55,19 @@ spring:
primary: master
datasource:
master:
- url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ url: jdbc:mysql://192.168.1.128:3306/hs-admin-cloud?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
username: root
- password: 123456
+ password: hs-rootadmin
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
lazy: true # 开启懒加载,保证启动速度
- url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ url: jdbc:mysql://192.168.1.128:3306/hs-admin-cloud?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
username: root
- password: 123456
+ password: hs-rootadmin
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
data:
redis:
- host: 400-infra.server.iocoder.cn # 地址
+ host: 192.168.1.128 # 地址
port: 6379 # 端口
database: 1 # 数据库索引
# password: 123456 # 密码,建议生产环境开启
@@ -76,15 +76,15 @@ spring:
# rocketmq 配置项,对应 RocketMQProperties 配置类
rocketmq:
- name-server: 127.0.0.1:9876 # RocketMQ Namesrv
+ name-server: 192.168.1.128:9876 # RocketMQ Namesrv
spring:
# RabbitMQ 配置项,对应 RabbitProperties 配置类
rabbitmq:
- host: 127.0.0.1 # RabbitMQ 服务的地址
+ host: 192.168.1.128 # RabbitMQ 服务的地址
port: 5672 # RabbitMQ 服务的端口
- username: guest # RabbitMQ 服务的账号
- password: guest # RabbitMQ 服务的密码
+ username: admin # RabbitMQ
+ password: hsrabbitmq # 服务的密码
# Kafka 配置项,对应 KafkaProperties 配置类
kafka:
bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
@@ -93,7 +93,7 @@ spring:
xxl:
job:
admin:
- addresses: http://127.0.0.1:9090/xxl-job-admin # 调度中心部署跟地址
+ addresses: http://192.168.1.128:9090/xxl-job-admin # 调度中心部署跟地址
--- #################### 服务保障相关配置 ####################
diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-local.yaml b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-local.yaml
index aaa8ccef7..e04749baa 100644
--- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-local.yaml
+++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-local.yaml
@@ -3,9 +3,9 @@
spring:
cloud:
nacos:
- server-addr: 127.0.0.1:8848 # Nacos 服务器地址
- username: # Nacos 账号
- password: # Nacos 密码
+ server-addr: 192.168.1.128:8848 # Nacos 服务器地址
+ username: nacos # Nacos 账号
+ password: nacos # Nacos 密码
discovery: # 【配置中心】配置项
namespace: dev # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
@@ -60,28 +60,28 @@ spring:
primary: master
datasource:
master:
- url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ url: jdbc:mysql://192.168.1.128:3306/hs-admin-cloud?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
# url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例
# url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
# url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
username: root
- password: 123456
+ password: hs-rootadmin
# username: sa # SQL Server 连接的示例
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
# username: SYSDBA # DM 连接的示例
# password: SYSDBA # DM 连接的示例
slave: # 模拟从库,可根据自己需要修改
lazy: true # 开启懒加载,保证启动速度
- url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
+ url: jdbc:mysql://192.168.1.128:3306/hs-admin-cloud?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
username: root
- password: 123456
+ password: hs-rootadmin
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
data:
redis:
- host: 127.0.0.1 # 地址
+ host: 192.168.1.128 # 地址
port: 6379 # 端口
database: 0 # 数据库索引
# password: 123456 # 密码,建议生产环境开启
@@ -90,15 +90,15 @@ spring:
# rocketmq 配置项,对应 RocketMQProperties 配置类
rocketmq:
- name-server: 127.0.0.1:9876 # RocketMQ Namesrv
+ name-server: 192.168.1.128:9876 # RocketMQ Namesrv
spring:
# RabbitMQ 配置项,对应 RabbitProperties 配置类
rabbitmq:
- host: 127.0.0.1 # RabbitMQ 服务的地址
+ host: 192.168.1.128 # RabbitMQ 服务的地址
port: 5672 # RabbitMQ 服务的端口
- username: guest # RabbitMQ 服务的账号
- password: guest # RabbitMQ 服务的密码
+ username: admin # RabbitMQ
+ password: hsrabbitmq # 服务的密码
# Kafka 配置项,对应 KafkaProperties 配置类
kafka:
bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
@@ -108,7 +108,7 @@ xxl:
job:
enabled: false # 是否开启调度中心,默认为 true 开启
admin:
- addresses: http://127.0.0.1:9090/xxl-job-admin # 调度中心部署跟地址
+ addresses: http://192.168.1.128:9090/xxl-job-admin # 调度中心部署跟地址
--- #################### 服务保障相关配置 ####################
diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-prod.yaml b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-prod.yaml
new file mode 100644
index 000000000..e04749baa
--- /dev/null
+++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-prod.yaml
@@ -0,0 +1,159 @@
+--- #################### 注册中心 + 配置中心相关配置 ####################
+
+spring:
+ cloud:
+ nacos:
+ server-addr: 192.168.1.128:8848 # Nacos 服务器地址
+ username: nacos # Nacos 账号
+ password: nacos # Nacos 密码
+ discovery: # 【配置中心】配置项
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+ metadata:
+ version: 1.0.0 # 服务实例的版本号,可用于灰度发布
+ config: # 【注册中心】配置项
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+
+--- #################### 数据库相关配置 ####################
+spring:
+
+ # 数据源配置项
+ autoconfigure:
+ exclude:
+ - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
+ - de.codecentric.boot.admin.server.cloud.config.AdminServerDiscoveryAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
+ - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
+ - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置
+ datasource:
+ druid: # Druid 【监控】相关的全局配置
+ web-stat-filter:
+ enabled: true
+ stat-view-servlet:
+ enabled: true
+ allow: # 设置白名单,不填则允许所有访问
+ url-pattern: /druid/*
+ login-username: # 控制台管理用户名和密码
+ login-password:
+ filter:
+ stat:
+ enabled: true
+ log-slow-sql: true # 慢 SQL 记录
+ slow-sql-millis: 100
+ merge-sql: true
+ wall:
+ config:
+ multi-statement-allow: true
+ dynamic: # 多数据源配置
+ druid: # Druid 【连接池】相关的全局配置
+ initial-size: 1 # 初始连接数
+ min-idle: 1 # 最小连接池数量
+ max-active: 20 # 最大连接池数量
+ max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
+ time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
+ min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
+ max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
+ validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
+ test-while-idle: true
+ test-on-borrow: false
+ test-on-return: false
+ primary: master
+ datasource:
+ master:
+ url: jdbc:mysql://192.168.1.128:3306/hs-admin-cloud?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ # url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例
+ # url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
+ # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
+ # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
+ # url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
+ username: root
+ password: hs-rootadmin
+ # username: sa # SQL Server 连接的示例
+ # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
+ # username: SYSDBA # DM 连接的示例
+ # password: SYSDBA # DM 连接的示例
+ slave: # 模拟从库,可根据自己需要修改
+ lazy: true # 开启懒加载,保证启动速度
+ url: jdbc:mysql://192.168.1.128:3306/hs-admin-cloud?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
+ username: root
+ password: hs-rootadmin
+
+ # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
+ data:
+ redis:
+ host: 192.168.1.128 # 地址
+ port: 6379 # 端口
+ database: 0 # 数据库索引
+# password: 123456 # 密码,建议生产环境开启
+
+--- #################### MQ 消息队列相关配置 ####################
+
+# rocketmq 配置项,对应 RocketMQProperties 配置类
+rocketmq:
+ name-server: 192.168.1.128:9876 # RocketMQ Namesrv
+
+spring:
+ # RabbitMQ 配置项,对应 RabbitProperties 配置类
+ rabbitmq:
+ host: 192.168.1.128 # RabbitMQ 服务的地址
+ port: 5672 # RabbitMQ 服务的端口
+ username: admin # RabbitMQ
+ password: hsrabbitmq # 服务的密码
+ # Kafka 配置项,对应 KafkaProperties 配置类
+ kafka:
+ bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
+
+--- #################### 定时任务相关配置 ####################
+xxl:
+ job:
+ enabled: false # 是否开启调度中心,默认为 true 开启
+ admin:
+ addresses: http://192.168.1.128:9090/xxl-job-admin # 调度中心部署跟地址
+
+--- #################### 服务保障相关配置 ####################
+
+# Lock4j 配置项
+lock4j:
+ acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒
+ expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒
+
+--- #################### 监控相关配置 ####################
+
+# Actuator 监控端点的配置项
+management:
+ endpoints:
+ web:
+ base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
+
+# Spring Boot Admin 配置项
+spring:
+ boot:
+ admin:
+ # Spring Boot Admin Client 客户端的相关配置
+ client:
+ instance:
+ service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
+ # Spring Boot Admin Server 服务端的相关配置
+ context-path: /admin # 配置 Spring
+
+# 日志文件配置
+logging:
+ level:
+ # 配置自己写的 MyBatis Mapper 打印日志
+ cn.iocoder.yudao.module.infra.dal.mysql: debug
+ cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiErrorLogMapper: INFO # 配置 ApiErrorLogMapper 的日志级别为 info,避免和 GlobalExceptionHandler 重复打印
+ cn.iocoder.yudao.module.infra.dal.mysql.file.FileConfigMapper: INFO # 配置 FileConfigMapper 的日志级别为 info
+ org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 芋艿:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示
+
+--- #################### 芋道相关配置 ####################
+
+# 芋道配置项,设置当前项目所有自定义的配置
+yudao:
+ env: # 多环境的配置项
+ tag: ${HOSTNAME}
+ security:
+ mock-enable: true
+ access-log: # 访问日志的配置项
+ enable: false
\ No newline at end of file
diff --git a/yudao-module-mall/pom.xml b/yudao-module-mall/pom.xml
index 8cb649739..a9eef3c39 100644
--- a/yudao-module-mall/pom.xml
+++ b/yudao-module-mall/pom.xml
@@ -26,6 +26,10 @@
yudao-module-trade-biz
yudao-module-statistics-api
yudao-module-statistics-biz
+ yudao-module-hshy-api
+ yudao-module-hshy-biz
+ yudao-module-hsfx-api
+ yudao-module-hsfx-biz
diff --git a/yudao-module-mall/yudao-module-hsfx-api/pom.xml b/yudao-module-mall/yudao-module-hsfx-api/pom.xml
new file mode 100644
index 000000000..d3652d3d2
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-api/pom.xml
@@ -0,0 +1,47 @@
+
+
+
+ cn.iocoder.cloud
+ yudao-module-mall
+ ${revision}
+
+ 4.0.0
+ yudao-module-hsfx-api
+ jar
+
+ ${project.artifactId}
+
+ infra 模块 API,暴露给其它模块调用
+
+
+
+
+ cn.iocoder.cloud
+ yudao-common
+
+
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-api
+ provided
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+ true
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+ true
+
+
+
+
diff --git a/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragebaseconfig/BrokerageBaseConfigApi.java b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragebaseconfig/BrokerageBaseConfigApi.java
new file mode 100644
index 000000000..cc49a416f
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragebaseconfig/BrokerageBaseConfigApi.java
@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.hsfx.api.brokeragebaseconfig;
+
+import cn.iocoder.yudao.module.hsfx.api.brokeragebaseconfig.dto.RpcBrokerageBaseConfigDto;
+import cn.iocoder.yudao.module.hsfx.api.brokeragelevelhistory.dto.RpcBroLevelHisRespDto;
+import cn.iocoder.yudao.module.hsfx.enums.ApiConstants;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+
+/**
+ * @author izao
+ * @Description 分销基础配置远程调用接口
+ * @date 2024/12/26 10:57
+ */
+@FeignClient(name = ApiConstants.NAME)
+@Tag(name = "RPC服务-分销基础配置远程调用接口")
+public interface BrokerageBaseConfigApi {
+ String PREFIX = ApiConstants.PREFIX + "/brokerage-baseconfig";//controller层访问前缀
+
+ /**
+ * @Description 根据id获取分销基础配置详情
+ * @author izao
+ * @date 2024/12/26 11:58
+ * @param id
+ * @return RpcBroLevelHisRespDto
+ */
+ @GetMapping(PREFIX + "/get")
+ @Operation(summary = "根据id获取分销基础配置详情")
+ @Parameter(name = "id", description = "分销基础配置id", example = "1", required = true)
+ RpcBrokerageBaseConfigDto getBroBaseConfigById(Long id);
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragebaseconfig/dto/RpcBrokerageBaseConfigDto.java b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragebaseconfig/dto/RpcBrokerageBaseConfigDto.java
new file mode 100644
index 000000000..a0f9af850
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragebaseconfig/dto/RpcBrokerageBaseConfigDto.java
@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.hsfx.api.brokeragebaseconfig.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "RPC服务 - 分销基础配置 返回DTO")
+@Data
+public class RpcBrokerageBaseConfigDto {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1354")
+ private Long id;
+
+ @Schema(description = "基础配置json")
+ private String baseConfigJson;
+
+ @Schema(description = "结算设置配置json")
+ private String settleConfigJson;
+
+ @Schema(description = "文字设置配置json")
+ private String textConfigJson;
+
+ @Schema(description = "业绩中心配置json")
+ private String perforConfigJson;
+
+ @Schema(description = "创建时间")
+ private LocalDateTime createTime;
+
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevel/BrokerageLevelApi.java b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevel/BrokerageLevelApi.java
new file mode 100644
index 000000000..e99636a12
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevel/BrokerageLevelApi.java
@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.hsfx.api.brokeragelevel;
+
+import cn.iocoder.yudao.module.hsfx.api.brokeragelevel.dto.RpcBrokerageLevelDto;
+import cn.iocoder.yudao.module.hsfx.enums.ApiConstants;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+
+/**
+ * @author izao
+ * @Description 分销商等级远程调用接口
+ * @date 2024/12/26 11:05
+ */
+@FeignClient(name = ApiConstants.NAME)
+@Tag(name = "RPC服务-分销商等级")
+public interface BrokerageLevelApi {
+ String PREFIX = ApiConstants.PREFIX + "/brokerage-level";//controller层访问前缀
+
+ /**
+ * @param id
+ * @return RpcBrokerageLevelDto
+ * @Description 获取分销商等级详情
+ * @author izao
+ * @date 2024/12/26 11:44
+ */
+ @GetMapping(PREFIX + "/get")
+ @Operation(summary = "获取分销用户详情")
+ @Parameter(name = "id", description = "分销用户id", example = "1", required = true)
+ RpcBrokerageLevelDto getBroLevelHisById(Long id);
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevel/dto/RpcBrokerageLevelDto.java b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevel/dto/RpcBrokerageLevelDto.java
new file mode 100644
index 000000000..7e0ea9320
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevel/dto/RpcBrokerageLevelDto.java
@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.hsfx.api.brokeragelevel.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "RPC服务 - 分销商等级返回DTO")
+@Data
+public class RpcBrokerageLevelDto {
+
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23559")
+ private Long id;
+
+ @Schema(description = "等级 默认等级、一级、二级、三级等")
+ private String level;
+
+ @Schema(description = "等级名称")
+ private String levelName;
+
+ @Schema(description = "基础配置json;一级、二级、三级佣金比例、培育奖等")
+ private String baseConfig;
+
+ @Schema(description = "升级策略配置json 升级到此等级需要的条件")
+ private String upgradeConfig;
+
+ @Schema(description = "降级策略配置json 不满足此条件则降级")
+ private String downgradeConfig;
+
+ @Schema(description = "创建时间")
+ private LocalDateTime createTime;
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevelhistory/BroLevelHisApi.java b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevelhistory/BroLevelHisApi.java
new file mode 100644
index 000000000..09df8ab8f
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevelhistory/BroLevelHisApi.java
@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.hsfx.api.brokeragelevelhistory;
+
+import cn.iocoder.yudao.module.hsfx.api.brokeragelevelhistory.dto.RpcBroLevelHisRespDto;
+import cn.iocoder.yudao.module.hsfx.enums.ApiConstants;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+
+/**
+ * @Description 分销等级变更历史记录远程调用接口
+ * @author izao
+ * @date 2024/12/26 10:57
+ */
+@FeignClient(name = ApiConstants.NAME)
+@Tag(name = "RPC服务-分销等级变更历史记录")
+public interface BroLevelHisApi {
+
+ String PREFIX = ApiConstants.PREFIX + "/brokerage-levelhistory";//controller层访问前缀
+
+ /**
+ * @Description 获取等级变更历史记录详情
+ * @author izao
+ * @date 2024/12/26 11:52
+ * @param id
+ * @return RpcBroLevelHisRespDto
+ */
+ @GetMapping(PREFIX + "/get")
+ @Operation(summary = "获取等级变更历史记录详情")
+ @Parameter(name = "id", description = "等级变更历史记录id", example = "1", required = true)
+ RpcBroLevelHisRespDto getBroLevelHisById(Long id);
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevelhistory/dto/RpcBroLevelHisRespDto.java b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevelhistory/dto/RpcBroLevelHisRespDto.java
new file mode 100644
index 000000000..10cca636b
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevelhistory/dto/RpcBroLevelHisRespDto.java
@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.hsfx.api.brokeragelevelhistory.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "RPC服务 - 分销商等级变更历史记录返回DTO")
+@Data
+public class RpcBroLevelHisRespDto {
+
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20579")
+ private Long id;
+
+ @Schema(description = "分销用户id", example = "29277")
+ private Long brokerageUserId;
+
+ @Schema(description = "初始等级id", example = "28982")
+ private Long initLevelId;
+
+ @Schema(description = "目标(现在)等级id", example = "5160")
+ private Long toLevelId;
+
+ @Schema(description = "变动原因", example = "不满足条件自动降级")
+ private String changeReason;
+
+ @Schema(description = "创建时间")
+ private LocalDateTime createTime;
+
+ private String brokerageMemberNickName;//分销用户会员昵称
+
+ private String initLevelName;//初始等级名称
+
+ private String toLevelName;//变动目标等级
+
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokerageuser/BrokerageUserApi.java b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokerageuser/BrokerageUserApi.java
new file mode 100644
index 000000000..73cb9b593
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokerageuser/BrokerageUserApi.java
@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.hsfx.api.brokerageuser;
+
+import cn.iocoder.yudao.module.hsfx.api.brokerageuser.dto.RpcBrokerageUserRespDto;
+import cn.iocoder.yudao.module.hsfx.enums.ApiConstants;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * @Description 分销用户远程调用接口
+ * @Author izao
+ * @Date 2024/12/26 10:31
+ */
+@FeignClient(name = ApiConstants.NAME)
+@Tag(name = "RPC服务-分销用户")
+public interface BrokerageUserApi {
+ String PREFIX = ApiConstants.PREFIX + "/brokerage-user";//controller层访问前缀
+
+
+ /**
+ * @Description 远程调用 获取分销用户详情
+ * @author izao
+ * @date 2024/12/26 10:51
+ * @param id
+ * @return BrokerageUserRespDto
+ */
+ @GetMapping(PREFIX + "/get")
+ @Operation(summary = "获取分销用户详情")
+ @Parameter(name = "id", description = "分销用户id", example = "1", required = true)
+ RpcBrokerageUserRespDto getBrokerageUserById(@RequestParam("id") Long id);
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokerageuser/dto/RpcBrokerageUserRespDto.java b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokerageuser/dto/RpcBrokerageUserRespDto.java
new file mode 100644
index 000000000..2cb4080cf
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokerageuser/dto/RpcBrokerageUserRespDto.java
@@ -0,0 +1,38 @@
+package cn.iocoder.yudao.module.hsfx.api.brokerageuser.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "RPC服务 - 分销用户返回DTO")
+@Data
+public class RpcBrokerageUserRespDto {
+ @Schema(description = "分销商id", example = "8493")
+ private Long id;//分销商id
+
+ @Schema(description = "会员id", example = "2354")
+ private Long memberUserId;//会员id
+
+ @Schema(description = "会员昵称", example = "芊芊")
+ private String nickName;//会员昵称
+
+ @Schema(description = "会员名称", example = "李四")
+ private String name;//会员名称
+
+ @Schema(description = "会员手机号", example = "15801123344")
+ private String phone;//会员手机号
+
+ @Schema(description = "分销商等级id", example = "2")
+ private Long levelId;//分销商等级id
+
+ @Schema(description = "等级名称", example = "测试等级")
+ private String levelName;//等级名称
+
+ @Schema(description = "上级分销商id", example = "123")
+ private Long parentId;
+
+ @Schema(description = "上级会员id", example = "123")
+ private Long parentMemberUserId;
+
+ @Schema(description = "上级分销商昵称", example = "张三")
+ private String parentMemberNickName;
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/enums/ApiConstants.java b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/enums/ApiConstants.java
new file mode 100644
index 000000000..887ee5fd4
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/enums/ApiConstants.java
@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.module.hsfx.enums;
+
+import cn.iocoder.yudao.framework.common.enums.RpcConstants;
+
+public class ApiConstants {
+ // hsfx-server/hsfx/xxx
+ /**
+ * 服务名
+ *
+ * 注意,需要保证和 spring.application.name 保持一致
+ */
+ public static final String NAME = "hsfx-server";
+
+ /**
+ * controller访问前缀
+ */
+ public static final String PREFIX = RpcConstants.RPC_API_PREFIX + "/hsfx";
+
+ public static final String VERSION = "1.0.0";
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/enums/ErrorCodeConstants.java b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/enums/ErrorCodeConstants.java
new file mode 100644
index 000000000..0eb719777
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-api/src/main/java/cn/iocoder/yudao/module/hsfx/enums/ErrorCodeConstants.java
@@ -0,0 +1,46 @@
+package cn.iocoder.yudao.module.hsfx.enums;
+
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+
+
+/**
+ * 海上分销 错误码枚举类
+ *
+ * 海上分销 系统,使用 1-100-000-000 段
+ */
+public interface ErrorCodeConstants {
+ // ========== 分销用户不存在 TODO 补充编号 ==========
+
+ //分销商 1-100-001-xxx
+ //分销等级 1-100-002-xxx
+ //分销基础配置 1-100-003-xxx
+ //等级变更历史 1-100-004-xxx
+
+ ErrorCode MEMBER_USER_NOT_EXISTS = new ErrorCode(1 - 100 - 001 - 001, "分销会员信息不存在!");
+ ErrorCode PARENT_BROKERAGE_USER_NOT_EXISTS = new ErrorCode(1 - 001 - 100 - 002, "上级分销用户不存在!");
+ ErrorCode BROKERAGE_USER_NOT_EXISTS = new ErrorCode(1 - 100 - 001 - 003, "分销用户不存在!");
+ ErrorCode BROKERAGE_USER_ALREADY_EXISTS = new ErrorCode(1 - 100 - 001 - 004, "分销用户已存在!");
+ ErrorCode BROKERAGE_USER_MEMBER_MISMATCH = new ErrorCode(1 - 100 - 001 - 005, "分销用户与会员不对应!");
+
+ ErrorCode BROKERAGE_LEVEL_NOT_EXISTS = new ErrorCode(1 - 100 - 002 - 001, "分销等级不存在!");
+ ErrorCode BROKERAGE_LEVEL_ALREADY_EXISTS = new ErrorCode(1 - 100 - 002 - 002, "分销等级名称已经存在!");
+ ErrorCode BROKERAGE_LEVEL_LEVELNAME_NOTEXISTS = new ErrorCode(1 - 100 - 002 - 003, "分销等级基础信息配置不能为空!");
+ ErrorCode BROKERAGE_LEVEL_BASECONFIG_NOTEXISTS = new ErrorCode(1 - 100 - 002 - 004, "分销等级基础信息配置不能为空!");
+ ErrorCode BROKERAGE_LEVEL_UPGRADECONFIG_NOTEXISTS = new ErrorCode(1 - 100 - 002 - 005, "分销等级升级配置不能为空!");
+ ErrorCode BROKERAGE_LEVEL_DOWNGRADECONFIG_NOTEXISTS = new ErrorCode(1 - 100 - 002 - 006, "分销等级基础信息配置不能为空!");
+
+
+ ErrorCode BROKERAGE_BASECONFIG_NOT_EXISTS = new ErrorCode(1 - 100 - 003 - 001, "分销基础配置不存在!");
+ ErrorCode BROKERAGE_BASECONFIG_SINGLE_PROPERTY = new ErrorCode(1 - 100 - 003 - 002, "分销基础配置只能同时更新一个!");
+ ErrorCode BROKERAGE_BASECONFIG_BASECONFIGJSON_NOTEXISTS = new ErrorCode(1 - 100 - 003 - 003, "分销基础配置字段不能为空!");
+ ErrorCode BROKERAGE_BASECONFIG_SETTLECONFIGJSON_NOTEXISTS = new ErrorCode(1 - 100 - 003 - 004, "分销结算设置配置字段不能为空!");
+ ErrorCode BROKERAGE_BASECONFIG_TEXTCONFIGJSON_NOTEXISTS = new ErrorCode(1 - 100 - 003 - 005, "分销文字设置配置字段不能为空!");
+ ErrorCode BROKERAGE_BASECONFIG_PREFORCONFIGJSON_NOTEXISTS = new ErrorCode(1 - 100 - 003 - 006, "分销业绩中心设置配置字段不能为空!");
+
+
+ ErrorCode BROKERAGE_LEVELHISTORY_NOT_EXISTS = new ErrorCode(1 - 100 - 004 - 001, "分销等级变更历史信息不存在!");
+
+ ErrorCode JSON_FORMATCHECK_FAIL=new ErrorCode(1-100-005-001,"JSON类型属性格式校验异常");
+
+
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/pom.xml b/yudao-module-mall/yudao-module-hsfx-biz/pom.xml
new file mode 100644
index 000000000..3166b0e78
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/pom.xml
@@ -0,0 +1,123 @@
+
+
+
+ cn.iocoder.cloud
+ yudao-module-mall
+ ${revision}
+
+ 4.0.0
+ yudao-module-hsfx-biz
+ jar
+
+ ${project.artifactId}
+
+ product 模块,主要实现商品相关功能
+ 例如:品牌、商品分类、spu、sku等功能。
+
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-env
+
+
+
+
+ cn.iocoder.cloud
+ yudao-module-hsfx-api
+ ${revision}
+
+
+ cn.iocoder.cloud
+ yudao-module-product-api
+ ${revision}
+
+
+ cn.iocoder.cloud
+ yudao-module-member-api
+ ${revision}
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-biz-tenant
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-web
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-security
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-mybatis
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-rpc
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-test
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-excel
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-monitor
+
+
+
+
+
+ ${project.artifactId}
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring.boot.version}
+
+
+
+ repackage
+
+
+
+
+
+
+
+
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/HsfxServerApplication.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/HsfxServerApplication.java
new file mode 100644
index 000000000..8506a0e10
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/HsfxServerApplication.java
@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.module.hsfx;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * 项目的启动类
+ *
+ * @author tpj
+ */
+@SpringBootApplication
+public class HsfxServerApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(HsfxServerApplication.class, args);
+
+ }
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragebaseconfig/BrokerageBaseConfigImpl.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragebaseconfig/BrokerageBaseConfigImpl.java
new file mode 100644
index 000000000..d9c33ee50
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragebaseconfig/BrokerageBaseConfigImpl.java
@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.hsfx.api.brokeragebaseconfig;
+
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.hsfx.api.brokeragebaseconfig.dto.RpcBrokerageBaseConfigDto;
+import cn.iocoder.yudao.module.hsfx.api.brokeragelevelhistory.dto.RpcBroLevelHisRespDto;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragebaseconfig.BrokerageBaseconfigDO;
+import cn.iocoder.yudao.module.hsfx.service.brokeragebaseconfig.BrokerageBaseconfigService;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController // 提供 RESTful API 接口,给 Feign 调用
+@Validated
+public class BrokerageBaseConfigImpl implements BrokerageBaseConfigApi {
+
+ @Autowired
+ private BrokerageBaseconfigService brokerageBaseconfigService;
+
+ @Override
+ public RpcBrokerageBaseConfigDto getBroBaseConfigById(Long id) {
+ BrokerageBaseconfigDO brokerageBaseconfig = brokerageBaseconfigService.getBrokerageBaseconfig(id);
+ RpcBrokerageBaseConfigDto rpcBrokerageBaseConfigDto = new RpcBrokerageBaseConfigDto();
+ BeanUtils.copyProperties(brokerageBaseconfig, rpcBrokerageBaseConfigDto);
+ return rpcBrokerageBaseConfigDto;
+ }
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevel/BrokerageLevelImpl.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevel/BrokerageLevelImpl.java
new file mode 100644
index 000000000..6c4815494
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevel/BrokerageLevelImpl.java
@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.hsfx.api.brokeragelevel;
+
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.hsfx.api.brokeragelevel.dto.RpcBrokerageLevelDto;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevel.BrokerageLevelDO;
+import cn.iocoder.yudao.module.hsfx.service.brokeragelevel.BrokerageLevelService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController // 提供 RESTful API 接口,给 Feign 调用
+@Validated
+public class BrokerageLevelImpl implements BrokerageLevelApi {
+
+
+ @Autowired
+ private BrokerageLevelService brokerageLevelService;
+
+ @Override
+ public RpcBrokerageLevelDto getBroLevelHisById(Long id) {
+ BrokerageLevelDO brokerageLevel = brokerageLevelService.getBrokerageLevel(id);
+ RpcBrokerageLevelDto rpcBrokerageLevelDto = new RpcBrokerageLevelDto();
+ BeanUtils.copyProperties(brokerageLevel, rpcBrokerageLevelDto);
+ return rpcBrokerageLevelDto;
+ }
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevelhistory/BrokerageLevelHisImpl.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevelhistory/BrokerageLevelHisImpl.java
new file mode 100644
index 000000000..a28e3db75
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokeragelevelhistory/BrokerageLevelHisImpl.java
@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.hsfx.api.brokeragelevelhistory;
+
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.hsfx.api.brokeragelevelhistory.dto.RpcBroLevelHisRespDto;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevelhistory.vo.BrokerageLevelhistoryRespVO;
+import cn.iocoder.yudao.module.hsfx.service.brokeragelevelhistory.BrokerageLevelhistoryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author izao
+ * @Description 用户等级变更历史记录远程调用接口实现类
+ * @date 2024/12/26 11:21
+ */
+
+@RestController // 提供 RESTful API 接口,给 Feign 调用
+@Validated
+public class BrokerageLevelHisImpl implements BroLevelHisApi {
+
+ @Autowired
+ private BrokerageLevelhistoryService levelhistoryService;
+
+ @Override
+ public RpcBroLevelHisRespDto getBroLevelHisById(Long id) {
+ BrokerageLevelhistoryRespVO levelhistoryRespVO = levelhistoryService.getBrokerageLevelhistory(id);
+ RpcBroLevelHisRespDto rpcBroLevelHisRespDto = new RpcBroLevelHisRespDto();
+ BeanUtils.copyProperties(levelhistoryRespVO, rpcBroLevelHisRespDto);
+ return rpcBroLevelHisRespDto;
+ }
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokerageuser/BrokerageUserImpl.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokerageuser/BrokerageUserImpl.java
new file mode 100644
index 000000000..518d010e3
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/api/brokerageuser/BrokerageUserImpl.java
@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.hsfx.api.brokerageuser;
+
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.hsfx.api.brokerageuser.dto.RpcBrokerageUserRespDto;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokerageuser.vo.BrokerageUserPageResVO;
+import cn.iocoder.yudao.module.hsfx.service.brokerageuser.BrokerageUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RestController;
+
+
+
+/**
+ * @Description 分销用户远程调用接口实现类
+ * @author izao
+ * @date 2024/12/26 10:54
+ */
+@RestController // 提供 RESTful API 接口,给 Feign 调用
+@Validated
+public class BrokerageUserImpl implements BrokerageUserApi{
+
+ @Autowired
+ private BrokerageUserService brokerageUserService;
+
+ @Override
+ public RpcBrokerageUserRespDto getBrokerageUserById(Long id) {
+ RpcBrokerageUserRespDto rpcBrokerageUserRespDto = new RpcBrokerageUserRespDto();
+ BrokerageUserPageResVO brokerageUser = brokerageUserService.getBrokerageUser(id);
+ BeanUtils.copyProperties(brokerageUser, rpcBrokerageUserRespDto);
+ return rpcBrokerageUserRespDto;
+ }
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/DemoTestController.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/DemoTestController.java
new file mode 100644
index 000000000..d4faf22df
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/DemoTestController.java
@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+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 static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - hsfx")
+@RestController
+@RequestMapping("/hsfx/test")
+@Validated
+public class DemoTestController {
+
+ @GetMapping("/get")
+ @Operation(summary = "获取 海上会员分销信息 信息")
+ public CommonResult get() {
+ return success("true");
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragebaseconfig/BrokerageBaseconfigController.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragebaseconfig/BrokerageBaseconfigController.java
new file mode 100644
index 000000000..409282686
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragebaseconfig/BrokerageBaseconfigController.java
@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokeragebaseconfig;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragebaseconfig.vo.*;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragebaseconfig.BrokerageBaseconfigDO;
+import cn.iocoder.yudao.module.hsfx.service.brokeragebaseconfig.BrokerageBaseconfigService;
+
+
+@Tag(name = "管理后台 - 分销配置")
+@RestController
+@RequestMapping("/hsfx/brokerage-baseconfig")
+@Validated
+public class BrokerageBaseconfigController {
+
+ @Resource
+ private BrokerageBaseconfigService brokerageBaseconfigService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建分销配置")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-baseconfig:create')")
+ public CommonResult createBrokerageBaseconfig(@Valid @RequestBody BrokerageBaseconfigSaveReqVO createReqVO) {
+ return success(brokerageBaseconfigService.createBrokerageBaseconfig(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新分销配置")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-baseconfig:update')")
+ public CommonResult updateBrokerageBaseconfig(@Valid @RequestBody BrokerageBaseconfigSaveReqVO updateReqVO) {
+ brokerageBaseconfigService.updateBrokerageBaseconfig(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除分销配置")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-baseconfig:delete')")
+ public CommonResult deleteBrokerageBaseconfig(@RequestParam("id") Long id) {
+ brokerageBaseconfigService.deleteBrokerageBaseconfig(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得分销配置")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-baseconfig:query')")
+ public CommonResult getBrokerageBaseconfig(@RequestParam("id") Long id) {
+ BrokerageBaseconfigDO brokerageBaseconfig = brokerageBaseconfigService.getBrokerageBaseconfig(id);
+ return success(BeanUtils.toBean(brokerageBaseconfig, BrokerageBaseconfigRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得分销配置分页")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-baseconfig:query')")
+ public CommonResult> getBrokerageBaseconfigPage(@Valid BrokerageBaseconfigPageReqVO pageReqVO) {
+ PageResult pageResult = brokerageBaseconfigService.getBrokerageBaseconfigPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, BrokerageBaseconfigRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出分销配置 Excel")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-baseconfig:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportBrokerageBaseconfigExcel(@Valid BrokerageBaseconfigPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = brokerageBaseconfigService.getBrokerageBaseconfigPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "分销配置.xls", "数据", BrokerageBaseconfigRespVO.class,
+ BeanUtils.toBean(list, BrokerageBaseconfigRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragebaseconfig/vo/BrokerageBaseconfigPageReqVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragebaseconfig/vo/BrokerageBaseconfigPageReqVO.java
new file mode 100644
index 000000000..a095bf9a7
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragebaseconfig/vo/BrokerageBaseconfigPageReqVO.java
@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokeragebaseconfig.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 分销配置分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class BrokerageBaseconfigPageReqVO extends PageParam {
+
+ @Schema(description = "基础配置json")
+ private String baseConfigJson;
+
+ @Schema(description = "结算设置配置json")
+ private String settleConfigJson;
+
+ @Schema(description = "文字设置配置json")
+ private String textConfigJson;
+
+ @Schema(description = "业绩中心配置json")
+ private String perforConfigJson;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragebaseconfig/vo/BrokerageBaseconfigRespVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragebaseconfig/vo/BrokerageBaseconfigRespVO.java
new file mode 100644
index 000000000..acd4aa8a7
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragebaseconfig/vo/BrokerageBaseconfigRespVO.java
@@ -0,0 +1,38 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokeragebaseconfig.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 分销配置 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class BrokerageBaseconfigRespVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1354")
+ @ExcelProperty("id")
+ private Long id;
+
+ @Schema(description = "基础配置json")
+ @ExcelProperty("基础配置json")
+ private String baseConfigJson;
+
+ @Schema(description = "结算设置配置json")
+ @ExcelProperty("结算设置配置json")
+ private String settleConfigJson;
+
+ @Schema(description = "文字设置配置json")
+ @ExcelProperty("文字设置配置json")
+ private String textConfigJson;
+
+ @Schema(description = "业绩中心配置json")
+ @ExcelProperty("业绩中心配置json")
+ private String perforConfigJson;
+
+ @Schema(description = "创建时间")
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragebaseconfig/vo/BrokerageBaseconfigSaveReqVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragebaseconfig/vo/BrokerageBaseconfigSaveReqVO.java
new file mode 100644
index 000000000..9ef176052
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragebaseconfig/vo/BrokerageBaseconfigSaveReqVO.java
@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokeragebaseconfig.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+
+@Schema(description = "管理后台 - 分销配置新增/修改 Request VO")
+@Data
+public class BrokerageBaseconfigSaveReqVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1354")
+ private Long id;
+
+ @Schema(description = "基础配置json")
+ private String baseConfigJson;
+
+ @Schema(description = "结算设置配置json")
+ private String settleConfigJson;
+
+ @Schema(description = "文字设置配置json")
+ private String textConfigJson;
+
+ @Schema(description = "业绩中心配置json")
+ private String perforConfigJson;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevel/BrokerageLevelController.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevel/BrokerageLevelController.java
new file mode 100644
index 000000000..710e1d87c
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevel/BrokerageLevelController.java
@@ -0,0 +1,94 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevel;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevel.vo.*;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevel.BrokerageLevelDO;
+import cn.iocoder.yudao.module.hsfx.service.brokeragelevel.BrokerageLevelService;
+
+
+@Tag(name = "管理后台 - 分销商等级")
+@RestController
+@RequestMapping("/hsfx/brokerage-level")
+@Validated
+public class BrokerageLevelController {
+
+ @Resource
+ private BrokerageLevelService brokerageLevelService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建分销商等级")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-level:create')")
+ public CommonResult createBrokerageLevel(@Valid @RequestBody BrokerageLevelSaveReqVO createReqVO) {
+ return success(brokerageLevelService.createBrokerageLevel(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新分销商等级")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-level:update')")
+ public CommonResult updateBrokerageLevel(@Valid @RequestBody BrokerageLevelSaveReqVO updateReqVO) {
+ brokerageLevelService.updateBrokerageLevel(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除分销商等级")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-level:delete')")
+ public CommonResult deleteBrokerageLevel(@RequestParam("id") Long id) {
+ brokerageLevelService.deleteBrokerageLevel(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得分销商等级")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-level:query')")
+ public CommonResult getBrokerageLevel(@RequestParam("id") Long id) {
+ BrokerageLevelDO brokerageLevel = brokerageLevelService.getBrokerageLevel(id);
+ return success(BeanUtils.toBean(brokerageLevel, BrokerageLevelRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得分销商等级分页")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-level:query')")
+ public CommonResult> getBrokerageLevelPage(@Valid BrokerageLevelPageReqVO pageReqVO) {
+ PageResult pageResult = brokerageLevelService.getBrokerageLevelPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, BrokerageLevelRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出分销商等级 Excel")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-level:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportBrokerageLevelExcel(@Valid BrokerageLevelPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = brokerageLevelService.getBrokerageLevelPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "分销商等级.xls", "数据", BrokerageLevelRespVO.class,
+ BeanUtils.toBean(list, BrokerageLevelRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevel/vo/BrokerageLevelPageReqVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevel/vo/BrokerageLevelPageReqVO.java
new file mode 100644
index 000000000..a19a3568b
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevel/vo/BrokerageLevelPageReqVO.java
@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevel.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 分销商等级分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class BrokerageLevelPageReqVO extends PageParam {
+
+ @Schema(description = "等级 默认等级、一级、二级、三级等")
+ private String level;
+
+ @Schema(description = "等级名称")
+ private String levelName;
+
+ @Schema(description = "基础配置json;一级、二级、三级佣金比例、培育奖等")
+ private String baseConfig;
+
+ @Schema(description = "升级策略配置json 升级到此等级需要的条件")
+ private String upgradeConfig;
+
+ @Schema(description = "降级策略配置json 不满足此条件则降级")
+ private String downgradeConfig;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevel/vo/BrokerageLevelRespVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevel/vo/BrokerageLevelRespVO.java
new file mode 100644
index 000000000..02988b66a
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevel/vo/BrokerageLevelRespVO.java
@@ -0,0 +1,46 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevel.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+
+@Schema(description = "管理后台 - 分销商等级 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class BrokerageLevelRespVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23559")
+ @ExcelProperty("id")
+ private Long id;
+
+ @Schema(description = "等级 默认等级、一级、二级、三级等")
+ @ExcelProperty("等级 默认等级、一级、二级、三级等")
+ private String level;
+
+ @Schema(description = "等级名称")
+ @ExcelProperty("等级名称")
+ private String levelName;
+
+ @Schema(description = "基础配置json;一级、二级、三级佣金比例、培育奖等")
+ @ExcelProperty("基础配置json;一级、二级、三级佣金比例、培育奖等")
+ private String baseConfig;
+
+ @Schema(description = "升级策略配置json 升级到此等级需要的条件")
+ @ExcelProperty("升级策略配置json 升级到此等级需要的条件")
+ private String upgradeConfig;
+
+ @Schema(description = "降级策略配置json 不满足此条件则降级")
+ @ExcelProperty("降级策略配置json 不满足此条件则降级")
+ private String downgradeConfig;
+
+ @Schema(description = "创建时间")
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevel/vo/BrokerageLevelSaveReqVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevel/vo/BrokerageLevelSaveReqVO.java
new file mode 100644
index 000000000..029a89827
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevel/vo/BrokerageLevelSaveReqVO.java
@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevel.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+
+@Schema(description = "管理后台 - 分销商等级新增/修改 Request VO")
+@Data
+public class BrokerageLevelSaveReqVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23559")
+ private Long id;
+
+ @Schema(description = "等级 默认等级、一级、二级、三级等")
+ private String level;
+
+ @Schema(description = "等级名称")
+ private String levelName;
+
+ @Schema(description = "基础配置json;一级、二级、三级佣金比例、培育奖等")
+ private String baseConfig;
+
+ @Schema(description = "升级策略配置json 升级到此等级需要的条件")
+ private String upgradeConfig;
+
+ @Schema(description = "降级策略配置json 不满足此条件则降级")
+ private String downgradeConfig;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevelhistory/BrokerageLevelhistoryController.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevelhistory/BrokerageLevelhistoryController.java
new file mode 100644
index 000000000..d2366e38b
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevelhistory/BrokerageLevelhistoryController.java
@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevelhistory;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevelhistory.vo.*;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevelhistory.BrokerageLevelhistoryDO;
+import cn.iocoder.yudao.module.hsfx.service.brokeragelevelhistory.BrokerageLevelhistoryService;
+
+
+@Tag(name = "管理后台 - 等级变更历史记录")
+@RestController
+@RequestMapping("/hsfx/brokerage-levelhistory")
+@Validated
+public class BrokerageLevelhistoryController {
+
+ @Resource
+ private BrokerageLevelhistoryService brokerageLevelhistoryService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建等级变更历史记录")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-levelhistory:create')")
+ public CommonResult createBrokerageLevelhistory(@Valid @RequestBody BrokerageLevelhistorySaveReqVO createReqVO) {
+ return success(brokerageLevelhistoryService.createBrokerageLevelhistory(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新等级变更历史记录")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-levelhistory:update')")
+ public CommonResult updateBrokerageLevelhistory(@Valid @RequestBody BrokerageLevelhistorySaveReqVO updateReqVO) {
+ brokerageLevelhistoryService.updateBrokerageLevelhistory(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除等级变更历史记录")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-levelhistory:delete')")
+ public CommonResult deleteBrokerageLevelhistory(@RequestParam("id") Long id) {
+ brokerageLevelhistoryService.deleteBrokerageLevelhistory(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得等级变更历史记录")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-levelhistory:query')")
+ public CommonResult getBrokerageLevelhistory(@RequestParam("id") Long id) {
+ return success(brokerageLevelhistoryService.getBrokerageLevelhistory(id));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得等级变更历史记录分页")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-levelhistory:query')")
+ public CommonResult> getBrokerageLevelhistoryPage(@Valid BrokerageLevelhistoryPageReqVO pageReqVO) {
+ PageResult pageResult = brokerageLevelhistoryService.getBrokerageLevelhistoryPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, BrokerageLevelhistoryRespVO.class));
+ }
+
+// @GetMapping("/export-excel")
+// @Operation(summary = "导出等级变更历史记录 Excel")
+// @PreAuthorize("@ss.hasPermission('hsfx:brokerage-levelhistory:export')")
+// @ApiAccessLog(operateType = EXPORT)
+// public void exportBrokerageLevelhistoryExcel(@Valid BrokerageLevelhistoryPageReqVO pageReqVO,
+// HttpServletResponse response) throws IOException {
+// pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+// List list = brokerageLevelhistoryService.getBrokerageLevelhistoryPage(pageReqVO).getList();
+// // 导出 Excel
+// ExcelUtils.write(response, "等级变更历史记录.xls", "数据", BrokerageLevelhistoryRespVO.class,
+// BeanUtils.toBean(list, BrokerageLevelhistoryRespVO.class));
+// }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevelhistory/vo/BrokerageLevelhistoryPageReqVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevelhistory/vo/BrokerageLevelhistoryPageReqVO.java
new file mode 100644
index 000000000..ffe1c4bbb
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevelhistory/vo/BrokerageLevelhistoryPageReqVO.java
@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevelhistory.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 等级变更历史记录分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class BrokerageLevelhistoryPageReqVO extends PageParam {
+
+ @Schema(description = "分销用户id", example = "29277")
+ private Long brokerageUserId;
+
+ @Schema(description = "初始等级id", example = "28982")
+ private Long initLevelId;
+
+ @Schema(description = "目标(现在)等级id", example = "5160")
+ private Long toLevelId;
+
+ @Schema(description = "变动原因", example = "不满足条件自动降级")
+ private String changeReason;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevelhistory/vo/BrokerageLevelhistoryRespVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevelhistory/vo/BrokerageLevelhistoryRespVO.java
new file mode 100644
index 000000000..831a60342
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevelhistory/vo/BrokerageLevelhistoryRespVO.java
@@ -0,0 +1,47 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevelhistory.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+
+@Schema(description = "管理后台 - 等级变更历史记录 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class BrokerageLevelhistoryRespVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20579")
+ @ExcelProperty("id")
+ private Long id;
+
+ @Schema(description = "分销用户id", example = "29277")
+ @ExcelProperty("分销用户id")
+ private Long brokerageUserId;
+
+ @Schema(description = "初始等级id", example = "28982")
+ @ExcelProperty("初始等级id")
+ private Long initLevelId;
+
+ @Schema(description = "目标(现在)等级id", example = "5160")
+ @ExcelProperty("目标(现在)等级id")
+ private Long toLevelId;
+
+ @Schema(description = "变动原因", example = "不满足条件自动降级")
+ @ExcelProperty("变动原因")
+ private String changeReason;
+
+ @Schema(description = "创建时间")
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ private String brokerageMemberNickName;//分销用户会员昵称
+
+ private String initLevelName;//初始等级名称
+
+ private String toLevelName;//变动目标等级
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevelhistory/vo/BrokerageLevelhistorySaveReqVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevelhistory/vo/BrokerageLevelhistorySaveReqVO.java
new file mode 100644
index 000000000..2c07c40ff
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokeragelevelhistory/vo/BrokerageLevelhistorySaveReqVO.java
@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevelhistory.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+@Schema(description = "管理后台 - 等级变更历史记录新增/修改 Request VO")
+@Data
+public class BrokerageLevelhistorySaveReqVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20579")
+ private Long id;
+
+ @Schema(description = "分销用户id", example = "29277")
+ private Long brokerageUserId;
+
+ @Schema(description = "初始等级id", example = "28982")
+ private Long initLevelId;
+
+ @Schema(description = "目标(现在)等级id", example = "5160")
+ private Long toLevelId;
+
+ @Schema(description = "变动原因", example = "不满足条件自动降级")
+ private String changeReason;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/BrokerageUserController.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/BrokerageUserController.java
new file mode 100644
index 000000000..aff98f182
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/BrokerageUserController.java
@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokerageuser;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokerageuser.vo.*;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokerageuser.BrokerageUserDO;
+import cn.iocoder.yudao.module.hsfx.service.brokerageuser.BrokerageUserService;
+
+@Tag(name = "管理后台 - 分销用户")
+@RestController
+@RequestMapping("/hsfx/brokerage-user")
+@Validated
+public class BrokerageUserController {
+
+ @Resource
+ private BrokerageUserService brokerageUserService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建分销用户")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-user:create')")
+ public CommonResult createBrokerageUser(@Valid @RequestBody BrokerageUserSaveReqVO createReqVO) {
+ return success(brokerageUserService.createBrokerageUser(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新分销用户")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-user:update')")
+ public CommonResult updateBrokerageUser(@Valid @RequestBody BrokerageUserSaveReqVO updateReqVO) {
+ brokerageUserService.updateBrokerageUser(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除分销用户")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-user:delete')")
+ public CommonResult deleteBrokerageUser(@RequestParam("id") Long id) {
+ brokerageUserService.deleteBrokerageUser(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得分销用户")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-user:query')")
+ public CommonResult getBrokerageUser(@RequestParam("id") Long id) {
+ BrokerageUserPageResVO brokerageUser = brokerageUserService.getBrokerageUser(id);
+ return CommonResult.success(brokerageUser);
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得分销用户分页")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-user:query')")
+ public CommonResult> getBrokerageUserPage(@Valid BrokerageUserPageReqVO pageReqVO) {
+ PageResult pageResult = brokerageUserService.getBrokerageUserPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, BrokerageUserPageResVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出分销用户 Excel")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-user:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportBrokerageUserExcel(@Valid BrokerageUserPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = brokerageUserService.getBrokerageUserPage(pageReqVO).getList();
+
+ // 导出 Excel
+ ExcelUtils.write(response, "分销用户.xls", "数据", BrokerageUserRespVO.class,
+ BeanUtils.toBean(list, BrokerageUserRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/vo/BrokerageUserPageReqVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/vo/BrokerageUserPageReqVO.java
new file mode 100644
index 000000000..fc6ef804d
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/vo/BrokerageUserPageReqVO.java
@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokerageuser.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 分销用户分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class BrokerageUserPageReqVO extends PageParam {
+
+ @Schema(description = "用户id", example = "8493")
+ private Long memberUserId;
+
+ @Schema(description = "分销商等级id", example = "24915")
+ private Long levelId;
+
+ @Schema(description = "上级用户id", example = "9225")
+ private Long parentId;
+
+ @Schema(description = "数据字典 是否启用")
+ private Integer isEnable;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/vo/BrokerageUserPageResVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/vo/BrokerageUserPageResVO.java
new file mode 100644
index 000000000..71ee202b3
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/vo/BrokerageUserPageResVO.java
@@ -0,0 +1,18 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokerageuser.vo;
+
+import lombok.Data;
+
+@Data
+public class BrokerageUserPageResVO {
+
+ private Long id;//分销商id
+ private Long memberUserId;//会员id
+ private String nickName;//会员昵称
+ private String name;//会员名称
+ private String phone;//会员手机号
+ private Long levelId;//分销商等级id
+ private String levelName;//等级名称
+ private Long parentId;
+ private Long parentMemberUserId;
+ private String parentMemberNickName;
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/vo/BrokerageUserRespVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/vo/BrokerageUserRespVO.java
new file mode 100644
index 000000000..ea5726fce
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/vo/BrokerageUserRespVO.java
@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokerageuser.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+
+@Schema(description = "管理后台 - 分销用户 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class BrokerageUserRespVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32060")
+ @ExcelProperty("id")
+ private Long id;
+
+ @Schema(description = "用户id", example = "8493")
+ @ExcelProperty("用户id")
+ private Long memberUserId;
+
+ @Schema(description = "分销商等级id", example = "24915")
+ @ExcelProperty("分销商等级id")
+ private Long levelId;
+
+ @Schema(description = "上级用户id", example = "9225")
+ @ExcelProperty("上级用户id")
+ private Long parentId;
+
+ @Schema(description = "数据字典 是否启用")
+ @ExcelProperty(value = "数据字典 是否启用", converter = DictConvert.class)
+ @DictFormat("infra_boolean_string") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private Integer isEnable;
+
+ @Schema(description = "创建时间")
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/vo/BrokerageUserSaveReqVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/vo/BrokerageUserSaveReqVO.java
new file mode 100644
index 000000000..09fda59fa
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/vo/BrokerageUserSaveReqVO.java
@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokerageuser.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+@Schema(description = "管理后台 - 分销用户新增/修改 Request VO")
+@Data
+public class BrokerageUserSaveReqVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32060")
+ private Long id;
+
+ @Schema(description = "用户id", example = "8493")
+ private Long memberUserId;
+
+ @Schema(description = "分销商等级id", example = "24915")
+ private Long levelId;
+
+ @Schema(description = "上级用户id", example = "9225")
+ private Long parentId;
+
+ @Schema(description = "数据字典 是否启用")
+ private Integer isEnable;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/vo/MemberResDo.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/vo/MemberResDo.java
new file mode 100644
index 000000000..b1dc4e563
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/admin/brokerageuser/vo/MemberResDo.java
@@ -0,0 +1,9 @@
+package cn.iocoder.yudao.module.hsfx.controller.admin.brokerageuser.vo;
+
+import lombok.Data;
+
+@Data
+public class MemberResDo {
+ private Long memberId;
+ private String memberName;
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/AppDemoTestController.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/AppDemoTestController.java
new file mode 100644
index 000000000..3d0bbdcc2
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/AppDemoTestController.java
@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.hsfx.controller.app;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+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 static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "APP - 管理后台 - hsfx")
+@RestController
+@RequestMapping("/hsfx/test")
+@Validated
+public class AppDemoTestController {
+
+ @GetMapping("/get")
+ @Operation(summary = "获取 分销app 信息")
+ public CommonResult get() {
+ return success("true");
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragebaseconfig/AppBroBaseconfigController.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragebaseconfig/AppBroBaseconfigController.java
new file mode 100644
index 000000000..9e2458139
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragebaseconfig/AppBroBaseconfigController.java
@@ -0,0 +1,118 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokeragebaseconfig;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragebaseconfig.vo.BrokerageBaseconfigPageReqVO;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragebaseconfig.vo.BrokerageBaseconfigRespVO;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragebaseconfig.vo.BrokerageBaseconfigSaveReqVO;
+import cn.iocoder.yudao.module.hsfx.controller.app.brokeragebaseconfig.vo.AppBroBaseconfigPageReqVO;
+import cn.iocoder.yudao.module.hsfx.controller.app.brokeragebaseconfig.vo.AppBroBaseconfigRespVO;
+import cn.iocoder.yudao.module.hsfx.controller.app.brokeragebaseconfig.vo.AppBroBaseconfigSaveReqVO;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragebaseconfig.BrokerageBaseconfigDO;
+import cn.iocoder.yudao.module.hsfx.service.brokeragebaseconfig.BrokerageBaseconfigService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "APP后台 - 分销配置")
+@RestController
+@RequestMapping("/hsfx/brokerage-baseconfig")
+@Validated
+public class AppBroBaseconfigController {
+
+ @Resource
+ private BrokerageBaseconfigService brokerageBaseconfigService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建分销配置")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-baseconfig:create')")
+ public CommonResult createBrokerageBaseconfig(@Valid @RequestBody AppBroBaseconfigSaveReqVO createReqVO) {
+ BrokerageBaseconfigSaveReqVO adminBrokerageBaseconfigSaveReqVO = new BrokerageBaseconfigSaveReqVO();
+ BeanUtils.copyProperties(createReqVO, adminBrokerageBaseconfigSaveReqVO);
+ return success(brokerageBaseconfigService.createBrokerageBaseconfig(adminBrokerageBaseconfigSaveReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新分销配置")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-baseconfig:update')")
+ public CommonResult updateBrokerageBaseconfig(@Valid @RequestBody AppBroBaseconfigSaveReqVO updateReqVO) {
+ BrokerageBaseconfigSaveReqVO brokerageBaseconfigSaveReqVO = new BrokerageBaseconfigSaveReqVO();
+ BeanUtils.copyProperties(updateReqVO, brokerageBaseconfigSaveReqVO);
+ brokerageBaseconfigService.updateBrokerageBaseconfig(brokerageBaseconfigSaveReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除分销配置")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-baseconfig:delete')")
+ public CommonResult deleteBrokerageBaseconfig(@RequestParam("id") Long id) {
+ brokerageBaseconfigService.deleteBrokerageBaseconfig(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得分销配置")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-baseconfig:query')")
+ public CommonResult getBrokerageBaseconfig(@RequestParam("id") Long id) {
+ BrokerageBaseconfigDO adminBrokerageBaseconfig = brokerageBaseconfigService.getBrokerageBaseconfig(id);
+ if (adminBrokerageBaseconfig == null) {
+ return success(null);
+ }
+ return success(BeanUtils.toBean(adminBrokerageBaseconfig, AppBroBaseconfigRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得分销配置分页")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-baseconfig:query')")
+ public CommonResult> getBrokerageBaseconfigPage(@Valid AppBroBaseconfigPageReqVO pageReqVO) {
+ BrokerageBaseconfigPageReqVO adminBrokerageBaseconfigPageReqVO = new BrokerageBaseconfigPageReqVO();
+ BeanUtils.copyProperties(pageReqVO, adminBrokerageBaseconfigPageReqVO);
+ PageResult pageResult = brokerageBaseconfigService.getBrokerageBaseconfigPage(adminBrokerageBaseconfigPageReqVO);
+ List appBroBaseconfigRespVOList = new ArrayList<>();
+ PageResult appPageResult = new PageResult<>();
+ appPageResult.setTotal(pageResult.getTotal());
+ pageResult.getList().forEach(adminBaseConfigDo -> {
+ AppBroBaseconfigRespVO appBroBaseconfigRespVO = new AppBroBaseconfigRespVO();
+ BeanUtils.copyProperties(adminBaseConfigDo, appBroBaseconfigRespVO);
+ appBroBaseconfigRespVOList.add(appBroBaseconfigRespVO);
+ });
+ appPageResult.setList(appBroBaseconfigRespVOList);
+ return success(appPageResult);
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出分销配置 Excel")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-baseconfig:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportBrokerageBaseconfigExcel(@Valid AppBroBaseconfigPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ BrokerageBaseconfigPageReqVO adminBaseconfigPageReqVO = new BrokerageBaseconfigPageReqVO();
+ BeanUtils.copyProperties(pageReqVO, adminBaseconfigPageReqVO);
+ List list = brokerageBaseconfigService.getBrokerageBaseconfigPage(adminBaseconfigPageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "分销配置.xls", "数据", AppBroBaseconfigRespVO.class,
+ BeanUtils.toBean(list, AppBroBaseconfigRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragebaseconfig/vo/AppBroBaseconfigPageReqVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragebaseconfig/vo/AppBroBaseconfigPageReqVO.java
new file mode 100644
index 000000000..a9b428e3e
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragebaseconfig/vo/AppBroBaseconfigPageReqVO.java
@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokeragebaseconfig.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 分销配置分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AppBroBaseconfigPageReqVO extends PageParam {
+
+ @Schema(description = "基础配置json")
+ private String baseConfigJson;
+
+ @Schema(description = "结算设置配置json")
+ private String settleConfigJson;
+
+ @Schema(description = "文字设置配置json")
+ private String textConfigJson;
+
+ @Schema(description = "业绩中心配置json")
+ private String perforConfigJson;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragebaseconfig/vo/AppBroBaseconfigRespVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragebaseconfig/vo/AppBroBaseconfigRespVO.java
new file mode 100644
index 000000000..7eb3586c6
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragebaseconfig/vo/AppBroBaseconfigRespVO.java
@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokeragebaseconfig.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 分销配置 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AppBroBaseconfigRespVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1354")
+ @ExcelProperty("id")
+ private Long id;
+
+ @Schema(description = "基础配置json")
+ @ExcelProperty("基础配置json")
+ private String baseConfigJson;
+
+ @Schema(description = "结算设置配置json")
+ @ExcelProperty("结算设置配置json")
+ private String settleConfigJson;
+
+ @Schema(description = "文字设置配置json")
+ @ExcelProperty("文字设置配置json")
+ private String textConfigJson;
+
+ @Schema(description = "业绩中心配置json")
+ @ExcelProperty("业绩中心配置json")
+ private String perforConfigJson;
+
+ @Schema(description = "创建时间")
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragebaseconfig/vo/AppBroBaseconfigSaveReqVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragebaseconfig/vo/AppBroBaseconfigSaveReqVO.java
new file mode 100644
index 000000000..f557de972
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragebaseconfig/vo/AppBroBaseconfigSaveReqVO.java
@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokeragebaseconfig.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 分销配置新增/修改 Request VO")
+@Data
+public class AppBroBaseconfigSaveReqVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1354")
+ private Long id;
+
+ @Schema(description = "基础配置json")
+ private String baseConfigJson;
+
+ @Schema(description = "结算设置配置json")
+ private String settleConfigJson;
+
+ @Schema(description = "文字设置配置json")
+ private String textConfigJson;
+
+ @Schema(description = "业绩中心配置json")
+ private String perforConfigJson;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevel/AppBroLevelController.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevel/AppBroLevelController.java
new file mode 100644
index 000000000..43f8415e3
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevel/AppBroLevelController.java
@@ -0,0 +1,123 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokeragelevel;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevel.vo.BrokerageLevelPageReqVO;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevel.vo.BrokerageLevelRespVO;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevel.vo.BrokerageLevelSaveReqVO;
+import cn.iocoder.yudao.module.hsfx.controller.app.brokeragelevel.vo.AppBroLevelPageReqVO;
+import cn.iocoder.yudao.module.hsfx.controller.app.brokeragelevel.vo.AppBroLevelRespVO;
+import cn.iocoder.yudao.module.hsfx.controller.app.brokeragelevel.vo.AppBroLevelSaveReqVO;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevel.BrokerageLevelDO;
+import cn.iocoder.yudao.module.hsfx.service.brokeragelevel.BrokerageLevelService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+
+@Tag(name = "APP后台 - 分销商等级")
+@RestController
+@RequestMapping("/hsfx/brokerage-level")
+@Validated
+public class AppBroLevelController {
+
+ @Resource
+ private BrokerageLevelService brokerageLevelService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建分销商等级")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-level:create')")
+ public CommonResult createBrokerageLevel(@Valid @RequestBody AppBroLevelSaveReqVO createReqVO) {
+ BrokerageLevelSaveReqVO brokerageLevelSaveReqVO = new BrokerageLevelSaveReqVO();
+ BeanUtils.copyProperties(createReqVO, brokerageLevelSaveReqVO);
+ return success(brokerageLevelService.createBrokerageLevel(brokerageLevelSaveReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新分销商等级")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-level:update')")
+ public CommonResult updateBrokerageLevel(@Valid @RequestBody AppBroLevelSaveReqVO updateReqVO) {
+ BrokerageLevelSaveReqVO brokerageLevelUpdateReqVO = new BrokerageLevelSaveReqVO();
+ BeanUtils.copyProperties(updateReqVO, brokerageLevelUpdateReqVO);
+ brokerageLevelService.updateBrokerageLevel(brokerageLevelUpdateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除分销商等级")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-level:delete')")
+ public CommonResult deleteBrokerageLevel(@RequestParam("id") Long id) {
+ brokerageLevelService.deleteBrokerageLevel(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得分销商等级")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-level:query')")
+ public CommonResult getBrokerageLevel(@RequestParam("id") Long id) {
+ BrokerageLevelDO brokerageLevel = brokerageLevelService.getBrokerageLevel(id);
+ if(brokerageLevel==null){
+ return success(null);
+ }
+ return success(BeanUtils.toBean(brokerageLevel, AppBroLevelRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得分销商等级分页")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-level:query')")
+ public CommonResult> getBrokerageLevelPage(@Valid AppBroLevelPageReqVO pageReqVO) {
+ BrokerageLevelPageReqVO levelPageReqVO = new BrokerageLevelPageReqVO();
+ BeanUtils.copyProperties(pageReqVO, levelPageReqVO);
+ PageResult adminPageResult = brokerageLevelService.getBrokerageLevelPage(levelPageReqVO);
+ PageResult respVOPageResult = new PageResult<>();
+ respVOPageResult.setTotal(adminPageResult.getTotal());
+ List appBroLevelRespVOS = new ArrayList<>();
+ adminPageResult.getList().forEach(brokerageLevelDO -> {
+ AppBroLevelRespVO appBroLevelRespVO = new AppBroLevelRespVO();
+ BeanUtils.copyProperties(brokerageLevelDO, appBroLevelRespVO);
+ appBroLevelRespVOS.add(appBroLevelRespVO);
+ });
+ respVOPageResult.setList(appBroLevelRespVOS);
+ return success(respVOPageResult);
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出分销商等级 Excel")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-level:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportBrokerageLevelExcel(@Valid AppBroLevelPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ BrokerageLevelPageReqVO adminLevelPageReqVO = new BrokerageLevelPageReqVO();
+ List list = brokerageLevelService.getBrokerageLevelPage(adminLevelPageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "分销商等级.xls", "数据", AppBroLevelRespVO.class,
+ BeanUtils.toBean(list, AppBroLevelRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevel/vo/AppBroLevelPageReqVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevel/vo/AppBroLevelPageReqVO.java
new file mode 100644
index 000000000..fafbc78a2
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevel/vo/AppBroLevelPageReqVO.java
@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokeragelevel.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 分销商等级分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AppBroLevelPageReqVO extends PageParam {
+
+ @Schema(description = "等级 默认等级、一级、二级、三级等")
+ private String level;
+
+ @Schema(description = "等级名称")
+ private String levelName;
+
+ @Schema(description = "基础配置json;一级、二级、三级佣金比例、培育奖等")
+ private String baseConfig;
+
+ @Schema(description = "升级策略配置json 升级到此等级需要的条件")
+ private String upgradeConfig;
+
+ @Schema(description = "降级策略配置json 不满足此条件则降级")
+ private String downgradeConfig;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevel/vo/AppBroLevelRespVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevel/vo/AppBroLevelRespVO.java
new file mode 100644
index 000000000..59a9e1681
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevel/vo/AppBroLevelRespVO.java
@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokeragelevel.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 分销商等级 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AppBroLevelRespVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23559")
+ @ExcelProperty("id")
+ private Long id;
+
+ @Schema(description = "等级 默认等级、一级、二级、三级等")
+ @ExcelProperty("等级 默认等级、一级、二级、三级等")
+ private String level;
+
+ @Schema(description = "等级名称")
+ @ExcelProperty("等级名称")
+ private String levelName;
+
+ @Schema(description = "基础配置json;一级、二级、三级佣金比例、培育奖等")
+ @ExcelProperty("基础配置json;一级、二级、三级佣金比例、培育奖等")
+ private String baseConfig;
+
+ @Schema(description = "升级策略配置json 升级到此等级需要的条件")
+ @ExcelProperty("升级策略配置json 升级到此等级需要的条件")
+ private String upgradeConfig;
+
+ @Schema(description = "降级策略配置json 不满足此条件则降级")
+ @ExcelProperty("降级策略配置json 不满足此条件则降级")
+ private String downgradeConfig;
+
+ @Schema(description = "创建时间")
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevel/vo/AppBroLevelSaveReqVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevel/vo/AppBroLevelSaveReqVO.java
new file mode 100644
index 000000000..2dc3aa11a
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevel/vo/AppBroLevelSaveReqVO.java
@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokeragelevel.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 分销商等级新增/修改 Request VO")
+@Data
+public class AppBroLevelSaveReqVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23559")
+ private Long id;
+
+ @Schema(description = "等级 默认等级、一级、二级、三级等")
+ private String level;
+
+ @Schema(description = "等级名称")
+ private String levelName;
+
+ @Schema(description = "基础配置json;一级、二级、三级佣金比例、培育奖等")
+ private String baseConfig;
+
+ @Schema(description = "升级策略配置json 升级到此等级需要的条件")
+ private String upgradeConfig;
+
+ @Schema(description = "降级策略配置json 不满足此条件则降级")
+ private String downgradeConfig;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevelhistory/AppBroLevelhisController.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevelhistory/AppBroLevelhisController.java
new file mode 100644
index 000000000..3be54e45d
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevelhistory/AppBroLevelhisController.java
@@ -0,0 +1,129 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokeragelevelhistory;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevelhistory.vo.BrokerageLevelhistoryPageReqVO;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevelhistory.vo.BrokerageLevelhistoryRespVO;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevelhistory.vo.BrokerageLevelhistorySaveReqVO;
+import cn.iocoder.yudao.module.hsfx.controller.app.brokeragelevelhistory.vo.AppBroLevelhisPageReqVO;
+import cn.iocoder.yudao.module.hsfx.controller.app.brokeragelevelhistory.vo.AppBroLevelhisRespVO;
+import cn.iocoder.yudao.module.hsfx.controller.app.brokeragelevelhistory.vo.AppBroLevelhisSaveReqVO;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevelhistory.BrokerageLevelhistoryDO;
+import cn.iocoder.yudao.module.hsfx.service.brokeragelevelhistory.BrokerageLevelhistoryService;
+
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+
+@Tag(name = "APP后台 - 等级变更历史记录")
+@RestController
+@RequestMapping("/hsfx/brokerage-levelhistory")
+@Validated
+public class AppBroLevelhisController {
+
+ @Resource
+ private BrokerageLevelhistoryService brokerageLevelhistoryService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建等级变更历史记录")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-levelhistory:create')")
+ public CommonResult createBrokerageLevelhistory(@Valid @RequestBody AppBroLevelhisSaveReqVO createReqVO) {
+ BrokerageLevelhistorySaveReqVO adminReqVO = new BrokerageLevelhistorySaveReqVO();
+ BeanUtils.copyProperties(createReqVO, adminReqVO);
+ return success(brokerageLevelhistoryService.createBrokerageLevelhistory(adminReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新等级变更历史记录")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-levelhistory:update')")
+ public CommonResult updateBrokerageLevelhistory(@Valid @RequestBody AppBroLevelhisSaveReqVO updateReqVO) {
+ BrokerageLevelhistorySaveReqVO adminSaveVo = new BrokerageLevelhistorySaveReqVO();
+ BeanUtils.copyProperties(updateReqVO, adminSaveVo);
+ brokerageLevelhistoryService.updateBrokerageLevelhistory(adminSaveVo);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除等级变更历史记录")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-levelhistory:delete')")
+ public CommonResult deleteBrokerageLevelhistory(@RequestParam("id") Long id) {
+ brokerageLevelhistoryService.deleteBrokerageLevelhistory(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得等级变更历史记录")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-levelhistory:query')")
+ public CommonResult getBrokerageLevelhistory(@RequestParam("id") Long id) {
+ BrokerageLevelhistoryRespVO adminLevelRespVo = brokerageLevelhistoryService.getBrokerageLevelhistory(id);
+ if (adminLevelRespVo == null) {
+ return success(null);
+ }
+ AppBroLevelhisRespVO appBroLevelhisRespVO = new AppBroLevelhisRespVO();
+ BeanUtils.copyProperties(adminLevelRespVo, appBroLevelhisRespVO);
+ return success(appBroLevelhisRespVO);
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得等级变更历史记录分页")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-levelhistory:query')")
+ public CommonResult> getBrokerageLevelhistoryPage(@Valid AppBroLevelhisPageReqVO pageReqVO) {
+ BrokerageLevelhistoryPageReqVO adminHisPageReqVo = new BrokerageLevelhistoryPageReqVO();
+ BeanUtils.copyProperties(pageReqVO, adminHisPageReqVo);
+ PageResult adminBroLevelhisPage = brokerageLevelhistoryService.getBrokerageLevelhistoryPage(adminHisPageReqVo);
+ PageResult appBroLevelhisRespVOPageResult = new PageResult<>();
+ appBroLevelhisRespVOPageResult.setTotal(adminBroLevelhisPage.getTotal());
+ List adminBroLevelhisPageList = adminBroLevelhisPage.getList();
+ ArrayList appBroLevelhisRespVOS = new ArrayList<>();
+ adminBroLevelhisPageList.forEach(brokerageLevelhistoryRespVO -> {
+ AppBroLevelhisRespVO appBroLevelhisRespVO = new AppBroLevelhisRespVO();
+ BeanUtils.copyProperties(brokerageLevelhistoryRespVO, appBroLevelhisRespVO);
+ appBroLevelhisRespVOS.add(appBroLevelhisRespVO);
+ });
+ appBroLevelhisRespVOPageResult.setList(appBroLevelhisRespVOS);
+ return success(appBroLevelhisRespVOPageResult);
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出等级变更历史记录 Excel")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-levelhistory:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportBrokerageLevelhistoryExcel(@Valid AppBroLevelhisPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ BrokerageLevelhistoryPageReqVO adminRespVO = new BrokerageLevelhistoryPageReqVO();
+ PageResult adminLevelHisRespVoPage = brokerageLevelhistoryService.getBrokerageLevelhistoryPage(adminRespVO);
+ List list = new ArrayList<>();
+ adminLevelHisRespVoPage.getList().forEach(BrokerageLevelhistoryRespVO -> {
+ AppBroLevelhisRespVO appBroLevelhisRespVO = new AppBroLevelhisRespVO();
+ BeanUtils.copyProperties(BrokerageLevelhistoryRespVO, appBroLevelhisRespVO);
+ list.add(appBroLevelhisRespVO);
+ });
+ // 导出 Excel
+ ExcelUtils.write(response, "等级变更历史记录.xls", "数据", AppBroLevelhisRespVO.class,
+ BeanUtils.toBean(list, AppBroLevelhisRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevelhistory/vo/AppBroLevelhisPageReqVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevelhistory/vo/AppBroLevelhisPageReqVO.java
new file mode 100644
index 000000000..d9175b9e1
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevelhistory/vo/AppBroLevelhisPageReqVO.java
@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokeragelevelhistory.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 等级变更历史记录分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AppBroLevelhisPageReqVO extends PageParam {
+
+ @Schema(description = "分销用户id", example = "29277")
+ private Long brokerageUserId;
+
+ @Schema(description = "初始等级id", example = "28982")
+ private Long initLevelId;
+
+ @Schema(description = "目标(现在)等级id", example = "5160")
+ private Long toLevelId;
+
+ @Schema(description = "变动原因", example = "不满足条件自动降级")
+ private String changeReason;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevelhistory/vo/AppBroLevelhisRespVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevelhistory/vo/AppBroLevelhisRespVO.java
new file mode 100644
index 000000000..723f0d71d
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevelhistory/vo/AppBroLevelhisRespVO.java
@@ -0,0 +1,45 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokeragelevelhistory.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 等级变更历史记录 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AppBroLevelhisRespVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20579")
+ @ExcelProperty("id")
+ private Long id;
+
+ @Schema(description = "分销用户id", example = "29277")
+ @ExcelProperty("分销用户id")
+ private Long brokerageUserId;
+
+ @Schema(description = "初始等级id", example = "28982")
+ @ExcelProperty("初始等级id")
+ private Long initLevelId;
+
+ @Schema(description = "目标(现在)等级id", example = "5160")
+ @ExcelProperty("目标(现在)等级id")
+ private Long toLevelId;
+
+ @Schema(description = "变动原因", example = "不满足条件自动降级")
+ @ExcelProperty("变动原因")
+ private String changeReason;
+
+ @Schema(description = "创建时间")
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ private String brokerageMemberNickName;//分销用户会员昵称
+
+ private String initLevelName;//初始等级名称
+
+ private String toLevelName;//变动目标等级
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevelhistory/vo/AppBroLevelhisSaveReqVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevelhistory/vo/AppBroLevelhisSaveReqVO.java
new file mode 100644
index 000000000..0db36a751
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokeragelevelhistory/vo/AppBroLevelhisSaveReqVO.java
@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokeragelevelhistory.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 等级变更历史记录新增/修改 Request VO")
+@Data
+public class AppBroLevelhisSaveReqVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20579")
+ private Long id;
+
+ @Schema(description = "分销用户id", example = "29277")
+ private Long brokerageUserId;
+
+ @Schema(description = "初始等级id", example = "28982")
+ private Long initLevelId;
+
+ @Schema(description = "目标(现在)等级id", example = "5160")
+ private Long toLevelId;
+
+ @Schema(description = "变动原因", example = "不满足条件自动降级")
+ private String changeReason;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokerageuser/AppBroUserController.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokerageuser/AppBroUserController.java
new file mode 100644
index 000000000..0064b2694
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokerageuser/AppBroUserController.java
@@ -0,0 +1,129 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokerageuser;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokerageuser.vo.BrokerageUserPageReqVO;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokerageuser.vo.BrokerageUserPageResVO;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokerageuser.vo.BrokerageUserSaveReqVO;
+import cn.iocoder.yudao.module.hsfx.controller.app.brokerageuser.vo.AppBroUserPageReqVO;
+import cn.iocoder.yudao.module.hsfx.controller.app.brokerageuser.vo.AppBroUserPageResVO;
+import cn.iocoder.yudao.module.hsfx.controller.app.brokerageuser.vo.AppBroUserRespVO;
+import cn.iocoder.yudao.module.hsfx.controller.app.brokerageuser.vo.AppBroUserSaveReqVO;
+import cn.iocoder.yudao.module.hsfx.service.brokerageuser.BrokerageUserService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "APP后台 - 分销用户")
+@RestController
+@RequestMapping("/hsfx/brokerage-user")
+@Validated
+public class AppBroUserController {
+
+ @Resource
+ private BrokerageUserService brokerageUserService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建分销用户")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-user:create')")
+ public CommonResult createBrokerageUser(@Valid @RequestBody AppBroUserSaveReqVO createReqVO) {
+ BrokerageUserSaveReqVO broUserSaveReqVO = new BrokerageUserSaveReqVO();
+ BeanUtils.copyProperties(createReqVO, broUserSaveReqVO);
+ return success(brokerageUserService.createBrokerageUser(broUserSaveReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新分销用户")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-user:update')")
+ public CommonResult updateBrokerageUser(@Valid @RequestBody AppBroUserSaveReqVO updateReqVO) {
+ BrokerageUserSaveReqVO broUserSaveReqVO = new BrokerageUserSaveReqVO();
+ BeanUtils.copyProperties(updateReqVO, broUserSaveReqVO);
+ brokerageUserService.updateBrokerageUser(broUserSaveReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除分销用户")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-user:delete')")
+ public CommonResult deleteBrokerageUser(@RequestParam("id") Long id) {
+ brokerageUserService.deleteBrokerageUser(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得分销用户")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-user:query')")
+ public CommonResult getBrokerageUser(@RequestParam("id") Long id) {
+ BrokerageUserPageResVO brokerageUser = brokerageUserService.getBrokerageUser(id);
+ if(brokerageUser==null){
+ return CommonResult.success(null);
+ }
+ AppBroUserPageResVO appBroUser = new AppBroUserPageResVO();
+ BeanUtils.copyProperties(brokerageUser, appBroUser);
+ return CommonResult.success(appBroUser);
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得分销用户分页")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-user:query')")
+ public CommonResult> getBrokerageUserPage(@Valid AppBroUserPageReqVO pageReqVO) {
+ BrokerageUserPageReqVO broUserPageReqVO = new BrokerageUserPageReqVO();
+ BeanUtils.copyProperties(pageReqVO, broUserPageReqVO);
+ PageResult brokerageUserPage = brokerageUserService.getBrokerageUserPage(broUserPageReqVO);
+ PageResult appPageResult = new PageResult<>();
+ appPageResult.setTotal(brokerageUserPage.getTotal());
+ List brokerageUserPageList = brokerageUserPage.getList();
+ ArrayList appBroUserPageResVOList = new ArrayList<>();
+ for (int i = 0; i < brokerageUserPageList.size(); i++) {
+ AppBroUserPageResVO appPageResVO = new AppBroUserPageResVO();
+ BeanUtils.copyProperties(brokerageUserPageList.get(i), appPageResVO);
+ appBroUserPageResVOList.add(appPageResVO);
+ }
+ appPageResult.setList(appBroUserPageResVOList);
+ return success(appPageResult);
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出分销用户 Excel")
+ @PreAuthorize("@ss.hasPermission('hsfx:brokerage-user:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportBrokerageUserExcel(@Valid AppBroUserPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ BrokerageUserPageReqVO broUserPageReqVO = new BrokerageUserPageReqVO();
+ BeanUtils.copyProperties(pageReqVO, broUserPageReqVO);
+ List pageResVOList = brokerageUserService.getBrokerageUserPage(broUserPageReqVO).getList();
+
+ List appPageResVOList = new ArrayList<>();
+ for (int i = 0; i < pageResVOList.size(); i++) {
+ AppBroUserPageResVO pageResVO = new AppBroUserPageResVO();
+ BeanUtils.copyProperties(pageResVOList.get(i), pageResVO);
+ appPageResVOList.add(pageResVO);
+ }
+
+ // 导出 Excel
+ ExcelUtils.write(response, "分销用户.xls", "数据", AppBroUserRespVO.class,
+ BeanUtils.toBean(appPageResVOList, AppBroUserRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokerageuser/vo/AppBroUserPageReqVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokerageuser/vo/AppBroUserPageReqVO.java
new file mode 100644
index 000000000..c03c3f0b4
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokerageuser/vo/AppBroUserPageReqVO.java
@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokerageuser.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 分销用户分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AppBroUserPageReqVO extends PageParam {
+
+ @Schema(description = "用户id", example = "8493")
+ private Long memberUserId;
+
+ @Schema(description = "分销商等级id", example = "24915")
+ private Long levelId;
+
+ @Schema(description = "上级用户id", example = "9225")
+ private Long parentId;
+
+ @Schema(description = "数据字典 是否启用")
+ private Integer isEnable;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokerageuser/vo/AppBroUserPageResVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokerageuser/vo/AppBroUserPageResVO.java
new file mode 100644
index 000000000..0cc90155a
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokerageuser/vo/AppBroUserPageResVO.java
@@ -0,0 +1,18 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokerageuser.vo;
+
+import lombok.Data;
+
+@Data
+public class AppBroUserPageResVO {
+
+ private Long id;//分销商id
+ private Long memberUserId;//会员id
+ private String nickName;//会员昵称
+ private String name;//会员名称
+ private String phone;//会员手机号
+ private Long levelId;//分销商等级id
+ private String levelName;//等级名称
+ private Long parentId;
+ private Long parentMemberUserId;
+ private String parentMemberNickName;
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokerageuser/vo/AppBroUserRespVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokerageuser/vo/AppBroUserRespVO.java
new file mode 100644
index 000000000..7cd6afcf6
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokerageuser/vo/AppBroUserRespVO.java
@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokerageuser.vo;
+
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 分销用户 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AppBroUserRespVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32060")
+ @ExcelProperty("id")
+ private Long id;
+
+ @Schema(description = "用户id", example = "8493")
+ @ExcelProperty("用户id")
+ private Long memberUserId;
+
+ @Schema(description = "分销商等级id", example = "24915")
+ @ExcelProperty("分销商等级id")
+ private Long levelId;
+
+ @Schema(description = "上级用户id", example = "9225")
+ @ExcelProperty("上级用户id")
+ private Long parentId;
+
+ @Schema(description = "数据字典 是否启用")
+ @ExcelProperty(value = "数据字典 是否启用", converter = DictConvert.class)
+ @DictFormat("infra_boolean_string") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private Integer isEnable;
+
+ @Schema(description = "创建时间")
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokerageuser/vo/AppBroUserSaveReqVO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokerageuser/vo/AppBroUserSaveReqVO.java
new file mode 100644
index 000000000..b21ea73c5
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/controller/app/brokerageuser/vo/AppBroUserSaveReqVO.java
@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.hsfx.controller.app.brokerageuser.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 分销用户新增/修改 Request VO")
+@Data
+public class AppBroUserSaveReqVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32060")
+ private Long id;
+
+ @Schema(description = "用户id", example = "8493")
+ private Long memberUserId;
+
+ @Schema(description = "分销商等级id", example = "24915")
+ private Long levelId;
+
+ @Schema(description = "上级用户id", example = "9225")
+ private Long parentId;
+
+ @Schema(description = "数据字典 是否启用")
+ private Integer isEnable;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/dataobject/brokeragebaseconfig/BrokerageBaseconfigDO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/dataobject/brokeragebaseconfig/BrokerageBaseconfigDO.java
new file mode 100644
index 000000000..2ed1e2f26
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/dataobject/brokeragebaseconfig/BrokerageBaseconfigDO.java
@@ -0,0 +1,48 @@
+package cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragebaseconfig;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+
+/**
+ * 分销配置 DO
+ *
+ * @author admin
+ */
+@TableName("trade_brokerage_baseconfig")
+@KeySequence("trade_brokerage_baseconfig_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class BrokerageBaseconfigDO extends BaseDO {
+
+ /**
+ * id
+ */
+ @TableId
+ private Long id;
+ /**
+ * 基础配置json
+ */
+ private String baseConfigJson;
+ /**
+ * 结算设置配置json
+ */
+ private String settleConfigJson;
+ /**
+ * 文字设置配置json
+ */
+ private String textConfigJson;
+ /**
+ * 业绩中心配置json
+ */
+ private String perforConfigJson;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/dataobject/brokeragelevel/BrokerageLevelDO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/dataobject/brokeragelevel/BrokerageLevelDO.java
new file mode 100644
index 000000000..2558766d5
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/dataobject/brokeragelevel/BrokerageLevelDO.java
@@ -0,0 +1,53 @@
+package cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevel;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 分销商等级 DO
+ *
+ * @author admin
+ */
+@TableName("trade_brokerage_level")
+@KeySequence("trade_brokerage_level_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class BrokerageLevelDO extends BaseDO {
+
+ /**
+ * id
+ */
+ @TableId
+ private Long id;
+ /**
+ * 等级 默认等级、一级、二级、三级等
+ */
+ private String level;
+ /**
+ * 等级名称
+ */
+ private String levelName;
+ /**
+ * 基础配置json;一级、二级、三级佣金比例、培育奖等
+ */
+ private String baseConfig;
+ /**
+ * 升级策略配置json 升级到此等级需要的条件
+ */
+ private String upgradeConfig;
+ /**
+ * 降级策略配置json 不满足此条件则降级
+ */
+ private String downgradeConfig;
+
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/dataobject/brokeragelevelhistory/BrokerageLevelhistoryDO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/dataobject/brokeragelevelhistory/BrokerageLevelhistoryDO.java
new file mode 100644
index 000000000..ab7b39c87
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/dataobject/brokeragelevelhistory/BrokerageLevelhistoryDO.java
@@ -0,0 +1,47 @@
+package cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevelhistory;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 等级变更历史记录 DO
+ *
+ * @author admin
+ */
+@TableName("trade_brokerage_levelhistory")
+@KeySequence("trade_brokerage_levelhistory_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class BrokerageLevelhistoryDO extends BaseDO {
+
+ /**
+ * id
+ */
+ @TableId
+ private Long id;
+ /**
+ * 分销用户id
+ */
+ private Long brokerageUserId;
+ /**
+ * 初始等级id
+ */
+ private Long initLevelId;
+ /**
+ * 目标(现在)等级id
+ */
+ private Long toLevelId;
+ /**
+ * 变动原因
+ */
+ private String changeReason;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/dataobject/brokerageuser/BrokerageUserDO.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/dataobject/brokerageuser/BrokerageUserDO.java
new file mode 100644
index 000000000..4e7624460
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/dataobject/brokerageuser/BrokerageUserDO.java
@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.hsfx.dal.dataobject.brokerageuser;
+
+import lombok.*;
+
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 分销用户 DO
+ *
+ * @author admin
+ */
+@TableName("trade_brokerage_user")
+@KeySequence("trade_brokerage_user_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class BrokerageUserDO extends BaseDO {
+
+ /**
+ * id
+ */
+ @TableId
+ private Long id;
+ /**
+ * 用户id
+ */
+ private Long memberUserId;
+ /**
+ * 分销商等级id
+ */
+ private Long levelId;
+ /**
+ * 上级用户id
+ */
+ private Long parentId;
+ /**
+ * 数据字典 是否启用
+ *
+ * 枚举 {@link TODO infra_boolean_string 对应的类}
+ */
+ private Integer isEnable;
+
+ @TableField(exist = false)
+ private String levelName;
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/mysql/brokeragebaseconfig/BrokerageBaseconfigMapper.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/mysql/brokeragebaseconfig/BrokerageBaseconfigMapper.java
new file mode 100644
index 000000000..726bb283c
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/mysql/brokeragebaseconfig/BrokerageBaseconfigMapper.java
@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.hsfx.dal.mysql.brokeragebaseconfig;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragebaseconfig.BrokerageBaseconfigDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragebaseconfig.vo.*;
+
+/**
+ * 分销配置 Mapper
+ *
+ * @author admin
+ */
+@Mapper
+public interface BrokerageBaseconfigMapper extends BaseMapperX {
+
+ default PageResult selectPage(BrokerageBaseconfigPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(BrokerageBaseconfigDO::getBaseConfigJson, reqVO.getBaseConfigJson())
+ .eqIfPresent(BrokerageBaseconfigDO::getSettleConfigJson, reqVO.getSettleConfigJson())
+ .eqIfPresent(BrokerageBaseconfigDO::getTextConfigJson, reqVO.getTextConfigJson())
+ .eqIfPresent(BrokerageBaseconfigDO::getPerforConfigJson, reqVO.getPerforConfigJson())
+ .betweenIfPresent(BrokerageBaseconfigDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(BrokerageBaseconfigDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/mysql/brokeragelevel/BrokerageLevelMapper.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/mysql/brokeragelevel/BrokerageLevelMapper.java
new file mode 100644
index 000000000..2d44bfbde
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/mysql/brokeragelevel/BrokerageLevelMapper.java
@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.hsfx.dal.mysql.brokeragelevel;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevel.BrokerageLevelDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevel.vo.*;
+
+/**
+ * 分销商等级 Mapper
+ *
+ * @author admin
+ */
+@Mapper
+public interface BrokerageLevelMapper extends BaseMapperX {
+
+ default PageResult selectPage(BrokerageLevelPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(BrokerageLevelDO::getLevel, reqVO.getLevel())
+ .likeIfPresent(BrokerageLevelDO::getLevelName, reqVO.getLevelName())
+ .eqIfPresent(BrokerageLevelDO::getBaseConfig, reqVO.getBaseConfig())
+ .eqIfPresent(BrokerageLevelDO::getUpgradeConfig, reqVO.getUpgradeConfig())
+ .eqIfPresent(BrokerageLevelDO::getDowngradeConfig, reqVO.getDowngradeConfig())
+ .betweenIfPresent(BrokerageLevelDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(BrokerageLevelDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/mysql/brokeragelevelhistory/BrokerageLevelhistoryMapper.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/mysql/brokeragelevelhistory/BrokerageLevelhistoryMapper.java
new file mode 100644
index 000000000..033ab17cc
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/mysql/brokeragelevelhistory/BrokerageLevelhistoryMapper.java
@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.hsfx.dal.mysql.brokeragelevelhistory;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevelhistory.BrokerageLevelhistoryDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevelhistory.vo.*;
+
+/**
+ * 等级变更历史记录 Mapper
+ *
+ * @author admin
+ */
+@Mapper
+public interface BrokerageLevelhistoryMapper extends BaseMapperX {
+
+ default PageResult selectPage(BrokerageLevelhistoryPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(BrokerageLevelhistoryDO::getBrokerageUserId, reqVO.getBrokerageUserId())
+ .eqIfPresent(BrokerageLevelhistoryDO::getInitLevelId, reqVO.getInitLevelId())
+ .eqIfPresent(BrokerageLevelhistoryDO::getToLevelId, reqVO.getToLevelId())
+ .likeIfPresent(BrokerageLevelhistoryDO::getChangeReason, reqVO.getChangeReason())
+ .betweenIfPresent(BrokerageLevelhistoryDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(BrokerageLevelhistoryDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/mysql/brokerageuser/BrokerageUserMapper.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/mysql/brokerageuser/BrokerageUserMapper.java
new file mode 100644
index 000000000..d996e64f8
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/dal/mysql/brokerageuser/BrokerageUserMapper.java
@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.hsfx.dal.mysql.brokerageuser;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokerageuser.BrokerageUserDO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.query.MPJQueryWrapper;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokerageuser.vo.*;
+
+/**
+ * 分销用户 Mapper
+ *
+ * @author admin
+ */
+@Mapper
+public interface BrokerageUserMapper extends BaseMapperX {
+
+ default PageResult selectPage(BrokerageUserPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(BrokerageUserDO::getMemberUserId, reqVO.getMemberUserId())
+ .eqIfPresent(BrokerageUserDO::getLevelId, reqVO.getLevelId())
+ .eqIfPresent(BrokerageUserDO::getParentId, reqVO.getParentId())
+ .eqIfPresent(BrokerageUserDO::getIsEnable, reqVO.getIsEnable())
+ .betweenIfPresent(BrokerageUserDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(BrokerageUserDO::getId));
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/framework/rpc/config/RpcConfiguration.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/framework/rpc/config/RpcConfiguration.java
new file mode 100644
index 000000000..4b132d59e
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/framework/rpc/config/RpcConfiguration.java
@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.hsfx.framework.rpc.config;
+
+import cn.iocoder.yudao.module.member.api.address.MemberAddressApi;
+import cn.iocoder.yudao.module.member.api.config.MemberConfigApi;
+import cn.iocoder.yudao.module.member.api.level.MemberLevelApi;
+import cn.iocoder.yudao.module.member.api.point.MemberPointApi;
+import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
+import cn.iocoder.yudao.module.product.api.category.ProductCategoryApi;
+import cn.iocoder.yudao.module.product.api.comment.ProductCommentApi;
+import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
+import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
+import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
+import cn.iocoder.yudao.module.system.api.social.SocialClientApi;
+import cn.iocoder.yudao.module.system.api.social.SocialUserApi;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration(proxyBeanMethods = false)
+@EnableFeignClients(clients = {
+ AdminUserApi.class,MemberUserApi.class
+})
+public class RpcConfiguration {
+}
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/framework/security/config/SecurityConfiguration.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/framework/security/config/SecurityConfiguration.java
new file mode 100644
index 000000000..edbe0ce23
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/framework/security/config/SecurityConfiguration.java
@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.hsfx.framework.security.config;
+
+import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer;
+import cn.iocoder.yudao.module.product.enums.ApiConstants;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer;
+
+/**
+ * Product 模块的 Security 配置
+ */
+@Configuration("productSecurityConfiguration")
+public class SecurityConfiguration {
+
+ @Bean("productAuthorizeRequestsCustomizer")
+ public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
+ return new AuthorizeRequestsCustomizer() {
+
+ @Override
+ public void customize(AuthorizeHttpRequestsConfigurer.AuthorizationManagerRequestMatcherRegistry registry) {
+ // Swagger 接口文档
+ registry.requestMatchers("/v3/api-docs/**").permitAll()
+ .requestMatchers("/webjars/**").permitAll()
+ .requestMatchers("/swagger-ui").permitAll()
+ .requestMatchers("/swagger-ui/**").permitAll();
+ // Spring Boot Actuator 的安全配置
+ registry.requestMatchers("/actuator").permitAll()
+ .requestMatchers("/actuator/**").permitAll();
+ // Druid 监控
+ registry.requestMatchers("/druid/**").permitAll();
+ // RPC 服务的安全配置
+ registry.requestMatchers(ApiConstants.PREFIX + "/**").permitAll();
+ }
+
+ };
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragebaseconfig/BrokerageBaseconfigService.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragebaseconfig/BrokerageBaseconfigService.java
new file mode 100644
index 000000000..34c5e0621
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragebaseconfig/BrokerageBaseconfigService.java
@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.hsfx.service.brokeragebaseconfig;
+
+import java.util.*;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragebaseconfig.vo.*;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragebaseconfig.BrokerageBaseconfigDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import jakarta.validation.Valid;
+
+
+/**
+ * 分销配置 Service 接口
+ *
+ * @author admin
+ */
+public interface BrokerageBaseconfigService {
+
+ /**
+ * 创建分销配置
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createBrokerageBaseconfig(@Valid BrokerageBaseconfigSaveReqVO createReqVO);
+
+ /**
+ * 更新分销配置
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateBrokerageBaseconfig(@Valid BrokerageBaseconfigSaveReqVO updateReqVO);
+
+ /**
+ * 删除分销配置
+ *
+ * @param id 编号
+ */
+ void deleteBrokerageBaseconfig(Long id);
+
+ /**
+ * 获得分销配置
+ *
+ * @param id 编号
+ * @return 分销配置
+ */
+ BrokerageBaseconfigDO getBrokerageBaseconfig(Long id);
+
+ /**
+ * 获得分销配置分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 分销配置分页
+ */
+ PageResult getBrokerageBaseconfigPage(BrokerageBaseconfigPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragebaseconfig/BrokerageBaseconfigServiceImpl.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragebaseconfig/BrokerageBaseconfigServiceImpl.java
new file mode 100644
index 000000000..56936f915
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragebaseconfig/BrokerageBaseconfigServiceImpl.java
@@ -0,0 +1,171 @@
+package cn.iocoder.yudao.module.hsfx.service.brokeragebaseconfig;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import jakarta.annotation.Resource;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragebaseconfig.vo.*;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragebaseconfig.BrokerageBaseconfigDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.hsfx.dal.mysql.brokeragebaseconfig.BrokerageBaseconfigMapper;
+
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.hsfx.enums.ErrorCodeConstants.*;
+
+/**
+ * 分销配置 Service 实现类
+ *
+ * @author admin
+ */
+@Service
+@Validated
+public class BrokerageBaseconfigServiceImpl implements BrokerageBaseconfigService {
+
+ @Resource
+ private BrokerageBaseconfigMapper brokerageBaseconfigMapper;
+
+ @Override
+ @Transactional
+ public Long createBrokerageBaseconfig(BrokerageBaseconfigSaveReqVO createReqVO) {
+ //校验格式是否正常
+ validateJson(createReqVO);
+ // 插入
+ BrokerageBaseconfigDO brokerageBaseconfig = BeanUtils.toBean(createReqVO, BrokerageBaseconfigDO.class);
+ brokerageBaseconfig.setDeleted(false);
+ brokerageBaseconfigMapper.insert(brokerageBaseconfig);
+ // 返回
+ return brokerageBaseconfig.getId();
+ }
+
+ @Override
+ @Transactional
+ public void updateBrokerageBaseconfig(BrokerageBaseconfigSaveReqVO updateReqVO) {
+ // 校验存在
+ validateBrokerageBaseconfigExists(updateReqVO.getId());
+ //设置每次只能更新一个字段的值
+ //校验其中基础设置、结算设置、文字设置、业绩中心设置每次只能更新一个字段值
+ // 更新
+// validateBaseconfigPropertyOne(updateReqVO);
+
+// BrokerageBaseconfigDO updateObj = BeanUtils.toBean(updateReqVO, BrokerageBaseconfigDO.class);
+// LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+// if (updateReqVO.getBaseConfigJson() != null && updateReqVO.getBaseConfigJson() != "") {
+// lambdaUpdateWrapper.set(BrokerageBaseconfigDO::getBaseConfigJson, updateReqVO.getBaseConfigJson());
+// }
+// if (updateReqVO.getPerforConfigJson() != null && updateReqVO.getPerforConfigJson() != "") {
+// lambdaUpdateWrapper.set(BrokerageBaseconfigDO::getPerforConfigJson, updateReqVO.getPerforConfigJson());
+// }
+// if (updateReqVO.getTextConfigJson() != null && updateReqVO.getTextConfigJson() != "") {
+// lambdaUpdateWrapper.set(BrokerageBaseconfigDO::getTextConfigJson, updateReqVO.getTextConfigJson());
+// }
+// if (updateReqVO.getSettleConfigJson() != null && updateReqVO.getSettleConfigJson() != "") {
+// lambdaUpdateWrapper.set(BrokerageBaseconfigDO::getSettleConfigJson, updateReqVO.getSettleConfigJson());
+// }
+// lambdaUpdateWrapper.eq(BrokerageBaseconfigDO::getId, updateReqVO.getId());
+// brokerageBaseconfigMapper.update(updateObj, lambdaUpdateWrapper);
+
+ //校验格式是否正常
+ validateJson(updateReqVO);
+ //校验属性是否为空
+ validateBrokerageBaseconfigProperties(updateReqVO);
+ BrokerageBaseconfigDO brokerageBaseconfigDO = new BrokerageBaseconfigDO();
+ BeanUtils.copyProperties(updateReqVO, brokerageBaseconfigDO);
+ brokerageBaseconfigMapper.updateById(brokerageBaseconfigDO);
+ }
+
+ @Override
+ @Transactional
+ public void deleteBrokerageBaseconfig(Long id) {
+ // 校验存在
+ validateBrokerageBaseconfigExists(id);
+ // 删除
+ brokerageBaseconfigMapper.deleteById(id);
+ }
+
+ @Override
+ public BrokerageBaseconfigDO getBrokerageBaseconfig(Long id) {
+ return brokerageBaseconfigMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getBrokerageBaseconfigPage(BrokerageBaseconfigPageReqVO pageReqVO) {
+ return brokerageBaseconfigMapper.selectPage(pageReqVO);
+ }
+
+
+ private void validateBrokerageBaseconfigExists(Long id) {
+ if (brokerageBaseconfigMapper.selectById(id) == null) {
+ throw exception(BROKERAGE_BASECONFIG_NOT_EXISTS);
+ }
+ }
+
+ //校验属性是是否存在 JSON格式的属性值,有一个为null都无法存入
+ private void validateBrokerageBaseconfigProperties(BrokerageBaseconfigSaveReqVO baseconfigSaveReqVO) {
+ if (StringUtils.isEmpty(baseconfigSaveReqVO.getBaseConfigJson())) {
+ throw exception(BROKERAGE_BASECONFIG_BASECONFIGJSON_NOTEXISTS);
+ }
+ if (StringUtils.isEmpty(baseconfigSaveReqVO.getSettleConfigJson())) {
+ throw exception(BROKERAGE_BASECONFIG_SETTLECONFIGJSON_NOTEXISTS);
+ }
+ if (StringUtils.isEmpty(baseconfigSaveReqVO.getTextConfigJson())) {
+ throw exception(BROKERAGE_BASECONFIG_TEXTCONFIGJSON_NOTEXISTS);
+ }
+ if (StringUtils.isEmpty(baseconfigSaveReqVO.getPerforConfigJson())) {
+ throw exception(BROKERAGE_BASECONFIG_PREFORCONFIGJSON_NOTEXISTS);
+ }
+ }
+
+ //验证单属性更新 后续看是否需要
+ private void validateBaseconfigPropertyOne(BrokerageBaseconfigSaveReqVO baseconfigSaveReqVO) {
+ int flag = 0;
+ if (baseconfigSaveReqVO.getBaseConfigJson() != null && baseconfigSaveReqVO.getBaseConfigJson() != "") {
+ flag++;
+ }
+ if (baseconfigSaveReqVO.getPerforConfigJson() != null && baseconfigSaveReqVO.getPerforConfigJson() != "") {
+ flag++;
+ }
+ if (baseconfigSaveReqVO.getTextConfigJson() != null && baseconfigSaveReqVO.getTextConfigJson() != "") {
+ flag++;
+ }
+ if (baseconfigSaveReqVO.getSettleConfigJson() != null && baseconfigSaveReqVO.getSettleConfigJson() != "") {
+ flag++;
+ }
+ if (flag > 1) {
+ throw exception(BROKERAGE_BASECONFIG_SINGLE_PROPERTY);
+ }
+ }
+
+
+ private void validateJson(BrokerageBaseconfigSaveReqVO baseconfigSaveReqVO) {
+ ObjectMapper objectMapper = new ObjectMapper();
+ try {
+ if (baseconfigSaveReqVO.getBaseConfigJson() != null) {
+ objectMapper.readValue(baseconfigSaveReqVO.getBaseConfigJson(), Object.class);
+ }
+ if (baseconfigSaveReqVO.getTextConfigJson() != null) {
+ objectMapper.readValue(baseconfigSaveReqVO.getTextConfigJson(), Object.class);
+ }
+ if (baseconfigSaveReqVO.getSettleConfigJson() != null) {
+ objectMapper.readValue(baseconfigSaveReqVO.getSettleConfigJson(), Object.class);
+ }
+ if (baseconfigSaveReqVO.getPerforConfigJson() != null) {
+ objectMapper.readValue(baseconfigSaveReqVO.getPerforConfigJson(), Object.class);
+ }
+ } catch (JsonProcessingException e) {
+ throw exception(JSON_FORMATCHECK_FAIL);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragelevel/BrokerageLevelService.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragelevel/BrokerageLevelService.java
new file mode 100644
index 000000000..2cf5b2934
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragelevel/BrokerageLevelService.java
@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.hsfx.service.brokeragelevel;
+
+import java.util.*;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevel.vo.*;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevel.BrokerageLevelDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import jakarta.validation.Valid;
+
+
+/**
+ * 分销商等级 Service 接口
+ *
+ * @author admin
+ */
+public interface BrokerageLevelService {
+
+ /**
+ * 创建分销商等级
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createBrokerageLevel(@Valid BrokerageLevelSaveReqVO createReqVO);
+
+ /**
+ * 更新分销商等级
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateBrokerageLevel(@Valid BrokerageLevelSaveReqVO updateReqVO);
+
+ /**
+ * 删除分销商等级
+ *
+ * @param id 编号
+ */
+ void deleteBrokerageLevel(Long id);
+
+ /**
+ * 获得分销商等级
+ *
+ * @param id 编号
+ * @return 分销商等级
+ */
+ BrokerageLevelDO getBrokerageLevel(Long id);
+
+ /**
+ * 获得分销商等级分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 分销商等级分页
+ */
+ PageResult getBrokerageLevelPage(BrokerageLevelPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragelevel/BrokerageLevelServiceImpl.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragelevel/BrokerageLevelServiceImpl.java
new file mode 100644
index 000000000..a6be5e259
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragelevel/BrokerageLevelServiceImpl.java
@@ -0,0 +1,171 @@
+package cn.iocoder.yudao.module.hsfx.service.brokeragelevel;
+
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevelhistory.BrokerageLevelhistoryDO;
+import cn.iocoder.yudao.module.hsfx.dal.mysql.brokeragelevelhistory.BrokerageLevelhistoryMapper;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import jakarta.annotation.Resource;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevel.vo.*;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevel.BrokerageLevelDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.hsfx.dal.mysql.brokeragelevel.BrokerageLevelMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.hsfx.enums.ErrorCodeConstants.*;
+
+/**
+ * 分销商等级 Service 实现类
+ *
+ * @author admin
+ */
+@Service
+@Validated
+public class BrokerageLevelServiceImpl implements BrokerageLevelService {
+
+ @Resource
+ private BrokerageLevelMapper brokerageLevelMapper;
+
+
+ @Override
+ @Transactional
+ public Long createBrokerageLevel(BrokerageLevelSaveReqVO createReqVO) {
+ //校验必须属性是否为空或空字符串
+// validateBrokerageLevelNullProperties(createReqVO);
+ //校验分销等级是否存在
+ validateBrokerageLevelExistsByName(createReqVO.getLevelName());
+
+ //校验对应的json属性是否完整
+ validateJson(createReqVO);
+ // 插入
+ BrokerageLevelDO brokerageLevel = BeanUtils.toBean(createReqVO, BrokerageLevelDO.class);
+ brokerageLevel.setDeleted(false);
+ brokerageLevelMapper.insert(brokerageLevel);
+ // 返回
+ return brokerageLevel.getId();
+ }
+
+ @Override
+ @Transactional
+ public void updateBrokerageLevel(BrokerageLevelSaveReqVO updateReqVO) {
+ //校验必须属性是否为空或空字符串
+// validateBrokerageLevelNullProperties(updateReqVO);
+ // 校验更新数据是否存在
+ validateBrokerageLevelExistsById(updateReqVO.getId());
+ validateJson(updateReqVO);
+ //校验分销等级是否存在
+// validateBrokerageLevelExistsByName(updateReqVO.getLevelName());
+ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
+ lambdaQueryWrapper.eq(BrokerageLevelDO::getLevelName, updateReqVO.getLevelName());
+ lambdaQueryWrapper.eq(BrokerageLevelDO::getDeleted, 0);
+ BrokerageLevelDO levelDOOne = brokerageLevelMapper.selectOne(lambdaQueryWrapper);
+ if (levelDOOne != null && (levelDOOne.getId() != updateReqVO.getId())) {//名称相同但是id不同
+ throw exception(BROKERAGE_LEVEL_ALREADY_EXISTS);
+ }
+
+ // 更新
+ BrokerageLevelDO updateObj = BeanUtils.toBean(updateReqVO, BrokerageLevelDO.class);
+ brokerageLevelMapper.updateById(updateObj);
+ }
+
+ @Override
+ @Transactional
+ public void deleteBrokerageLevel(Long id) {
+ // 校验存在
+ validateBrokerageLevelExistsById(id);
+ // 删除
+ brokerageLevelMapper.deleteById(id);
+ }
+
+
+ @Override
+ public BrokerageLevelDO getBrokerageLevel(Long id) {
+
+ BrokerageLevelDO levelDO = brokerageLevelMapper.selectById(id);
+ //json解析获取值
+// String baseConfig = levelDO.getBaseConfig();
+// JSONObject baseConfigJson = (JSONObject) JSON.parse(baseConfig);
+// String module = (String) baseConfigJson.get("module");
+// System.out.println(module);
+// System.out.println(baseConfigJson);
+ return levelDO;
+ }
+
+ @Override
+ public PageResult getBrokerageLevelPage(BrokerageLevelPageReqVO pageReqVO) {
+ return brokerageLevelMapper.selectPage(pageReqVO);
+ }
+
+ private void validateBrokerageLevelExistsById(Long id) {
+ if (brokerageLevelMapper.selectById(id) == null) {
+ throw exception(BROKERAGE_LEVEL_NOT_EXISTS);
+ }
+ }
+
+
+ private void validateBrokerageLevelExistsByName(String levelName) {
+ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
+ lambdaQueryWrapper.eq(BrokerageLevelDO::getLevelName, levelName);
+ lambdaQueryWrapper.eq(BrokerageLevelDO::getDeleted, 0);
+ if (brokerageLevelMapper.selectOne(lambdaQueryWrapper) != null) {
+ throw exception(BROKERAGE_LEVEL_ALREADY_EXISTS);
+ }
+
+ }
+
+ //校验属性字段为空
+ private void validateBrokerageLevelNullProperties(BrokerageLevelSaveReqVO levelSaveReqVO) {
+ if (levelSaveReqVO.getLevel() == null) {
+ throw exception(BROKERAGE_LEVEL_NOT_EXISTS);
+ }
+ if (levelSaveReqVO.getLevelName() == null) {
+ throw exception(BROKERAGE_LEVEL_LEVELNAME_NOTEXISTS);
+ }
+
+ if (levelSaveReqVO.getBaseConfig() == null) {
+ throw exception(BROKERAGE_LEVEL_BASECONFIG_NOTEXISTS);
+ }
+
+ if (levelSaveReqVO.getUpgradeConfig() == null) {
+ throw exception(BROKERAGE_LEVEL_UPGRADECONFIG_NOTEXISTS);
+ }
+
+ if (levelSaveReqVO.getDowngradeConfig() == null) {
+ throw exception(BROKERAGE_LEVEL_DOWNGRADECONFIG_NOTEXISTS);
+ }
+
+
+ }
+
+ private void validateJson(BrokerageLevelSaveReqVO levelSaveReqVO) {
+ ObjectMapper objectMapper = new ObjectMapper();
+ try {
+ if (levelSaveReqVO.getBaseConfig() != null) {
+ objectMapper.readValue(levelSaveReqVO.getBaseConfig(), Object.class);
+ }
+ if (levelSaveReqVO.getUpgradeConfig() != null) {
+ objectMapper.readValue(levelSaveReqVO.getUpgradeConfig(), Object.class);
+ }
+ if (levelSaveReqVO.getDowngradeConfig() != null) {
+ objectMapper.readValue(levelSaveReqVO.getDowngradeConfig(), Object.class);
+ }
+ } catch (JsonProcessingException e) {
+ throw exception(JSON_FORMATCHECK_FAIL);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragelevelhistory/BrokerageLevelhistoryService.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragelevelhistory/BrokerageLevelhistoryService.java
new file mode 100644
index 000000000..f1be32f3f
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragelevelhistory/BrokerageLevelhistoryService.java
@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.hsfx.service.brokeragelevelhistory;
+
+import java.util.*;
+
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevelhistory.vo.*;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevelhistory.BrokerageLevelhistoryDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import jakarta.validation.Valid;
+
+
+/**
+ * 等级变更历史记录 Service 接口
+ *
+ * @author admin
+ */
+public interface BrokerageLevelhistoryService {
+
+ /**
+ * 创建等级变更历史记录
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createBrokerageLevelhistory(@Valid BrokerageLevelhistorySaveReqVO createReqVO);
+
+ /**
+ * 更新等级变更历史记录
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateBrokerageLevelhistory(@Valid BrokerageLevelhistorySaveReqVO updateReqVO);
+
+ /**
+ * 删除等级变更历史记录
+ *
+ * @param id 编号
+ */
+ void deleteBrokerageLevelhistory(Long id);
+
+ /**
+ * 获得等级变更历史记录
+ *
+ * @param id 编号
+ * @return 等级变更历史记录
+ */
+ BrokerageLevelhistoryRespVO getBrokerageLevelhistory(Long id);
+
+ /**
+ * 获得等级变更历史记录分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 等级变更历史记录分页
+ */
+ PageResult getBrokerageLevelhistoryPage(BrokerageLevelhistoryPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragelevelhistory/BrokerageLevelhistoryServiceImpl.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragelevelhistory/BrokerageLevelhistoryServiceImpl.java
new file mode 100644
index 000000000..67f82f6af
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokeragelevelhistory/BrokerageLevelhistoryServiceImpl.java
@@ -0,0 +1,167 @@
+package cn.iocoder.yudao.module.hsfx.service.brokeragelevelhistory;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevel.BrokerageLevelDO;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokerageuser.BrokerageUserDO;
+import cn.iocoder.yudao.module.hsfx.dal.mysql.brokeragelevel.BrokerageLevelMapper;
+import cn.iocoder.yudao.module.hsfx.dal.mysql.brokerageuser.BrokerageUserMapper;
+import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
+import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
+import jakarta.annotation.Resource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokeragelevelhistory.vo.*;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevelhistory.BrokerageLevelhistoryDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.hsfx.dal.mysql.brokeragelevelhistory.BrokerageLevelhistoryMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.hsfx.enums.ErrorCodeConstants.BROKERAGE_LEVELHISTORY_NOT_EXISTS;
+
+/**
+ * 等级变更历史记录 Service 实现类
+ *
+ * @author admin
+ */
+@Service
+@Validated
+public class BrokerageLevelhistoryServiceImpl implements BrokerageLevelhistoryService {
+
+ @Resource
+ private BrokerageLevelhistoryMapper brokerageLevelhistoryMapper;
+
+ @Resource
+ private BrokerageUserMapper brokerageUserMapper;
+
+ @Autowired
+ private MemberUserApi memberUserApi;
+
+ @Autowired
+ private BrokerageLevelMapper levelMapper;
+
+ @Override
+ @Transactional
+ public Long createBrokerageLevelhistory(BrokerageLevelhistorySaveReqVO createReqVO) {
+ // 插入
+ BrokerageLevelhistoryDO brokerageLevelhistory = BeanUtils.toBean(createReqVO, BrokerageLevelhistoryDO.class);
+ brokerageLevelhistoryMapper.insert(brokerageLevelhistory);
+ // 返回
+ return brokerageLevelhistory.getId();
+ }
+
+ @Override
+ @Transactional
+ public void updateBrokerageLevelhistory(BrokerageLevelhistorySaveReqVO updateReqVO) {
+ // 校验存在
+ validateBrokerageLevelhistoryExists(updateReqVO.getId());
+ // 更新
+ BrokerageLevelhistoryDO updateObj = BeanUtils.toBean(updateReqVO, BrokerageLevelhistoryDO.class);
+ brokerageLevelhistoryMapper.updateById(updateObj);
+ }
+
+ @Override
+ @Transactional
+ public void deleteBrokerageLevelhistory(Long id) {
+ // 校验存在
+ validateBrokerageLevelhistoryExists(id);
+ // 删除
+ brokerageLevelhistoryMapper.deleteById(id);
+ }
+
+ private void validateBrokerageLevelhistoryExists(Long id) {
+ if (brokerageLevelhistoryMapper.selectById(id) == null) {
+ throw exception(BROKERAGE_LEVELHISTORY_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public BrokerageLevelhistoryRespVO getBrokerageLevelhistory(Long id) {
+ if (brokerageLevelhistoryMapper.selectById(id) == null) {
+ return null;
+ }
+ BrokerageLevelhistoryDO levelhistoryDO = brokerageLevelhistoryMapper.selectById(id);
+ Long brokerageUserId = levelhistoryDO.getBrokerageUserId();
+ BrokerageUserDO brokerageUserDO = brokerageUserMapper.selectById(brokerageUserId);
+ CommonResult memberUserResult = memberUserApi.getUser(brokerageUserDO.getMemberUserId());
+ BrokerageLevelhistoryRespVO respVO = new BrokerageLevelhistoryRespVO();
+ BeanUtils.copyProperties(levelhistoryDO, respVO);
+ if (memberUserResult.getData() != null) {
+ respVO.setBrokerageMemberNickName(memberUserResult.getData().getNickname());
+ }
+ respVO.setBrokerageUserId(brokerageUserId);
+
+ //获取初始等级信息
+ Long initLevelId = levelhistoryDO.getInitLevelId();
+ BrokerageLevelDO initLevelVo = levelMapper.selectById(initLevelId);
+ respVO.setInitLevelId(initLevelId);
+ if (initLevelVo != null) {
+ respVO.setInitLevelName(initLevelVo.getLevelName());
+ }
+
+ //获取目标等级信息
+ Long toLevelId = levelhistoryDO.getToLevelId();
+ BrokerageLevelDO toLevelDO = levelMapper.selectById(toLevelId);
+ respVO.setToLevelId(toLevelId);
+ if (toLevelDO != null) {
+ respVO.setToLevelName(toLevelDO.getLevelName());
+ }
+
+ return respVO;
+ }
+
+ @Override
+ public PageResult getBrokerageLevelhistoryPage(BrokerageLevelhistoryPageReqVO pageReqVO) {
+ PageResult result = new PageResult<>();
+ PageResult historyDOPageResult = brokerageLevelhistoryMapper.selectPage(pageReqVO);
+ result.setTotal(historyDOPageResult.getTotal());//总量
+ //遍历获取其他信息
+ List levelhistoryDOList = historyDOPageResult.getList();
+ List respVOList = new ArrayList();
+ for (int i = 0; i < levelhistoryDOList.size(); i++) {
+ //获取会员信息
+ //先获取分销商id 再去查询会员id
+ BrokerageLevelhistoryDO brokerageLevelhistoryDO = levelhistoryDOList.get(i);
+ Long brokerageUserId = brokerageLevelhistoryDO.getBrokerageUserId();
+ BrokerageUserDO brokerageUserDO = brokerageUserMapper.selectById(brokerageUserId);
+ if (brokerageUserDO == null) {
+ continue;
+ }
+ CommonResult memberUserResult = memberUserApi.getUser(brokerageUserDO.getMemberUserId());
+ BrokerageLevelhistoryRespVO respVO = new BrokerageLevelhistoryRespVO();
+ BeanUtils.copyProperties(brokerageLevelhistoryDO, respVO);
+ if (memberUserResult.getData() != null) {
+ respVO.setBrokerageMemberNickName(memberUserResult.getData().getNickname());
+ }
+ respVO.setBrokerageUserId(brokerageUserId);
+
+ //获取初始等级信息
+ Long initLevelId = brokerageLevelhistoryDO.getInitLevelId();
+ BrokerageLevelDO initLevelVo = levelMapper.selectById(initLevelId);
+ respVO.setInitLevelId(initLevelId);
+ if (initLevelVo != null) {
+ respVO.setInitLevelName(initLevelVo.getLevelName());
+ }
+
+ //获取目标等级信息
+ Long toLevelId = brokerageLevelhistoryDO.getToLevelId();
+ BrokerageLevelDO toLevelDO = levelMapper.selectById(toLevelId);
+ respVO.setToLevelId(toLevelId);
+ if (toLevelDO != null) {
+ respVO.setToLevelName(toLevelDO.getLevelName());
+ }
+ respVOList.add(respVO);
+ }
+
+// return historyDOPageResult;
+ result.setList(respVOList);
+ return result;
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokerageuser/BrokerageUserService.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokerageuser/BrokerageUserService.java
new file mode 100644
index 000000000..cf2d20292
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokerageuser/BrokerageUserService.java
@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.hsfx.service.brokerageuser;
+
+import java.util.*;
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokerageuser.vo.*;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokerageuser.BrokerageUserDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import jakarta.validation.Valid;
+
+/**
+ * 分销用户 Service 接口
+ *
+ * @author admin
+ */
+public interface BrokerageUserService {
+
+ /**
+ * 创建分销用户
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createBrokerageUser(@Valid BrokerageUserSaveReqVO createReqVO);
+
+ /**
+ * 更新分销用户
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateBrokerageUser(@Valid BrokerageUserSaveReqVO updateReqVO);
+
+ /**
+ * 删除分销用户
+ *
+ * @param id 编号
+ */
+ void deleteBrokerageUser(Long id);
+
+ /**
+ * 获得分销用户
+ *
+ * @param id 编号
+ * @return 分销用户
+ */
+ BrokerageUserPageResVO getBrokerageUser(Long id);
+
+ /**
+ * 获得分销用户分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 分销用户分页
+ */
+ PageResult getBrokerageUserPage(BrokerageUserPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokerageuser/BrokerageUserServiceImpl.java b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokerageuser/BrokerageUserServiceImpl.java
new file mode 100644
index 000000000..dd670b813
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/service/brokerageuser/BrokerageUserServiceImpl.java
@@ -0,0 +1,235 @@
+package cn.iocoder.yudao.module.hsfx.service.brokerageuser;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevel.BrokerageLevelDO;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokeragelevelhistory.BrokerageLevelhistoryDO;
+import cn.iocoder.yudao.module.hsfx.dal.mysql.brokeragelevel.BrokerageLevelMapper;
+import cn.iocoder.yudao.module.hsfx.dal.mysql.brokeragelevelhistory.BrokerageLevelhistoryMapper;
+import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
+import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import jakarta.annotation.Resource;
+import lombok.val;
+import org.apache.commons.lang3.ObjectUtils;
+import org.checkerframework.checker.units.qual.C;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+import cn.iocoder.yudao.module.hsfx.controller.admin.brokerageuser.vo.*;
+import cn.iocoder.yudao.module.hsfx.dal.dataobject.brokerageuser.BrokerageUserDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.hsfx.dal.mysql.brokerageuser.BrokerageUserMapper;
+
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.hsfx.enums.ErrorCodeConstants.*;
+
+/**
+ * 分销用户 Service 实现类
+ *
+ * @author admin
+ */
+@Service
+@Validated
+public class BrokerageUserServiceImpl implements BrokerageUserService {
+
+ @Resource
+ private BrokerageUserMapper brokerageUserMapper;
+
+ @Autowired
+ private BrokerageLevelMapper levelMapper;
+
+ @Autowired
+ private MemberUserApi memberUserApi;
+
+ @Resource
+ private BrokerageLevelhistoryMapper historyMapper;
+
+ @Override
+ @Transactional
+ public Long createBrokerageUser(BrokerageUserSaveReqVO createReqVO) {
+ //校验会员是否存在
+ validateMemberUserExists(createReqVO.getMemberUserId());
+ //校验分销等级是否存在
+ validateLevelExists(createReqVO.getLevelId());
+ //校验上级分销商是否存在
+// BrokerageUserDO parentBrokerageUser = getBrokerageUser(createReqVO.getParentId());
+ BrokerageUserDO parentBrokerageUser = brokerageUserMapper.selectById(createReqVO.getParentId());
+ if (parentBrokerageUser == null) {
+ throw exception(PARENT_BROKERAGE_USER_NOT_EXISTS);
+ }
+ //校验是否已经存在
+ validateBrokerUserExists(createReqVO.getMemberUserId());
+ // 插入
+ BrokerageUserDO brokerageUser = BeanUtils.toBean(createReqVO, BrokerageUserDO.class);
+ brokerageUser.setIsEnable(0);
+ brokerageUser.setDeleted(false);
+ brokerageUserMapper.insert(brokerageUser);
+ // 返回
+ return brokerageUser.getId();
+ }
+
+ @Override
+ @Transactional
+ public void updateBrokerageUser(BrokerageUserSaveReqVO updateReqVO) {
+ // 校验存在
+// validateBrokerageUserExists(updateReqVO.getId());
+ BrokerageUserDO oriUser = brokerageUserMapper.selectById(updateReqVO.getId());
+ if (oriUser == null) {
+ throw exception(BROKERAGE_USER_NOT_EXISTS);
+ }
+ //校验数据库会员id与输入会员id是否一致
+ if (!oriUser.getMemberUserId().equals(updateReqVO.getMemberUserId())) {
+ throw exception(BROKERAGE_USER_MEMBER_MISMATCH);
+ }
+ //校验会员是否存在
+ validateMemberUserExists(updateReqVO.getMemberUserId());
+ //校验等级是否存在
+ validateLevelExists(updateReqVO.getLevelId());
+ //校验上级会员是否存在
+ validateBrokerageUserExists(updateReqVO.getId());
+
+
+ //等级变更记录保存 当两个等级值不一致的时候执行
+ if (oriUser.getLevelId() != updateReqVO.getLevelId()) {
+ BrokerageLevelhistoryDO brokerageLevelhistoryDO = new BrokerageLevelhistoryDO();
+ brokerageLevelhistoryDO.setBrokerageUserId(updateReqVO.getId());//分销商id
+ brokerageLevelhistoryDO.setInitLevelId(oriUser.getLevelId());//初始等级
+ brokerageLevelhistoryDO.setToLevelId(updateReqVO.getLevelId());//目标等级id
+ brokerageLevelhistoryDO.setDeleted(false);
+ historyMapper.insert(brokerageLevelhistoryDO);
+ }
+ // 更新
+ BrokerageUserDO updateObj = BeanUtils.toBean(updateReqVO, BrokerageUserDO.class);
+ brokerageUserMapper.updateById(updateObj);
+ }
+
+ @Override
+ @Transactional
+ public void deleteBrokerageUser(Long id) {
+ // 校验存在
+ validateBrokerageUserExists(id);
+ // 删除
+ brokerageUserMapper.deleteById(id);
+ }
+
+
+ @Override
+ public BrokerageUserPageResVO getBrokerageUser(Long id) {
+ BrokerageUserDO brokerageUserDO = brokerageUserMapper.selectById(id);
+ //校验存在
+ if (brokerageUserDO == null) {
+ return null;
+ }
+ MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>();
+ wrapper.selectAll(BrokerageUserDO.class)
+ .leftJoin(BrokerageLevelDO.class, BrokerageLevelDO::getId, BrokerageUserDO::getLevelId)
+ .select(BrokerageLevelDO::getLevelName)
+ .select(BrokerageLevelDO::getId)
+ .eq(BrokerageUserDO::getId, id);
+ BrokerageUserPageResVO brokerageUserPageResVO = brokerageUserMapper.selectJoinOne(BrokerageUserPageResVO.class, wrapper);
+ BrokerageUserDO parentUserDo = brokerageUserMapper.selectById(brokerageUserPageResVO.getParentId());//上级分销商信息
+ brokerageUserPageResVO.setParentId(parentUserDo.getId());
+ CommonResult parentMemberUserResult = memberUserApi.getUser(parentUserDo.getMemberUserId());
+ if (parentMemberUserResult.getData() != null) {
+ brokerageUserPageResVO.setParentMemberNickName(parentMemberUserResult.getData().getNickname());
+ brokerageUserPageResVO.setParentMemberUserId(parentMemberUserResult.getData().getId());
+ }
+ CommonResult memberUserResult = memberUserApi.getUser(brokerageUserPageResVO.getMemberUserId());
+ if (memberUserResult.getData() != null) {
+ brokerageUserPageResVO.setNickName(memberUserResult.getData().getNickname());
+ brokerageUserPageResVO.setPhone(memberUserResult.getData().getMobile());
+ }
+ return brokerageUserPageResVO;
+ }
+
+ @Override
+ public PageResult getBrokerageUserPage(BrokerageUserPageReqVO pageReqVO) {
+
+ Page page = new Page(1, 10);
+ MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>();
+ wrapper.selectAll(BrokerageUserDO.class)
+// .select(BrokerageLevelDO::getLevelName)
+// .select(BrokerageLevelDO::getId)
+ .select(BrokerageLevelDO::getLevelName)
+ .select(BrokerageLevelDO::getId)
+ .leftJoin(BrokerageLevelDO.class, BrokerageLevelDO::getId, BrokerageUserDO::getLevelId);
+ PageResult brokerageLevelDOPageResult = brokerageUserMapper.selectJoinPage(new PageParam(), BrokerageUserPageResVO.class, wrapper);
+ List list = brokerageLevelDOPageResult.getList();
+
+ for (int i = 0; i < list.size(); i++) {
+ BrokerageUserPageResVO brokerageUserPageResVO = list.get(i);
+ Long parentId = brokerageUserPageResVO.getParentId();
+ BrokerageUserDO brokerageUserDO = brokerageUserMapper.selectById(parentId);
+ brokerageUserPageResVO.setParentMemberUserId(brokerageUserDO.getMemberUserId());
+ list.set(i, brokerageUserPageResVO);
+ }
+ for (int i = 0; i < list.size(); i++) {
+ BrokerageUserPageResVO brokerageUserPageResVO = list.get(i);
+ CommonResult memberUserResult = memberUserApi.getUser(brokerageUserPageResVO.getMemberUserId());
+ if (memberUserResult.getData() != null) {
+ brokerageUserPageResVO.setNickName(memberUserResult.getData().getNickname());
+ brokerageUserPageResVO.setPhone(memberUserResult.getData().getMobile());
+ }
+ CommonResult memberParentUserResult = memberUserApi.getUser(brokerageUserPageResVO.getParentMemberUserId());
+ if (memberParentUserResult.getData() != null) {
+ brokerageUserPageResVO.setParentMemberNickName(memberParentUserResult.getData().getNickname());
+ }
+ list.set(i, brokerageUserPageResVO);
+ }
+ brokerageLevelDOPageResult.setList(list);
+ return brokerageLevelDOPageResult;
+ }
+
+
+ //校验分销用户是否存在
+ private void validateBrokerageUserExists(Long id) {
+ if (brokerageUserMapper.selectById(id) == null) {
+ throw exception(BROKERAGE_USER_NOT_EXISTS);
+ }
+ }
+
+ //校验会员是否存在
+ private void validateMemberUserExists(Long memberUserId) {
+ CommonResult userResult = memberUserApi.getUser(memberUserId);
+ System.out.println(userResult);
+ if (userResult.getData() == null) {
+ throw exception(MEMBER_USER_NOT_EXISTS);
+ }
+ }
+
+ //校验分销等级是否存在
+ private void validateLevelExists(Long levelId) {
+ BrokerageLevelDO levelDO = levelMapper.selectById(levelId);
+ if (levelDO == null) {
+ throw exception(BROKERAGE_LEVEL_NOT_EXISTS);
+ }
+ }
+
+ private void validateBrokerUserExists(Long memberUserId) {
+ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
+ lambdaQueryWrapper.eq(BrokerageUserDO::getMemberUserId, memberUserId);
+ BrokerageUserDO brokerageUserDO = brokerageUserMapper.selectOne(lambdaQueryWrapper);
+ if (brokerageUserDO != null) {
+ throw exception(BROKERAGE_USER_ALREADY_EXISTS);
+ }
+ }
+
+ private void validateBrokerageUserUnique() {
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/application-dev.yaml b/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/application-dev.yaml
new file mode 100644
index 000000000..a38cd37be
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/application-dev.yaml
@@ -0,0 +1,115 @@
+--- #################### 注册中心 + 配置中心相关配置 ####################
+
+spring:
+ cloud:
+ nacos:
+ server-addr: 192.168.1.128:8848 # Nacos 服务器地址
+ username: nacos # Nacos 账号8
+ password: nacos # Nacos 密码
+ discovery: # 【配置中心】配置项
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+ metadata:
+ version: 1.0.0 # 服务实例的版本号,可用于灰度发布
+ config: # 【注册中心】配置项
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+
+--- #################### 数据库相关配置 ####################
+spring:
+ # 数据源配置项
+ autoconfigure:
+ exclude:
+ - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
+ datasource:
+ druid: # Druid 【监控】相关的全局配置
+ web-stat-filter:
+ enabled: true
+ stat-view-servlet:
+ enabled: true
+ allow: # 设置白名单,不填则允许所有访问
+ url-pattern: /druid/*
+ login-username: # 控制台管理用户名和密码
+ login-password:
+ filter:
+ stat:
+ enabled: true
+ log-slow-sql: true # 慢 SQL 记录
+ slow-sql-millis: 100
+ merge-sql: true
+ wall:
+ config:
+ multi-statement-allow: true
+ dynamic: # 多数据源配置
+ druid: # Druid 【连接池】相关的全局配置
+ initial-size: 5 # 初始连接数
+ min-idle: 10 # 最小连接池数量
+ max-active: 20 # 最大连接池数量
+ max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
+ time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
+ min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
+ max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
+ validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
+ test-while-idle: true
+ test-on-borrow: false
+ test-on-return: false
+ primary: master
+ datasource:
+ master:
+ url: jdbc:mysql://192.168.1.128/hs-mall-cloud?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ username: root
+ password: hs-rootadmin
+ slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
+ lazy: true # 开启懒加载,保证启动速度
+ url: jdbc:mysql://192.168.1.128/hs-mall-cloud?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ username: root
+ password: hs-rootadmin
+
+ # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
+ redis:
+ host: 192.168.1.128 # 地址
+ port: 6379 # 端口
+ database: 1 # 数据库索引
+# password: hs-rootadmin # 密码,建议生产环境开启
+
+--- #################### MQ 消息队列相关配置 ####################
+
+--- #################### 定时任务相关配置 ####################
+xxl:
+ job:
+ admin:
+ addresses: http://192.168.1.128:9090/xxl-job-admin # 调度中心部署跟地址
+
+--- #################### 服务保障相关配置 ####################
+
+# Lock4j 配置项
+lock4j:
+ acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒
+ expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒
+
+--- #################### 监控相关配置 ####################
+
+# Actuator 监控端点的配置项
+management:
+ endpoints:
+ web:
+ base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
+
+# Spring Boot Admin 配置项
+spring:
+ boot:
+ admin:
+ # Spring Boot Admin Client 客户端的相关配置
+ client:
+ instance:
+ service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
+ # Spring Boot Admin Server 服务端的相关配置
+ context-path: /admin # 配置 Spring
+
+--- #################### 芋道相关配置 ####################
+
+# 芋道配置项,设置当前项目所有自定义的配置
+yudao:
+ demo: true # 开启演示模式
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/application-local.yaml b/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/application-local.yaml
new file mode 100644
index 000000000..749669dbb
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/application-local.yaml
@@ -0,0 +1,137 @@
+--- #################### 注册中心 + 配置中心相关配置 ####################
+
+spring:
+ cloud:
+ nacos:
+ server-addr: 192.168.1.128:8848 # Nacos 服务器地址
+ username: nacos # Nacos 账号8
+ password: nacos # Nacos 密码
+ discovery: # 【配置中心】配置项
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+ metadata:
+ version: 1.0.0 # 服务实例的版本号,可用于灰度发布
+ config: # 【注册中心】配置项
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+
+--- #################### 数据库相关配置 ####################
+spring:
+ # 数据源配置项
+ autoconfigure:
+ exclude:
+ - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
+ - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置
+ datasource:
+ druid: # Druid 【监控】相关的全局配置
+ web-stat-filter:
+ enabled: true
+ stat-view-servlet:
+ enabled: true
+ allow: # 设置白名单,不填则允许所有访问
+ url-pattern: /druid/*
+ login-username: # 控制台管理用户名和密码
+ login-password:
+ filter:
+ stat:
+ enabled: true
+ log-slow-sql: true # 慢 SQL 记录
+ slow-sql-millis: 100
+ merge-sql: true
+ wall:
+ config:
+ multi-statement-allow: true
+ dynamic: # 多数据源配置
+ druid: # Druid 【连接池】相关的全局配置
+ initial-size: 1 # 初始连接数
+ min-idle: 1 # 最小连接池数量
+ max-active: 20 # 最大连接池数量
+ max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
+ time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
+ min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
+ max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
+ validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
+ test-while-idle: true
+ test-on-borrow: false
+ test-on-return: false
+ primary: master
+ datasource:
+ master:
+ url: jdbc:mysql://192.168.1.128/hs-mall-cloud?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ # url: jdbc:mysql://192.168.1.128/hs-mall-cloud?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例
+ # url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
+ # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
+ # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
+ # url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
+ username: root
+ password: hs-rootadmin
+ # username: sa # SQL Server 连接的示例
+ # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
+ # username: SYSDBA # DM 连接的示例
+ # password: SYSDBA # DM 连接的示例
+ slave: # 模拟从库,可根据自己需要修改
+ lazy: true # 开启懒加载,保证启动速度
+ url: jdbc:mysql://192.168.1.128/hs-mall-cloud?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
+ username: root
+ password: hs-rootadmin
+
+ # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
+ redis:
+ host: 192.168.1.128 # 地址
+ port: 6379 # 端口
+ database: 0 # 数据库索引
+# password: hs-rootadmin # 密码,建议生产环境开启
+
+--- #################### MQ 消息队列相关配置 ####################
+
+--- #################### 定时任务相关配置 ####################
+
+xxl:
+ job:
+ enabled: true # 是否开启调度中心,默认为 true 开启
+ admin:
+ addresses: http://192.168.1.128:9090/xxl-job-admin # 调度中心部署跟地址
+
+--- #################### 服务保障相关配置 ####################
+
+# Lock4j 配置项
+lock4j:
+ acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒
+ expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒
+
+--- #################### 监控相关配置 ####################
+
+# Actuator 监控端点的配置项
+management:
+ endpoints:
+ web:
+ base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
+
+# Spring Boot Admin 配置项
+spring:
+ boot:
+ admin:
+ # Spring Boot Admin Client 客户端的相关配置
+ client:
+ instance:
+ service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
+
+# 日志文件配置
+logging:
+ level:
+ # 配置自己写的 MyBatis Mapper 打印日志
+ cn.iocoder.yudao.module.hsfx.dal.mysql: debug
+ org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 芋艿:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示
+
+--- #################### 芋道相关配置 ####################
+
+# 芋道配置项,设置当前项目所有自定义的配置
+yudao:
+ env: # 多环境的配置项
+ tag: ${HOSTNAME}
+ security:
+ mock-enable: true
+ access-log: # 访问日志的配置项
+ enable: false
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/application.yaml b/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/application.yaml
new file mode 100644
index 000000000..3db0c1e78
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/application.yaml
@@ -0,0 +1,127 @@
+spring:
+ application:
+ name: hsfx-server
+
+ profiles:
+ active: local
+
+ main:
+ allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。
+ allow-bean-definition-overriding: true # 允许 Bean 覆盖,例如说 Feign 等会存在重复定义的服务
+
+ config:
+ import:
+ - optional:classpath:application-${spring.profiles.active}.yaml # 加载【本地】配置
+ - optional:nacos:${spring.application.name}-${spring.profiles.active}.yaml # 加载【Nacos】的配置
+
+ # Servlet 配置
+ servlet:
+ # 文件上传相关配置项
+ multipart:
+ max-file-size: 16MB # 单个文件大小
+ max-request-size: 32MB # 设置总上传的文件大小
+
+ # Jackson 配置项
+ jackson:
+ serialization:
+ write-dates-as-timestamps: true # 设置 LocalDateTime 的格式,使用时间戳
+ write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401
+ write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳
+ fail-on-empty-beans: false # 允许序列化无属性的 Bean
+
+ # Cache 配置项
+ cache:
+ type: REDIS
+ redis:
+ time-to-live: 1h # 设置过期时间为 1 小时
+
+server:
+ port: 48100
+
+logging:
+ file:
+ name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+
+--- #################### 接口文档配置 ####################
+
+springdoc:
+ api-docs:
+ enabled: true # 1. 是否开启 Swagger 接文档的元数据
+ path: /v3/api-docs
+ swagger-ui:
+ enabled: true # 2.1 是否开启 Swagger 文档的官方 UI 界面
+ path: /swagger-ui
+ default-flat-param-object: true # 参见 https://doc.xiaominfo.com/docs/faq/v4/knife4j-parameterobject-flat-param 文档
+
+knife4j:
+ enable: true # 2.2 是否开启 Swagger 文档的 Knife4j UI 界面
+ setting:
+ language: zh_cn
+
+# MyBatis Plus 的配置项
+mybatis-plus:
+ configuration:
+ map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
+ global-config:
+ db-config:
+ id-type: NONE # “智能”模式,基于 IdTypeEnvironmentPostProcessor + 数据源的类型,自动适配成 AUTO、INPUT 模式。
+ # id-type: AUTO # 自增 ID,适合 MySQL 等直接自增的数据库
+ # id-type: INPUT # 用户输入 ID,适合 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库
+ # id-type: ASSIGN_ID # 分配 ID,默认使用雪花算法。注意,Oracle、PostgreSQL、Kingbase、DB2、H2 数据库时,需要去除实体类上的 @KeySequence 注解
+ logic-delete-value: 1 # 逻辑已删除值(默认为 1)
+ logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
+ banner: false # 关闭控制台的 Banner 打印
+ type-aliases-package: ${yudao.info.base-package}.dal.dataobject
+ encryptor:
+ password: XDV71a+xqStEA3WH # 加解密的秘钥,可使用 https://www.imaegoo.com/2020/aes-key-generator/ 网站生成
+
+mybatis-plus-join:
+ banner: false # 关闭控制台的 Banner 打印
+
+# Spring Data Redis 配置
+spring:
+ data:
+ redis:
+ repositories:
+ enabled: false # 项目未使用到 Spring Data Redis 的 Repository,所以直接禁用,保证启动速度
+
+# VO 转换(数据翻译)相关
+easy-trans:
+ is-enable-global: true # 启用全局翻译(拦截所有 SpringMVC ResponseBody 进行自动翻译 )。如果对于性能要求很高可关闭此配置,或通过 @IgnoreTrans 忽略某个接口
+
+--- #################### RPC 远程调用相关配置 ####################
+
+--- #################### MQ 消息队列相关配置 ####################
+
+--- #################### 定时任务相关配置 ####################
+
+xxl:
+ job:
+ executor:
+ appname: ${spring.application.name} # 执行器 AppName
+ logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径
+ accessToken: default_token # 执行器通讯TOKEN
+
+--- #################### 芋道相关配置 ####################
+
+yudao:
+ info:
+ version: 1.0.0
+ base-package: cn.iocoder.yudao.module.hsfx
+ web:
+ admin-ui:
+ url: http://dashboard.yudao.iocoder.cn # Admin 管理后台 UI 的地址
+ xss:
+ enable: false
+ exclude-urls: # 如下 url,仅仅是为了演示,去掉配置也没关系
+ - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求
+ swagger:
+ title: 管理后台
+ description: 提供管理员管理的所有功能
+ version: ${yudao.info.version}
+ tenant: # 多租户相关配置项
+ enable: true
+ ignore-urls:
+ ignore-tables:
+
+debug: false
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/logback-spring.xml b/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/logback-spring.xml
new file mode 100644
index 000000000..b1b9f3faf
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/logback-spring.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ ${PATTERN_DEFAULT}
+
+
+
+
+
+
+
+
+
+ ${PATTERN_DEFAULT}
+
+
+
+ ${LOG_FILE}
+
+
+ ${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}
+
+ ${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}
+
+ ${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}
+
+ ${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}
+
+ ${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-30}
+
+
+
+
+
+ 0
+
+ 256
+
+
+
+
+
+
+
+ ${PATTERN_DEFAULT}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/mapper/brokeragebaseconfig/BrokerageBaseconfigMapper.xml b/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/mapper/brokeragebaseconfig/BrokerageBaseconfigMapper.xml
new file mode 100644
index 000000000..4bcb3bc78
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/mapper/brokeragebaseconfig/BrokerageBaseconfigMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/mapper/brokeragelevel/BrokerageLevelMapper.xml b/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/mapper/brokeragelevel/BrokerageLevelMapper.xml
new file mode 100644
index 000000000..c7deda8bd
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/mapper/brokeragelevel/BrokerageLevelMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/mapper/brokeragelevelhistory/BrokerageLevelhistoryMapper.xml b/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/mapper/brokeragelevelhistory/BrokerageLevelhistoryMapper.xml
new file mode 100644
index 000000000..f2db9b2db
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/mapper/brokeragelevelhistory/BrokerageLevelhistoryMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/mapper/brokerageuser/BrokerageUserMapper.xml b/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/mapper/brokerageuser/BrokerageUserMapper.xml
new file mode 100644
index 000000000..8898b3051
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/resources/mapper/brokerageuser/BrokerageUserMapper.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-api/pom.xml b/yudao-module-mall/yudao-module-hshy-api/pom.xml
new file mode 100644
index 000000000..4650b337d
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-api/pom.xml
@@ -0,0 +1,48 @@
+
+
+ 4.0.0
+
+ cn.iocoder.cloud
+ yudao-module-mall
+ ${revision}
+
+
+ yudao-module-hshy-api
+ jar
+
+ ${project.artifactId}
+
+ 海上会员 模块 API,暴露给其它模块调用
+
+
+
+
+ cn.iocoder.cloud
+ yudao-common
+
+
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-api
+ provided
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+ true
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+ true
+
+
+
+
diff --git a/yudao-module-mall/yudao-module-hshy-api/src/main/java/cn/iocoder/yudao/module/hshy/api/pointruleitem/PointRuleItemApi.java b/yudao-module-mall/yudao-module-hshy-api/src/main/java/cn/iocoder/yudao/module/hshy/api/pointruleitem/PointRuleItemApi.java
new file mode 100644
index 000000000..b888e9bcd
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-api/src/main/java/cn/iocoder/yudao/module/hshy/api/pointruleitem/PointRuleItemApi.java
@@ -0,0 +1,18 @@
+package cn.iocoder.yudao.module.hshy.api.pointruleitem;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.hshy.api.pointruleitem.dto.PointRuleItemReqDTO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+public interface PointRuleItemApi {
+
+ @Operation(summary = "根据类型获取规则明细")
+ @Parameter(name = "type", description = "类型", required = true, example = "code")
+ CommonResult> getPointRuleItemList(@RequestParam("type") String type);
+
+}
diff --git a/yudao-module-mall/yudao-module-hshy-api/src/main/java/cn/iocoder/yudao/module/hshy/api/pointruleitem/dto/PointRuleItemReqDTO.java b/yudao-module-mall/yudao-module-hshy-api/src/main/java/cn/iocoder/yudao/module/hshy/api/pointruleitem/dto/PointRuleItemReqDTO.java
new file mode 100644
index 000000000..8af6cb236
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-api/src/main/java/cn/iocoder/yudao/module/hshy/api/pointruleitem/dto/PointRuleItemReqDTO.java
@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.hshy.api.pointruleitem.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+
+
+@Schema(description = "管理后台 - 规则明细 Response TDO")
+@Data
+public class PointRuleItemReqDTO {
+ @Schema(description = "编码")
+ private Integer id;
+
+ @Schema(description = "规则类型")
+ private String type;
+
+ @Schema(description = "标签")
+ private String label;
+
+ @Schema(description = "开始键值")
+ private String starValue;
+
+ @Schema(description = "结束键值")
+ private String endValue;
+
+ @Schema(description = "排序")
+
+ private Integer sort;
+
+ @Schema(description = "状态(0正常 1停用)")
+ private Integer status;
+
+ @Schema(description = "颜色类型", example = "2")
+ private String colorType;
+
+ @Schema(description = "css 样式")
+ private String cssClass;
+
+ @Schema(description = "备注", example = "你说的对")
+ private String remark;
+
+}
diff --git a/yudao-module-mall/yudao-module-hshy-api/src/main/java/cn/iocoder/yudao/module/hshy/api/userblack/UserBlackApi.java b/yudao-module-mall/yudao-module-hshy-api/src/main/java/cn/iocoder/yudao/module/hshy/api/userblack/UserBlackApi.java
new file mode 100644
index 000000000..f3a267372
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-api/src/main/java/cn/iocoder/yudao/module/hshy/api/userblack/UserBlackApi.java
@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.hshy.api.userblack;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.hshy.api.userblack.dto.UserBlackReqDTO;
+
+import java.util.List;
+
+public interface UserBlackApi {
+ /**
+ * 获得所有会员黑名单
+ *
+ */
+ CommonResult> listUserBlack();
+
+}
diff --git a/yudao-module-mall/yudao-module-hshy-api/src/main/java/cn/iocoder/yudao/module/hshy/api/userblack/dto/UserBlackReqDTO.java b/yudao-module-mall/yudao-module-hshy-api/src/main/java/cn/iocoder/yudao/module/hshy/api/userblack/dto/UserBlackReqDTO.java
new file mode 100644
index 000000000..07ee6fe72
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-api/src/main/java/cn/iocoder/yudao/module/hshy/api/userblack/dto/UserBlackReqDTO.java
@@ -0,0 +1,11 @@
+package cn.iocoder.yudao.module.hshy.api.userblack.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+
+
+public class UserBlackReqDTO {
+ @Schema(description = "会员编号", example = "1034")
+ @NotNull(message = "会员编号")
+ private Long memberUserId;
+}
diff --git a/yudao-module-mall/yudao-module-hshy-api/src/main/java/cn/iocoder/yudao/module/hshy/enums/ErrorCodeConstants.java b/yudao-module-mall/yudao-module-hshy-api/src/main/java/cn/iocoder/yudao/module/hshy/enums/ErrorCodeConstants.java
new file mode 100644
index 000000000..1e6ff750b
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-api/src/main/java/cn/iocoder/yudao/module/hshy/enums/ErrorCodeConstants.java
@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.hshy.enums;
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+
+
+/**
+ * 海上会员 错误码枚举类
+ *
+ * 海上会员 系统,使用 1-100-000-000 段
+ */
+public interface ErrorCodeConstants {
+ // ========== 会员黑名单 TODO 补充编号 ==========
+ ErrorCode USER_BLACK_NOT_EXISTS = new ErrorCode(1-100-001-000, "登录异常,请联系管理员!");
+
+ // ========== 规则 TODO 补充编号 ==========
+ ErrorCode POINT_RULE_NOT_EXISTS = new ErrorCode(1-101-001-000, "规则不存在");
+
+ // ========== 规则明细 TODO 补充编号 ==========
+ ErrorCode POINT_RULE_ITEM_NOT_EXISTS = new ErrorCode(1-102-001-000, "规则明细不存在");
+
+ // ========== 用户积分金额冻结 TODO 补充编号 ==========
+ ErrorCode POINT_CONGEAL_NOT_EXISTS = new ErrorCode(1-103-001-000, "用户积分金额冻结不存在");
+
+ // ========== 商品扩展 TODO 补充编号 ==========
+ ErrorCode EXTEND_NOT_EXISTS = new ErrorCode(1-104-001-000, "商品扩展不存在");
+
+ // ========== 会员条件配置 TODO 补充编号 ==========
+ ErrorCode USER_CONFIG_NOT_EXISTS = new ErrorCode(1-105-001-000, "会员条件配置不存在");
+
+ // ========== 会员积分兑换 TODO 补充编号 ==========
+ ErrorCode POINT_EXCHANGE_NOT_EXISTS = new ErrorCode(1-106-001-000, "会员积分兑换不存在");
+
+
+}
diff --git a/yudao-module-mall/yudao-module-hshy-biz/pom.xml b/yudao-module-mall/yudao-module-hshy-biz/pom.xml
new file mode 100644
index 000000000..be17f2065
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/pom.xml
@@ -0,0 +1,123 @@
+
+
+
+ cn.iocoder.cloud
+ yudao-module-mall
+ ${revision}
+
+ 4.0.0
+ yudao-module-hshy-biz
+ jar
+
+ ${project.artifactId}
+
+ product 模块,主要实现商品相关功能
+ 例如:品牌、商品分类、spu、sku等功能。
+
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-env
+
+
+
+
+ cn.iocoder.cloud
+ yudao-module-hshy-api
+ ${revision}
+
+
+ cn.iocoder.cloud
+ yudao-module-product-api
+ ${revision}
+
+
+ cn.iocoder.cloud
+ yudao-module-member-api
+ ${revision}
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-biz-tenant
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-web
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-security
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-mybatis
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-rpc
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-test
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-excel
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-monitor
+
+
+
+
+
+ ${project.artifactId}
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring.boot.version}
+
+
+
+ repackage
+
+
+
+
+
+
+
+
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/HshyServerApplication.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/HshyServerApplication.java
new file mode 100644
index 000000000..ba5f4ac29
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/HshyServerApplication.java
@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.module.hshy;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * 项目的启动类
+ *
+ * @author tpj
+ */
+@SpringBootApplication
+public class HshyServerApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(HshyServerApplication.class, args);
+ System.out.println("HsfxServerApplication 启动成功");
+ }
+}
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/api/pointruleitem/PointRuleItemImpl.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/api/pointruleitem/PointRuleItemImpl.java
new file mode 100644
index 000000000..b94b53fb7
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/api/pointruleitem/PointRuleItemImpl.java
@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.hshy.api.pointruleitem;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.hshy.api.pointruleitem.dto.PointRuleItemReqDTO;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.pointruleitem.PointRuleItemDO;
+import cn.iocoder.yudao.module.hshy.service.pointruleitem.PointRuleItemService;
+import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
+import jakarta.annotation.Resource;
+
+
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+public class PointRuleItemImpl implements PointRuleItemApi {
+
+ @Resource
+ private PointRuleItemService pointRuleItemService;
+ @Override
+ public CommonResult> getPointRuleItemList(String type) {
+ List list =pointRuleItemService.getPointRuleItemList(type);
+ return success(BeanUtils.toBean(list, PointRuleItemReqDTO.class));
+ }
+
+}
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/api/userblack/UserBlackApiImpl.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/api/userblack/UserBlackApiImpl.java
new file mode 100644
index 000000000..c1e929483
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/api/userblack/UserBlackApiImpl.java
@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.hshy.api.userblack;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.hshy.api.userblack.dto.UserBlackReqDTO;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.userblack.UserBlackDO;
+import cn.iocoder.yudao.module.hshy.service.userblack.UserBlackService;
+
+import jakarta.annotation.Resource;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+public class UserBlackApiImpl implements UserBlackApi {
+
+ @Resource
+ private UserBlackService userBlackService;
+ @Override
+ public CommonResult> listUserBlack() {
+ List list= userBlackService.listUserBlack();
+ return success(BeanUtils.toBean(list, UserBlackReqDTO.class));
+ }
+
+}
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/extend/ExtendController.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/extend/ExtendController.java
new file mode 100644
index 000000000..55df8afed
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/extend/ExtendController.java
@@ -0,0 +1,96 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.extend;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.hshy.controller.admin.extend.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.extend.ExtendDO;
+import cn.iocoder.yudao.module.hshy.service.extend.ExtendService;
+
+
+
+@Tag(name = "管理后台 - 商品扩展")
+@RestController
+@RequestMapping("/hshy/extend")
+@Validated
+public class ExtendController {
+
+ @Resource
+ private ExtendService extendService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建商品扩展")
+ @PreAuthorize("@ss.hasPermission('hshy:extend:create')")
+ public CommonResult createExtend(@Valid @RequestBody ExtendSaveReqVO createReqVO) {
+ return success(extendService.createExtend(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新商品扩展")
+ @PreAuthorize("@ss.hasPermission('hshy:extend:update')")
+ public CommonResult updateExtend(@Valid @RequestBody ExtendSaveReqVO updateReqVO) {
+ extendService.updateExtend(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除商品扩展")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('hshy:extend:delete')")
+ public CommonResult deleteExtend(@RequestParam("id") Integer id) {
+ extendService.deleteExtend(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "根据spuId获取扩展信息")
+ @Parameter(name = "spuId", description = "商品 SPU 编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('hshy:extend:query')")
+ public CommonResult getExtend(@RequestParam("spuId") Integer spuId) {
+ ExtendDO extend = extendService.getExtend(spuId);
+ return success(BeanUtils.toBean(extend, ExtendRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得商品扩展分页")
+ @PreAuthorize("@ss.hasPermission('hshy:extend:query')")
+ public CommonResult> getExtendPage(@Valid ExtendPageReqVO pageReqVO) {
+ PageResult pageResult = extendService.getExtendPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, ExtendRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出商品扩展 Excel")
+ @PreAuthorize("@ss.hasPermission('hshy:extend:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportExtendExcel(@Valid ExtendPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = extendService.getExtendPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "商品扩展.xls", "数据", ExtendRespVO.class,
+ BeanUtils.toBean(list, ExtendRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/extend/vo/ExtendPageReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/extend/vo/ExtendPageReqVO.java
new file mode 100644
index 000000000..5184bdbf3
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/extend/vo/ExtendPageReqVO.java
@@ -0,0 +1,47 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.extend.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 商品扩展分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ExtendPageReqVO extends PageParam {
+
+ @Schema(description = "是否是推广商品(0否 1是)")
+ private Integer isPromotion;
+
+ @Schema(description = "是否是指定商品(0否 1是)")
+ private Integer isAppoint;
+
+ @Schema(description = "是否是特殊商品(0否 1是)")
+ private Integer isSpecial;
+
+ @Schema(description = "状态(0正常 1停用)", example = "2")
+ private Integer status;
+
+ @Schema(description = "说明", example = "随便")
+ private String remark;
+
+ @Schema(description = "商品 SPU 编号", example = "26933")
+ private Long spuId;
+
+ @Schema(description = "商品 SKU 编号", example = "3820")
+ private Long skuId;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+ @Schema(description = "删除时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] deletedTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/extend/vo/ExtendReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/extend/vo/ExtendReqVO.java
new file mode 100644
index 000000000..2f1eaf3ad
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/extend/vo/ExtendReqVO.java
@@ -0,0 +1,16 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.extend.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 商品扩展分页 Request VO")
+@Data
+@ToString(callSuper = true)
+public class ExtendReqVO {
+ @Schema(description = "商品 SPU 编号", example = "26933")
+ private Long spuId;
+
+ @Schema(description = "商品 SKU 编号", example = "3820")
+ private Long skuId;
+}
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/extend/vo/ExtendRespVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/extend/vo/ExtendRespVO.java
new file mode 100644
index 000000000..719bc87d3
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/extend/vo/ExtendRespVO.java
@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.extend.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 商品扩展 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ExtendRespVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "25961")
+ @ExcelProperty("主键")
+ private Integer id;
+
+ @Schema(description = "是否是推广商品(0否 1是)")
+ @ExcelProperty("是否是推广商品(0否 1是)")
+ private Integer isPromotion;
+
+ @Schema(description = "是否是指定商品(0否 1是)")
+ @ExcelProperty("是否是指定商品(0否 1是)")
+ private Integer isAppoint;
+
+ @Schema(description = "是否是特殊商品(0否 1是)")
+ @ExcelProperty("是否是特殊商品(0否 1是)")
+ private Integer isSpecial;
+
+ @Schema(description = "状态(0正常 1停用)", example = "2")
+ @ExcelProperty("状态(0正常 1停用)")
+ private Integer status;
+
+ @Schema(description = "说明", example = "随便")
+ @ExcelProperty("说明")
+ private String remark;
+
+ @Schema(description = "商品 SPU 编号", example = "26933")
+ @ExcelProperty("商品 SPU 编号")
+ private Long spuId;
+
+ @Schema(description = "商品 SKU 编号", example = "3820")
+ @ExcelProperty("商品 SKU 编号")
+ private Long skuId;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @Schema(description = "删除时间")
+ @ExcelProperty("删除时间")
+ private LocalDateTime deletedTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/extend/vo/ExtendSaveReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/extend/vo/ExtendSaveReqVO.java
new file mode 100644
index 000000000..e23bedbb2
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/extend/vo/ExtendSaveReqVO.java
@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.extend.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 商品扩展新增/修改 Request VO")
+@Data
+public class ExtendSaveReqVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "25961")
+ private Integer id;
+
+ @Schema(description = "是否是推广商品(0否 1是)")
+ private Integer isPromotion;
+
+ @Schema(description = "是否是指定商品(0否 1是)")
+ private Integer isAppoint;
+
+ @Schema(description = "是否是特殊商品(0否 1是)")
+ private Integer isSpecial;
+
+ @Schema(description = "状态(0正常 1停用)", example = "2")
+ private Integer status;
+
+ @Schema(description = "说明", example = "随便")
+ private String remark;
+
+ @Schema(description = "商品 SPU 编号", example = "26933")
+ private Long spuId;
+
+ @Schema(description = "商品 SKU 编号", example = "3820")
+ private Long skuId;
+
+ @Schema(description = "删除时间")
+ private LocalDateTime deletedTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointcongeal/PointCongealController.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointcongeal/PointCongealController.java
new file mode 100644
index 000000000..286a8a81b
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointcongeal/PointCongealController.java
@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointcongeal;
+
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.hshy.controller.admin.pointcongeal.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.pointcongeal.PointCongealDO;
+import cn.iocoder.yudao.module.hshy.service.pointcongeal.PointCongealService;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+
+@Tag(name = "管理后台 - 用户积分金额冻结")
+@RestController
+@RequestMapping("/hshy/point-congeal")
+@Validated
+public class PointCongealController {
+
+ @Resource
+ private PointCongealService pointCongealService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建用户积分金额冻结")
+ @PreAuthorize("@ss.hasPermission('hshy:point-congeal:create')")
+ public CommonResult createPointCongeal(@Valid @RequestBody PointCongealSaveReqVO createReqVO) {
+ return success(pointCongealService.createPointCongeal(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新用户积分金额冻结")
+ @PreAuthorize("@ss.hasPermission('hshy:point-congeal:update')")
+ public CommonResult updatePointCongeal(@Valid @RequestBody PointCongealSaveReqVO updateReqVO) {
+ pointCongealService.updatePointCongeal(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除用户积分金额冻结")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('hshy:point-congeal:delete')")
+ public CommonResult deletePointCongeal(@RequestParam("id") Integer id) {
+ pointCongealService.deletePointCongeal(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得用户积分金额冻结")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('hshy:point-congeal:query')")
+ public CommonResult getPointCongeal(@RequestParam("id") Integer id) {
+ PointCongealDO pointCongeal = pointCongealService.getPointCongeal(id);
+ return success(BeanUtils.toBean(pointCongeal, PointCongealRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得用户积分金额冻结分页")
+ @PreAuthorize("@ss.hasPermission('hshy:point-congeal:query')")
+ public CommonResult> getPointCongealPage(@Valid PointCongealPageReqVO pageReqVO) {
+ PageResult pageResult = pointCongealService.getPointCongealPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, PointCongealRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出用户积分金额冻结 Excel")
+ @PreAuthorize("@ss.hasPermission('hshy:point-congeal:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportPointCongealExcel(@Valid PointCongealPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = pointCongealService.getPointCongealPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "用户积分金额冻结.xls", "数据", PointCongealRespVO.class,
+ BeanUtils.toBean(list, PointCongealRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointcongeal/vo/PointCongealPageReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointcongeal/vo/PointCongealPageReqVO.java
new file mode 100644
index 000000000..902bb027e
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointcongeal/vo/PointCongealPageReqVO.java
@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointcongeal.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 用户积分金额冻结分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class PointCongealPageReqVO extends PageParam {
+
+ @Schema(description = "会员编码", example = "26604")
+ private Long memberUserId;
+
+ @Schema(description = "用户积分主键", example = "8748")
+ private Long pointCongealId;
+
+ @Schema(description = "冻结金额")
+ private Integer amount;
+
+ @Schema(description = "冻结积分")
+ private Integer point;
+
+ @Schema(description = "描述", example = "你说的对")
+ private String description;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointcongeal/vo/PointCongealRespVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointcongeal/vo/PointCongealRespVO.java
new file mode 100644
index 000000000..6397a7304
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointcongeal/vo/PointCongealRespVO.java
@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointcongeal.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 用户积分金额冻结 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class PointCongealRespVO {
+
+ @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "10758")
+ @ExcelProperty("自增主键")
+ private Integer id;
+
+ @Schema(description = "会员编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "26604")
+ @ExcelProperty("会员编码")
+ private Long memberUserId;
+
+ @Schema(description = "用户积分主键", example = "8748")
+ @ExcelProperty("用户积分主键")
+ private Long pointCongealId;
+
+ @Schema(description = "冻结金额")
+ @ExcelProperty("冻结金额")
+ private Integer amount;
+
+ @Schema(description = "冻结积分", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("冻结积分")
+ private Integer point;
+
+ @Schema(description = "描述", example = "你说的对")
+ @ExcelProperty("描述")
+ private String description;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointcongeal/vo/PointCongealSaveReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointcongeal/vo/PointCongealSaveReqVO.java
new file mode 100644
index 000000000..a90b30d99
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointcongeal/vo/PointCongealSaveReqVO.java
@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointcongeal.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import jakarta.validation.constraints.NotNull;
+import java.util.*;
+
+
+@Schema(description = "管理后台 - 用户积分金额冻结新增/修改 Request VO")
+@Data
+public class PointCongealSaveReqVO {
+
+ @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "10758")
+ private Integer id;
+
+ @Schema(description = "会员编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "26604")
+ @NotNull(message = "会员编码不能为空")
+ private Long memberUserId;
+
+ @Schema(description = "用户积分主键", example = "8748")
+ private Long pointCongealId;
+
+ @Schema(description = "冻结金额")
+ private Integer amount;
+
+ @Schema(description = "冻结积分")
+ private Integer point;
+
+ @Schema(description = "描述", example = "你说的对")
+ private String description;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointexchange/PointExchangeController.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointexchange/PointExchangeController.java
new file mode 100644
index 000000000..f3df617d7
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointexchange/PointExchangeController.java
@@ -0,0 +1,104 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointexchange;
+
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.hshy.controller.admin.pointexchange.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.pointexchange.PointExchangeDO;
+import cn.iocoder.yudao.module.hshy.service.pointexchange.PointExchangeService;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+
+@Tag(name = "管理后台 - 会员积分兑换")
+@RestController
+@RequestMapping("/hshy/point-exchange")
+@Validated
+public class PointExchangeController {
+
+ @Resource
+ private PointExchangeService pointExchangeService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建会员积分兑换")
+ @PreAuthorize("@ss.hasPermission('hshy:point-exchange:create')")
+ public CommonResult createPointExchange(@Valid @RequestBody PointExchangeSaveReqVO createReqVO) {
+ return success(pointExchangeService.createPointExchange(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新会员积分兑换")
+ @PreAuthorize("@ss.hasPermission('hshy:point-exchange:update')")
+ public CommonResult updatePointExchange(@Valid @RequestBody PointExchangeSaveReqVO updateReqVO) {
+ pointExchangeService.updatePointExchange(updateReqVO);
+ return success(true);
+ }
+
+ @PutMapping("/audit")
+ @Operation(summary = "会员积分兑换审核")
+ @PreAuthorize("@ss.hasPermission('hshy:point-exchange:update')")
+ public CommonResult auditPointExchange(@Valid @RequestBody PointExchangeAuditReqVO auditReqVO) {
+ pointExchangeService.auditPointExchange(auditReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除会员积分兑换")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('hshy:point-exchange:delete')")
+ public CommonResult deletePointExchange(@RequestParam("id") Integer id) {
+ pointExchangeService.deletePointExchange(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得会员积分兑换")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('hshy:point-exchange:query')")
+ public CommonResult getPointExchange(@RequestParam("id") Integer id) {
+ PointExchangeDO pointExchange = pointExchangeService.getPointExchange(id);
+ return success(BeanUtils.toBean(pointExchange, PointExchangeRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得会员积分兑换分页")
+ @PreAuthorize("@ss.hasPermission('hshy:point-exchange:query')")
+ public CommonResult> getPointExchangePage(@Valid PointExchangePageReqVO pageReqVO) {
+ PageResult pageResult = pointExchangeService.getPointExchangePage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, PointExchangeRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出会员积分兑换 Excel")
+ @PreAuthorize("@ss.hasPermission('hshy:point-exchange:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportPointExchangeExcel(@Valid PointExchangePageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = pointExchangeService.getPointExchangePage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "会员积分兑换.xls", "数据", PointExchangeRespVO.class,
+ BeanUtils.toBean(list, PointExchangeRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointexchange/vo/PointExchangeAuditReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointexchange/vo/PointExchangeAuditReqVO.java
new file mode 100644
index 000000000..6cde93454
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointexchange/vo/PointExchangeAuditReqVO.java
@@ -0,0 +1,23 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointexchange.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 会员积分兑换审核 Request VO")
+@Data
+public class PointExchangeAuditReqVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "22548")
+ private Integer id;
+
+ @Schema(description = "审核状态", example = "2")
+ private String auditStatus;
+
+ @Schema(description = "审核备注")
+ private String auditNotes;
+
+}
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointexchange/vo/PointExchangePageReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointexchange/vo/PointExchangePageReqVO.java
new file mode 100644
index 000000000..cddbd133e
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointexchange/vo/PointExchangePageReqVO.java
@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointexchange.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 会员积分兑换分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class PointExchangePageReqVO extends PageParam {
+
+ @Schema(description = "会员Id", example = "14170")
+ private Long memberUserId;
+
+ @Schema(description = "会员类型", example = "1")
+ private String userType;
+
+ @Schema(description = "业务类型(余额,商品,其他)", example = "1")
+ private String bizType;
+
+ @Schema(description = "规则明细")
+ private String jsonRule;
+
+ @Schema(description = "余额.积分")
+ private Integer balance;
+
+ @Schema(description = "累积支出")
+ private Integer totalExpense;
+
+ @Schema(description = "累积充值")
+ private Integer totalRecharge;
+
+ @Schema(description = "状态(0正常 1停用)", example = "2")
+ private Integer status;
+
+ @Schema(description = "说明", example = "随便")
+ private String remark;
+
+ @Schema(description = "审核状态", example = "2")
+ private String auditStatus;
+
+ @Schema(description = "审核人")
+ private String audit;
+
+ @Schema(description = "审核时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] auditTime;
+
+ @Schema(description = "审核备注")
+ private String auditNotes;
+
+ @Schema(description = "商品 SPU 编号", example = "852")
+ private Long spuId;
+
+ @Schema(description = "商品 SKU 编号", example = "28024")
+ private Long skuId;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+ @Schema(description = "删除时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] deletedTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointexchange/vo/PointExchangeRespVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointexchange/vo/PointExchangeRespVO.java
new file mode 100644
index 000000000..171faec06
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointexchange/vo/PointExchangeRespVO.java
@@ -0,0 +1,91 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointexchange.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+
+@Schema(description = "管理后台 - 会员积分兑换 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class PointExchangeRespVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "22548")
+ @ExcelProperty("主键")
+ private Integer id;
+
+ @Schema(description = "会员Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "14170")
+ @ExcelProperty("会员Id")
+ private Long memberUserId;
+
+ @Schema(description = "会员类型", example = "1")
+ @ExcelProperty("会员类型")
+ private String userType;
+
+ @Schema(description = "业务类型(余额,商品,其他)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @ExcelProperty(value = "业务类型(余额,商品,其他)", converter = DictConvert.class)
+ @DictFormat("member_point_exchange_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private String bizType;
+
+ @Schema(description = "规则明细", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("规则明细")
+ private String jsonRule;
+
+ @Schema(description = "余额.积分")
+ @ExcelProperty("余额.积分")
+ private Integer balance;
+
+ @Schema(description = "累积支出")
+ @ExcelProperty("累积支出")
+ private Integer totalExpense;
+
+ @Schema(description = "累积充值")
+ @ExcelProperty("累积充值")
+ private Integer totalRecharge;
+
+ @Schema(description = "状态(0正常 1停用)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @ExcelProperty("状态(0正常 1停用)")
+ private Integer status;
+
+ @Schema(description = "说明", example = "随便")
+ @ExcelProperty("说明")
+ private String remark;
+
+ @Schema(description = "审核状态", example = "2")
+ @ExcelProperty(value = "审核状态", converter = DictConvert.class)
+ @DictFormat("member_point_exchange_audit_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private String auditStatus;
+
+ @Schema(description = "审核人")
+ @ExcelProperty("审核人")
+ private String audit;
+
+ @Schema(description = "审核时间")
+ @ExcelProperty("审核时间")
+ private LocalDateTime auditTime;
+
+ @Schema(description = "审核备注")
+ @ExcelProperty("审核备注")
+ private String auditNotes;
+
+ @Schema(description = "商品 SPU 编号", example = "852")
+ @ExcelProperty("商品 SPU 编号")
+ private Long spuId;
+
+ @Schema(description = "商品 SKU 编号", example = "28024")
+ @ExcelProperty("商品 SKU 编号")
+ private Long skuId;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @Schema(description = "删除时间")
+ @ExcelProperty("删除时间")
+ private LocalDateTime deletedTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointexchange/vo/PointExchangeSaveReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointexchange/vo/PointExchangeSaveReqVO.java
new file mode 100644
index 000000000..cce4a9941
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointexchange/vo/PointExchangeSaveReqVO.java
@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointexchange.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 会员积分兑换新增/修改 Request VO")
+@Data
+public class PointExchangeSaveReqVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "22548")
+ private Integer id;
+
+ @Schema(description = "会员Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "14170")
+ @NotNull(message = "会员Id不能为空")
+ private Long memberUserId;
+
+ @Schema(description = "会员类型", example = "1")
+ private String userType;
+
+ @Schema(description = "业务类型(余额,商品,其他)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotEmpty(message = "业务类型(余额,商品,其他)不能为空")
+ private String bizType;
+
+ @Schema(description = "规则明细", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "规则明细不能为空")
+ private String jsonRule;
+
+ @Schema(description = "余额.积分")
+ private Integer balance;
+
+ @Schema(description = "累积支出")
+ private Integer totalExpense;
+
+ @Schema(description = "累积充值")
+ private Integer totalRecharge;
+
+ @Schema(description = "状态(0正常 1停用)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @NotNull(message = "状态(0正常 1停用)不能为空")
+ private Integer status;
+
+ @Schema(description = "说明", example = "随便")
+ private String remark;
+
+ @Schema(description = "审核状态", example = "2")
+ private String auditStatus;
+
+ @Schema(description = "审核人")
+ private String audit;
+
+ @Schema(description = "审核时间")
+ private LocalDateTime auditTime;
+
+ @Schema(description = "审核备注")
+ private String auditNotes;
+
+ @Schema(description = "商品 SPU 编号", example = "852")
+ private Long spuId;
+
+ @Schema(description = "商品 SKU 编号", example = "28024")
+ private Long skuId;
+
+ @Schema(description = "删除时间")
+ private LocalDateTime deletedTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointrule/PointRuleController.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointrule/PointRuleController.java
new file mode 100644
index 000000000..7a2cfa724
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointrule/PointRuleController.java
@@ -0,0 +1,94 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointrule;
+
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.hshy.controller.admin.pointrule.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.pointrule.PointRuleDO;
+import cn.iocoder.yudao.module.hshy.service.pointrule.PointRuleService;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+
+@Tag(name = "管理后台 - 规则")
+@RestController
+@RequestMapping("/hshy/point-rule")
+@Validated
+public class PointRuleController {
+
+ @Resource
+ private PointRuleService pointRuleService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建规则")
+ @PreAuthorize("@ss.hasPermission('hshy:point-rule:create')")
+ public CommonResult createPointRule(@Valid @RequestBody PointRuleSaveReqVO createReqVO) {
+ return success(pointRuleService.createPointRule(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新规则")
+ @PreAuthorize("@ss.hasPermission('hshy:point-rule:update')")
+ public CommonResult updatePointRule(@Valid @RequestBody PointRuleSaveReqVO updateReqVO) {
+ pointRuleService.updatePointRule(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除规则")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('hshy:point-rule:delete')")
+ public CommonResult deletePointRule(@RequestParam("id") Integer id) {
+ pointRuleService.deletePointRule(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得规则")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('hshy:point-rule:query')")
+ public CommonResult getPointRule(@RequestParam("id") Integer id) {
+ PointRuleDO pointRule = pointRuleService.getPointRule(id);
+ return success(BeanUtils.toBean(pointRule, PointRuleRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得规则分页")
+ @PreAuthorize("@ss.hasPermission('hshy:point-rule:query')")
+ public CommonResult> getPointRulePage(@Valid PointRulePageReqVO pageReqVO) {
+ PageResult pageResult = pointRuleService.getPointRulePage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, PointRuleRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出规则 Excel")
+ @PreAuthorize("@ss.hasPermission('hshy:point-rule:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportPointRuleExcel(@Valid PointRulePageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = pointRuleService.getPointRulePage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "规则.xls", "数据", PointRuleRespVO.class,
+ BeanUtils.toBean(list, PointRuleRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointrule/vo/PointRulePageReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointrule/vo/PointRulePageReqVO.java
new file mode 100644
index 000000000..6c845f8f4
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointrule/vo/PointRulePageReqVO.java
@@ -0,0 +1,38 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointrule.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 规则分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class PointRulePageReqVO extends PageParam {
+
+ @Schema(description = "类型(天数,时间,条款,区间,升级,降级)", example = "1")
+ private String type;
+
+ @Schema(description = "名称", example = "赵六")
+ private String name;
+
+ @Schema(description = "状态(0正常 1停用)", example = "2")
+ private Integer status;
+
+ @Schema(description = "说明", example = "你猜")
+ private String remark;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+ @Schema(description = "删除时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] deletedTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointrule/vo/PointRuleRespVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointrule/vo/PointRuleRespVO.java
new file mode 100644
index 000000000..3143dd60e
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointrule/vo/PointRuleRespVO.java
@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointrule.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 规则 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class PointRuleRespVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15498")
+ @ExcelProperty("主键")
+ private Integer id;
+
+ @Schema(description = "类型(天数,时间,条款,区间,升级,降级)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @ExcelProperty("类型(天数,时间,条款,区间,升级,降级)")
+ private String type;
+
+ @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
+ @ExcelProperty("名称")
+ private String name;
+
+ @Schema(description = "状态(0正常 1停用)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @ExcelProperty("状态(0正常 1停用)")
+ private Integer status;
+
+ @Schema(description = "说明", example = "你猜")
+ @ExcelProperty("说明")
+ private String remark;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @Schema(description = "删除时间")
+ @ExcelProperty("删除时间")
+ private LocalDateTime deletedTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointrule/vo/PointRuleSaveReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointrule/vo/PointRuleSaveReqVO.java
new file mode 100644
index 000000000..290df5a83
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointrule/vo/PointRuleSaveReqVO.java
@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointrule.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import java.util.*;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 规则新增/修改 Request VO")
+@Data
+public class PointRuleSaveReqVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15498")
+ private Integer id;
+
+ @Schema(description = "类型(天数,时间,条款,区间,升级,降级)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotEmpty(message = "类型(天数,时间,条款,区间,升级,降级)不能为空")
+ private String type;
+
+ @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
+ @NotEmpty(message = "名称不能为空")
+ private String name;
+
+ @Schema(description = "状态(0正常 1停用)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @NotNull(message = "状态(0正常 1停用)不能为空")
+ private Integer status;
+
+ @Schema(description = "说明", example = "你猜")
+ private String remark;
+
+ @Schema(description = "删除时间")
+ private LocalDateTime deletedTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointruleitem/PointRuleItemController.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointruleitem/PointRuleItemController.java
new file mode 100644
index 000000000..8c250f135
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointruleitem/PointRuleItemController.java
@@ -0,0 +1,105 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointruleitem;
+
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.hshy.controller.admin.pointruleitem.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.pointruleitem.PointRuleItemDO;
+import cn.iocoder.yudao.module.hshy.service.pointruleitem.PointRuleItemService;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+
+@Tag(name = "管理后台 - 规则明细")
+@RestController
+@RequestMapping("/hshy/point-rule-item")
+@Validated
+public class PointRuleItemController {
+
+ @Resource
+ private PointRuleItemService pointRuleItemService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建规则明细")
+ @PreAuthorize("@ss.hasPermission('hshy:point-rule-item:create')")
+ public CommonResult createPointRuleItem(@Valid @RequestBody PointRuleItemSaveReqVO createReqVO) {
+ return success(pointRuleItemService.createPointRuleItem(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新规则明细")
+ @PreAuthorize("@ss.hasPermission('hshy:point-rule-item:update')")
+ public CommonResult updatePointRuleItem(@Valid @RequestBody PointRuleItemSaveReqVO updateReqVO) {
+ pointRuleItemService.updatePointRuleItem(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除规则明细")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('hshy:point-rule-item:delete')")
+ public CommonResult deletePointRuleItem(@RequestParam("id") Integer id) {
+ pointRuleItemService.deletePointRuleItem(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得规则明细")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('hshy:point-rule-item:query')")
+ public CommonResult getPointRuleItem(@RequestParam("id") Integer id) {
+ PointRuleItemDO pointRuleItem = pointRuleItemService.getPointRuleItem(id);
+ return success(BeanUtils.toBean(pointRuleItem, PointRuleItemRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得规则明细分页")
+ @PreAuthorize("@ss.hasPermission('hshy:point-rule-item:query')")
+ public CommonResult> getPointRuleItemPage(@Valid PointRuleItemPageReqVO pageReqVO) {
+ PageResult pageResult = pointRuleItemService.getPointRuleItemPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, PointRuleItemRespVO.class));
+ }
+
+ @GetMapping("/detail")
+ @Operation(summary = "根据type获取规则明细")
+ @Parameter(name = "type", description = "类型", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('hshy:point-rule-item:query')")
+ public CommonResult> detail(@Valid String type) {
+ List pageResult = pointRuleItemService.getPointRuleItemList(type);
+ return success(BeanUtils.toBean(pageResult, PointRuleItemRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出规则明细 Excel")
+ @PreAuthorize("@ss.hasPermission('hshy:point-rule-item:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportPointRuleItemExcel(@Valid PointRuleItemPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = pointRuleItemService.getPointRuleItemPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "规则明细.xls", "数据", PointRuleItemRespVO.class,
+ BeanUtils.toBean(list, PointRuleItemRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointruleitem/vo/PointRuleItemPageReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointruleitem/vo/PointRuleItemPageReqVO.java
new file mode 100644
index 000000000..b42ba9d93
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointruleitem/vo/PointRuleItemPageReqVO.java
@@ -0,0 +1,52 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointruleitem.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 规则明细分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class PointRuleItemPageReqVO extends PageParam {
+
+ @Schema(description = "编码")
+ private Long code;
+
+ @Schema(description = "规则类型", example = "2")
+ private String type;
+
+ @Schema(description = "标签")
+ private String label;
+
+ @Schema(description = "开始键值")
+ private String starValue;
+
+ @Schema(description = "结束键值")
+ private String endValue;
+
+ @Schema(description = "排序")
+ private Integer sort;
+
+ @Schema(description = "状态(0正常 1停用)", example = "1")
+ private Integer status;
+
+ @Schema(description = "颜色类型", example = "2")
+ private String colorType;
+
+ @Schema(description = "css 样式")
+ private String cssClass;
+
+ @Schema(description = "备注", example = "你说的对")
+ private String remark;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointruleitem/vo/PointRuleItemRespVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointruleitem/vo/PointRuleItemRespVO.java
new file mode 100644
index 000000000..97d632c2a
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointruleitem/vo/PointRuleItemRespVO.java
@@ -0,0 +1,63 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointruleitem.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 规则明细 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class PointRuleItemRespVO {
+
+ @Schema(description = "编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "25327")
+ @ExcelProperty("编码")
+ private Integer id;
+
+ @Schema(description = "编码")
+ @ExcelProperty("编码")
+ private Long code;
+
+ @Schema(description = "规则类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @ExcelProperty("规则类型")
+ private String type;
+
+ @Schema(description = "标签", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("标签")
+ private String label;
+
+ @Schema(description = "开始键值")
+ @ExcelProperty("开始键值")
+ private String starValue;
+
+ @Schema(description = "结束键值", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("结束键值")
+ private String endValue;
+
+ @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("排序")
+ private Integer sort;
+
+ @Schema(description = "状态(0正常 1停用)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @ExcelProperty("状态(0正常 1停用)")
+ private Integer status;
+
+ @Schema(description = "颜色类型", example = "2")
+ @ExcelProperty("颜色类型")
+ private String colorType;
+
+ @Schema(description = "css 样式")
+ @ExcelProperty("css 样式")
+ private String cssClass;
+
+ @Schema(description = "备注", example = "你说的对")
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointruleitem/vo/PointRuleItemSaveReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointruleitem/vo/PointRuleItemSaveReqVO.java
new file mode 100644
index 000000000..3abeb7b99
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/pointruleitem/vo/PointRuleItemSaveReqVO.java
@@ -0,0 +1,50 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.pointruleitem.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import java.util.*;
+
+@Schema(description = "管理后台 - 规则明细新增/修改 Request VO")
+@Data
+public class PointRuleItemSaveReqVO {
+
+ @Schema(description = "编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "25327")
+ private Integer id;
+
+
+ @Schema(description = "规则类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @NotEmpty(message = "规则类型不能为空")
+ private String type;
+
+ @Schema(description = "标签", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "标签不能为空")
+ private String label;
+
+ @Schema(description = "开始键值")
+ private String starValue;
+
+ @Schema(description = "结束键值", requiredMode = Schema.RequiredMode.REQUIRED)
+ private String endValue;
+
+ @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "排序不能为空")
+ private Integer sort;
+
+ @Schema(description = "状态(0正常 1停用)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "状态(0正常 1停用)不能为空")
+ private Integer status;
+
+ @Schema(description = "颜色类型", example = "2")
+ private String colorType;
+
+ @Schema(description = "css 样式")
+ private String cssClass;
+
+ @Schema(description = "备注", example = "你说的对")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userblack/UserBlackController.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userblack/UserBlackController.java
new file mode 100644
index 000000000..34e4f4af4
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userblack/UserBlackController.java
@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.userblack;
+
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.hshy.controller.admin.userblack.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.userblack.UserBlackDO;
+import cn.iocoder.yudao.module.hshy.service.userblack.UserBlackService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+
+@Tag(name = "管理后台 - 会员黑名单")
+@RestController
+@RequestMapping("/hshy/user-black")
+@Validated
+public class UserBlackController {
+
+ @Resource
+ private UserBlackService userBlackService;
+
+ @PostMapping("/create")
+ @Operation(summary = "批量创建会员黑名单")
+ @PreAuthorize("@ss.hasPermission('member:user-black-list:create')")
+ public CommonResult createUserBlackList(@Valid @RequestBody UserBlackSaveReqVO createReqVO) {
+ return success(userBlackService.createUserBlack(createReqVO));
+ }
+
+
+ @PutMapping("/update")
+ @Operation(summary = "更新会员黑名单")
+ @PreAuthorize("@ss.hasPermission('hshy:user-black:update')")
+ public CommonResult updateUserBlack(@Valid @RequestBody UserBlackSaveReqVO updateReqVO) {
+ userBlackService.updateUserBlack(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "批量删除会员黑名单")
+ @PreAuthorize("@ss.hasPermission('member:user-black-list:delete')")
+ public CommonResult deleteUserBlackList(@Valid @RequestBody UserBlackSaveReqVO deleteReqVO) {
+ userBlackService.deleteUserBlack(deleteReqVO);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得会员黑名单")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('hshy:user-black:query')")
+ public CommonResult getUserBlack(@RequestParam("id") Integer id) {
+ return success(userBlackService.getUserBlack(id));
+
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得会员黑名单分页")
+ @PreAuthorize("@ss.hasPermission('hshy:user-black:query')")
+ public CommonResult> getUserBlackPage(@Valid UserBlackPageReqVO pageReqVO) {
+ PageResult pageResult = userBlackService.getUserBlackPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, UserBlackRespVO.class));
+ }
+
+// @GetMapping("/export-excel")
+// @Operation(summary = "导出会员黑名单 Excel")
+// @PreAuthorize("@ss.hasPermission('hshy:user-black:export')")
+// @ApiAccessLog(operateType = EXPORT)
+// public void exportUserBlackExcel(@Valid UserBlackPageReqVO pageReqVO,
+// HttpServletResponse response) throws IOException {
+// pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+// List list = userBlackService.getUserBlackPage(pageReqVO).getList();
+// // 导出 Excel
+// ExcelUtils.write(response, "会员黑名单.xls", "数据", UserBlackRespVO.class,
+// BeanUtils.toBean(list, UserBlackRespVO.class));
+// }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userblack/vo/UserBlackPageReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userblack/vo/UserBlackPageReqVO.java
new file mode 100644
index 000000000..c53a6559a
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userblack/vo/UserBlackPageReqVO.java
@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.userblack.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 会员黑名单分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class UserBlackPageReqVO extends PageParam {
+
+ @Schema(description = "会员编号", example = "1034")
+ private Long memberUserId;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userblack/vo/UserBlackRespVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userblack/vo/UserBlackRespVO.java
new file mode 100644
index 000000000..6dcf9b3ec
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userblack/vo/UserBlackRespVO.java
@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.userblack.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 会员黑名单 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class UserBlackRespVO {
+
+ @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11987")
+ @ExcelProperty("编号")
+ private Integer id;
+
+ @Schema(description = "会员编号", example = "1034")
+ @ExcelProperty("会员编号")
+ private Long memberUserId;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userblack/vo/UserBlackSaveReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userblack/vo/UserBlackSaveReqVO.java
new file mode 100644
index 000000000..dd31cce38
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userblack/vo/UserBlackSaveReqVO.java
@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.userblack.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+
+@Schema(description = "管理后台 - 会员黑名单新增/修改 Request VO")
+@Data
+public class UserBlackSaveReqVO {
+
+ @Schema(description = "会员编号", example = "8642")
+ private List memberUserIds;
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userconfig/UserConfigBalanceController.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userconfig/UserConfigBalanceController.java
new file mode 100644
index 000000000..16e00e17e
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userconfig/UserConfigBalanceController.java
@@ -0,0 +1,63 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.userconfig;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.hshy.controller.admin.userconfig.vo.UserConfigBalanceRespVO;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.userconfig.UserConfigDO;
+import cn.iocoder.yudao.module.hshy.service.userconfig.UserConfigService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 会员消费返余额")
+@RestController
+@RequestMapping("/hshy/user-config-Balance")
+@Validated
+public class UserConfigBalanceController {
+ @Resource
+ private UserConfigService userConfigService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建会员消费返余额")
+ @PreAuthorize("@ss.hasPermission('hshy:user-config:create')")
+ public CommonResult creatBalance(@Valid @RequestBody UserConfigBalanceRespVO createReqVO) {
+ return success(userConfigService.creatBalance(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新会员消费返余额")
+ @PreAuthorize("@ss.hasPermission('hshy:user-config:update')")
+ public CommonResult updateBalance(@Valid @RequestBody UserConfigBalanceRespVO updateReqVO) {
+ userConfigService.updateBalance(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除会员消费返余额")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('hshy:user-config:delete')")
+ public CommonResult deleteUserConfig(@RequestParam("id") Integer id) {
+ userConfigService.deleteUserConfig(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得会员消费返余额")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('hshy:user-config:query')")
+ public CommonResult