Helius
2021-09-23 e1e48ce1dd3170fe151a685480f8b06c7a103045
add order overtime
2 files added
4 files modified
98 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/listener/RedisKeyExpirationListener.java 58 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/listener/RedisListenerConfig.java 24 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/utils/AppContants.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallAddressInfoMapper.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java 7 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallAddressInfoMapper.xml 5 ●●●●● 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>