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); + } +}