package com.xiaopeng.order.utils; import com.alibaba.nacos.common.utils.CollectionUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto; import com.xiaopeng.api.feignClient.vehicleConvoy.BluetoothUnlockClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.vehicleConvoy.BluetoothDeliverVo; import com.xiaopeng.common.core.utils.StringUtils; import com.xiaopeng.common.redis.service.RedisService; import com.xiaopeng.order.service.impl.BootCommonService; 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 javax.annotation.Resource; import java.time.LocalDateTime; import java.util.List; @Slf4j @Component public class TaskOrderCancelUtil { @Autowired private IXpOrderService xpOrderService; @Autowired private RedisService redisService; @Resource private XpVehicleClient xpVehicleClient; @Resource private BluetoothUnlockClient bluetoothUnlockClient; @Resource private BootCommonService bootCommonService; /** * 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); order.setAppUserId(appUserId); bootCommonService.setCache_orderStatus(order.getId(), order, null); //删除蓝牙秘钥 String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + order.getId()); if(StringUtils.isNotBlank(token)){ redisService.deleteObject("rt:bluetooth:unlock:" + token); redisService.deleteObject("rt:bluetooth:unlock:order:" + order.getId()); XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData(); BluetoothDeliverVo vo = new BluetoothDeliverVo(); vo.setCredential(token); vo.setVin(xpVehicle.getVehicleVin()); vo.setPassengerUid(order.getAppUserId()); BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo); if(null == delete || delete.getCode() != 0){ log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber()); } } } }