From 1a34ca17ad994d5b79ccdd7eecd6c7eca96c242f Mon Sep 17 00:00:00 2001
From: wuxicheng <1441859745@qq.com>
Date: Thu, 30 Mar 2023 10:59:53 +0800
Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E4=B8=9A=E5=8A=A1=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
bnyer-common/bnyer-common-core/pom.xml | 5 +
.../bnyer/common/core/dto/VipOrderDto.java | 34 +++
.../bnyer/common/core/enums/ResponseEnum.java | 50 +++++
.../core/utils/bean/EntityConvertUtil.java | 203 ++++++++++++++++++
.../com/bnyer/common/core/vo/VipOrderVo.java | 42 ++++
.../common/core/web/domain/AjaxResult.java | 10 +
.../common/redis/adapter/CacheTtlAdapter.java | 20 ++
.../common/redis/bo/CacheNameWithTtlBo.java | 28 +++
.../common/redis/configure/RedisConfig.java | 143 ++++++++++--
.../common/redis/constant/CacheNames.java | 20 ++
.../redis/constant/OrderCacheNames.java | 25 +++
.../redis/service/RedisCacheService.java | 49 +++++
.../common/redis/service/RedisService.java | 29 ++-
.../main/resources/META-INF/spring.factories | 3 +-
bnyer-common/bnyer-common-rocketmq/pom.xml | 32 +++
.../rocketmq/config/RocketMqAdapter.java | 38 ++++
.../rocketmq/config/RocketMqConstant.java | 40 ++++
bnyer-common/pom.xml | 1 +
.../img/constants/UserVipTypeConstant.java | 24 ---
.../impl/UserVipServiceRecordImpl.java | 22 +-
bnyer-services/bnyer-order/pom.xml | 7 +-
.../bnyer/order/BnyerOrderApplication.java | 2 +-
.../order/config/OrderCacheTtlAdapter.java | 27 +++
.../bnyer/order/config/RocketMqConfig.java | 28 +++
.../order/controller/VipOrderController.java | 78 +++++++
.../order/controller/testController.java | 4 -
.../com/bnyer/order/enums/EnumSceneCode.java | 30 +++
.../com/bnyer/order/enums/EnumVipType.java | 32 +++
.../listener/vip/VipOrderCancelConsumer.java | 24 +++
.../vip/VipOrderPaySuccessConsumer.java | 18 ++
.../com/bnyer/order/service/TestService.java | 4 -
.../bnyer/order/service/VipOrderService.java | 27 +++
.../order/service/impl/TestServiceImpl.java | 8 -
.../service/impl/VipOrderServiceImpl.java | 97 +++++++++
bnyer-services/bnyer-pay/pom.xml | 6 +
.../com/bnyer/pay/BnyerPayApplication.java | 2 +-
.../com/bnyer/pay/config/RocketMqConfig.java | 28 +++
.../java/com/bnyer/pay/config/TestConfig.java | 4 -
pom.xml | 13 ++
39 files changed, 1168 insertions(+), 89 deletions(-)
create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/VipOrderDto.java
create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/ResponseEnum.java
create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/bean/EntityConvertUtil.java
create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/vo/VipOrderVo.java
create mode 100644 bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/adapter/CacheTtlAdapter.java
create mode 100644 bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/bo/CacheNameWithTtlBo.java
create mode 100644 bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/constant/CacheNames.java
create mode 100644 bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/constant/OrderCacheNames.java
create mode 100644 bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisCacheService.java
create mode 100644 bnyer-common/bnyer-common-rocketmq/pom.xml
create mode 100644 bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqAdapter.java
create mode 100644 bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java
delete mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/UserVipTypeConstant.java
create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/OrderCacheTtlAdapter.java
create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java
create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java
delete mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/testController.java
create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumSceneCode.java
create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java
create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java
create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPaySuccessConsumer.java
delete mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/TestService.java
create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java
delete mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/TestServiceImpl.java
create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java
create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/RocketMqConfig.java
delete mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/TestConfig.java
diff --git a/bnyer-common/bnyer-common-core/pom.xml b/bnyer-common/bnyer-common-core/pom.xml
index e522210..f475dbf 100644
--- a/bnyer-common/bnyer-common-core/pom.xml
+++ b/bnyer-common/bnyer-common-core/pom.xml
@@ -65,6 +65,11 @@
jackson-databind
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+
+
com.alibaba
diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/VipOrderDto.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/VipOrderDto.java
new file mode 100644
index 0000000..1ad7cbc
--- /dev/null
+++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/VipOrderDto.java
@@ -0,0 +1,34 @@
+package com.bnyer.common.core.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @author :WXC
+ * @Date :2023/03/27
+ * @description :
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+public class VipOrderDto implements Serializable {
+
+ @NotBlank(message = "手机号不能为空!")
+ @ApiModelProperty(value="手机号")
+ private String phone;
+
+ @NotNull(message = "用户vipId不能为空!")
+ @ApiModelProperty(value="用户vip表id")
+ private Long userVipId;
+
+ @NotBlank(message = "vip类型状态不能为空!")
+ @ApiModelProperty(value="vip类型状态(0->月卡;1->季卡;2->年卡)")
+ private String type;
+
+}
diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/ResponseEnum.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/ResponseEnum.java
new file mode 100644
index 0000000..44f80ae
--- /dev/null
+++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/ResponseEnum.java
@@ -0,0 +1,50 @@
+package com.bnyer.common.core.enums;
+
+/**
+ * @author :WXC
+ * @Date :2023/03/28
+ * @description :
+ */
+public enum ResponseEnum {
+
+ //======================订单异常========================
+
+ /**
+ * 订单已过期,当前端看到该状态码的时候,提示订单信息已过期,请重新确认后提交,此时用户点击确定,前端刷新页面。
+ */
+ ORDER_EXPIRED(110001, "订单已过期"),
+
+ /**
+ * 请勿重复提交订单,
+ * 1.当前端遇到该异常时,说明前端防多次点击没做好
+ * 2.提示用户 订单已发生改变,请勿重复下单
+ */
+ REPEAT_ORDER(110002,"请勿重复提交订单"),
+
+ ;
+
+ private final int code;
+
+ private final String msg;
+
+ public int value() {
+ return code;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+
+ ResponseEnum(int code, String msg) {
+ this.code = code;
+ this.msg = msg;
+ }
+
+ @Override
+ public String toString() {
+ return "ResponseEnum{" +
+ "code=" + code +
+ ", msg='" + msg + '\'' +
+ '}';
+ }
+}
diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/bean/EntityConvertUtil.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/bean/EntityConvertUtil.java
new file mode 100644
index 0000000..6184b37
--- /dev/null
+++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/bean/EntityConvertUtil.java
@@ -0,0 +1,203 @@
+package com.bnyer.common.core.utils.bean;
+
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.BeanWrapper;
+import org.springframework.beans.BeanWrapperImpl;
+import org.springframework.util.CollectionUtils;
+
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.*;
+import java.util.*;
+
+@Slf4j
+public class EntityConvertUtil {
+
+ /**
+ * 数组集合转化为指定对象集合
+ * 指定的实体对象必须包含所以字段的构造方法,数组的元素的顺序将和构造方法顺序和类型一一对应
+ *
+ * @param list 集合
+ * @param clazz c
+ * @param 类型
+ * @return List
+ * @description 用于jpa查询自定义vo用的
+ */
+ public static List castEntity(List
+
+
+ com.dimensionalnode
+ bnyer-common-rocketmq
+
@@ -128,4 +133,4 @@
-
\ No newline at end of file
+
diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/BnyerOrderApplication.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/BnyerOrderApplication.java
index 4a7db6a..2674afb 100644
--- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/BnyerOrderApplication.java
+++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/BnyerOrderApplication.java
@@ -15,7 +15,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
@EnableCustomConfig
@EnableCustomSwagger2
@EnableRyFeignClients
-@SpringBootApplication
+@SpringBootApplication(scanBasePackages = { "com.bnyer" })
@EnableAsync
public class BnyerOrderApplication
{
diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/OrderCacheTtlAdapter.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/OrderCacheTtlAdapter.java
new file mode 100644
index 0000000..9155ba0
--- /dev/null
+++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/OrderCacheTtlAdapter.java
@@ -0,0 +1,27 @@
+package com.bnyer.order.config;
+
+import com.bnyer.common.redis.adapter.CacheTtlAdapter;
+import com.bnyer.common.redis.bo.CacheNameWithTtlBo;
+import com.bnyer.common.redis.constant.OrderCacheNames;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author :WXC
+ * @Date :2023/03/28
+ * @description :
+ */
+@Component
+public class OrderCacheTtlAdapter implements CacheTtlAdapter{
+
+ @Override
+ public List listCacheNameWithTtl() {
+ List cacheNameWithTtls = new ArrayList<>();
+ // 确认订单缓存30分钟
+ cacheNameWithTtls.add(new CacheNameWithTtlBo(OrderCacheNames.VIP_ORDER_PREFIX + OrderCacheNames.ORDER_CONFIRM_UID_KEY, 60 * 30));
+ cacheNameWithTtls.add(new CacheNameWithTtlBo(OrderCacheNames.VIP_ORDER_PREFIX + OrderCacheNames.ORDER_CONFIRM_KEY, 60 * 30));
+ return cacheNameWithTtls;
+ }
+}
diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java
new file mode 100644
index 0000000..da710d7
--- /dev/null
+++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java
@@ -0,0 +1,28 @@
+package com.bnyer.order.config;
+
+import com.bnyer.common.rocketmq.config.RocketMqAdapter;
+import com.bnyer.common.rocketmq.config.RocketMqConstant;
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+
+/**
+ * @author :WXC
+ * @Date :2023/03/24
+ * @description :
+ */
+@RefreshScope
+@Configuration
+public class RocketMqConfig {
+ @Autowired
+ private RocketMqAdapter rocketMqAdapter;
+
+ @Lazy
+ @Bean(destroyMethod = "destroy")
+ public RocketMQTemplate orderCancelMqTemplate() {
+ return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.VIP_ORDER_CANCEL_TOPIC);
+ }
+}
diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java
new file mode 100644
index 0000000..bd35334
--- /dev/null
+++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java
@@ -0,0 +1,78 @@
+package com.bnyer.order.controller;
+
+import com.bnyer.common.core.context.SecurityContextHolder;
+import com.bnyer.common.core.dto.VipOrderDto;
+import com.bnyer.common.core.enums.ResponseEnum;
+import com.bnyer.common.core.vo.VipOrderVo;
+import com.bnyer.common.core.web.controller.BaseController;
+import com.bnyer.common.core.web.domain.AjaxResult;
+import com.bnyer.common.redis.constant.CacheNames;
+import com.bnyer.common.redis.constant.OrderCacheNames;
+import com.bnyer.common.redis.service.RedisCacheService;
+import com.bnyer.common.redis.service.RedisService;
+import com.bnyer.order.service.VipOrderService;
+import io.swagger.annotations.Api;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.Objects;
+
+/**
+ * @author :WXC
+ * @Date :2023/03/24
+ * @description :
+ */
+@Api(value = "会员订单相关接口",tags = "会员订单相关接口")
+@RestController
+@RequestMapping("/order/vip")
+@Slf4j
+public class VipOrderController extends BaseController {
+
+ @Autowired
+ private RedisService redisService;
+
+ @Autowired
+ private RedisCacheService redisCacheService;
+
+
+ @Autowired
+ private VipOrderService vipOrderService;
+
+ /**
+ * 生成订单
+ */
+ @PostMapping("/confirmVipOrder")
+ @Operation(summary = "生成订单,返回订单信息" , description = "传入下单所需要的参数进行下单")
+ public AjaxResult confirmVipOrder(@Valid @RequestBody VipOrderDto vipOrderDto){
+ VipOrderVo vipOrderVo = vipOrderService.confirmVipOrder(vipOrderDto);
+ return AjaxResult.success(vipOrderVo);
+ }
+
+ /**
+ * 提交订单
+ */
+ @PostMapping("/submitOrder")
+ @Operation(summary = "提交订单,返回支付流水号" , description = "提交订单,通过支付场景获取订单信息生成订单并返回订单号")
+ public AjaxResult submitVipOrder() {
+ // 防止重复提交
+ Long userId = SecurityContextHolder.getUserId();
+ VipOrderVo vipOrderVo = redisCacheService.getCache(OrderCacheNames.VIP_ORDER_PREFIX + OrderCacheNames.ORDER_CONFIRM_KEY, String.valueOf(userId));
+ // 看看订单有没有过期
+ if (Objects.isNull(vipOrderVo)) {
+ return AjaxResult.error(ResponseEnum.ORDER_EXPIRED);
+ }
+ boolean cad = redisService.cad(OrderCacheNames.VIP_ORDER_PREFIX + OrderCacheNames.ORDER_CONFIRM_UID_KEY + CacheNames.UNION + userId, String.valueOf(userId));
+ if (!cad) {
+ return AjaxResult.error(ResponseEnum.REPEAT_ORDER);
+ }
+ String orderId = vipOrderService.submitVipOrder(userId,vipOrderVo);
+ return AjaxResult.success(orderId);
+ }
+
+}
diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/testController.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/testController.java
deleted file mode 100644
index ade0f8a..0000000
--- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/testController.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.bnyer.order.controller;
-
-public class testController {
-}
diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumSceneCode.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumSceneCode.java
new file mode 100644
index 0000000..b410ac8
--- /dev/null
+++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumSceneCode.java
@@ -0,0 +1,30 @@
+package com.bnyer.order.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author :WXC
+ * @description :
+ */
+@Getter
+@AllArgsConstructor
+public enum EnumSceneCode {
+
+ VIP_RECHARGE("1","会员充值"),
+ ;
+
+ private String sceneCode;
+
+ private String name;
+
+ public static String getSceneCodeName(String sceneCode) {
+ for (EnumSceneCode s : EnumSceneCode.values()) {
+ if (sceneCode.equals(s.getSceneCode())) {
+ return s.getName();
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java
new file mode 100644
index 0000000..903a52a
--- /dev/null
+++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java
@@ -0,0 +1,32 @@
+package com.bnyer.order.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 用户会员vip常量
+ * @author chengkun
+ * @date 2022/4/21 18:12
+ */
+@Getter
+@AllArgsConstructor
+public enum EnumVipType {
+
+ MONTH_CARD("0","月卡"),
+ SEASON_CARD("1","季卡"),
+ YEAR_CARD("2","年卡"),
+ ;
+
+ private String typeCode;
+
+ private String name;
+
+ public static String getTypeCodeName(String typeCode) {
+ for (EnumSceneCode s : EnumSceneCode.values()) {
+ if (typeCode.equals(s.getSceneCode())) {
+ return s.getName();
+ }
+ }
+ return null;
+ }
+}
diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java
new file mode 100644
index 0000000..aacbf9c
--- /dev/null
+++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java
@@ -0,0 +1,24 @@
+package com.bnyer.order.listener.vip;
+
+import com.bnyer.common.rocketmq.config.RocketMqConstant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+import org.apache.rocketmq.spring.core.RocketMQListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author :WXC
+ * @Date :2023/03/24
+ * @description :取消订单mq消费监听
+ */
+@Slf4j
+@Component
+@RocketMQMessageListener(topic = RocketMqConstant.VIP_ORDER_CANCEL_TOPIC,consumerGroup = RocketMqConstant.VIP_ORDER_CANCEL_TOPIC)
+public class VipOrderCancelConsumer implements RocketMQListener {
+
+ @Override
+ public void onMessage(String orderId) {
+ log.info("收到消息:{}", orderId);
+// cancelOrder();
+ }
+}
diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPaySuccessConsumer.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPaySuccessConsumer.java
new file mode 100644
index 0000000..2d901ba
--- /dev/null
+++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPaySuccessConsumer.java
@@ -0,0 +1,18 @@
+//package com.bnyer.order.listener.vip;
+//
+//import com.bnyer.common.rocketmq.config.RocketMqConstant;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+//import org.springframework.stereotype.Component;
+//
+///**
+// * @author :WXC
+// * @Date :2023/03/24
+// * @description :订单支付成功mq消费监听
+// */
+//@Slf4j
+//@Component
+//@RocketMQMessageListener(topic = RocketMqConstant.VIP_ORDER_PAY_SUCCESS_TOPIC,consumerGroup = RocketMqConstant.VIP_ORDER_PAY_SUCCESS_TOPIC)
+//public class VipOrderPaySuccessConsumer {
+//
+//}
diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/TestService.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/TestService.java
deleted file mode 100644
index 20ed969..0000000
--- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/TestService.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.bnyer.order.service;
-
-public interface TestService {
-}
diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java
new file mode 100644
index 0000000..b147150
--- /dev/null
+++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java
@@ -0,0 +1,27 @@
+package com.bnyer.order.service;
+
+import com.bnyer.common.core.dto.VipOrderDto;
+import com.bnyer.common.core.vo.VipOrderVo;
+
+/**
+ * @author :WXC
+ * @Date :2023/03/27
+ * @description :
+ */
+public interface VipOrderService {
+ /**
+ * 生成订单,返回订单信息
+ * @param vipOrderDto 下单所需要的参数
+ * @return 订单信息
+ */
+ VipOrderVo confirmVipOrder(VipOrderDto vipOrderDto);
+
+ /**
+ * 提交订单,返回支付流水号
+ *
+ * @param userId
+ * @param vipOrderVo 缓存的订单信息
+ * @return 支付流水号
+ */
+ String submitVipOrder(Long userId, VipOrderVo vipOrderVo);
+}
diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/TestServiceImpl.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/TestServiceImpl.java
deleted file mode 100644
index 4bb1f8f..0000000
--- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/TestServiceImpl.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.bnyer.order.service.impl;
-
-import com.bnyer.order.service.TestService;
-import org.springframework.stereotype.Service;
-
-@Service
-public class TestServiceImpl implements TestService {
-}
diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java
new file mode 100644
index 0000000..cac68ea
--- /dev/null
+++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java
@@ -0,0 +1,97 @@
+package com.bnyer.order.service.impl;
+
+import com.bnyer.common.core.exception.ServiceException;
+import com.bnyer.common.core.utils.DateUtils;
+import com.bnyer.common.core.utils.bean.EntityConvertUtil;
+import com.bnyer.common.redis.constant.CacheNames;
+import com.bnyer.common.redis.constant.OrderCacheNames;
+import com.bnyer.common.core.context.SecurityContextHolder;
+import com.bnyer.common.core.dto.VipOrderDto;
+import com.bnyer.common.core.vo.VipOrderVo;
+import com.bnyer.common.redis.service.RedisCacheService;
+import com.bnyer.common.redis.service.RedisService;
+import com.bnyer.common.rocketmq.config.RocketMqConstant;
+import com.bnyer.order.enums.EnumVipType;
+import com.bnyer.order.service.VipOrderService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.client.producer.SendStatus;
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.messaging.support.GenericMessage;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author :WXC
+ * @Date :2023/03/28
+ * @description :
+ */
+@Slf4j
+@Service
+public class VipOrderServiceImpl implements VipOrderService {
+
+ @Autowired
+ private RedisService redisService;
+
+ @Autowired
+ private RedisCacheService redisCacheService;
+
+ @Autowired
+ private RocketMQTemplate orderCancelMqTemplate;
+
+ @Override
+ public VipOrderVo confirmVipOrder(VipOrderDto vipOrderDto) {
+ Long userId = SecurityContextHolder.getUserId();
+ //将要返回给前端的完整的订单信息
+ VipOrderVo vipOrderVo = buildVipOrderVo(vipOrderDto);
+ // 防止重复提交
+ redisService.setCacheObject(OrderCacheNames.VIP_ORDER_PREFIX + OrderCacheNames.ORDER_CONFIRM_UID_KEY + CacheNames.UNION + userId, String.valueOf(userId));
+ // 保存订单计算结果缓存
+ redisCacheService.putCache(OrderCacheNames.VIP_ORDER_PREFIX + OrderCacheNames.ORDER_CONFIRM_KEY ,String.valueOf(userId), vipOrderVo);
+ return vipOrderVo;
+ }
+
+ /**
+ * 构建vip订单
+ * @param vipOrderDto
+ * @return
+ */
+ private VipOrderVo buildVipOrderVo(VipOrderDto vipOrderDto) {
+ VipOrderVo vipOrderVo = EntityConvertUtil.copy(vipOrderDto, VipOrderVo.class);
+ Date startTime = new Date();
+ vipOrderVo.setStartTime(startTime);
+ if(EnumVipType.MONTH_CARD.getTypeCode().equals(vipOrderDto.getType())){
+ //计算月卡(30天)的结束时间
+ vipOrderVo.setEndTime(DateUtils.getDateAfter(startTime, 30));
+ }else if(EnumVipType.SEASON_CARD.getTypeCode().equals(vipOrderDto.getType())){
+ //结算季卡(90天)的结束时间
+ vipOrderVo.setEndTime(DateUtils.getDateAfter(startTime, 90));
+ }else if (EnumVipType.YEAR_CARD.getTypeCode().equals(vipOrderDto.getType())){
+ //计算年卡(365天)的结束时间
+ vipOrderVo.setEndTime(DateUtils.getDateAfter(startTime, 365));
+ }else {
+ throw new ServiceException("参数异常!");
+ }
+ return vipOrderVo;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public String submitVipOrder(Long userId,VipOrderVo vipOrderVo) {
+ String orderId = "123";
+ //发送消息,如果三十分钟后没有支付,则取消订单
+ SendStatus sendStatus = orderCancelMqTemplate.syncSend(RocketMqConstant.VIP_ORDER_CANCEL_TOPIC, new GenericMessage<>(orderId), RocketMqConstant.TIMEOUT, RocketMqConstant.CANCEL_ORDER_DELAY_LEVEL).getSendStatus();
+ if (!Objects.equals(sendStatus,SendStatus.SEND_OK)) {
+ // 消息发不出去就抛异常,发的出去无所谓
+ throw new ServiceException("系统繁忙,请稍候重试!");
+ }else {
+ log.info("消息发送成功,topic:{}",RocketMqConstant.VIP_ORDER_CANCEL_TOPIC);
+ }
+ return orderId;
+ }
+}
diff --git a/bnyer-services/bnyer-pay/pom.xml b/bnyer-services/bnyer-pay/pom.xml
index 92ea1c3..e232156 100644
--- a/bnyer-services/bnyer-pay/pom.xml
+++ b/bnyer-services/bnyer-pay/pom.xml
@@ -95,6 +95,12 @@
mybatis-plus-boot-starter
+
+
+ com.dimensionalnode
+ bnyer-common-rocketmq
+
+
diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/BnyerPayApplication.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/BnyerPayApplication.java
index a30abb8..b3112d7 100644
--- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/BnyerPayApplication.java
+++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/BnyerPayApplication.java
@@ -15,7 +15,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
@EnableCustomConfig
@EnableCustomSwagger2
@EnableRyFeignClients
-@SpringBootApplication
+@SpringBootApplication(scanBasePackages = { "com.bnyer" })
@EnableAsync
public class BnyerPayApplication
{
diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/RocketMqConfig.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/RocketMqConfig.java
new file mode 100644
index 0000000..88fe05f
--- /dev/null
+++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/RocketMqConfig.java
@@ -0,0 +1,28 @@
+package com.bnyer.pay.config;
+
+import com.bnyer.common.rocketmq.config.RocketMqAdapter;
+import com.bnyer.common.rocketmq.config.RocketMqConstant;
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+
+/**
+ * @author :WXC
+ * @Date :2023/03/24
+ * @description :
+ */
+@RefreshScope
+@Configuration
+public class RocketMqConfig {
+ @Autowired
+ private RocketMqAdapter rocketMqAdapter;
+
+ @Lazy
+ @Bean(destroyMethod = "destroy")
+ public RocketMQTemplate orderPaySuccessMqTemplate() {
+ return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.VIP_ORDER_PAY_SUCCESS_TOPIC);
+ }
+}
diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/TestConfig.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/TestConfig.java
deleted file mode 100644
index 263d3ce..0000000
--- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/TestConfig.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.bnyer.pay.config;
-
-public class TestConfig {
-}
diff --git a/pom.xml b/pom.xml
index ddf9806..8134091 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,6 +46,7 @@
4.23.21.ALL
4.2.0
7.2.18
+ 2.2.2
@@ -250,6 +251,13 @@
${bnyer.version}
+
+
+ com.dimensionalnode
+ bnyer-common-rocketmq
+ ${bnyer.version}
+
+
com.dimensionalnode
@@ -282,6 +290,11 @@
qiniu-java-sdk
${qiniu.version}
+
+ org.apache.rocketmq
+ rocketmq-spring-boot-starter
+ ${rocketmq-springboot.version}
+