| | |
| | | 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; |
| | |
| | | this.updateById(chargingOrder); |
| | | |
| | | |
| | | scheduleReservationStart(chargingOrder); |
| | | return AjaxResult.success(); |
| | | } |
| | | |
| | |
| | | || 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) { |