package com.xiaopeng.order.utils; import com.alibaba.nacos.common.utils.CollectionUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.common.redis.service.RedisService; import com.xiaopeng.order.service.IXpOrderService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.List; import java.util.concurrent.TimeUnit; @Slf4j @Component public class TaskOrderCancelUtil { @Autowired private IXpOrderService xpOrderService; @Autowired private RedisService redisService; /** * 30秒执行一次 */ @Scheduled(cron = "0/30 * * * * ?") public void taskOrder() { // 计算30分钟前的时间 LocalDateTime thirtyMinutesAgo = LocalDateTime.now().minusMinutes(30); // 查询状态为1且创建时间超过30分钟的订单 List expiredOrders = xpOrderService.list(new LambdaQueryWrapper() .eq(XpOrder::getStatus, 1) .lt(XpOrder::getCreateTime, thirtyMinutesAgo) // 使用lt避免边界问题 .orderByAsc(XpOrder::getCreateTime) // 按创建时间正序处理,先处理最早的 .last("LIMIT 1000") // 防止一次处理太多数据,可以分批处理 ); if (CollectionUtils.isNotEmpty(expiredOrders)) { for (XpOrder order : expiredOrders) { try { // 处理过期订单 processExpiredOrder(order); } catch (Exception e) { log.error("处理过期订单失败,订单ID: {}", order.getId(), e); } } } } private void processExpiredOrder(XpOrder order){ Long appUserId = order.getAppUserId(); order.setAppUserId(null); order.setStatus(0); xpOrderService.updateById(order); redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 0, 24L, TimeUnit.HOURS); } }