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