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 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); } } } }