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.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;
|
import java.util.concurrent.TimeUnit;
|
|
@Slf4j
|
@Component
|
public class TaskOrderCancelUtil {
|
|
|
@Autowired
|
private IXpOrderService xpOrderService;
|
|
@Autowired
|
private RedisService redisService;
|
|
@Resource
|
private XpVehicleClient xpVehicleClient;
|
|
@Resource
|
private BluetoothUnlockClient bluetoothUnlockClient;
|
|
/**
|
* 30秒执行一次
|
*/
|
@Scheduled(cron = "0/30 * * * * ?")
|
public void taskOrder() {
|
// 计算30分钟前的时间
|
LocalDateTime thirtyMinutesAgo = LocalDateTime.now().minusMinutes(30);
|
|
// 查询状态为1且创建时间超过30分钟的订单
|
List<XpOrder> expiredOrders = xpOrderService.list(new LambdaQueryWrapper<XpOrder>()
|
.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);
|
redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 0, 24L, TimeUnit.HOURS);
|
//删除蓝牙秘钥
|
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.setVim(xpVehicle.getVehicleVin());
|
vo.setPassengerUid(order.getAppUserId());
|
BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo);
|
if(null == delete || delete.getCode() != 0){
|
log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber());
|
}
|
}
|
}
|
|
|
|
|
}
|