longz
2026-07-20 11b6b171f8416d17defb99bbd5aa9559719464b8
fix: 按预约时间启动充电
1个文件已修改
37 ■■■■■ 已修改文件
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -89,6 +89,7 @@
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
@@ -1554,7 +1555,6 @@
        this.updateById(chargingOrder);
        
        
        scheduleReservationStart(chargingOrder);
        return AjaxResult.success();
    }
@@ -1632,26 +1632,29 @@
                || expectedVin.equals(new StringBuilder(actualVin).reverse().toString());
    }
    private void scheduleReservationStart(TChargingOrder chargingOrder) {
        if (chargingOrder.getReservationTime() == null || !chargingOrder.getReservationTime().isAfter(LocalDateTime.now())) {
            return;
        }
        long delay = Math.max(0L, Duration.between(LocalDateTime.now(), chargingOrder.getReservationTime()).toMillis());
        ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.schedule(() -> {
    @Scheduled(fixedDelay = 5000L)
    public void startDueReservationOrders() {
        LocalDateTime now = LocalDateTime.now();
        List<TChargingOrder> dueOrders = this.list(new LambdaQueryWrapper<TChargingOrder>()
                .eq(TChargingOrder::getRechargePaymentStatus, 2)
                .eq(TChargingOrder::getStatus, 2)
                .eq(TChargingOrder::getOrderSource, 1)
                .eq(TChargingOrder::getDelFlag, 0)
                .isNotNull(TChargingOrder::getReservationTime)
                .ge(TChargingOrder::getReservationTime, now.minusHours(24))
                .le(TChargingOrder::getReservationTime, now)
                .orderByAsc(TChargingOrder::getReservationTime)
                .last("limit 100"));
        for (TChargingOrder order : dueOrders) {
            try {
                TChargingOrder latest = this.getById(chargingOrder.getId());
                if (latest == null || latest.getStatus() != 2) {
                    return;
                }
                PreChargeCheck check = redisService.getCacheObject("AQJC_" + latest.getChargingGunId());
                PreChargeCheck check = redisService.getCacheObject("AQJC_" + order.getChargingGunId());
                if (isSafetyCheckPassed(check)) {
                    startChargingAfterSafety(latest, check);
                    startChargingAfterSafety(order, check);
                }
            } finally {
                scheduler.shutdown();
            } catch (Exception e) {
                log.error("预约充电到时启动失败,orderCode={}", order.getCode(), e);
            }
        }, delay, TimeUnit.MILLISECONDS);
        }
    }
    private void startChargingAfterSafety(TChargingOrder chargingOrder, PreChargeCheck check) {