package com.xiaopeng.vehicleConvoy.task; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.vehicleConvoy.service.IXpVehicleService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; /** * 运营车辆年检/保险/运营资质过期检查定时任务 * 每日凌晨1点执行一次:任意一项过期则转为在库,车辆状态置为3(保险/年检已过期) */ @Slf4j @Component @RequiredArgsConstructor public class VehicleDocumentExpiryTask { private static final ZoneId ZONE_GMT8 = ZoneId.of("GMT+8"); private final IXpVehicleService xpVehicleService; @Scheduled(cron = "0 0 1 * * ?", zone = "GMT+8") public void checkAndStockExpiredVehicles() { LocalDate today = LocalDate.now(ZONE_GMT8); LocalDateTime todayStart = today.atStartOfDay(); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(XpVehicle::getVehicleType, 2) .and(w -> w.lt(XpVehicle::getAnnualInspectionDate, todayStart) .or().lt(XpVehicle::getInsuranceEndTime, todayStart) .or().lt(XpVehicle::getQualificationExpireTime, todayStart)) .set(XpVehicle::getVehicleType, 1) .set(XpVehicle::getStatus, 3); boolean updated = xpVehicleService.update(updateWrapper); log.info("运营车辆证件过期检查任务执行完成,todayStart={}, updated={}", todayStart, updated); } }