浏览代码

feat[litemall-wx-api]: 订单超时未支付任务

Junling Bu 6 年之前
父节点
当前提交
31eb148144

+ 10 - 0
litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/service/WxOrderService.java

@@ -18,6 +18,7 @@ import org.linlinjava.litemall.core.notify.NotifyService;
 import org.linlinjava.litemall.core.notify.NotifyType;
 import org.linlinjava.litemall.core.qcode.QCodeService;
 import org.linlinjava.litemall.core.system.SystemConfig;
+import org.linlinjava.litemall.core.task.TaskService;
 import org.linlinjava.litemall.core.util.DateTimeUtil;
 import org.linlinjava.litemall.core.util.JacksonUtil;
 import org.linlinjava.litemall.core.util.ResponseUtil;
@@ -27,6 +28,7 @@ import org.linlinjava.litemall.db.util.CouponUserConstant;
 import org.linlinjava.litemall.db.util.OrderHandleOption;
 import org.linlinjava.litemall.db.util.OrderUtil;
 import org.linlinjava.litemall.core.util.IpUtil;
+import org.linlinjava.litemall.wx.task.OrderUnpaidTask;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -105,6 +107,8 @@ public class WxOrderService {
     private LitemallCouponUserService couponUserService;
     @Autowired
     private CouponVerifyService couponVerifyService;
+    @Autowired
+    private TaskService taskService;
 
     /**
      * 订单列表
@@ -422,6 +426,9 @@ public class WxOrderService {
             grouponService.createGroupon(groupon);
         }
 
+        // 订单支付超期任务
+        taskService.addTask(new OrderUnpaidTask(orderId));
+
         Map<String, Object> data = new HashMap<>();
         data.put("orderId", orderId);
         return ResponseUtil.ok(data);
@@ -766,6 +773,9 @@ public class WxOrderService {
 
         notifyService.notifyWxTemplate(result.getOpenid(), NotifyType.PAY_SUCCEED, parms, "pages/index/index?orderId=" + order.getId());
 
+        // 取消订单超时未支付任务
+        taskService.removeTask(new OrderUnpaidTask(order.getId()));
+
         return WxPayNotifyResponse.success("处理成功!");
     }
 

+ 62 - 0
litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/task/OrderUnpaidTask.java

@@ -0,0 +1,62 @@
+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.Task;
+import org.linlinjava.litemall.core.util.BeanUtil;
+import org.linlinjava.litemall.db.domain.LitemallOrder;
+import org.linlinjava.litemall.db.domain.LitemallOrderGoods;
+import org.linlinjava.litemall.db.service.LitemallGoodsProductService;
+import org.linlinjava.litemall.db.service.LitemallOrderGoodsService;
+import org.linlinjava.litemall.db.service.LitemallOrderService;
+import org.linlinjava.litemall.db.util.OrderUtil;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+public class OrderUnpaidTask extends Task {
+    private final Log logger = LogFactory.getLog(OrderUnpaidTask.class);
+    private int orderId = -1;
+
+    public OrderUnpaidTask(Integer orderId){
+        super("OrderUnpaidTask-" + orderId, SystemConfig.getOrderUnpaid() * 60 * 1000);
+        this.orderId = orderId;
+    }
+
+    @Override
+    public void run() {
+        logger.info("系统开始处理订单超时未付款订单 " + this.orderId);
+
+        LitemallOrderService orderService = BeanUtil.getBean(LitemallOrderService.class);
+        LitemallOrderGoodsService orderGoodsService = BeanUtil.getBean(LitemallOrderGoodsService.class);
+        LitemallGoodsProductService productService = BeanUtil.getBean(LitemallGoodsProductService.class);
+
+        LitemallOrder order = orderService.findById(this.orderId);
+        if(order == null){
+            return;
+        }
+        if(!OrderUtil.isCreateStatus(order)){
+            return;
+        }
+
+        // 设置订单已取消状态
+        order.setOrderStatus(OrderUtil.STATUS_AUTO_CANCEL);
+        order.setEndTime(LocalDateTime.now());
+        if (orderService.updateWithOptimisticLocker(order) == 0) {
+            throw new RuntimeException("更新数据已失效");
+        }
+
+        // 商品货品数量增加
+        Integer orderId = order.getId();
+        List<LitemallOrderGoods> orderGoodsList = orderGoodsService.queryByOid(orderId);
+        for (LitemallOrderGoods orderGoods : orderGoodsList) {
+            Integer productId = orderGoods.getProductId();
+            Short number = orderGoods.getNumber();
+            if (productService.addStock(productId, number) == 0) {
+                throw new RuntimeException("商品货品库存增加失败");
+            }
+        }
+        logger.info("系统成功处理订单超时未付款订单 " + this.orderId);
+    }
+}