FlashDeliveryAutoCompleteTask.java 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package com.ruoyi.app.flashdelivery.task;
  2. import com.ruoyi.app.flashdelivery.service.FlashDeliveryApplicationService;
  3. import com.ruoyi.system.domain.flash.FlashDeliveryOrder;
  4. import org.springframework.stereotype.Component;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import java.time.Instant;
  8. import java.time.temporal.ChronoUnit;
  9. import java.util.Date;
  10. /**
  11. * 提供闪送订单的 Quartz 收口任务:送达超时自动完成、预约取件超时自动取消。
  12. * 由若依任务调度分别调用本 Bean 的公开方法,避免使用应用内 {@code @Scheduled} 造成重复执行。
  13. */
  14. @Component("flashDeliveryAutoCompleteTask")
  15. public class FlashDeliveryAutoCompleteTask {
  16. private static final Logger log = LoggerFactory.getLogger(FlashDeliveryAutoCompleteTask.class);
  17. private final FlashDeliveryApplicationService service;
  18. public FlashDeliveryAutoCompleteTask(FlashDeliveryApplicationService service) { this.service = service; }
  19. public void completeDeliveredOrders() {
  20. Date deadline = Date.from(Instant.now().minus(24, ChronoUnit.HOURS));
  21. // 分批处理避免单次扫描过多;条件更新保证与用户确认/平台完成并发时只有一方成功。
  22. for (FlashDeliveryOrder order : service.autoCompleteCandidates(deadline, 200)) {
  23. try {
  24. service.complete(null, "SYSTEM", order.getId());
  25. } catch (RuntimeException exception) {
  26. log.error("Flash delivery auto-complete failed, orderId={}", order.getId(), exception);
  27. }
  28. }
  29. }
  30. /**
  31. * 每分钟扫描已过预约取件结束时间但仍未接单的订单。接单和取消均走条件更新,
  32. * 因此任务延迟或并发执行不会取消已经被骑手接取的订单。
  33. */
  34. public void cancelExpiredScheduledOrders() {
  35. Date now = new Date();
  36. for (FlashDeliveryOrder order : service.expiredScheduledCandidates(now, 200)) {
  37. try {
  38. service.cancelExpiredScheduledOrder(order.getId(), now);
  39. } catch (RuntimeException exception) {
  40. log.error("Flash delivery scheduled expiry failed, orderId={}", order.getId(), exception);
  41. }
  42. }
  43. }
  44. }