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..2623f017d
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-api/pom.xml
@@ -0,0 +1,48 @@
+
+
+ 4.0.0
+
+ cn.iocoder.cloud
+ yudao-module-mall
+ ${revision}
+
+
+ yudao-module-hsfx-api
+ jar
+
+ ${project.artifactId}
+
+ product 模块 API,暴露给其它模块调用
+
+
+
+
+ cn.iocoder.cloud
+ yudao-common
+
+
+
+
+ org.springdoc
+ springdoc-openapi-ui
+ 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-biz/pom.xml b/yudao-module-mall/yudao-module-hsfx-biz/pom.xml
new file mode 100644
index 000000000..8c0eb3092
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/pom.xml
@@ -0,0 +1,118 @@
+
+
+
+ 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-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..a910cbfb6
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hsfx-biz/src/main/java/cn/iocoder/yudao/module/hsfx/HsfxServerApplication.java
@@ -0,0 +1,16 @@
+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/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/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/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/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-hshy-api/pom.xml b/yudao-module-mall/yudao-module-hshy-api/pom.xml
new file mode 100644
index 000000000..496a0e825
--- /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}
+
+ product 模块 API,暴露给其它模块调用
+
+
+
+
+ cn.iocoder.cloud
+ yudao-common
+
+
+
+
+ org.springdoc
+ springdoc-openapi-ui
+ 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..408672a97
--- /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,43 @@
+package cn.iocoder.yudao.module.hshy.api.pointruleitem.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+
+@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..360ba3888
--- /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,10 @@
+package cn.iocoder.yudao.module.hshy.api.userblack.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import javax.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..70d756043
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/pom.xml
@@ -0,0 +1,127 @@
+
+
+
+ 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
+
+
+ javax.servlet
+ javax.servlet-api
+
+
+
+
+
+ ${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..59c7c5b4a
--- /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);
+ }
+}
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..b23ea6b10
--- /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,25 @@
+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 javax.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..54eaf325e
--- /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 javax.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..2658657d3
--- /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,95 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.extend;
+
+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;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@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..09dd47739
--- /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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.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..eac7c0e8e
--- /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 javax.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..c07dd9a38
--- /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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.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..a889e6cfa
--- /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 javax.validation.constraints.NotEmpty;
+import javax.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..f67610128
--- /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 javax.validation.constraints.NotEmpty;
+import javax.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..34e5179f3
--- /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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.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..794007a67
--- /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 javax.validation.constraints.NotEmpty;
+import javax.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..44ad2a34f
--- /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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.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..750869509
--- /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 javax.validation.constraints.NotEmpty;
+import javax.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..35b3baad6
--- /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 javax.annotation.Resource;
+import javax.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/UserConfigController.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userconfig/UserConfigController.java
new file mode 100644
index 000000000..e89181ccd
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userconfig/UserConfigController.java
@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.userconfig;
+
+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.userconfig.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.userconfig.UserConfigDO;
+import cn.iocoder.yudao.module.hshy.service.userconfig.UserConfigService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Tag(name = "管理后台 - 会员条件配置")
+@RestController
+@RequestMapping("/hshy/user-config")
+@Validated
+public class UserConfigController {
+
+ @Resource
+ private UserConfigService userConfigService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建会员条件配置")
+ @PreAuthorize("@ss.hasPermission('hshy:user-config:create')")
+ public CommonResult createUserConfig(@Valid @RequestBody UserConfigSaveReqVO createReqVO) {
+ return success(userConfigService.createUserConfig(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新会员条件配置")
+ @PreAuthorize("@ss.hasPermission('hshy:user-config:update')")
+ public CommonResult updateUserConfig(@Valid @RequestBody UserConfigSaveReqVO updateReqVO) {
+ userConfigService.updateUserConfig(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 getUserConfig(@RequestParam("id") Integer id) {
+ UserConfigDO userConfig = userConfigService.getUserConfig(id);
+ return success(BeanUtils.toBean(userConfig, UserConfigRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得会员条件配置分页")
+ @PreAuthorize("@ss.hasPermission('hshy:user-config:query')")
+ public CommonResult> getUserConfigPage(@Valid UserConfigPageReqVO pageReqVO) {
+ PageResult pageResult = userConfigService.getUserConfigPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, UserConfigRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出会员条件配置 Excel")
+ @PreAuthorize("@ss.hasPermission('hshy:user-config:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportUserConfigExcel(@Valid UserConfigPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = userConfigService.getUserConfigPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "会员条件配置.xls", "数据", UserConfigRespVO.class,
+ BeanUtils.toBean(list, UserConfigRespVO.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/userconfig/vo/UserConfigPageReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userconfig/vo/UserConfigPageReqVO.java
new file mode 100644
index 000000000..7304f701b
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userconfig/vo/UserConfigPageReqVO.java
@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.userconfig.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 UserConfigPageReqVO extends PageParam {
+
+ @Schema(description = "会员编码", example = "6413")
+ private Long memberUserId;
+
+ @Schema(description = "业务类型", example = "2")
+ private String bizType;
+
+ @Schema(description = "前置条件")
+ private String beforeJson;
+
+ @Schema(description = "后置条件")
+ private String afterJson;
+
+ @Schema(description = "业务值")
+ private String bizValue;
+
+ @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/userconfig/vo/UserConfigRespVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userconfig/vo/UserConfigRespVO.java
new file mode 100644
index 000000000..3dc2cda6c
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userconfig/vo/UserConfigRespVO.java
@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.userconfig.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 UserConfigRespVO {
+
+ @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "28791")
+ @ExcelProperty("编号")
+ private Integer id;
+
+ @Schema(description = "会员编码", example = "6413")
+ @ExcelProperty("会员编码")
+ private Long memberUserId;
+
+ @Schema(description = "业务类型", example = "2")
+ @ExcelProperty("业务类型")
+ private String bizType;
+
+ @Schema(description = "前置条件")
+ @ExcelProperty("前置条件")
+ private String beforeJson;
+
+ @Schema(description = "后置条件")
+ @ExcelProperty("后置条件")
+ private String afterJson;
+
+ @Schema(description = "业务值")
+ @ExcelProperty("业务值")
+ private String bizValue;
+
+ @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/userconfig/vo/UserConfigSaveReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userconfig/vo/UserConfigSaveReqVO.java
new file mode 100644
index 000000000..24b858843
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/admin/userconfig/vo/UserConfigSaveReqVO.java
@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.hshy.controller.admin.userconfig.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+
+@Schema(description = "管理后台 - 会员条件配置新增/修改 Request VO")
+@Data
+public class UserConfigSaveReqVO {
+
+ @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "28791")
+ private Integer id;
+
+ @Schema(description = "会员编码", example = "6413")
+ private Long memberUserId;
+
+ @Schema(description = "业务类型", example = "2")
+ private String bizType;
+
+ @Schema(description = "前置条件")
+ private String beforeJson;
+
+ @Schema(description = "后置条件")
+ private String afterJson;
+
+ @Schema(description = "业务值")
+ private String bizValue;
+
+}
\ 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/app/pointexchange/vo/AppPointExchangeController.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/app/pointexchange/vo/AppPointExchangeController.java
new file mode 100644
index 000000000..335999e32
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/app/pointexchange/vo/AppPointExchangeController.java
@@ -0,0 +1,96 @@
+package cn.iocoder.yudao.module.hshy.controller.app.pointexchange.vo;
+
+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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Tag(name = "管理后台 - 会员积分兑换")
+@RestController
+@RequestMapping("/hshy/point-exchange")
+@Validated
+public class AppPointExchangeController {
+
+ @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);
+ }
+
+ @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));
+ }
+
+}
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/app/userblack/AppUserBlackController.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/app/userblack/AppUserBlackController.java
new file mode 100644
index 000000000..38d6aa04e
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/app/userblack/AppUserBlackController.java
@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.hshy.controller.app.userblack;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.hshy.controller.app.userblack.vo.UserBlackPageReqVO;
+import cn.iocoder.yudao.module.hshy.controller.app.userblack.vo.UserBlackRespVO;
+import cn.iocoder.yudao.module.hshy.controller.app.userblack.vo.UserBlackSaveReqVO;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.userblack.UserBlackDO;
+import cn.iocoder.yudao.module.hshy.service.userblack.UserBlackService;
+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 javax.annotation.Resource;
+import javax.validation.Valid;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "APP后台 - 会员黑名单")
+@RestController
+@RequestMapping("/hshy/user-black")
+@Validated
+public class AppUserBlackController {
+
+ @Resource
+ private UserBlackService userBlackService;
+
+ @GetMapping("/get")
+ @Operation(summary = "APP获得会员黑名单")
+ @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));
+ }
+
+}
\ 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/app/userblack/vo/UserBlackPageReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/app/userblack/vo/UserBlackPageReqVO.java
new file mode 100644
index 000000000..417907415
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/app/userblack/vo/UserBlackPageReqVO.java
@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.hshy.controller.app.userblack.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 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/app/userblack/vo/UserBlackRespVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/app/userblack/vo/UserBlackRespVO.java
new file mode 100644
index 000000000..4b6ebf9cd
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/app/userblack/vo/UserBlackRespVO.java
@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.module.hshy.controller.app.userblack.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 UserBlackRespVO {
+ @Schema(description = "会员编号", example = "1034")
+ @ExcelProperty("会员编号")
+ private Long memberUserId;
+}
\ 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/app/userblack/vo/UserBlackSaveReqVO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/app/userblack/vo/UserBlackSaveReqVO.java
new file mode 100644
index 000000000..9b71cbcda
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/controller/app/userblack/vo/UserBlackSaveReqVO.java
@@ -0,0 +1,16 @@
+package cn.iocoder.yudao.module.hshy.controller.app.userblack.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@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/convert/SnowflakeIdWorker.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/convert/SnowflakeIdWorker.java
new file mode 100644
index 000000000..e46ebee4f
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/convert/SnowflakeIdWorker.java
@@ -0,0 +1,103 @@
+package cn.iocoder.yudao.module.hshy.convert;
+
+public class SnowflakeIdWorker {
+
+ // 开始时间戳(毫秒级)
+ private final long twepoch = 1288834974657L;
+
+ // 机器ID所占的位数
+ private final long workerIdBits = 10L;
+
+ // 数据中心ID所占的位数
+ private final long datacenterIdBits = 10L;
+
+ // 支持的最大机器ID,结果是1023
+ private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+
+ // 支持的最大数据中心ID,结果是1023
+ private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+
+ // 序列号所占的位数
+ private final long sequenceBits = 12L;
+
+ // 机器ID左移12位
+ private final long workerIdShift = sequenceBits;
+
+ // 数据中心ID左移22位
+ private final long datacenterIdShift = sequenceBits + workerIdBits;
+
+ // 时间戳左移32位
+ private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
+
+ // 序列号掩码
+ private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+
+ // 上次生成ID的时间戳
+ private long lastTimestamp = -1L;
+
+ // 机器ID
+ private long workerId;
+
+ // 数据中心ID
+ private long datacenterId;
+
+ // 序列号
+ private long sequence = 0L;
+
+ // 构造函数
+ public SnowflakeIdWorker(long workerId, long datacenterId) {
+ if (workerId > maxWorkerId || workerId < 0) {
+ throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
+ }
+ if (datacenterId > maxDatacenterId || datacenterId < 0) {
+ throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
+ }
+ this.workerId = workerId;
+ this.datacenterId = datacenterId;
+ }
+
+ // 获取下一个ID
+ public synchronized long nextId() {
+ long timestamp = timeGen();
+
+ if (timestamp < lastTimestamp) {
+ throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
+ }
+
+ if (lastTimestamp == timestamp) {
+ sequence = (sequence + 1) & sequenceMask;
+ if (sequence == 0) {
+ timestamp = tilNextMillis(lastTimestamp);
+ }
+ } else {
+ sequence = 0L;
+ }
+
+ lastTimestamp = timestamp;
+
+ return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence;
+ }
+
+ // 阻塞到下一个毫秒,直到获得新的时间戳
+ private long tilNextMillis(long lastTimestamp) {
+ long timestamp = timeGen();
+ while (timestamp <= lastTimestamp) {
+ timestamp = timeGen();
+ }
+ return timestamp;
+ }
+
+ // 获取当前时间戳
+ private long timeGen() {
+ return System.currentTimeMillis();
+ }
+
+ // 测试
+// public static void main(String[] args) {
+//
+// for (int i = 0; i < 100; i++) {
+// System.out.println(idWorker.nextId());
+// }
+// }
+}
+
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/dataobject/extend/ExtendDO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/dataobject/extend/ExtendDO.java
new file mode 100644
index 000000000..1f10c219a
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/dataobject/extend/ExtendDO.java
@@ -0,0 +1,64 @@
+package cn.iocoder.yudao.module.hshy.dal.dataobject.extend;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 商品扩展 DO
+ *
+ * @author 超级管理员
+ */
+@TableName("product_extend")
+@KeySequence("product_extend_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ExtendDO extends BaseDO {
+
+ /**
+ * 主键
+ */
+ @TableId
+ private Integer id;
+ /**
+ * 是否是推广商品(0否 1是)
+ */
+ private Integer isPromotion;
+ /**
+ * 是否是指定商品(0否 1是)
+ */
+ private Integer isAppoint;
+ /**
+ * 是否是特殊商品(0否 1是)
+ */
+ private Integer isSpecial;
+ /**
+ * 状态(0正常 1停用)
+ */
+ private Integer status;
+ /**
+ * 说明
+ */
+ private String remark;
+ /**
+ * 商品 SPU 编号
+ */
+ private Long spuId;
+ /**
+ * 商品 SKU 编号
+ */
+ private Long skuId;
+ /**
+ * 删除时间
+ */
+ 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/dal/dataobject/pointcongeal/PointCongealDO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/dataobject/pointcongeal/PointCongealDO.java
new file mode 100644
index 000000000..b2f7cd23f
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/dataobject/pointcongeal/PointCongealDO.java
@@ -0,0 +1,51 @@
+package cn.iocoder.yudao.module.hshy.dal.dataobject.pointcongeal;
+
+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 超级管理员
+ */
+@TableName("member_point_congeal")
+@KeySequence("member_point_congeal_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PointCongealDO extends BaseDO {
+
+ /**
+ * 自增主键
+ */
+ @TableId
+ private Integer id;
+ /**
+ * 会员编码
+ */
+ private Long memberUserId;
+ /**
+ * 用户积分主键
+ */
+ private Long pointCongealId;
+ /**
+ * 冻结金额
+ */
+ private Integer amount;
+ /**
+ * 冻结积分
+ */
+ private Integer point;
+ /**
+ * 描述
+ */
+ 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/dal/dataobject/pointexchange/PointExchangeDO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/dataobject/pointexchange/PointExchangeDO.java
new file mode 100644
index 000000000..027070a49
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/dataobject/pointexchange/PointExchangeDO.java
@@ -0,0 +1,101 @@
+package cn.iocoder.yudao.module.hshy.dal.dataobject.pointexchange;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 会员积分兑换 DO
+ *
+ * @author 超级管理员
+ */
+@TableName("member_point_exchange")
+@KeySequence("member_point_exchange_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PointExchangeDO extends BaseDO {
+
+ /**
+ * 主键
+ */
+ @TableId
+ private Integer id;
+ /**
+ * 会员Id
+ */
+ private Long memberUserId;
+ /**
+ * 会员类型
+ */
+ private String userType;
+ /**
+ * 业务类型(余额,商品,其他)
+ *
+ * 枚举 {@link TODO member_point_exchange_type 对应的类}
+ */
+ private String bizType;
+ /**
+ * 规则明细
+ */
+ private String jsonRule;
+ /**
+ * 余额.积分
+ */
+ private Integer balance;
+ /**
+ * 累积支出
+ */
+ private Integer totalExpense;
+ /**
+ * 累积充值
+ */
+ private Integer totalRecharge;
+ /**
+ * 状态(0正常 1停用)
+ */
+ private Integer status;
+ /**
+ * 说明
+ */
+ private String remark;
+ /**
+ * 审核状态
+ *
+ * 枚举 {@link TODO member_point_exchange_audit_type 对应的类}
+ */
+ private String auditStatus;
+ /**
+ * 审核人
+ */
+ private String audit;
+ /**
+ * 审核时间
+ */
+ private LocalDateTime auditTime;
+ /**
+ * 审核备注
+ */
+ private String auditNotes;
+ /**
+ * 商品 SPU 编号
+ */
+ private Long spuId;
+ /**
+ * 商品 SKU 编号
+ */
+ private Long skuId;
+ /**
+ * 删除时间
+ */
+ 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/dal/dataobject/pointrule/PointRuleDO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/dataobject/pointrule/PointRuleDO.java
new file mode 100644
index 000000000..2311baf10
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/dataobject/pointrule/PointRuleDO.java
@@ -0,0 +1,52 @@
+package cn.iocoder.yudao.module.hshy.dal.dataobject.pointrule;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 规则 DO
+ *
+ * @author 唐
+ */
+@TableName("member_point_rule")
+@KeySequence("member_point_rule_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PointRuleDO extends BaseDO {
+
+ /**
+ * 主键
+ */
+ @TableId
+ private Integer id;
+ /**
+ * 类型(天数,时间,条款,区间,升级,降级)
+ */
+ private String type;
+ /**
+ * 名称
+ */
+ private String name;
+ /**
+ * 状态(0正常 1停用)
+ */
+ private Integer status;
+ /**
+ * 说明
+ */
+ private String remark;
+ /**
+ * 删除时间
+ */
+ 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/dal/dataobject/pointruleitem/PointRuleItemDO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/dataobject/pointruleitem/PointRuleItemDO.java
new file mode 100644
index 000000000..49c35ff5d
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/dataobject/pointruleitem/PointRuleItemDO.java
@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.hshy.dal.dataobject.pointruleitem;
+
+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 唐
+ */
+@TableName("member_point_rule_item")
+@KeySequence("member_point_rule_item_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PointRuleItemDO extends BaseDO {
+
+ /**
+ * 编码
+ */
+ @TableId
+ private Integer id;
+ /**
+ * 编码
+ */
+ private Long code;
+ /**
+ * 规则类型
+ */
+ private String type;
+ /**
+ * 标签
+ */
+ private String label;
+ /**
+ * 开始键值
+ */
+ private String starValue;
+ /**
+ * 结束键值
+ */
+ private String endValue;
+ /**
+ * 排序
+ */
+ private Integer sort;
+ /**
+ * 状态(0正常 1停用)
+ */
+ private Integer status;
+ /**
+ * 颜色类型
+ */
+ private String colorType;
+ /**
+ * css 样式
+ */
+ private String cssClass;
+ /**
+ * 备注
+ */
+ 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/dal/dataobject/userblack/UserBlackDO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/dataobject/userblack/UserBlackDO.java
new file mode 100644
index 000000000..fa062da1b
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/dataobject/userblack/UserBlackDO.java
@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.hshy.dal.dataobject.userblack;
+
+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 芋道源码
+ */
+@TableName("member_user_black_list")
+@KeySequence("member_user_black_list_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserBlackDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Integer id;
+ /**
+ * 会员编号
+ */
+ private Long memberUserId;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/dataobject/userconfig/UserConfigDO.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/dataobject/userconfig/UserConfigDO.java
new file mode 100644
index 000000000..0724dba29
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/dataobject/userconfig/UserConfigDO.java
@@ -0,0 +1,51 @@
+package cn.iocoder.yudao.module.hshy.dal.dataobject.userconfig;
+
+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 超级管理员
+ */
+@TableName("member_user_config")
+@KeySequence("member_user_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserConfigDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Integer id;
+ /**
+ * 会员编码
+ */
+ private Long memberUserId;
+ /**
+ * 业务类型
+ */
+ private String bizType;
+ /**
+ * 前置条件
+ */
+ private String beforeJson;
+ /**
+ * 后置条件
+ */
+ private String afterJson;
+ /**
+ * 业务值
+ */
+ private String bizValue;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/extend/ExtendMapper.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/extend/ExtendMapper.java
new file mode 100644
index 000000000..4d861061d
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/extend/ExtendMapper.java
@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.hshy.dal.mysql.extend;
+
+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.hshy.dal.dataobject.extend.ExtendDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.hshy.controller.admin.extend.vo.*;
+
+/**
+ * 商品扩展 Mapper
+ *
+ * @author 超级管理员
+ */
+@Mapper
+public interface ExtendMapper extends BaseMapperX {
+
+ default PageResult selectPage(ExtendPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(ExtendDO::getIsPromotion, reqVO.getIsPromotion())
+ .eqIfPresent(ExtendDO::getIsAppoint, reqVO.getIsAppoint())
+ .eqIfPresent(ExtendDO::getIsSpecial, reqVO.getIsSpecial())
+ .eqIfPresent(ExtendDO::getStatus, reqVO.getStatus())
+ .eqIfPresent(ExtendDO::getRemark, reqVO.getRemark())
+ .eqIfPresent(ExtendDO::getSpuId, reqVO.getSpuId())
+ .eqIfPresent(ExtendDO::getSkuId, reqVO.getSkuId())
+ .betweenIfPresent(ExtendDO::getCreateTime, reqVO.getCreateTime())
+ .betweenIfPresent(ExtendDO::getDeletedTime, reqVO.getDeletedTime())
+ .orderByDesc(ExtendDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/pointcongeal/PointCongealMapper.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/pointcongeal/PointCongealMapper.java
new file mode 100644
index 000000000..cd19be268
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/pointcongeal/PointCongealMapper.java
@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.hshy.dal.mysql.pointcongeal;
+
+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.hshy.dal.dataobject.pointcongeal.PointCongealDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.hshy.controller.admin.pointcongeal.vo.*;
+
+/**
+ * 用户积分金额冻结 Mapper
+ *
+ * @author 超级管理员
+ */
+@Mapper
+public interface PointCongealMapper extends BaseMapperX {
+
+ default PageResult selectPage(PointCongealPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(PointCongealDO::getMemberUserId, reqVO.getMemberUserId())
+ .eqIfPresent(PointCongealDO::getPointCongealId, reqVO.getPointCongealId())
+ .eqIfPresent(PointCongealDO::getAmount, reqVO.getAmount())
+ .eqIfPresent(PointCongealDO::getPoint, reqVO.getPoint())
+ .eqIfPresent(PointCongealDO::getDescription, reqVO.getDescription())
+ .betweenIfPresent(PointCongealDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(PointCongealDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/pointexchange/PointExchangeMapper.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/pointexchange/PointExchangeMapper.java
new file mode 100644
index 000000000..c59b695f4
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/pointexchange/PointExchangeMapper.java
@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.hshy.dal.mysql.pointexchange;
+
+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.hshy.dal.dataobject.pointexchange.PointExchangeDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.hshy.controller.admin.pointexchange.vo.*;
+
+/**
+ * 会员积分兑换 Mapper
+ *
+ * @author 超级管理员
+ */
+@Mapper
+public interface PointExchangeMapper extends BaseMapperX {
+
+ default PageResult selectPage(PointExchangePageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(PointExchangeDO::getMemberUserId, reqVO.getMemberUserId())
+ .eqIfPresent(PointExchangeDO::getUserType, reqVO.getUserType())
+ .eqIfPresent(PointExchangeDO::getBizType, reqVO.getBizType())
+ .eqIfPresent(PointExchangeDO::getJsonRule, reqVO.getJsonRule())
+ .eqIfPresent(PointExchangeDO::getBalance, reqVO.getBalance())
+ .eqIfPresent(PointExchangeDO::getTotalExpense, reqVO.getTotalExpense())
+ .eqIfPresent(PointExchangeDO::getTotalRecharge, reqVO.getTotalRecharge())
+ .eqIfPresent(PointExchangeDO::getStatus, reqVO.getStatus())
+ .eqIfPresent(PointExchangeDO::getRemark, reqVO.getRemark())
+ .eqIfPresent(PointExchangeDO::getAuditStatus, reqVO.getAuditStatus())
+ .eqIfPresent(PointExchangeDO::getAudit, reqVO.getAudit())
+ .betweenIfPresent(PointExchangeDO::getAuditTime, reqVO.getAuditTime())
+ .eqIfPresent(PointExchangeDO::getAuditNotes, reqVO.getAuditNotes())
+ .eqIfPresent(PointExchangeDO::getSpuId, reqVO.getSpuId())
+ .eqIfPresent(PointExchangeDO::getSkuId, reqVO.getSkuId())
+ .betweenIfPresent(PointExchangeDO::getCreateTime, reqVO.getCreateTime())
+ .betweenIfPresent(PointExchangeDO::getDeletedTime, reqVO.getDeletedTime())
+ .orderByDesc(PointExchangeDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/pointrule/PointRuleMapper.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/pointrule/PointRuleMapper.java
new file mode 100644
index 000000000..03f611ae2
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/pointrule/PointRuleMapper.java
@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.hshy.dal.mysql.pointrule;
+
+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.hshy.dal.dataobject.pointrule.PointRuleDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.hshy.controller.admin.pointrule.vo.*;
+
+/**
+ * 规则 Mapper
+ *
+ * @author 唐
+ */
+@Mapper
+public interface PointRuleMapper extends BaseMapperX {
+
+ default PageResult selectPage(PointRulePageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(PointRuleDO::getType, reqVO.getType())
+ .likeIfPresent(PointRuleDO::getName, reqVO.getName())
+ .eqIfPresent(PointRuleDO::getStatus, reqVO.getStatus())
+ .eqIfPresent(PointRuleDO::getRemark, reqVO.getRemark())
+ .betweenIfPresent(PointRuleDO::getCreateTime, reqVO.getCreateTime())
+ .betweenIfPresent(PointRuleDO::getDeletedTime, reqVO.getDeletedTime())
+ .orderByDesc(PointRuleDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/pointruleitem/PointRuleItemMapper.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/pointruleitem/PointRuleItemMapper.java
new file mode 100644
index 000000000..911d78f9f
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/pointruleitem/PointRuleItemMapper.java
@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.hshy.dal.mysql.pointruleitem;
+
+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.hshy.dal.dataobject.pointruleitem.PointRuleItemDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.hshy.controller.admin.pointruleitem.vo.*;
+
+/**
+ * 规则明细 Mapper
+ *
+ * @author 唐
+ */
+@Mapper
+public interface PointRuleItemMapper extends BaseMapperX {
+
+ default PageResult selectPage(PointRuleItemPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(PointRuleItemDO::getType, reqVO.getType())
+ .eqIfPresent(PointRuleItemDO::getLabel, reqVO.getLabel())
+ .eqIfPresent(PointRuleItemDO::getStarValue, reqVO.getStarValue())
+ .eqIfPresent(PointRuleItemDO::getEndValue, reqVO.getEndValue())
+ .eqIfPresent(PointRuleItemDO::getSort, reqVO.getSort())
+ .eqIfPresent(PointRuleItemDO::getStatus, reqVO.getStatus())
+ .eqIfPresent(PointRuleItemDO::getColorType, reqVO.getColorType())
+ .eqIfPresent(PointRuleItemDO::getCssClass, reqVO.getCssClass())
+ .eqIfPresent(PointRuleItemDO::getRemark, reqVO.getRemark())
+ .betweenIfPresent(PointRuleItemDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(PointRuleItemDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/userblack/UserBlackMapper.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/userblack/UserBlackMapper.java
new file mode 100644
index 000000000..2e74fa9a9
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/userblack/UserBlackMapper.java
@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.hshy.dal.mysql.userblack;
+
+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.hshy.dal.dataobject.userblack.UserBlackDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.hshy.controller.admin.userblack.vo.*;
+
+/**
+ * 会员黑名单 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface UserBlackMapper extends BaseMapperX {
+
+ default PageResult selectPage(UserBlackPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(UserBlackDO::getMemberUserId, reqVO.getMemberUserId())
+ .betweenIfPresent(UserBlackDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(UserBlackDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/userconfig/UserConfigMapper.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/userconfig/UserConfigMapper.java
new file mode 100644
index 000000000..7e886cf2a
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/dal/mysql/userconfig/UserConfigMapper.java
@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.hshy.dal.mysql.userconfig;
+
+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.hshy.dal.dataobject.userconfig.UserConfigDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.hshy.controller.admin.userconfig.vo.*;
+
+/**
+ * 会员条件配置 Mapper
+ *
+ * @author 超级管理员
+ */
+@Mapper
+public interface UserConfigMapper extends BaseMapperX {
+
+ default PageResult selectPage(UserConfigPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(UserConfigDO::getMemberUserId, reqVO.getMemberUserId())
+ .eqIfPresent(UserConfigDO::getBizType, reqVO.getBizType())
+ .eqIfPresent(UserConfigDO::getBeforeJson, reqVO.getBeforeJson())
+ .eqIfPresent(UserConfigDO::getAfterJson, reqVO.getAfterJson())
+ .eqIfPresent(UserConfigDO::getBizValue, reqVO.getBizValue())
+ .betweenIfPresent(UserConfigDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(UserConfigDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/framework/security/config/SecurityConfiguration.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/framework/security/config/SecurityConfiguration.java
new file mode 100644
index 000000000..44d5d810f
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/framework/security/config/SecurityConfiguration.java
@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.hshy.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();
+ }
+
+ };
+ }
+
+}
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/extend/ExtendService.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/extend/ExtendService.java
new file mode 100644
index 000000000..0fefbcb9b
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/extend/ExtendService.java
@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.hshy.service.extend;
+
+import java.util.*;
+import javax.validation.Valid;
+import cn.iocoder.yudao.module.hshy.controller.admin.extend.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.extend.ExtendDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+/**
+ * 商品扩展 Service 接口
+ *
+ * @author 超级管理员
+ */
+public interface ExtendService {
+
+ /**
+ * 创建商品扩展
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Integer createExtend(@Valid ExtendSaveReqVO createReqVO);
+
+ /**
+ * 更新商品扩展
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateExtend(@Valid ExtendSaveReqVO updateReqVO);
+
+ /**
+ * 删除商品扩展
+ *
+ * @param id 编号
+ */
+ void deleteExtend(Integer id);
+
+ /**
+ * 获得商品扩展
+ *
+ * @param spuId 编号
+ * @return 商品扩展
+ */
+ ExtendDO getExtend(Integer spuId);
+
+ /**
+ * 获得商品扩展分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 商品扩展分页
+ */
+ PageResult getExtendPage(ExtendPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/extend/ExtendServiceImpl.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/extend/ExtendServiceImpl.java
new file mode 100644
index 000000000..a320f942c
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/extend/ExtendServiceImpl.java
@@ -0,0 +1,76 @@
+package cn.iocoder.yudao.module.hshy.service.extend;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.module.hshy.controller.admin.extend.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.extend.ExtendDO;
+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.hshy.dal.mysql.extend.ExtendMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.hshy.enums.ErrorCodeConstants.*;
+
+/**
+ * 商品扩展 Service 实现类
+ *
+ * @author 超级管理员
+ */
+@Service
+@Validated
+public class ExtendServiceImpl implements ExtendService {
+
+ @Resource
+ private ExtendMapper extendMapper;
+
+ @Override
+ public Integer createExtend(ExtendSaveReqVO createReqVO) {
+ // 插入
+ ExtendDO extend = BeanUtils.toBean(createReqVO, ExtendDO.class);
+ extendMapper.insert(extend);
+ // 返回
+ return extend.getId();
+ }
+
+ @Override
+ public void updateExtend(ExtendSaveReqVO updateReqVO) {
+ // 校验存在
+ validateExtendExists(updateReqVO.getId());
+ // 更新
+ ExtendDO updateObj = BeanUtils.toBean(updateReqVO, ExtendDO.class);
+ extendMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteExtend(Integer id) {
+ // 校验存在
+ validateExtendExists(id);
+ // 删除
+ extendMapper.deleteById(id);
+ }
+
+ private void validateExtendExists(Integer id) {
+ if (extendMapper.selectById(id) == null) {
+ throw exception(EXTEND_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public ExtendDO getExtend(Integer spuId) {
+ return extendMapper.selectOne(new LambdaQueryWrapper<>(ExtendDO.class)
+ .eq(ExtendDO::getSpuId, spuId));
+ }
+
+ @Override
+ public PageResult getExtendPage(ExtendPageReqVO pageReqVO) {
+ return extendMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointcongeal/PointCongealService.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointcongeal/PointCongealService.java
new file mode 100644
index 000000000..7fb4a49b7
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointcongeal/PointCongealService.java
@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.hshy.service.pointcongeal;
+
+import java.util.*;
+import cn.iocoder.yudao.module.hshy.controller.admin.pointcongeal.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.pointcongeal.PointCongealDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+import javax.validation.Valid;
+
+/**
+ * 用户积分金额冻结 Service 接口
+ *
+ * @author 超级管理员
+ */
+public interface PointCongealService {
+
+ /**
+ * 创建用户积分金额冻结
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Integer createPointCongeal(@Valid PointCongealSaveReqVO createReqVO);
+
+ /**
+ * 更新用户积分金额冻结
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updatePointCongeal(@Valid PointCongealSaveReqVO updateReqVO);
+
+ /**
+ * 删除用户积分金额冻结
+ *
+ * @param id 编号
+ */
+ void deletePointCongeal(Integer id);
+
+ /**
+ * 获得用户积分金额冻结
+ *
+ * @param id 编号
+ * @return 用户积分金额冻结
+ */
+ PointCongealDO getPointCongeal(Integer id);
+
+ /**
+ * 获得用户积分金额冻结分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 用户积分金额冻结分页
+ */
+ PageResult getPointCongealPage(PointCongealPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointcongeal/PointCongealServiceImpl.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointcongeal/PointCongealServiceImpl.java
new file mode 100644
index 000000000..d3f841d7a
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointcongeal/PointCongealServiceImpl.java
@@ -0,0 +1,75 @@
+package cn.iocoder.yudao.module.hshy.service.pointcongeal;
+
+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.hshy.controller.admin.pointcongeal.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.pointcongeal.PointCongealDO;
+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.hshy.dal.mysql.pointcongeal.PointCongealMapper;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.hshy.enums.ErrorCodeConstants.*;
+
+/**
+ * 用户积分金额冻结 Service 实现类
+ *
+ * @author 超级管理员
+ */
+@Service
+@Validated
+public class PointCongealServiceImpl implements PointCongealService {
+
+ @Resource
+ private PointCongealMapper pointCongealMapper;
+
+ @Override
+ public Integer createPointCongeal(PointCongealSaveReqVO createReqVO) {
+ // 插入
+ PointCongealDO pointCongeal = BeanUtils.toBean(createReqVO, PointCongealDO.class);
+ pointCongealMapper.insert(pointCongeal);
+ // 返回
+ return pointCongeal.getId();
+ }
+
+ @Override
+ public void updatePointCongeal(PointCongealSaveReqVO updateReqVO) {
+ // 校验存在
+ validatePointCongealExists(updateReqVO.getId());
+ // 更新
+ PointCongealDO updateObj = BeanUtils.toBean(updateReqVO, PointCongealDO.class);
+ pointCongealMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deletePointCongeal(Integer id) {
+ // 校验存在
+ validatePointCongealExists(id);
+ // 删除
+ pointCongealMapper.deleteById(id);
+ }
+
+ private void validatePointCongealExists(Integer id) {
+ if (pointCongealMapper.selectById(id) == null) {
+ throw exception(POINT_CONGEAL_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public PointCongealDO getPointCongeal(Integer id) {
+ return pointCongealMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getPointCongealPage(PointCongealPageReqVO pageReqVO) {
+ return pointCongealMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointexchange/PointExchangeService.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointexchange/PointExchangeService.java
new file mode 100644
index 000000000..683591528
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointexchange/PointExchangeService.java
@@ -0,0 +1,64 @@
+package cn.iocoder.yudao.module.hshy.service.pointexchange;
+
+import java.util.*;
+import cn.iocoder.yudao.module.hshy.controller.admin.pointexchange.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.pointexchange.PointExchangeDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+import javax.validation.Valid;
+
+/**
+ * 会员积分兑换 Service 接口
+ *
+ * @author 超级管理员
+ */
+public interface PointExchangeService {
+
+ /**
+ * 创建会员积分兑换
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Integer createPointExchange(@Valid PointExchangeSaveReqVO createReqVO);
+
+ /**
+ * 更新会员积分兑换
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updatePointExchange(@Valid PointExchangeSaveReqVO updateReqVO);
+
+
+ /**
+ * 更新会员积分兑换
+ *
+ * @param auditReqVO 更新信息
+ */
+ void auditPointExchange(@Valid PointExchangeAuditReqVO auditReqVO);
+
+ /**
+ * 删除会员积分兑换
+ *
+ * @param id 编号
+ */
+ void deletePointExchange(Integer id);
+
+ /**
+ * 获得会员积分兑换
+ *
+ * @param id 编号
+ * @return 会员积分兑换
+ */
+ PointExchangeDO getPointExchange(Integer id);
+
+ /**
+ * 获得会员积分兑换分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 会员积分兑换分页
+ */
+ PageResult getPointExchangePage(PointExchangePageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointexchange/PointExchangeServiceImpl.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointexchange/PointExchangeServiceImpl.java
new file mode 100644
index 000000000..5e71d4852
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointexchange/PointExchangeServiceImpl.java
@@ -0,0 +1,90 @@
+package cn.iocoder.yudao.module.hshy.service.pointexchange;
+
+import cn.iocoder.yudao.framework.security.core.LoginUser;
+import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.*;
+import cn.iocoder.yudao.module.hshy.controller.admin.pointexchange.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.pointexchange.PointExchangeDO;
+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.hshy.dal.mysql.pointexchange.PointExchangeMapper;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.hshy.enums.ErrorCodeConstants.*;
+
+/**
+ * 会员积分兑换 Service 实现类
+ *
+ * @author 超级管理员
+ */
+@Service
+@Validated
+public class PointExchangeServiceImpl implements PointExchangeService {
+
+ @Resource
+ private PointExchangeMapper pointExchangeMapper;
+
+ @Override
+ public Integer createPointExchange(PointExchangeSaveReqVO createReqVO) {
+ // 插入
+ PointExchangeDO pointExchange = BeanUtils.toBean(createReqVO, PointExchangeDO.class);
+ pointExchangeMapper.insert(pointExchange);
+ // 返回
+ return pointExchange.getId();
+ }
+
+ @Override
+ public void updatePointExchange(PointExchangeSaveReqVO updateReqVO) {
+ // 校验存在
+ validatePointExchangeExists(updateReqVO.getId());
+ // 更新
+ PointExchangeDO updateObj = BeanUtils.toBean(updateReqVO, PointExchangeDO.class);
+ pointExchangeMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void auditPointExchange(PointExchangeAuditReqVO auditReqVO) {
+
+ // 校验存在
+ validatePointExchangeExists(auditReqVO.getId());
+ // 更新
+ PointExchangeDO updateObj = BeanUtils.toBean(auditReqVO, PointExchangeDO.class);
+ updateObj.setAuditTime(LocalDateTime.now());
+ updateObj.setAudit(WebFrameworkUtils.getLoginUserId().toString());
+ pointExchangeMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deletePointExchange(Integer id) {
+ // 校验存在
+ validatePointExchangeExists(id);
+ // 删除
+ pointExchangeMapper.deleteById(id);
+ }
+
+ private void validatePointExchangeExists(Integer id) {
+ if (pointExchangeMapper.selectById(id) == null) {
+ throw exception(POINT_EXCHANGE_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public PointExchangeDO getPointExchange(Integer id) {
+ return pointExchangeMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getPointExchangePage(PointExchangePageReqVO pageReqVO) {
+ return pointExchangeMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointrule/PointRuleService.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointrule/PointRuleService.java
new file mode 100644
index 000000000..8c8bc82f6
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointrule/PointRuleService.java
@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.hshy.service.pointrule;
+
+import java.util.*;
+import cn.iocoder.yudao.module.hshy.controller.admin.pointrule.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.pointrule.PointRuleDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+import javax.validation.Valid;
+
+/**
+ * 规则 Service 接口
+ *
+ * @author 唐
+ */
+public interface PointRuleService {
+
+ /**
+ * 创建规则
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Integer createPointRule(@Valid PointRuleSaveReqVO createReqVO);
+
+ /**
+ * 更新规则
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updatePointRule(@Valid PointRuleSaveReqVO updateReqVO);
+
+ /**
+ * 删除规则
+ *
+ * @param id 编号
+ */
+ void deletePointRule(Integer id);
+
+ /**
+ * 获得规则
+ *
+ * @param id 编号
+ * @return 规则
+ */
+ PointRuleDO getPointRule(Integer id);
+
+ /**
+ * 获得规则分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 规则分页
+ */
+ PageResult getPointRulePage(PointRulePageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointrule/PointRuleServiceImpl.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointrule/PointRuleServiceImpl.java
new file mode 100644
index 000000000..2181b0e2a
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointrule/PointRuleServiceImpl.java
@@ -0,0 +1,75 @@
+package cn.iocoder.yudao.module.hshy.service.pointrule;
+
+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.hshy.controller.admin.pointrule.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.pointrule.PointRuleDO;
+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.hshy.dal.mysql.pointrule.PointRuleMapper;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.hshy.enums.ErrorCodeConstants.*;
+
+/**
+ * 规则 Service 实现类
+ *
+ * @author 唐
+ */
+@Service
+@Validated
+public class PointRuleServiceImpl implements PointRuleService {
+
+ @Resource
+ private PointRuleMapper pointRuleMapper;
+
+ @Override
+ public Integer createPointRule(PointRuleSaveReqVO createReqVO) {
+ // 插入
+ PointRuleDO pointRule = BeanUtils.toBean(createReqVO, PointRuleDO.class);
+ pointRuleMapper.insert(pointRule);
+ // 返回
+ return pointRule.getId();
+ }
+
+ @Override
+ public void updatePointRule(PointRuleSaveReqVO updateReqVO) {
+ // 校验存在
+ validatePointRuleExists(updateReqVO.getId());
+ // 更新
+ PointRuleDO updateObj = BeanUtils.toBean(updateReqVO, PointRuleDO.class);
+ pointRuleMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deletePointRule(Integer id) {
+ // 校验存在
+ validatePointRuleExists(id);
+ // 删除
+ pointRuleMapper.deleteById(id);
+ }
+
+ private void validatePointRuleExists(Integer id) {
+ if (pointRuleMapper.selectById(id) == null) {
+ throw exception(POINT_RULE_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public PointRuleDO getPointRule(Integer id) {
+ return pointRuleMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getPointRulePage(PointRulePageReqVO pageReqVO) {
+ return pointRuleMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointruleitem/PointRuleItemService.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointruleitem/PointRuleItemService.java
new file mode 100644
index 000000000..a00ee4d92
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointruleitem/PointRuleItemService.java
@@ -0,0 +1,66 @@
+package cn.iocoder.yudao.module.hshy.service.pointruleitem;
+
+import java.util.*;
+import cn.iocoder.yudao.module.hshy.controller.admin.pointruleitem.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.pointruleitem.PointRuleItemDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+import javax.validation.Valid;
+
+/**
+ * 规则明细 Service 接口
+ *
+ * @author 唐
+ */
+public interface PointRuleItemService {
+
+ /**
+ * 创建规则明细
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Integer createPointRuleItem(@Valid PointRuleItemSaveReqVO createReqVO);
+
+ /**
+ * 更新规则明细
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updatePointRuleItem(@Valid PointRuleItemSaveReqVO updateReqVO);
+
+ /**
+ * 删除规则明细
+ *
+ * @param id 编号
+ */
+ void deletePointRuleItem(Integer id);
+
+ /**
+ * 获得规则明细
+ *
+ * @param id 编号
+ * @return 规则明细
+ */
+ PointRuleItemDO getPointRuleItem(Integer id);
+
+
+ /**
+ * 根据规则类型获取规则明细
+ *
+ * @param type 编号
+ * @return 规则明细
+ */
+ List getPointRuleItemList(String type);
+
+
+ /**
+ * 获得规则明细分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 规则明细分页
+ */
+ PageResult getPointRuleItemPage(PointRuleItemPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointruleitem/PointRuleItemServiceImpl.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointruleitem/PointRuleItemServiceImpl.java
new file mode 100644
index 000000000..1ff8a17a5
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/pointruleitem/PointRuleItemServiceImpl.java
@@ -0,0 +1,86 @@
+package cn.iocoder.yudao.module.hshy.service.pointruleitem;
+
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.hshy.convert.SnowflakeIdWorker;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.hshy.controller.admin.pointruleitem.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.pointruleitem.PointRuleItemDO;
+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.hshy.dal.mysql.pointruleitem.PointRuleItemMapper;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.hshy.enums.ErrorCodeConstants.*;
+
+/**
+ * 规则明细 Service 实现类
+ *
+ * @author 唐
+ */
+@Service
+@Validated
+public class PointRuleItemServiceImpl implements PointRuleItemService {
+
+ @Resource
+ private PointRuleItemMapper pointRuleItemMapper;
+
+ @Override
+ public Integer createPointRuleItem(PointRuleItemSaveReqVO createReqVO) {
+ // 插入
+ PointRuleItemDO pointRuleItem = BeanUtils.toBean(createReqVO, PointRuleItemDO.class);
+ SnowflakeIdWorker idWorker = new SnowflakeIdWorker(0, 0);
+ pointRuleItem.setCode(idWorker.nextId());
+ pointRuleItemMapper.insert(pointRuleItem);
+ // 返回
+ return pointRuleItem.getId();
+ }
+
+ @Override
+ public void updatePointRuleItem(PointRuleItemSaveReqVO updateReqVO) {
+ // 校验存在
+ validatePointRuleItemExists(updateReqVO.getId());
+ // 更新
+ PointRuleItemDO updateObj = BeanUtils.toBean(updateReqVO, PointRuleItemDO.class);
+ pointRuleItemMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deletePointRuleItem(Integer id) {
+ // 校验存在
+ validatePointRuleItemExists(id);
+ // 删除
+ pointRuleItemMapper.deleteById(id);
+ }
+
+ private void validatePointRuleItemExists(Integer id) {
+ if (pointRuleItemMapper.selectById(id) == null) {
+ throw exception(POINT_RULE_ITEM_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public PointRuleItemDO getPointRuleItem(Integer id) {
+ return pointRuleItemMapper.selectById(id);
+ }
+
+ @Override
+ public List getPointRuleItemList(String type) {
+ return pointRuleItemMapper.selectList(new LambdaQueryWrapper<>(PointRuleItemDO.class)
+ .eq(PointRuleItemDO::getType, type));
+ }
+
+ @Override
+ public PageResult getPointRuleItemPage(PointRuleItemPageReqVO pageReqVO) {
+ return pointRuleItemMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/userblack/UserBlackService.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/userblack/UserBlackService.java
new file mode 100644
index 000000000..532670b4a
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/userblack/UserBlackService.java
@@ -0,0 +1,63 @@
+package cn.iocoder.yudao.module.hshy.service.userblack;
+
+import java.util.*;
+import cn.iocoder.yudao.module.hshy.controller.admin.userblack.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.userblack.UserBlackDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+import javax.validation.Valid;
+
+/**
+ * 会员黑名单 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface UserBlackService {
+
+ /**
+ * 创建会员黑名单
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Boolean createUserBlack(@Valid UserBlackSaveReqVO createReqVO);
+
+ /**
+ * 更新会员黑名单
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateUserBlack(@Valid UserBlackSaveReqVO updateReqVO);
+
+ /**
+ * 删除会员黑名单
+ *
+ * @param deleteReqVO 编号
+ */
+ void deleteUserBlack(UserBlackSaveReqVO deleteReqVO);
+
+ /**
+ * 获得会员黑名单
+ *
+ * @param id 编号
+ */
+ Boolean getUserBlack(long id);
+
+
+
+ /**
+ * 获得所有会员黑名单
+ *
+ */
+ List listUserBlack();
+
+ /**
+ * 获得会员黑名单分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 会员黑名单分页
+ */
+ PageResult getUserBlackPage(UserBlackPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/userblack/UserBlackServiceImpl.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/userblack/UserBlackServiceImpl.java
new file mode 100644
index 000000000..bf9bd8810
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/userblack/UserBlackServiceImpl.java
@@ -0,0 +1,85 @@
+package cn.iocoder.yudao.module.hshy.service.userblack;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import java.util.*;
+import cn.iocoder.yudao.module.hshy.controller.admin.userblack.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.userblack.UserBlackDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.hshy.dal.mysql.userblack.UserBlackMapper;
+import javax.annotation.Resource;
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.hshy.enums.ErrorCodeConstants.*;
+
+/**
+ * 会员黑名单 Service 实现类
+ *
+ * @author tpj
+ */
+@Service
+@Validated
+public class UserBlackServiceImpl implements UserBlackService {
+
+ @Resource
+ private UserBlackMapper userBlackMapper;
+
+ @Override
+ public Boolean createUserBlack(UserBlackSaveReqVO createReqVO) {
+ // 批量插入
+ List list = new ArrayList<>();
+ //查询会员是否存在
+ List validList =
+ userBlackMapper.selectList(new LambdaQueryWrapper().in(UserBlackDO::getMemberUserId, createReqVO.getMemberUserIds()));
+ for (Long memberUserId : createReqVO.getMemberUserIds()) {
+ //查询会员是否存在
+ boolean isExists = validList.stream().anyMatch(userBlackListDO -> userBlackListDO.getMemberUserId().equals(memberUserId));
+ if (isExists) {
+ continue;
+ }
+ UserBlackDO userBlackListDO = new UserBlackDO();
+ userBlackListDO.setMemberUserId(memberUserId);
+ list.add(userBlackListDO);
+ }
+ return userBlackMapper.insertBatch(list);
+ }
+
+ @Override
+ public void updateUserBlack(UserBlackSaveReqVO updateReqVO) {
+ // 校验存在
+ // validateUserBlackExists(updateReqVO.getId());
+ // 更新
+ UserBlackDO updateObj = BeanUtils.toBean(updateReqVO, UserBlackDO.class);
+ userBlackMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteUserBlack(UserBlackSaveReqVO deleteReqVO) {
+ // 校验存在
+ userBlackMapper.deleteByIds(deleteReqVO.getMemberUserIds());
+ }
+
+ private Boolean validateUserBlackExists(long id) {
+ List list= userBlackMapper.selectList(new LambdaQueryWrapper().eq(UserBlackDO::getMemberUserId,id));
+ //判断list
+ return list != null && !list.isEmpty();
+ }
+
+ @Override
+ public Boolean getUserBlack(long id) {
+ return validateUserBlackExists(id);
+ }
+
+ @Override
+ public List listUserBlack() {
+
+ return userBlackMapper.selectList(new LambdaQueryWrapper<>());
+ }
+
+ @Override
+ public PageResult getUserBlackPage(UserBlackPageReqVO pageReqVO) {
+ return userBlackMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/userconfig/UserConfigService.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/userconfig/UserConfigService.java
new file mode 100644
index 000000000..c2aa715f1
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/userconfig/UserConfigService.java
@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.hshy.service.userconfig;
+
+import java.util.*;
+import cn.iocoder.yudao.module.hshy.controller.admin.userconfig.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.userconfig.UserConfigDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+import javax.validation.Valid;
+
+/**
+ * 会员条件配置 Service 接口
+ *
+ * @author 超级管理员
+ */
+public interface UserConfigService {
+
+ /**
+ * 创建会员条件配置
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Integer createUserConfig(@Valid UserConfigSaveReqVO createReqVO);
+
+ /**
+ * 更新会员条件配置
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateUserConfig(@Valid UserConfigSaveReqVO updateReqVO);
+
+ /**
+ * 删除会员条件配置
+ *
+ * @param id 编号
+ */
+ void deleteUserConfig(Integer id);
+
+ /**
+ * 获得会员条件配置
+ *
+ * @param id 编号
+ * @return 会员条件配置
+ */
+ UserConfigDO getUserConfig(Integer id);
+
+ /**
+ * 获得会员条件配置分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 会员条件配置分页
+ */
+ PageResult getUserConfigPage(UserConfigPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/userconfig/UserConfigServiceImpl.java b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/userconfig/UserConfigServiceImpl.java
new file mode 100644
index 000000000..f10b45267
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/java/cn/iocoder/yudao/module/hshy/service/userconfig/UserConfigServiceImpl.java
@@ -0,0 +1,75 @@
+package cn.iocoder.yudao.module.hshy.service.userconfig;
+
+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.hshy.controller.admin.userconfig.vo.*;
+import cn.iocoder.yudao.module.hshy.dal.dataobject.userconfig.UserConfigDO;
+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.hshy.dal.mysql.userconfig.UserConfigMapper;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.hshy.enums.ErrorCodeConstants.*;
+
+/**
+ * 会员条件配置 Service 实现类
+ *
+ * @author 超级管理员
+ */
+@Service
+@Validated
+public class UserConfigServiceImpl implements UserConfigService {
+
+ @Resource
+ private UserConfigMapper userConfigMapper;
+
+ @Override
+ public Integer createUserConfig(UserConfigSaveReqVO createReqVO) {
+ // 插入
+ UserConfigDO userConfig = BeanUtils.toBean(createReqVO, UserConfigDO.class);
+ userConfigMapper.insert(userConfig);
+ // 返回
+ return userConfig.getId();
+ }
+
+ @Override
+ public void updateUserConfig(UserConfigSaveReqVO updateReqVO) {
+ // 校验存在
+ validateUserConfigExists(updateReqVO.getId());
+ // 更新
+ UserConfigDO updateObj = BeanUtils.toBean(updateReqVO, UserConfigDO.class);
+ userConfigMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteUserConfig(Integer id) {
+ // 校验存在
+ validateUserConfigExists(id);
+ // 删除
+ userConfigMapper.deleteById(id);
+ }
+
+ private void validateUserConfigExists(Integer id) {
+ if (userConfigMapper.selectById(id) == null) {
+ throw exception(USER_CONFIG_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public UserConfigDO getUserConfig(Integer id) {
+ return userConfigMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getUserConfigPage(UserConfigPageReqVO pageReqVO) {
+ return userConfigMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/logback-spring.xml b/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/logback-spring.xml
new file mode 100644
index 000000000..b1b9f3faf
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-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-hshy-biz/src/main/resources/mapper/extend/ExtendMapper.xml b/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/extend/ExtendMapper.xml
new file mode 100644
index 000000000..4ad54b0ee
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/extend/ExtendMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/pointcongeal/PointCongealMapper.xml b/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/pointcongeal/PointCongealMapper.xml
new file mode 100644
index 000000000..13f4492fb
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/pointcongeal/PointCongealMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/pointexchange/PointExchangeMapper.xml b/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/pointexchange/PointExchangeMapper.xml
new file mode 100644
index 000000000..9e33e5fc3
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/pointexchange/PointExchangeMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/pointrule/PointRuleMapper.xml b/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/pointrule/PointRuleMapper.xml
new file mode 100644
index 000000000..1c39f57bd
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/pointrule/PointRuleMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/pointruleitem/PointRuleItemMapper.xml b/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/pointruleitem/PointRuleItemMapper.xml
new file mode 100644
index 000000000..23355677e
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/pointruleitem/PointRuleItemMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/userblack/UserBlackMapper.xml b/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/userblack/UserBlackMapper.xml
new file mode 100644
index 000000000..d7f768e21
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/userblack/UserBlackMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/userconfig/UserConfigMapper.xml b/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/userconfig/UserConfigMapper.xml
new file mode 100644
index 000000000..79f4c7b40
--- /dev/null
+++ b/yudao-module-mall/yudao-module-hshy-biz/src/main/resources/mapper/userconfig/UserConfigMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file