package com.izouma.nineth.service; import com.izouma.nineth.config.GeneralProperties; import com.izouma.nineth.domain.Order; import com.izouma.nineth.domain.SysConfig; import com.izouma.nineth.enums.OrderStatus; import com.izouma.nineth.exception.BusinessException; import com.izouma.nineth.repo.OrderRepo; import com.izouma.nineth.repo.SysConfigRepo; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.time.LocalDateTime; import java.util.List; @Service @ConditionalOnProperty(value = "general.notify-server", havingValue = "true") @Slf4j @AllArgsConstructor public class OrderCancelService { private final GeneralProperties generalProperties; private final OrderRepo orderRepo; private final OrderService orderService; private final SysConfigRepo sysConfigRepo; private static int orderCancelInterval = 210; public static void setOrderCancelInterval(int orderCancelInterval) { OrderCancelService.orderCancelInterval = orderCancelInterval; } @PostConstruct public void init() { orderCancelInterval = sysConfigRepo.findByName("order_cancel_interval") .map(SysConfig::getValue).map(Integer::parseInt).orElse(210); } @Scheduled(fixedRate = 30000) public void batchCancel() { List orders = orderRepo.findByStatusAndCreatedAtBeforeAndDelFalse(OrderStatus.NOT_PAID, LocalDateTime.now().minusSeconds(orderCancelInterval)); orders.parallelStream().forEach(o -> { try { Order order = orderRepo.findById(o.getId()).orElseThrow(new BusinessException("订单不存在")); if (order.getStatus() == OrderStatus.NOT_PAID) { orderService.cancel(order); } } catch (Exception e) { log.error("取消订单错误 " + o.getId(), e); } }); } }