From e1e48ce1dd3170fe151a685480f8b06c7a103045 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Thu, 23 Sep 2021 17:22:52 +0800
Subject: [PATCH] add order overtime

---
 src/main/resources/mapper/modules/MallAddressInfoMapper.xml                     |    5 ++
 src/main/java/cc/mrbird/febs/common/listener/RedisListenerConfig.java           |   24 ++++++++++++
 src/main/java/cc/mrbird/febs/mall/mapper/MallAddressInfoMapper.java             |    2 +
 src/main/java/cc/mrbird/febs/common/utils/AppContants.java                      |    2 +
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java |    7 +++
 src/main/java/cc/mrbird/febs/common/listener/RedisKeyExpirationListener.java    |   58 +++++++++++++++++++++++++++++
 6 files changed, 97 insertions(+), 1 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/listener/RedisKeyExpirationListener.java b/src/main/java/cc/mrbird/febs/common/listener/RedisKeyExpirationListener.java
new file mode 100644
index 0000000..737c005
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/common/listener/RedisKeyExpirationListener.java
@@ -0,0 +1,58 @@
+package cc.mrbird.febs.common.listener;
+
+import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
+import cc.mrbird.febs.common.utils.AppContants;
+import cc.mrbird.febs.mall.entity.MallOrderInfo;
+import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
+import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.connection.Message;
+import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
+import org.springframework.data.redis.listener.RedisMessageListenerContainer;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2021-04-16
+ **/
+@Slf4j
+@Component
+public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
+
+    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
+        super(listenerContainer);
+    }
+
+    @Autowired
+    private MallOrderInfoMapper mallOrderInfoMapper;
+
+    @Override
+    public void onMessage(Message message, byte[] pattern) {
+        String expireKey = message.toString();
+        if (expireKey.startsWith(AppContants.REDIS_ORDER_OVERTIME_PREFIX)) {
+            List<String> split = StrUtil.split(expireKey, '_');
+            if (split.size() < 4) {
+                log.error("自动取消订单失效:{}", expireKey);
+                return;
+            }
+            Long memberId = Long.valueOf(split.get(2));
+            Long orderId = Long.valueOf(split.get(3));
+
+            MallOrderInfo orderInfo = mallOrderInfoMapper.selectOrderByMemberIdAndId(memberId, orderId);
+            if (orderInfo == null) {
+                log.error("自动取消订单参数错误:{}", expireKey);
+                return;
+            }
+            if (orderInfo.getStatus() == OrderStatusEnum.WAIT_PAY.getValue()) {
+                log.info("自动取消订单:{},{}", memberId, orderId);
+                orderInfo.setStatus(OrderStatusEnum.CANCEL.getValue());
+                orderInfo.setCancelType(MallOrderInfo.CANCEL_OVERTIME_NO_PAY);
+                mallOrderInfoMapper.updateById(orderInfo);
+            }
+        }
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/common/listener/RedisListenerConfig.java b/src/main/java/cc/mrbird/febs/common/listener/RedisListenerConfig.java
new file mode 100644
index 0000000..d0290a2
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/common/listener/RedisListenerConfig.java
@@ -0,0 +1,24 @@
+package cc.mrbird.febs.common.listener;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.listener.PatternTopic;
+import org.springframework.data.redis.listener.RedisMessageListenerContainer;
+
+/**
+ * @author wzy
+ * @date 2021-04-16
+ **/
+@Configuration
+public class RedisListenerConfig {
+
+    @Bean
+    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
+
+        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
+        container.setConnectionFactory(connectionFactory);
+//        container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired"));
+        return container;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/common/utils/AppContants.java b/src/main/java/cc/mrbird/febs/common/utils/AppContants.java
index c8af7fd..c2b96b7 100644
--- a/src/main/java/cc/mrbird/febs/common/utils/AppContants.java
+++ b/src/main/java/cc/mrbird/febs/common/utils/AppContants.java
@@ -62,5 +62,7 @@
 
     public static final int DEL_FLAG_N = 2;
 
+    public static final String REDIS_ORDER_OVERTIME_PREFIX = "order_overtime_";
+    public static final String REDIS_ORDER_OVERTIME = "order_overtime_{}_{}";
 
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallAddressInfoMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallAddressInfoMapper.java
index eb8e455..d930e11 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/MallAddressInfoMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallAddressInfoMapper.java
@@ -11,4 +11,6 @@
     List<MallAddressInfo> selectAddressInfoListByMemberId(@Param("memberId") Long memberId);
 
     int updateIsDefault(@Param("isDefault") Integer isDefault, @Param("memberId") Long memberId, @Param("id") Long id);
+
+    MallAddressInfo selectAddressInfoByMemberIdAndId(@Param("memberId") Long memberId, @Param("id") Long id);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
index 773f6c0..bbc4ff2 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -6,6 +6,7 @@
 import cc.mrbird.febs.common.utils.AppContants;
 import cc.mrbird.febs.common.utils.LoginUserUtil;
 import cc.mrbird.febs.common.utils.MallUtils;
+import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.mall.conversion.MallOrderInfoConversion;
 import cc.mrbird.febs.mall.conversion.MallOrderRefundConversion;
 import cc.mrbird.febs.mall.dto.*;
@@ -54,13 +55,14 @@
     private final MallOrderRefundMapper mallOrderRefundMapper;
     private final MallOrderRefundOperationMapper mallOrderRefundOperationMapper;
     private final MallShoppingCartMapper mallShoppingCartMapper;
+    private final RedisUtils redisUtils;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createOrder(AddOrderDto addOrderDto) {
         MallMember member = LoginUserUtil.getLoginUser();
 
-        MallAddressInfo address = mallAddressInfoMapper.selectById(addOrderDto.getAddressId());
+        MallAddressInfo address = mallAddressInfoMapper.selectAddressInfoByMemberIdAndId(member.getId(), addOrderDto.getAddressId());
         if (address == null) {
             throw new FebsException("地址不存在");
         }
@@ -121,6 +123,9 @@
         orderInfo.setAmount(total);
         this.baseMapper.updateById(orderInfo);
 
+        String redisKey = StrUtil.format(AppContants.REDIS_ORDER_OVERTIME, member.getId(), orderInfo.getId());
+        redisUtils.set(redisKey, orderInfo.getId(), 900);
+
         return orderInfo.getId();
     }
 
diff --git a/src/main/resources/mapper/modules/MallAddressInfoMapper.xml b/src/main/resources/mapper/modules/MallAddressInfoMapper.xml
index c464d62..d0cc911 100644
--- a/src/main/resources/mapper/modules/MallAddressInfoMapper.xml
+++ b/src/main/resources/mapper/modules/MallAddressInfoMapper.xml
@@ -16,4 +16,9 @@
             and id=#{id}
         </if>
     </update>
+
+    <select id="selectAddressInfoByMemberIdAndId" resultType="cc.mrbird.febs.mall.entity.MallAddressInfo">
+        select * from mall_address_info
+        where member_id=#{memberId} and id=#{id}
+    </select>
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.1