feat(order): 添加订单支付未核销自动退款功能
- 新增延迟队列常量 DELAY_ORDER_TO_BE_USED 用于处理已支付未核销订单 - 调整订单取消时间单位从秒改为分钟,值设为15分钟 - 新增订单支付未核销自动退款时间常量,设置为14天 - 实现订单支付后加入延迟队列逻辑,超时未核销自动退款 - 订阅延迟队列处理已支付未核销订单状态更新为已退款 - 异步处理订单退款逻辑,避免阻塞主流程
This commit is contained in:
parent
ee76a4cfda
commit
887ab084e9
@ -85,4 +85,10 @@ public interface CacheNames {
|
||||
*/
|
||||
String DELAY_ORDER_UNPAY = GlobalConstants.GLOBAL_REDIS_KEY + "order_unpay";
|
||||
|
||||
|
||||
/**
|
||||
* 延时队列:订单支付未核销
|
||||
*/
|
||||
String DELAY_ORDER_TO_BE_USED = GlobalConstants.GLOBAL_REDIS_KEY + "order_tobe_used";
|
||||
|
||||
}
|
||||
|
@ -73,9 +73,14 @@ public interface Constants {
|
||||
Long TOP_PARENT_ID = 0L;
|
||||
|
||||
/**
|
||||
* 订单未支付自动取消时间(秒)
|
||||
* 订单未支付自动取消时间(分钟)
|
||||
*/
|
||||
Long ORDER_CANCEL_TIME = 900L;
|
||||
Long ORDER_CANCEL_TIME = 15L;
|
||||
|
||||
/**
|
||||
* 订单支付未核销自动退款时间(天)
|
||||
*/
|
||||
Long ORDER_REFUND_TIME = 14L;
|
||||
|
||||
}
|
||||
|
||||
|
@ -64,8 +64,10 @@ import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.dromara.common.core.constant.CacheNames.DELAY_ORDER_TO_BE_USED;
|
||||
import static org.dromara.common.core.constant.CacheNames.DELAY_ORDER_UNPAY;
|
||||
import static org.dromara.common.core.constant.Constants.ORDER_CANCEL_TIME;
|
||||
import static org.dromara.common.core.constant.Constants.ORDER_REFUND_TIME;
|
||||
|
||||
|
||||
/**
|
||||
@ -281,7 +283,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
||||
}).toList();
|
||||
orderItemMapper.insert(orderItemList);
|
||||
// 添加订单到延迟队列
|
||||
QueueUtils.addDelayedQueueObject(DELAY_ORDER_UNPAY, order.getId(), ORDER_CANCEL_TIME, TimeUnit.SECONDS);
|
||||
QueueUtils.addDelayedQueueObject(DELAY_ORDER_UNPAY, order.getId(), ORDER_CANCEL_TIME, TimeUnit.MINUTES);
|
||||
return BeanUtil.copyProperties(order, OrderVO.class);
|
||||
}
|
||||
|
||||
@ -565,7 +567,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
||||
.paymentTime(LocalDateTime.now())
|
||||
.payType(payType)
|
||||
.build());
|
||||
|
||||
// 添加已支付订单到延迟队列,14天未使用自动退款
|
||||
QueueUtils.addDelayedQueueObject(DELAY_ORDER_TO_BE_USED, order.getId(), ORDER_REFUND_TIME, TimeUnit.DAYS);
|
||||
//发出消息
|
||||
MqUtil.sendIMMessage(buildMQMessage(order));
|
||||
}
|
||||
|
@ -14,6 +14,7 @@ import org.springframework.stereotype.Component;
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import static org.dromara.common.core.constant.CacheNames.DELAY_ORDER_TO_BE_USED;
|
||||
import static org.dromara.common.core.constant.CacheNames.DELAY_ORDER_UNPAY;
|
||||
|
||||
/**
|
||||
@ -65,4 +66,26 @@ public class OrderScheduledTask {
|
||||
});
|
||||
}, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 订阅redis延迟队列退款已支付未核销的订单
|
||||
*/
|
||||
@PostConstruct
|
||||
public void orderRefundByDelayedQueue() {
|
||||
log.info("订单已支付未核销延时队列: {} 监听中......",DELAY_ORDER_TO_BE_USED);
|
||||
// 项目初始化设置一次即可
|
||||
QueueUtils.subscribeBlockingQueue(DELAY_ORDER_TO_BE_USED, (Long orderId) -> {
|
||||
// 观察接收时间
|
||||
log.info("订单未支付延时队列: {}, 收到订单id: {}", DELAY_ORDER_TO_BE_USED, orderId);
|
||||
return CompletableFuture.runAsync(() -> {
|
||||
// 异步处理数据逻辑 不要在上方处理业务逻辑
|
||||
orderService.update(Wrappers.lambdaUpdate(Order.class)
|
||||
.eq(Order::getId, orderId)
|
||||
.eq(Order::getStatus, OrderStatusEnum.VERIFY.getValue())
|
||||
.set(Order::getStatus, OrderStatusEnum.REFUNDED.getValue()));
|
||||
// TODO退款
|
||||
});
|
||||
}, true);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user