package com.mydao.tourist.hotel.listener;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mydao.common.constant.Constant;
import com.mydao.tourist.hotel.common.constant.CacheStaticKey;
import com.mydao.tourist.hotel.common.enums.OrderStatusEnum;
import com.mydao.tourist.hotel.common.enums.PayStatusEnum;
import com.mydao.tourist.hotel.common.exception.HotelException;
import com.mydao.tourist.hotel.domain.HotelOrderInfo;
import com.mydao.tourist.hotel.service.HotelInfoService;
import com.mydao.tourist.hotel.service.HotelOrderInfoService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;
import org.springframework.data.redis.connection.Message;
import org.springframework.transaction.annotation.Transactional;import java.time.LocalDateTime;
/**
* @Author wzq
* @Version 1.0
* @Description //TODO 酒店订单过期监听
* @Date 2023/3/28
**/
@Component
public class OrderBackListener extends KeyExpirationEventMessageListener {private static final Logger log = LoggerFactory.getLogger(OrderBackListener.class);
@Autowired
private StringRedisTemplate stringRedisTemplate;@Autowired
private HotelInfoService hotelInfoService;@Autowired
private HotelOrderInfoService hotelOrderInfoService;public OrderBackListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}/**
* wzq
* 处理全局 订单过期事件
* */
@Transactional(rollbackFor = RuntimeException.class)
@Override
public void onMessage(Message message, byte[] pattern) {
log.info("################监听到订单过期事件,开始处理 订单过期################");
String key = message.toString();
//处理过期订单
if (key.indexOf(CacheStaticKey.orderExpire) == 0) {
//校验redis中被监听的过期的key
long orderId = 0;
try {
orderId = this.doCheckOrderChangeKey(key, CacheStaticKey.orderCancel);
} catch (HotelException e) {
if (e.getCode() == notExistAndWillDeleteKey) {
return;
}
} String key = message.toString();
//处理过期订单
if (key.indexOf(CacheStaticKey.orderCancel) == 0) {
//校验redis中被监听的过期的key
long orderId = 0;
try {
orderId = this.doCheckOrderChangeKey(key, CacheStaticKey.orderCancel);
} catch (HotelException e) {
if (e.getCode() == notExistAndWillDeleteKey) {
return;
}
}
}}HotelOrderInfo orderInfo = orderBackEvent.getOrderInfo();
if (ObjectUtil.isNull(orderInfo)) {
log.error("监听到订单过期事件,订单信息为空");
return;
}
log.debug("监听到订单过期事件,订单信息:{}", JSONObject.toJSONString(orderInfo));
//订单检验 (1:检测订单是否存在 2:订单是否已经过期; )
LambdaQueryWrapper<HotelOrderInfo> eq = new LambdaQueryWrapper<HotelOrderInfo>()
//入住状态 0 未入住 1已入住
.eq(HotelOrderInfo::getCheckInStatus, Constant.INT_VAL_0)
//订单状态;1-待付款 2-付款中(在线支付使用)3-已付款 4-已退款 5-部分退款 6-已使用 7-已取消,8-申请退款中 9-拒绝退款 10-退款中 11-拒绝订单
.in(HotelOrderInfo::getOrderStatus, OrderStatusEnum.STATUS_3, OrderStatusEnum.STATUS_9)
//删除状态
.eq(HotelOrderInfo::getDelFlag, Constant.INT_VAL_0)
//支付状态
.eq(HotelOrderInfo::getPayType, PayStatusEnum.STATUS_3)
//离店时间一定得大于当前时间
.gt(HotelOrderInfo::getLeaveTime, LocalDateTime.now());
hotelOrderInfoService.list();
}}
[001简码]秒杀
于 2023-07-17 09:54:29 首次发布