diff --git a/pom.xml b/pom.xml
index 05dc3e5ce..4054fb6c7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -100,7 +100,7 @@
local
local
- warn
+ debug
ruoyi
123456
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java
index 519034cf2..284d0566f 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java
@@ -81,8 +81,8 @@ public interface CacheNames {
String SYS_OSS_CONFIG = GlobalConstants.GLOBAL_REDIS_KEY + "sys_oss_config";
/**
- * 在线用户
+ * 延时队列:订单未支付取消
*/
- String ONLINE_TOKEN = "online_tokens";
+ String DELAY_ORDER_UNPAY = GlobalConstants.GLOBAL_REDIS_KEY + "order_unpay";
}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java
index 6354f893c..dc348ef12 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java
@@ -72,5 +72,10 @@ public interface Constants {
*/
Long TOP_PARENT_ID = 0L;
+ /**
+ * 订单未支付自动取消时间(秒)
+ */
+ Long ORDER_CANCEL_TIME = 900L;
+
}
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java
index 9f9652102..884a21240 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java
@@ -44,6 +44,7 @@ import org.dromara.common.mq.domain.MQMessage;
import org.dromara.common.mq.enums.MQMessageType;
import org.dromara.common.mq.enums.MessageActionEnum;
import org.dromara.common.mq.utils.MqUtil;
+import org.dromara.common.redis.utils.QueueUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.SysTenant;
@@ -60,8 +61,12 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
+import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
+import static org.dromara.common.core.constant.CacheNames.DELAY_ORDER_UNPAY;
+import static org.dromara.common.core.constant.Constants.ORDER_CANCEL_TIME;
+
/**
* 订单表Service业务层处理
@@ -275,6 +280,8 @@ public class OrderServiceImpl extends ServiceImpl implements
return orderItem;
}).toList();
orderItemMapper.insert(orderItemList);
+ // 添加订单到延迟队列
+ QueueUtils.addDelayedQueueObject(DELAY_ORDER_UNPAY, order.getId(), ORDER_CANCEL_TIME, TimeUnit.SECONDS);
return BeanUtil.copyProperties(order, OrderVO.class);
}
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/task/OrderScheduledTask.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/task/OrderScheduledTask.java
index b19a2c9de..a1d8a0387 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/task/OrderScheduledTask.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/task/OrderScheduledTask.java
@@ -1,20 +1,33 @@
package com.wzj.soopin.order.task;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.wzj.soopin.order.domain.entity.Order;
+import com.wzj.soopin.order.emum.OrderStatusEnum;
import com.wzj.soopin.order.service.OrderItemService;
+import com.wzj.soopin.order.service.OrderService;
import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.redis.utils.QueueUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
+import javax.annotation.PostConstruct;
+import java.util.concurrent.CompletableFuture;
+
+import static org.dromara.common.core.constant.CacheNames.DELAY_ORDER_UNPAY;
+
/**
* 订单相关定时任务
- *
+ *
* @author wzj
*/
@Slf4j
@Component
public class OrderScheduledTask {
+ @Autowired
+ private OrderService orderService;
+
@Autowired
private OrderItemService orderItemService;
@@ -32,4 +45,24 @@ public class OrderScheduledTask {
log.error("定时任务执行失败:缓存交易量最多商品到Redis时发生异常", e);
}
}
-}
\ No newline at end of file
+
+ /**
+ * 订阅redis延迟队列取消未支付的订单
+ */
+ @PostConstruct
+ public void orderCancelByDelayedQueue() {
+ log.info("订单未支付延时队列: {} 监听中......",DELAY_ORDER_UNPAY);
+ // 项目初始化设置一次即可
+ QueueUtils.subscribeBlockingQueue(DELAY_ORDER_UNPAY, (Long orderId) -> {
+ // 观察接收时间
+ log.info("订单未支付延时队列: {}, 收到订单id: {}", DELAY_ORDER_UNPAY, orderId);
+ return CompletableFuture.runAsync(() -> {
+ // 异步处理数据逻辑 不要在上方处理业务逻辑
+ orderService.update(Wrappers.lambdaUpdate(Order.class)
+ .eq(Order::getId, orderId)
+ .eq(Order::getStatus, OrderStatusEnum.UNPAID.getValue())
+ .set(Order::getStatus, OrderStatusEnum.CLOSED.getValue()));
+ });
+ }, true);
+ }
+}