ソースを参照

feat[litemall-wx-api]: 系统启动时,查询数据库,创建订单超时未支付任务

Junling Bu 6 年 前
コミット
285d164314

+ 2 - 28
litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/job/OrderJob.java

@@ -33,32 +33,6 @@ public class OrderJob {
     private LitemallGrouponRulesService rulesService;
 
     /**
-     * 自动取消订单
-     * <p>
-     * 定时检查订单未付款情况,如果超时 LITEMALL_ORDER_UNPAID 分钟则自动取消订单
-     * 定时时间是每次相隔半个小时。
-     * <p>
-     * TODO
-     * 注意,因为是相隔半小时检查,因此导致订单真正超时时间是 [LITEMALL_ORDER_UNPAID, 30 + LITEMALL_ORDER_UNPAID]
-     */
-    @Scheduled(fixedDelay = 30 * 60 * 1000)
-    @Transactional(rollbackFor = Exception.class)
-    public void checkOrderUnpaid() {
-        logger.info("系统开启任务检查订单是否已经超期自动取消订单");
-
-        List<LitemallOrder> orderList = orderService.queryUnpaid(SystemConfig.getOrderUnpaid());
-        for (LitemallOrder order : orderList) {
-            // 设置订单已取消状态
-            order.setOrderStatus(OrderUtil.STATUS_AUTO_CANCEL);
-            order.setEndTime(LocalDateTime.now());
-
-            cancelOrderScope(order);
-
-            logger.info("订单 ID" + order.getId() + " 已经超期自动取消订单");
-        }
-    }
-
-    /**
      * 自动确认订单
      * <p>
      * 定时检查订单未确认情况,如果超时 LITEMALL_ORDER_UNCONFIRM 天则自动确认订单
@@ -69,7 +43,7 @@ public class OrderJob {
      */
     @Scheduled(cron = "0 0 3 * * ?")
     public void checkOrderUnconfirm() {
-        logger.info("系统开启任务检查订单是否已经超期自动确认收货");
+        logger.info("系统开启定时任务检查订单是否已经超期自动确认收货");
 
         List<LitemallOrder> orderList = orderService.queryUnconfirm(SystemConfig.getOrderUnconfirm());
         for (LitemallOrder order : orderList) {
@@ -117,7 +91,7 @@ public class OrderJob {
     @Scheduled(initialDelay = 5000, fixedDelay = 10 * 60 * 1000)
     @Transactional(rollbackFor = Exception.class)
     public void checkGrouponOrderTimeout() {
-        logger.info("系统开启任务检查团购订单是否已经拼团超期自动取消订单");
+        logger.info("系统开启定时任务检查团购订单是否已经拼团超期自动取消订单");
 
         List<LitemallGroupon> grouponList = grouponService.queryJoinRecord(0);
         for (LitemallGroupon groupon : grouponList) {

+ 0 - 4
litemall-core/src/main/java/org/linlinjava/litemall/core/task/TaskService.java

@@ -1,14 +1,10 @@
 package org.linlinjava.litemall.core.task;
 
-import com.sun.org.apache.bcel.internal.generic.ARETURN;
 import org.springframework.stereotype.Component;
-
 import javax.annotation.PostConstruct;
-import java.util.Iterator;
 import java.util.concurrent.DelayQueue;
 import java.util.concurrent.Executors;
 
-
 @Component
 public class TaskService {
     private TaskService taskService;

+ 20 - 0
litemall-core/src/test/java/org/linlinjava/litemall/core/TaskTest.java

@@ -68,4 +68,24 @@ public class TaskTest {
         }
     }
 
+    @Test
+    public void test1() {
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        String now = df.format(LocalDateTime.now());
+        System.out.println("start at time=" + now);
+
+        taskService.addTask(new DemoTask("3", 0));
+        taskService.addTask(new DemoTask("2", 0));
+        taskService.addTask(new DemoTask("1", 0));
+
+        taskService.addTask(new DemoTask("4", 0));
+        taskService.addTask(new DemoTask("5", 0));
+        taskService.addTask(new DemoTask("6", 0));
+
+        try {
+            Thread.sleep(10 * 1000);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
 }

+ 1 - 3
litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallOrderService.java

@@ -126,10 +126,8 @@ public class LitemallOrderService {
     }
 
     public List<LitemallOrder> queryUnpaid(int minutes) {
-        LocalDateTime now = LocalDateTime.now();
-        LocalDateTime expired = now.minusMinutes(minutes);
         LitemallOrderExample example = new LitemallOrderExample();
-        example.or().andOrderStatusEqualTo(OrderUtil.STATUS_CREATE).andAddTimeLessThan(expired).andDeletedEqualTo(false);
+        example.or().andOrderStatusEqualTo(OrderUtil.STATUS_CREATE).andDeletedEqualTo(false);
         return litemallOrderMapper.selectByExample(example);
     }
 

+ 7 - 2
litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/task/OrderUnpaidTask.java

@@ -19,6 +19,11 @@ public class OrderUnpaidTask extends Task {
     private final Log logger = LogFactory.getLog(OrderUnpaidTask.class);
     private int orderId = -1;
 
+    public OrderUnpaidTask(Integer orderId, long delayInMilliseconds){
+        super("OrderUnpaidTask-" + orderId, delayInMilliseconds);
+        this.orderId = orderId;
+    }
+
     public OrderUnpaidTask(Integer orderId){
         super("OrderUnpaidTask-" + orderId, SystemConfig.getOrderUnpaid() * 60 * 1000);
         this.orderId = orderId;
@@ -26,7 +31,7 @@ public class OrderUnpaidTask extends Task {
 
     @Override
     public void run() {
-        logger.info("系统开始处理订单超时未付款订单 " + this.orderId);
+        logger.info("系统开始处理延时任务---订单超时未付款---" + this.orderId);
 
         LitemallOrderService orderService = BeanUtil.getBean(LitemallOrderService.class);
         LitemallOrderGoodsService orderGoodsService = BeanUtil.getBean(LitemallOrderGoodsService.class);
@@ -57,6 +62,6 @@ public class OrderUnpaidTask extends Task {
                 throw new RuntimeException("商品货品库存增加失败");
             }
         }
-        logger.info("系统成功处理订单超时未付款订单 " + this.orderId);
+        logger.info("系统结束处理延时任务---订单超时未付款---" + this.orderId);
     }
 }

+ 44 - 0
litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/task/TaskStartupRunner.java

@@ -0,0 +1,44 @@
+package org.linlinjava.litemall.wx.task;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.linlinjava.litemall.core.system.SystemConfig;
+import org.linlinjava.litemall.core.task.TaskService;
+import org.linlinjava.litemall.db.domain.LitemallOrder;
+import org.linlinjava.litemall.db.service.LitemallOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
+
+@Component
+public class TaskStartupRunner implements ApplicationRunner {
+
+    @Autowired
+    private LitemallOrderService orderService;
+    @Autowired
+    private TaskService taskService;
+
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        List<LitemallOrder> orderList = orderService.queryUnpaid(SystemConfig.getOrderUnpaid());
+        for(LitemallOrder order : orderList){
+            LocalDateTime add = order.getAddTime();
+            LocalDateTime now = LocalDateTime.now();
+            LocalDateTime expire =  add.plusMinutes(SystemConfig.getOrderUnpaid());
+            if(expire.isBefore(now)) {
+                // 已经过期,则加入延迟队列
+                taskService.addTask(new OrderUnpaidTask(order.getId(), 0));
+            }
+            else{
+                // 还没过期,则加入延迟队列
+                long delay = ChronoUnit.MILLIS.between(now, expire);
+                taskService.addTask(new OrderUnpaidTask(order.getId(), delay));
+            }
+        }
+    }
+}