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