src/main/java/cc/mrbird/febs/common/listener/RedisKeyExpirationListener.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/common/listener/RedisListenerConfig.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/common/utils/AppContants.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/mall/mapper/MallAddressInfoMapper.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java | ●●●●● patch | view | raw | blame | history | |
src/main/resources/mapper/modules/MallAddressInfoMapper.xml | ●●●●● patch | view | raw | blame | history |
src/main/java/cc/mrbird/febs/common/listener/RedisKeyExpirationListener.java
New file @@ -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); } } } } src/main/java/cc/mrbird/febs/common/listener/RedisListenerConfig.java
New file @@ -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; } } 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_{}_{}"; } 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); } 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(); } 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>